qwirk 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/README.md +9 -14
  2. data/lib/qwirk.rb +26 -17
  3. data/lib/qwirk/adapter.rb +3 -45
  4. data/lib/qwirk/adapter/base.rb +2 -0
  5. data/lib/qwirk/adapter/base/expanding_worker_config.rb +133 -0
  6. data/lib/qwirk/adapter/base/worker_config.rb +104 -0
  7. data/lib/qwirk/adapter/in_memory.rb +13 -0
  8. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/factory.rb +2 -2
  9. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/publisher.rb +4 -4
  10. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/queue.rb +3 -2
  11. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/reply_queue.rb +3 -2
  12. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/topic.rb +2 -2
  13. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/worker.rb +6 -8
  14. data/lib/qwirk/adapter/in_memory/worker_config.rb +50 -0
  15. data/lib/qwirk/adapter/inline.rb +9 -0
  16. data/lib/qwirk/adapter/inline/publisher.rb +86 -0
  17. data/lib/qwirk/adapter/inline/worker.rb +55 -0
  18. data/lib/qwirk/adapter/inline/worker_config.rb +30 -0
  19. data/lib/qwirk/adapter_factory.rb +48 -0
  20. data/lib/qwirk/base_worker.rb +18 -28
  21. data/lib/qwirk/batch/file_worker.rb +4 -4
  22. data/lib/qwirk/manager.rb +11 -8
  23. data/lib/qwirk/marshal_strategy/none.rb +1 -1
  24. data/lib/qwirk/publish_handle.rb +22 -11
  25. data/lib/qwirk/publisher.rb +9 -9
  26. data/lib/qwirk/{request_worker.rb → reply_worker.rb} +3 -3
  27. data/lib/qwirk/worker.rb +27 -29
  28. data/test/jms_fail_test.rb +11 -11
  29. data/test/jms_requestor_block_test.rb +12 -12
  30. data/test/jms_requestor_test.rb +8 -8
  31. data/test/jms_test.rb +10 -10
  32. metadata +104 -185
  33. data/examples/README +0 -1
  34. data/examples/activemq.xml +0 -84
  35. data/examples/advanced_requestor/README.md +0 -15
  36. data/examples/advanced_requestor/base_request_worker.rb +0 -18
  37. data/examples/advanced_requestor/char_count_worker.rb +0 -16
  38. data/examples/advanced_requestor/config.ru +0 -24
  39. data/examples/advanced_requestor/exception_raiser_worker.rb +0 -17
  40. data/examples/advanced_requestor/length_worker.rb +0 -14
  41. data/examples/advanced_requestor/print_worker.rb +0 -14
  42. data/examples/advanced_requestor/publisher.rb +0 -49
  43. data/examples/advanced_requestor/qwirk.yml +0 -16
  44. data/examples/advanced_requestor/reverse_worker.rb +0 -14
  45. data/examples/advanced_requestor/triple_worker.rb +0 -14
  46. data/examples/batch/my_batch_worker.rb +0 -30
  47. data/examples/batch/my_line_worker.rb +0 -8
  48. data/examples/qwirk.yml +0 -20
  49. data/examples/requestor/README.md +0 -13
  50. data/examples/requestor/config.ru +0 -13
  51. data/examples/requestor/qwirk_persist.yml +0 -5
  52. data/examples/requestor/requestor.rb +0 -68
  53. data/examples/requestor/reverse_echo_worker.rb +0 -15
  54. data/examples/setup.rb +0 -13
  55. data/examples/shared/README.md +0 -24
  56. data/examples/shared/config.ru +0 -13
  57. data/examples/shared/publisher.rb +0 -49
  58. data/examples/shared/qwirk_persist.yml +0 -5
  59. data/examples/shared/shared_worker.rb +0 -16
  60. data/examples/simple/README +0 -53
  61. data/examples/simple/bar_worker.rb +0 -10
  62. data/examples/simple/baz_worker.rb +0 -10
  63. data/examples/simple/config.ru +0 -14
  64. data/examples/simple/publisher.rb +0 -49
  65. data/examples/simple/qwirk_persist.yml +0 -4
  66. data/examples/simple/tmp/kahadb/db-1.log +0 -0
  67. data/examples/simple/tmp/kahadb/db.data +0 -0
  68. data/examples/simple/tmp/kahadb/db.redo +0 -0
  69. data/examples/task/README +0 -47
  70. data/examples/task/config.ru +0 -14
  71. data/examples/task/foo_worker.rb +0 -10
  72. data/examples/task/messages.out +0 -1000
  73. data/examples/task/publisher.rb +0 -25
  74. data/examples/task/qwirk_persist.yml +0 -5
  75. data/examples/task/task.rb +0 -36
  76. data/lib/qwirk/queue_adapter.rb +0 -3
  77. data/lib/qwirk/queue_adapter/active_mq.rb +0 -13
  78. data/lib/qwirk/queue_adapter/active_mq/publisher.rb +0 -12
  79. data/lib/qwirk/queue_adapter/active_mq/worker_config.rb +0 -16
  80. data/lib/qwirk/queue_adapter/in_mem.rb +0 -7
  81. data/lib/qwirk/queue_adapter/in_mem/worker_config.rb +0 -59
  82. data/lib/qwirk/queue_adapter/jms.rb +0 -50
  83. data/lib/qwirk/queue_adapter/jms/connection.rb +0 -42
  84. data/lib/qwirk/queue_adapter/jms/consumer.rb +0 -37
  85. data/lib/qwirk/queue_adapter/jms/publisher.rb +0 -126
  86. data/lib/qwirk/queue_adapter/jms/worker.rb +0 -89
  87. data/lib/qwirk/queue_adapter/jms/worker_config.rb +0 -38
  88. data/lib/qwirk/version.rb +0 -3
  89. data/lib/qwirk/worker_config.rb +0 -187
@@ -1,15 +0,0 @@
1
- class ReverseEchoWorker
2
- include Qwirk::RequestWorker
3
-
4
- def request(obj)
5
- puts "#{self}: Received #{obj} at #{Time.now}"
6
- if obj =~ /^sleep (.*)/
7
- sleep $1.to_f
8
- puts "#{self}: Finished sleeping at #{Time.now}"
9
- end
10
- if obj =~ /^Exception/
11
- raise Exception, 'You requested an exception'
12
- end
13
- obj.reverse
14
- end
15
- end
data/examples/setup.rb DELETED
@@ -1,13 +0,0 @@
1
- # Allow examples to be run in-place without requiring a gem install
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
-
4
- require 'rubygems'
5
- require 'qwirk'
6
- require 'rumx'
7
- require 'yaml'
8
- require 'logger'
9
-
10
- #Qwirk.logger = Logger.new($stdout)
11
- file = File.expand_path('../qwirk.yml', __FILE__)
12
- Qwirk.config = YAML.load(ERB.new(File.read(file), nil, '-').result(binding))
13
- $adapter_key = ENV['QWIRK_ADAPTER'] || 'in_mem'
@@ -1,24 +0,0 @@
1
- ## Step 0
2
- ### Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
-
4
- ## Step 1
5
- ### Start up the application
6
- * rm -f qwirk_persist.yml
7
- * rackup -p 4567
8
-
9
- ## Step 2
10
- * Browse to http://localhost:4567
11
- * Open up the tree to Qwirk => S1 => Attributes
12
- * Enter 2 for count and click the Update button.
13
- * Open up the tree to Qwirk => S2 => Attributes
14
- * Enter 3 for count and click the Update button.
15
- * Refresh the browser so that you get the worker updates to the tree
16
-
17
- ## Step 3
18
- * Open the tree to Publisher => Operations => send\_bar or send\_baz
19
- * Enter values for the various arguments and click Execute.
20
-
21
- ## Step 4
22
- * cntl-c the rackup process and start it back up. It should come back with
23
- the workers and the config values that have been configured via the browser.
24
-
@@ -1,13 +0,0 @@
1
- require '../setup'
2
- require './shared_worker'
3
- require './publisher'
4
-
5
- # If we're not starting up a standalone publisher, then start up a manager
6
- if ENV['RACK_ENV'] != 'publisher'
7
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
8
- at_exit { manager.stop }
9
- end
10
- if ENV['RACK_ENV'] != 'worker'
11
- Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
12
- end
13
- run Rumx::Server
@@ -1,49 +0,0 @@
1
- require 'rumx'
2
- require 'qwirk'
3
-
4
- class Publisher
5
- include Rumx::Bean
6
-
7
- bean_attr_accessor :s1_count, :integer, 'Number of S1 messages sent'
8
- bean_attr_accessor :s2_count, :integer, 'Number of S2 messages sent'
9
-
10
- bean_operation :send_s1, :void, 'Send messages to the S1 worker', [
11
- [ :count, :integer, 'Count of messages', 10 ],
12
- [ :message, :string, 'String portion of the message to send', 'Message for Bar' ],
13
- [ :sleep_time, :float, 'Time to sleep between messages', 0.2 ]
14
- ]
15
-
16
- bean_operation :send_s2, :void, 'Send messages to the S2 worker', [
17
- [ :count, :integer, 'Count of messages', 5 ],
18
- [ :message, :string, 'String portion of the message to send', 'Message for Baz' ],
19
- [ :sleep_time, :float, 'Time to sleep between messages', 0.5 ]
20
- ]
21
-
22
-
23
- def initialize(adapter_key)
24
- @s1_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'S1', :marshal => :bson)
25
- @s2_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'S2', :marshal => :string)
26
- @s1_count = 0
27
- @s2_count = 0
28
- end
29
-
30
- def send_s1(count, message, sleep_time)
31
- count.times do
32
- @s1_count += 1
33
- obj = {'count' => @s1_count, 'message' => message}
34
- puts "Publishing to S1 object: #{obj.inspect}"
35
- @s1_publisher.publish(obj)
36
- sleep sleep_time
37
- end
38
- end
39
-
40
- def send_s2(count, message, sleep_time)
41
- count.times do
42
- @s2_count += 1
43
- obj = "#{@s2_count}: #{message}"
44
- puts "Publishing to S2 object: #{obj}"
45
- @s2_publisher.publish(obj)
46
- sleep sleep_time
47
- end
48
- end
49
- end
@@ -1,5 +0,0 @@
1
- ---
2
- S1:
3
- :min_count: 1
4
- S2:
5
- :min_count: 1
@@ -1,16 +0,0 @@
1
- class SharedWorker
2
- include Qwirk::Worker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
- config_reader :message, :string, 'Message'
6
-
7
- define_configs(
8
- 'S1' => {:message => "I'm S1", :sleep_time => 10},
9
- 'S2' => {:message => "I'm S2"}
10
- )
11
-
12
- def perform(obj)
13
- puts "#{self}: Received #{obj.inspect} at #{Time.now}"
14
- sleep config.sleep_time
15
- end
16
- end
@@ -1,53 +0,0 @@
1
- Step 0
2
- # Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
-
4
- Step 1
5
- # Start up the application
6
- rm -f qwirk_persist.yml
7
- rackup -p 4567
8
- or for ActiveMQ
9
- QWIRK_ADAPTER=active_mq rackup -p 4567
10
-
11
-
12
- Step 2
13
- # Browse to http://localhost:4567
14
- # Open up the tree to Worker => Bar => Attributes and click on Attributes
15
- # Change max_count to 100, idle_worker_timeout to 10, and sleep_time to 5 and click Update.
16
-
17
- Step 3
18
- # Open the tree to Publisher => Operations => send_bar and click on send_bar
19
- # Set count to 1000 and sleep_time to 0.2 and click Execute.
20
- # Click back on Worker => Bar => Attributes and continue clicking every few seconds while
21
- messages are still being published. For the InMem adapter, workers will continue
22
- to increase while there are still messages in the queue. For the ActiveMQ adapter,
23
- the messages get cached on the consumer side so after the the publishing is complete,
24
- many of the workers will drop off while the remaining ones that have cached messages
25
- will continue.
26
-
27
- Step 4
28
- # cntl-c the rackup process and start it back up. It should come back with
29
- the workers and the config values that have been configured via the browser.
30
-
31
-
32
- Things to try:
33
-
34
-
35
- Expanding / Contracting workers
36
-
37
- Note that after you set a max_count and before you publish, the count of workers will be
38
- 1 as their is just a single worker waiting for data on the queue. Once you publish messages,
39
- the count of workers will grow as needed to handle the message volume up to max_count.
40
-
41
- If you set a value for idle_worker_timeout then the count of workers will go down when there
42
- is no work to be done. Set a timeout and refresh the attributes to see this in action.
43
-
44
-
45
- Monitoring your workers
46
-
47
- Browse to http://localhost:4567/Worker/Bar/timer/attributes.json?reset=true
48
-
49
- Publish some messages (possibly modifying the worker's sleep times first) and browse to that address again.
50
-
51
- If you use a monitoring tool such as munin, nagios, hyperic, etc., you could poll this url periodically to create
52
- a graph or alert for your system. For easy creation of munin graphs and alert withe this framework, see
53
- https://github.com/ClarityServices/ruminate
@@ -1,10 +0,0 @@
1
- class BarWorker
2
- include Qwirk::Worker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
-
6
- def perform(obj)
7
- puts "#{self}: Received #{obj.inspect} at #{Time.now}"
8
- sleep config.sleep_time
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- class BazWorker
2
- include Qwirk::Worker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 10
5
-
6
- def perform(obj)
7
- puts "#{self}: Received #{obj} at #{Time.now}"
8
- sleep config.sleep_time
9
- end
10
- end
@@ -1,14 +0,0 @@
1
- require '../setup'
2
- require './bar_worker'
3
- require './baz_worker'
4
- require './publisher'
5
-
6
- # If we're not starting up a standalone publisher, then start up a manager
7
- if ENV['RACK_ENV'] != 'publisher'
8
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
9
- at_exit { manager.stop }
10
- end
11
- if ENV['RACK_ENV'] != 'worker'
12
- Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
13
- end
14
- run Rumx::Server
@@ -1,49 +0,0 @@
1
- require 'rumx'
2
- require 'qwirk'
3
-
4
- class Publisher
5
- include Rumx::Bean
6
-
7
- bean_attr_accessor :bar_count, :integer, 'Number of Bar messages sent'
8
- bean_attr_accessor :baz_count, :integer, 'Number of Baz messages sent'
9
-
10
- bean_operation :send_bar, :void, 'Send messages to the Bar worker', [
11
- [ :count, :integer, 'Count of messages', 10 ],
12
- [ :message, :string, 'String portion of the message to send', 'Message for Bar' ],
13
- [ :sleep_time, :float, 'Time to sleep between messages', 0.2 ]
14
- ]
15
-
16
- bean_operation :send_baz, :void, 'Send messages to the Baz worker', [
17
- [ :count, :integer, 'Count of messages', 5 ],
18
- [ :message, :string, 'String portion of the message to send', 'Message for Baz' ],
19
- [ :sleep_time, :float, 'Time to sleep between messages', 0.5 ]
20
- ]
21
-
22
- def initialize(adapter_key)
23
- @bar_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'Bar', :marshal => :bson)
24
- @baz_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'Baz', :marshal => :string)
25
-
26
- @bar_count = 0
27
- @baz_count = 0
28
- end
29
-
30
- def send_bar(count, message, sleep_time)
31
- count.times do
32
- @bar_count += 1
33
- obj = {'count' => @bar_count, 'message' => message}
34
- puts "Publishing to Bar object: #{obj.inspect}"
35
- @bar_publisher.publish(obj)
36
- sleep sleep_time
37
- end
38
- end
39
-
40
- def send_baz(count, message, sleep_time)
41
- count.times do
42
- @baz_count += 1
43
- obj = "#{@baz_count}: #{message}"
44
- puts "Publishing to Baz object: #{obj}"
45
- @baz_publisher.publish(obj)
46
- sleep sleep_time
47
- end
48
- end
49
- end
@@ -1,4 +0,0 @@
1
- ---
2
- Bar:
3
- :min_count: 10
4
- ...
Binary file
Binary file
Binary file
data/examples/task/README DELETED
@@ -1,47 +0,0 @@
1
- Step 0
2
- # Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
-
4
- Step 1
5
- # Start up the application
6
- rm -f qwirk_persist.yml
7
- rackup -p 4567
8
-
9
- Step 2
10
- # Browse to http://localhost:4567
11
- # Open up the tree to Worker => Bar => Attributes and click on Attributes
12
- # Change max_count to 100, idle_worker_timeout to 10, and sleep_time to 5 and click Update.
13
-
14
- Step 3
15
- # Open the tree to Publisher => Operations => send_bar and click on send_bar
16
- # Set count to 100 and sleep_time to 0.2 and click Execute.
17
- # Click back on Worker => Bar => Attributes and continue clicking every few seconds. You
18
- should see the count of workers top out at around 25 (5 published messages/sec * 5 secs/worker)
19
- and then 10 seconds after all 100 messages have been read it will drop back down to 1.
20
-
21
- Step 4
22
- # cntl-c the rackup process and start it back up. It should come back with
23
- the workers and the config values that have been configured via the browser.
24
-
25
-
26
- Things to try:
27
-
28
-
29
- Expanding / Contracting workers
30
-
31
- Note that after you set a max_count and before you publish, the count of workers will be
32
- 1 as their is just a single worker waiting for data on the queue. Once you publish messages,
33
- the count of workers will grow as needed to handle the message volume up to max_count.
34
-
35
- If you set a value for idle_worker_timeout then the count of workers will go down when there
36
- is no work to be done. Set a timeout and refresh the attributes to see this in action.
37
-
38
-
39
- Monitoring your workers
40
-
41
- Browse to http://localhost:4567/Worker/Bar/timer/attributes.json?reset=true
42
-
43
- Publish some messages (possibly modifying the worker's sleep times first) and browse to that address again.
44
-
45
- If you use a monitoring tool such as munin, nagios, hyperic, etc., you could poll this url periodically to create
46
- a graph or alert for your system. For easy creation of munin graphs and alert withe this framework, see
47
- https://github.com/ClarityServices/ruminate
@@ -1,14 +0,0 @@
1
- require '../setup'
2
- require './foo_worker'
3
- require './publisher'
4
- require './task'
5
-
6
- # If we're not starting up a standalone publisher, then start up a manager
7
- if ENV['RACK_ENV'] != 'publisher'
8
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
9
- at_exit { manager.stop }
10
- end
11
- if ENV['RACK_ENV'] != 'worker'
12
- Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
13
- end
14
- run Rumx::Server
@@ -1,10 +0,0 @@
1
- class FooWorker
2
- include Qwirk::RequestWorker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
-
6
- def request(hash)
7
- sleep config.sleep_time
8
- '%s%04d' % [hash['message'], hash['count']]
9
- end
10
- end
@@ -1,1000 +0,0 @@
1
- M0001
2
- M0002
3
- M0003
4
- M0004
5
- M0005
6
- M0006
7
- M0007
8
- M0008
9
- M0009
10
- M0010
11
- M0011
12
- M0012
13
- M0013
14
- M0014
15
- M0015
16
- M0016
17
- M0017
18
- M0018
19
- M0019
20
- M0020
21
- M0021
22
- M0022
23
- M0023
24
- M0024
25
- M0025
26
- M0026
27
- M0027
28
- M0028
29
- M0029
30
- M0030
31
- M0031
32
- M0032
33
- M0033
34
- M0034
35
- M0035
36
- M0036
37
- M0037
38
- M0038
39
- M0039
40
- M0040
41
- M0041
42
- M0042
43
- M0043
44
- M0044
45
- M0045
46
- M0046
47
- M0047
48
- M0048
49
- M0049
50
- M0050
51
- M0051
52
- M0052
53
- M0053
54
- M0054
55
- M0055
56
- M0056
57
- M0057
58
- M0058
59
- M0059
60
- M0060
61
- M0061
62
- M0062
63
- M0063
64
- M0064
65
- M0065
66
- M0066
67
- M0067
68
- M0068
69
- M0069
70
- M0070
71
- M0071
72
- M0072
73
- M0073
74
- M0074
75
- M0075
76
- M0076
77
- M0077
78
- M0078
79
- M0079
80
- M0080
81
- M0081
82
- M0082
83
- M0083
84
- M0084
85
- M0085
86
- M0086
87
- M0087
88
- M0088
89
- M0089
90
- M0090
91
- M0091
92
- M0092
93
- M0093
94
- M0094
95
- M0095
96
- M0096
97
- M0097
98
- M0098
99
- M0100
100
- M0099
101
- M0101
102
- M0102
103
- M0103
104
- M0104
105
- M0106
106
- M0105
107
- M0107
108
- M0108
109
- M0109
110
- M0110
111
- M0111
112
- M0112
113
- M0113
114
- M0114
115
- M0115
116
- M0116
117
- M0117
118
- M0118
119
- M0119
120
- M0120
121
- M0121
122
- M0122
123
- M0123
124
- M0124
125
- M0125
126
- M0126
127
- M0127
128
- M0128
129
- M0129
130
- M0130
131
- M0131
132
- M0132
133
- M0133
134
- M0134
135
- M0135
136
- M0136
137
- M0137
138
- M0138
139
- M0139
140
- M0140
141
- M0141
142
- M0142
143
- M0143
144
- M0144
145
- M0145
146
- M0146
147
- M0147
148
- M0148
149
- M0149
150
- M0150
151
- M0151
152
- M0152
153
- M0154
154
- M0153
155
- M0155
156
- M0157
157
- M0156
158
- M0158
159
- M0160
160
- M0159
161
- M0161
162
- M0163
163
- M0162
164
- M0164
165
- M0166
166
- M0165
167
- M0167
168
- M0169
169
- M0168
170
- M0170
171
- M0171
172
- M0172
173
- M0173
174
- M0174
175
- M0175
176
- M0176
177
- M0177
178
- M0178
179
- M0179
180
- M0181
181
- M0180
182
- M0182
183
- M0183
184
- M0184
185
- M0185
186
- M0186
187
- M0187
188
- M0188
189
- M0190
190
- M0189
191
- M0191
192
- M0192
193
- M0193
194
- M0194
195
- M0196
196
- M0195
197
- M0197
198
- M0198
199
- M0199
200
- M0200
201
- M0202
202
- M0201
203
- M0203
204
- M0204
205
- M0205
206
- M0206
207
- M0208
208
- M0207
209
- M0209
210
- M0210
211
- M0211
212
- M0212
213
- M0214
214
- M0213
215
- M0215
216
- M0216
217
- M0217
218
- M0218
219
- M0220
220
- M0219
221
- M0221
222
- M0222
223
- M0223
224
- M0224
225
- M0225
226
- M0226
227
- M0227
228
- M0228
229
- M0229
230
- M0230
231
- M0231
232
- M0232
233
- M0233
234
- M0234
235
- M0235
236
- M0236
237
- M0237
238
- M0238
239
- M0239
240
- M0240
241
- M0241
242
- M0243
243
- M0242
244
- M0244
245
- M0245
246
- M0247
247
- M0246
248
- M0248
249
- M0249
250
- M0250
251
- M0251
252
- M0252
253
- M0253
254
- M0254
255
- M0255
256
- M0256
257
- M0257
258
- M0258
259
- M0259
260
- M0260
261
- M0261
262
- M0263
263
- M0262
264
- M0264
265
- M0265
266
- M0266
267
- M0267
268
- M0268
269
- M0269
270
- M0270
271
- M0271
272
- M0272
273
- M0273
274
- M0274
275
- M0275
276
- M0276
277
- M0277
278
- M0278
279
- M0279
280
- M0280
281
- M0281
282
- M0282
283
- M0283
284
- M0284
285
- M0285
286
- M0286
287
- M0287
288
- M0288
289
- M0289
290
- M0290
291
- M0291
292
- M0292
293
- M0293
294
- M0294
295
- M0295
296
- M0296
297
- M0297
298
- M0298
299
- M0299
300
- M0300
301
- M0301
302
- M0302
303
- M0303
304
- M0304
305
- M0305
306
- M0306
307
- M0307
308
- M0308
309
- M0309
310
- M0310
311
- M0311
312
- M0312
313
- M0313
314
- M0314
315
- M0315
316
- M0316
317
- M0317
318
- M0318
319
- M0319
320
- M0320
321
- M0321
322
- M0322
323
- M0323
324
- M0324
325
- M0325
326
- M0326
327
- M0327
328
- M0328
329
- M0329
330
- M0330
331
- M0331
332
- M0332
333
- M0333
334
- M0334
335
- M0335
336
- M0336
337
- M0337
338
- M0338
339
- M0339
340
- M0340
341
- M0341
342
- M0342
343
- M0343
344
- M0344
345
- M0345
346
- M0346
347
- M0348
348
- M0347
349
- M0349
350
- M0350
351
- M0351
352
- M0352
353
- M0353
354
- M0354
355
- M0356
356
- M0355
357
- M0357
358
- M0358
359
- M0359
360
- M0360
361
- M0361
362
- M0362
363
- M0363
364
- M0364
365
- M0365
366
- M0366
367
- M0367
368
- M0368
369
- M0369
370
- M0370
371
- M0371
372
- M0372
373
- M0373
374
- M0374
375
- M0376
376
- M0375
377
- M0377
378
- M0378
379
- M0379
380
- M0380
381
- M0381
382
- M0382
383
- M0384
384
- M0383
385
- M0385
386
- M0386
387
- M0387
388
- M0388
389
- M0389
390
- M0390
391
- M0392
392
- M0391
393
- M0393
394
- M0394
395
- M0395
396
- M0396
397
- M0397
398
- M0398
399
- M0399
400
- M0400
401
- M0401
402
- M0402
403
- M0403
404
- M0404
405
- M0405
406
- M0406
407
- M0407
408
- M0408
409
- M0409
410
- M0410
411
- M0411
412
- M0412
413
- M0413
414
- M0414
415
- M0415
416
- M0416
417
- M0417
418
- M0418
419
- M0420
420
- M0419
421
- M0421
422
- M0422
423
- M0423
424
- M0424
425
- M0425
426
- M0426
427
- M0427
428
- M0428
429
- M0429
430
- M0430
431
- M0431
432
- M0432
433
- M0433
434
- M0434
435
- M0436
436
- M0435
437
- M0437
438
- M0438
439
- M0439
440
- M0440
441
- M0441
442
- M0442
443
- M0443
444
- M0444
445
- M0445
446
- M0446
447
- M0447
448
- M0448
449
- M0449
450
- M0450
451
- M0451
452
- M0452
453
- M0453
454
- M0454
455
- M0455
456
- M0457
457
- M0456
458
- M0458
459
- M0459
460
- M0460
461
- M0461
462
- M0462
463
- M0463
464
- M0464
465
- M0465
466
- M0467
467
- M0466
468
- M0468
469
- M0469
470
- M0470
471
- M0471
472
- M0472
473
- M0473
474
- M0474
475
- M0475
476
- M0476
477
- M0477
478
- M0478
479
- M0479
480
- M0480
481
- M0481
482
- M0483
483
- M0482
484
- M0484
485
- M0485
486
- M0486
487
- M0487
488
- M0488
489
- M0489
490
- M0490
491
- M0491
492
- M0493
493
- M0492
494
- M0495
495
- M0494
496
- M0496
497
- M0497
498
- M0498
499
- M0499
500
- M0500
501
- M0501
502
- M0502
503
- M0503
504
- M0505
505
- M0504
506
- M0506
507
- M0508
508
- M0507
509
- M0509
510
- M0510
511
- M0511
512
- M0512
513
- M0513
514
- M0515
515
- M0514
516
- M0516
517
- M0517
518
- M0518
519
- M0519
520
- M0520
521
- M0521
522
- M0522
523
- M0523
524
- M0525
525
- M0524
526
- M0526
527
- M0527
528
- M0528
529
- M0529
530
- M0530
531
- M0531
532
- M0533
533
- M0532
534
- M0534
535
- M0535
536
- M0536
537
- M0537
538
- M0538
539
- M0539
540
- M0540
541
- M0541
542
- M0542
543
- M0543
544
- M0544
545
- M0545
546
- M0546
547
- M0548
548
- M0547
549
- M0549
550
- M0550
551
- M0551
552
- M0552
553
- M0553
554
- M0554
555
- M0555
556
- M0556
557
- M0557
558
- M0558
559
- M0559
560
- M0560
561
- M0562
562
- M0563
563
- M0561
564
- M0564
565
- M0565
566
- M0567
567
- M0566
568
- M0568
569
- M0569
570
- M0570
571
- M0571
572
- M0572
573
- M0573
574
- M0575
575
- M0574
576
- M0576
577
- M0578
578
- M0577
579
- M0579
580
- M0580
581
- M0581
582
- M0582
583
- M0583
584
- M0584
585
- M0585
586
- M0586
587
- M0588
588
- M0587
589
- M0589
590
- M0590
591
- M0591
592
- M0592
593
- M0593
594
- M0594
595
- M0595
596
- M0596
597
- M0598
598
- M0597
599
- M0599
600
- M0600
601
- M0601
602
- M0602
603
- M0603
604
- M0604
605
- M0605
606
- M0606
607
- M0607
608
- M0608
609
- M0609
610
- M0610
611
- M0611
612
- M0612
613
- M0613
614
- M0614
615
- M0615
616
- M0616
617
- M0617
618
- M0618
619
- M0619
620
- M0620
621
- M0621
622
- M0622
623
- M0623
624
- M0624
625
- M0625
626
- M0626
627
- M0627
628
- M0628
629
- M0629
630
- M0630
631
- M0631
632
- M0632
633
- M0633
634
- M0634
635
- M0635
636
- M0636
637
- M0637
638
- M0638
639
- M0639
640
- M0640
641
- M0641
642
- M0642
643
- M0643
644
- M0644
645
- M0645
646
- M0646
647
- M0647
648
- M0648
649
- M0649
650
- M0650
651
- M0651
652
- M0652
653
- M0653
654
- M0654
655
- M0655
656
- M0656
657
- M0657
658
- M0658
659
- M0659
660
- M0660
661
- M0661
662
- M0662
663
- M0663
664
- M0664
665
- M0665
666
- M0666
667
- M0668
668
- M0667
669
- M0669
670
- M0670
671
- M0671
672
- M0672
673
- M0673
674
- M0674
675
- M0675
676
- M0676
677
- M0677
678
- M0678
679
- M0679
680
- M0680
681
- M0681
682
- M0682
683
- M0683
684
- M0685
685
- M0684
686
- M0686
687
- M0688
688
- M0687
689
- M0689
690
- M0690
691
- M0691
692
- M0692
693
- M0693
694
- M0694
695
- M0695
696
- M0696
697
- M0697
698
- M0698
699
- M0699
700
- M0700
701
- M0701
702
- M0703
703
- M0702
704
- M0704
705
- M0705
706
- M0707
707
- M0708
708
- M0706
709
- M0709
710
- M0710
711
- M0711
712
- M0712
713
- M0713
714
- M0714
715
- M0715
716
- M0716
717
- M0717
718
- M0718
719
- M0719
720
- M0720
721
- M0721
722
- M0722
723
- M0723
724
- M0724
725
- M0725
726
- M0726
727
- M0728
728
- M0727
729
- M0729
730
- M0730
731
- M0731
732
- M0733
733
- M0732
734
- M0734
735
- M0735
736
- M0736
737
- M0737
738
- M0738
739
- M0739
740
- M0740
741
- M0741
742
- M0742
743
- M0743
744
- M0744
745
- M0746
746
- M0745
747
- M0747
748
- M0749
749
- M0748
750
- M0750
751
- M0752
752
- M0751
753
- M0753
754
- M0754
755
- M0755
756
- M0756
757
- M0757
758
- M0758
759
- M0759
760
- M0760
761
- M0761
762
- M0762
763
- M0763
764
- M0764
765
- M0765
766
- M0766
767
- M0767
768
- M0768
769
- M0769
770
- M0770
771
- M0771
772
- M0772
773
- M0773
774
- M0774
775
- M0775
776
- M0776
777
- M0777
778
- M0779
779
- M0778
780
- M0780
781
- M0781
782
- M0782
783
- M0784
784
- M0783
785
- M0785
786
- M0786
787
- M0787
788
- M0788
789
- M0790
790
- M0789
791
- M0791
792
- M0792
793
- M0793
794
- M0794
795
- M0795
796
- M0797
797
- M0796
798
- M0798
799
- M0799
800
- M0800
801
- M0801
802
- M0802
803
- M0803
804
- M0804
805
- M0805
806
- M0806
807
- M0807
808
- M0808
809
- M0809
810
- M0810
811
- M0811
812
- M0812
813
- M0814
814
- M0813
815
- M0816
816
- M0815
817
- M0817
818
- M0818
819
- M0820
820
- M0821
821
- M0819
822
- M0822
823
- M0823
824
- M0824
825
- M0826
826
- M0825
827
- M0827
828
- M0828
829
- M0829
830
- M0830
831
- M0831
832
- M0832
833
- M0834
834
- M0833
835
- M0835
836
- M0836
837
- M0838
838
- M0837
839
- M0840
840
- M0839
841
- M0841
842
- M0842
843
- M0843
844
- M0844
845
- M0845
846
- M0846
847
- M0847
848
- M0848
849
- M0849
850
- M0850
851
- M0851
852
- M0852
853
- M0853
854
- M0854
855
- M0855
856
- M0856
857
- M0857
858
- M0858
859
- M0859
860
- M0860
861
- M0861
862
- M0862
863
- M0863
864
- M0864
865
- M0865
866
- M0866
867
- M0867
868
- M0868
869
- M0869
870
- M0870
871
- M0871
872
- M0872
873
- M0873
874
- M0874
875
- M0875
876
- M0876
877
- M0877
878
- M0878
879
- M0879
880
- M0880
881
- M0881
882
- M0882
883
- M0883
884
- M0884
885
- M0885
886
- M0886
887
- M0887
888
- M0889
889
- M0888
890
- M0890
891
- M0891
892
- M0892
893
- M0893
894
- M0895
895
- M0894
896
- M0896
897
- M0897
898
- M0898
899
- M0899
900
- M0900
901
- M0901
902
- M0902
903
- M0903
904
- M0904
905
- M0905
906
- M0906
907
- M0907
908
- M0908
909
- M0909
910
- M0910
911
- M0911
912
- M0912
913
- M0913
914
- M0914
915
- M0915
916
- M0916
917
- M0917
918
- M0918
919
- M0919
920
- M0920
921
- M0921
922
- M0922
923
- M0923
924
- M0924
925
- M0925
926
- M0926
927
- M0927
928
- M0928
929
- M0929
930
- M0931
931
- M0930
932
- M0932
933
- M0933
934
- M0934
935
- M0935
936
- M0936
937
- M0937
938
- M0938
939
- M0940
940
- M0939
941
- M0941
942
- M0943
943
- M0942
944
- M0944
945
- M0945
946
- M0946
947
- M0947
948
- M0948
949
- M0949
950
- M0950
951
- M0951
952
- M0952
953
- M0953
954
- M0955
955
- M0956
956
- M0954
957
- M0957
958
- M0958
959
- M0959
960
- M0960
961
- M0962
962
- M0961
963
- M0963
964
- M0964
965
- M0965
966
- M0966
967
- M0968
968
- M0967
969
- M0969
970
- M0970
971
- M0971
972
- M0973
973
- M0972
974
- M0974
975
- M0975
976
- M0976
977
- M0977
978
- M0978
979
- M0979
980
- M0980
981
- M0981
982
- M0983
983
- M0982
984
- M0984
985
- M0985
986
- M0986
987
- M0987
988
- M0988
989
- M0989
990
- M0990
991
- M0991
992
- M0992
993
- M0994
994
- M0993
995
- M0995
996
- M0996
997
- M0997
998
- M0998
999
- M0999
1000
- M1000