net-dns2 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.travis.yml +20 -0
  4. data/CHANGELOG.md +105 -0
  5. data/Gemfile +4 -0
  6. data/README.md +155 -0
  7. data/Rakefile +94 -0
  8. data/THANKS.rdoc +24 -0
  9. data/demo/check_soa.rb +115 -0
  10. data/demo/threads.rb +22 -0
  11. data/lib/net/dns.rb +112 -0
  12. data/lib/net/dns/core_ext.rb +52 -0
  13. data/lib/net/dns/header.rb +713 -0
  14. data/lib/net/dns/names.rb +118 -0
  15. data/lib/net/dns/packet.rb +563 -0
  16. data/lib/net/dns/question.rb +188 -0
  17. data/lib/net/dns/resolver.rb +1313 -0
  18. data/lib/net/dns/resolver/socks.rb +154 -0
  19. data/lib/net/dns/resolver/timeouts.rb +75 -0
  20. data/lib/net/dns/rr.rb +366 -0
  21. data/lib/net/dns/rr/a.rb +124 -0
  22. data/lib/net/dns/rr/aaaa.rb +103 -0
  23. data/lib/net/dns/rr/classes.rb +133 -0
  24. data/lib/net/dns/rr/cname.rb +82 -0
  25. data/lib/net/dns/rr/hinfo.rb +108 -0
  26. data/lib/net/dns/rr/mr.rb +79 -0
  27. data/lib/net/dns/rr/mx.rb +92 -0
  28. data/lib/net/dns/rr/ns.rb +78 -0
  29. data/lib/net/dns/rr/null.rb +53 -0
  30. data/lib/net/dns/rr/ptr.rb +83 -0
  31. data/lib/net/dns/rr/soa.rb +78 -0
  32. data/lib/net/dns/rr/srv.rb +45 -0
  33. data/lib/net/dns/rr/txt.rb +61 -0
  34. data/lib/net/dns/rr/types.rb +193 -0
  35. data/lib/net/dns/version.rb +16 -0
  36. data/net-dns.gemspec +37 -0
  37. data/test/header_test.rb +167 -0
  38. data/test/names_test.rb +21 -0
  39. data/test/packet_test.rb +49 -0
  40. data/test/question_test.rb +83 -0
  41. data/test/resolver_test.rb +117 -0
  42. data/test/rr/a_test.rb +113 -0
  43. data/test/rr/aaaa_test.rb +109 -0
  44. data/test/rr/classes_test.rb +85 -0
  45. data/test/rr/cname_test.rb +97 -0
  46. data/test/rr/hinfo_test.rb +117 -0
  47. data/test/rr/mr_test.rb +105 -0
  48. data/test/rr/mx_test.rb +112 -0
  49. data/test/rr/ns_test.rb +86 -0
  50. data/test/rr/types_test.rb +69 -0
  51. data/test/rr_test.rb +131 -0
  52. data/test/test_helper.rb +4 -0
  53. metadata +158 -0
@@ -0,0 +1,45 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+ class RR
4
+
5
+ #------------------------------------------------------------
6
+ # RR type SRV
7
+ #------------------------------------------------------------
8
+ class SRV < RR
9
+
10
+ attr_reader :priority, :weight, :port, :host
11
+
12
+ private
13
+
14
+ def build_pack
15
+ str = ""
16
+ end
17
+
18
+ def subclass_new_from_binary(data,offset)
19
+ off_end = offset + @rdlength
20
+ @priority, @weight, @port = data.unpack("@#{offset} n n n")
21
+ offset+=6
22
+
23
+ @host=[]
24
+ while offset < off_end
25
+ len = data.unpack("@#{offset} C")[0]
26
+ offset += 1
27
+ str = data[offset..offset+len-1]
28
+ offset += len
29
+ @host << str
30
+ end
31
+ @host=@host.join(".")
32
+ offset
33
+ end
34
+
35
+ private
36
+
37
+ def set_type
38
+ @type = Net::DNS::RR::Types.new("SRV")
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,61 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+ class RR
4
+
5
+ #------------------------------------------------------------
6
+ # RR type TXT
7
+ #------------------------------------------------------------
8
+ class TXT < RR
9
+ attr_reader :txt
10
+
11
+ private
12
+
13
+ def build_pack
14
+ str = ""
15
+ @txt.split(" ").each do |txt|
16
+ str += [txt.length,txt].pack("C a*")
17
+ end
18
+ @txt_pack = str
19
+ @rdlength = @txt_pack.size
20
+ end
21
+
22
+ def get_data
23
+ @txt_pack
24
+ end
25
+
26
+ def subclass_new_from_hash(args)
27
+ if args.has_key? :txt
28
+ @txt = args[:txt].strip
29
+ else
30
+ raise ArgumentError, ":txt field is mandatory but missing"
31
+ end
32
+ end
33
+
34
+ def subclass_new_from_string(str)
35
+ @txt = str.strip
36
+ end
37
+
38
+ def subclass_new_from_binary(data,offset)
39
+ off_end = offset + @rdlength
40
+ @txt = ""
41
+ while offset < off_end
42
+ len = data.unpack("@#{offset} C")[0]
43
+ offset += 1
44
+ str = data[offset..offset+len-1]
45
+ offset += len
46
+ @txt << str << " "
47
+ end
48
+ return offset
49
+ end
50
+
51
+ private
52
+
53
+ def set_type
54
+ @type = Net::DNS::RR::Types.new("TXT")
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,193 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+
4
+ class RR
5
+
6
+ # This is an auxiliary class to handle RR type field in a DNS packet.
7
+ class Types
8
+
9
+ TYPES = {
10
+ 'SIGZERO' => 0, # RFC2931 consider this a pseudo type
11
+ 'A' => 1, # RFC 1035, Section 3.4.1
12
+ 'NS' => 2, # RFC 1035, Section 3.3.11
13
+ 'MD' => 3, # RFC 1035, Section 3.3.4 (obsolete)
14
+ 'MF' => 4, # RFC 1035, Section 3.3.5 (obsolete)
15
+ 'CNAME' => 5, # RFC 1035, Section 3.3.1
16
+ 'SOA' => 6, # RFC 1035, Section 3.3.13
17
+ 'MB' => 7, # RFC 1035, Section 3.3.3
18
+ 'MG' => 8, # RFC 1035, Section 3.3.6
19
+ 'MR' => 9, # RFC 1035, Section 3.3.8
20
+ 'NULL' => 10, # RFC 1035, Section 3.3.10
21
+ 'WKS' => 11, # RFC 1035, Section 3.4.2 (deprecated)
22
+ 'PTR' => 12, # RFC 1035, Section 3.3.12
23
+ 'HINFO' => 13, # RFC 1035, Section 3.3.2
24
+ 'MINFO' => 14, # RFC 1035, Section 3.3.7
25
+ 'MX' => 15, # RFC 1035, Section 3.3.9
26
+ 'TXT' => 16, # RFC 1035, Section 3.3.14
27
+ 'RP' => 17, # RFC 1183, Section 2.2
28
+ 'AFSDB' => 18, # RFC 1183, Section 1
29
+ 'X25' => 19, # RFC 1183, Section 3.1
30
+ 'ISDN' => 20, # RFC 1183, Section 3.2
31
+ 'RT' => 21, # RFC 1183, Section 3.3
32
+ 'NSAP' => 22, # RFC 1706, Section 5
33
+ 'NSAP_PTR' => 23, # RFC 1348 (obsolete)
34
+ # The following 2 RRs are impemented in Net::DNS::SEC, TODO
35
+ 'SIG' => 24, # RFC 2535, Section 4.1
36
+ 'KEY' => 25, # RFC 2535, Section 3.1
37
+ 'PX' => 26, # RFC 2163,
38
+ 'GPOS' => 27, # RFC 1712 (obsolete)
39
+ 'AAAA' => 28, # RFC 1886, Section 2.1
40
+ 'LOC' => 29, # RFC 1876
41
+ # The following RR is implemented in Net::DNS::SEC, TODO
42
+ 'NXT' => 30, # RFC 2535, Section 5.2
43
+ 'EID' => 31, # draft-ietf-nimrod-dns-xx.txt
44
+ 'NIMLOC' => 32, # draft-ietf-nimrod-dns-xx.txt
45
+ 'SRV' => 33, # RFC 2052
46
+ 'ATMA' => 34, # ???
47
+ 'NAPTR' => 35, # RFC 2168
48
+ 'KX' => 36, # RFC 2230
49
+ 'CERT' => 37, # RFC 2538
50
+ 'DNAME' => 39, # RFC 2672
51
+ 'OPT' => 41, # RFC 2671
52
+ # The following 4 RRs are implemented in Net::DNS::SEC TODO
53
+ 'DS' => 43, # draft-ietf-dnsext-delegation-signer
54
+ 'SSHFP' => 44, # draft-ietf-secsh-dns (No RFC # yet at time of coding)
55
+ 'RRSIG' => 46, # draft-ietf-dnsext-dnssec-2535typecode-change
56
+ 'NSEC' => 47, # draft-ietf-dnsext-dnssec-2535typecode-change
57
+ 'DNSKEY' => 48, # draft-ietf-dnsext-dnssec-2535typecode-change
58
+ 'UINFO' => 100, # non-standard
59
+ 'UID' => 101, # non-standard
60
+ 'GID' => 102, # non-standard
61
+ 'UNSPEC' => 103, # non-standard
62
+ 'TKEY' => 249, # RFC 2930
63
+ 'TSIG' => 250, # RFC 2931
64
+ 'IXFR' => 251, # RFC 1995
65
+ 'AXFR' => 252, # RFC 1035
66
+ 'MAILB' => 253, # RFC 1035 (MB, MG, MR)
67
+ 'MAILA' => 254, # RFC 1035 (obsolete - see MX)
68
+ 'ANY' => 255, # RFC 1035
69
+ }
70
+
71
+ # The default value when type is nil in Resource Records
72
+ @@default = TYPES["A"]
73
+
74
+ # Be able to control the default type to assign when
75
+ # type is +nil+. Default to +A+
76
+ def self.default=(str)
77
+ if TYPES.has_key? str
78
+ @@default = TYPES[str]
79
+ else
80
+ raise ArgumentError, "Unknown type #{str}"
81
+ end
82
+ end
83
+
84
+ # Checks whether +type+ is a valid RR type.
85
+ def self.valid?(type)
86
+ case type
87
+ when String
88
+ TYPES.has_key?(type)
89
+ when Fixnum
90
+ TYPES.invert.has_key?(type)
91
+ else
92
+ raise ArgumentError, "Wrong type class: #{type.class}"
93
+ end
94
+ end
95
+
96
+ # Returns the type in string format, as "A" or "NS",
97
+ # given the numeric value
98
+ def self.to_str(type)
99
+ case type
100
+ when Fixnum
101
+ if TYPES.invert.has_key? type
102
+ TYPES.invert[type]
103
+ else
104
+ raise ArgumentError, "Unknown type number #{type}"
105
+ end
106
+ else
107
+ raise ArgumentError, "Wrong type class: #{type.class}"
108
+ end
109
+ end
110
+
111
+ # Gives in output the keys from the +Types+ hash
112
+ # in a format suited for regexps
113
+ def self.regexp
114
+ # Longest ones go first, so the regex engine will match AAAA before A.
115
+ TYPES.keys.sort { |a,b| b.length <=> a.length }.join("|")
116
+ end
117
+
118
+ # Creates a new object representing an RR type. Performs some
119
+ # checks on the argument validity too. Il +type+ is +nil+, the
120
+ # default value is +ANY+ or the one set with Types.default=
121
+ def initialize(type)
122
+ case type
123
+ when String
124
+ # type in the form "A" or "NS"
125
+ new_from_string(type.upcase)
126
+ when Fixnum
127
+ # type in numeric form
128
+ new_from_num(type)
129
+ when nil
130
+ # default type, control with Types.default=
131
+ @str = TYPES.invert[@@default]
132
+ @num = @@default
133
+ else
134
+ raise ArgumentError, "Wrong type class: #{type.class}"
135
+ end
136
+ end
137
+
138
+ # Returns the type in number format
139
+ # (default for normal use)
140
+ def inspect
141
+ @num
142
+ end
143
+
144
+ # Returns the type in string format,
145
+ # i.d. "A" or "NS" or such a string.
146
+ def to_s
147
+ @str
148
+ end
149
+
150
+ # Returns the type in numeric format,
151
+ # usable by the pack methods for data transfers
152
+ def to_i
153
+ @num.to_i
154
+ end
155
+
156
+ def to_str
157
+ @num.to_s
158
+ end
159
+
160
+
161
+ private
162
+
163
+ # Constructor for string data type.
164
+ def new_from_string(type)
165
+ case type
166
+ when /^TYPE\\d+/
167
+ # TODO!!!
168
+ else
169
+ # String with name of type
170
+ if TYPES.has_key? type
171
+ @str = type
172
+ @num = TYPES[type]
173
+ else
174
+ raise ArgumentError, "Unknown type #{type}"
175
+ end
176
+ end
177
+ end
178
+
179
+ # Contructor for numeric data type.
180
+ def new_from_num(type)
181
+ if TYPES.invert.has_key? type
182
+ @num = type
183
+ @str = TYPES.invert[type]
184
+ else
185
+ raise ArgumentError, "Unkown type number #{type}"
186
+ end
187
+ end
188
+
189
+ end
190
+
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,16 @@
1
+ module Net
2
+ module DNS
3
+ module Version
4
+
5
+ MAJOR = 0
6
+ MINOR = 8
7
+ PATCH = 0
8
+ BUILD = nil
9
+
10
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join(".")
11
+ end
12
+
13
+ VERSION = Version::STRING
14
+
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "net-dns2"
5
+ s.version = "0.8.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Marco Ceresa", "Simone Carletti", "Christopher Carpenter"]
9
+ s.date = "2014-05-12"
10
+ s.description = "Net::DNS is a pure Ruby DNS library, with a clean OO interface and an extensible API."
11
+ s.email = ["ceresa@gmail.com", "weppos@weppos.net"]
12
+ s.files = [".gitignore", ".travis.yml", "CHANGELOG.md", "Gemfile", "README.md", "Rakefile", "THANKS.rdoc", "demo/check_soa.rb", "demo/threads.rb", "lib/net/dns.rb", "lib/net/dns/core_ext.rb", "lib/net/dns/header.rb", "lib/net/dns/names.rb", "lib/net/dns/packet.rb", "lib/net/dns/question.rb", "lib/net/dns/resolver.rb", "lib/net/dns/resolver/socks.rb", "lib/net/dns/resolver/timeouts.rb", "lib/net/dns/rr.rb", "lib/net/dns/rr/a.rb", "lib/net/dns/rr/aaaa.rb", "lib/net/dns/rr/classes.rb", "lib/net/dns/rr/cname.rb", "lib/net/dns/rr/hinfo.rb", "lib/net/dns/rr/mr.rb", "lib/net/dns/rr/mx.rb", "lib/net/dns/rr/ns.rb", "lib/net/dns/rr/null.rb", "lib/net/dns/rr/ptr.rb", "lib/net/dns/rr/soa.rb", "lib/net/dns/rr/srv.rb", "lib/net/dns/rr/txt.rb", "lib/net/dns/rr/types.rb", "lib/net/dns/version.rb", "net-dns.gemspec", "test/header_test.rb", "test/names_test.rb", "test/packet_test.rb", "test/question_test.rb", "test/resolver_test.rb", "test/rr/a_test.rb", "test/rr/aaaa_test.rb", "test/rr/classes_test.rb", "test/rr/cname_test.rb", "test/rr/hinfo_test.rb", "test/rr/mr_test.rb", "test/rr/mx_test.rb", "test/rr/ns_test.rb", "test/rr/types_test.rb", "test/rr_test.rb", "test/test_helper.rb"]
13
+ s.homepage = "http://github.com/mordocai/net-dns"
14
+ s.require_paths = ["lib"]
15
+ s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
16
+ s.rubygems_version = "1.0.0"
17
+ s.summary = "Pure Ruby DNS library, fork with fixes."
18
+ s.test_files = ["test/header_test.rb", "test/names_test.rb", "test/packet_test.rb", "test/question_test.rb", "test/resolver_test.rb", "test/rr/a_test.rb", "test/rr/aaaa_test.rb", "test/rr/classes_test.rb", "test/rr/cname_test.rb", "test/rr/hinfo_test.rb", "test/rr/mr_test.rb", "test/rr/mx_test.rb", "test/rr/ns_test.rb", "test/rr/types_test.rb", "test/rr_test.rb", "test/test_helper.rb"]
19
+ s.license = 'Ruby'
20
+
21
+ if s.respond_to? :specification_version then
22
+ s.specification_version = 4
23
+
24
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25
+ s.add_development_dependency(%q<rake>, ["~> 10.0"])
26
+ s.add_development_dependency(%q<yard>, [">= 0"])
27
+ else
28
+ s.add_dependency(%q<rake>, ["~> 10.0"])
29
+ s.add_dependency(%q<yard>, [">= 0"])
30
+ end
31
+ else
32
+ s.add_dependency(%q<rake>, ["~> 10.0"])
33
+ s.add_dependency(%q<yard>, [">= 0"])
34
+ end
35
+
36
+ s.add_runtime_dependency "packetfu"
37
+ end
@@ -0,0 +1,167 @@
1
+ require 'test_helper'
2
+ require 'net/dns/header'
3
+
4
+ class HeaderTest < Test::Unit::TestCase
5
+ include Net::DNS
6
+
7
+ def setup
8
+
9
+ @default = Header.new
10
+ @hash = Header.new(:id => 441,
11
+ :qr => 1,
12
+ :opCode => Header::IQUERY,
13
+ :aa => 1,
14
+ :tc => 1,
15
+ :rd => 0,
16
+ :cd => 0,
17
+ :ad => 0,
18
+ :ra => 1,
19
+ :rCode => Header::RCode::FORMAT,
20
+ :qdCount => 1,
21
+ :anCount => 2,
22
+ :nsCount => 3,
23
+ :arCount => 3)
24
+
25
+ @modified = Header.new
26
+ @modified.id = 442
27
+ @modified.qr = true
28
+ @modified.opCode = Header::IQUERY
29
+ @modified.aa = true
30
+ @modified.tc = true
31
+ @modified.rd = false
32
+ @modified.cd = false
33
+ @modified.ra = true
34
+ @modified.rCode = Header::RCode::FORMAT
35
+ @modified.qdCount = 1
36
+ @modified.anCount = 2
37
+ @modified.nsCount = 3
38
+ @modified.arCount = 3
39
+
40
+ @data = @modified.data
41
+ num = [(@data.unpack("n")[0]+1)].pack("n")
42
+ @data[0],@data[1] = num[0], num[1]
43
+ @binary = Header.parse(@data)
44
+
45
+ end
46
+
47
+ def test_simple
48
+ assert_equal(@default.query?, true)
49
+ assert_equal(@default.response?, false)
50
+ assert_equal(@default.opCode, Header::QUERY)
51
+ assert_equal(@default.auth?, false)
52
+ assert_equal(@default.truncated?, false)
53
+ assert_equal(@default.recursive?, true)
54
+ assert_equal(@default.checking?, true)
55
+ assert_equal(@default.verified?, false)
56
+ assert_equal(@default.r_available?, false)
57
+ assert_equal(@default.rCode.code, Header::RCode::NOERROR)
58
+ assert_equal(@default.qdCount, 1)
59
+ assert_equal(@default.anCount, 0)
60
+ assert_equal(@default.nsCount, 0)
61
+ assert_equal(@default.arCount, 0)
62
+
63
+ assert_equal(@hash.id, 441)
64
+ assert_equal(@hash.query?, false)
65
+ assert_equal(@hash.response?, true)
66
+ assert_equal(@hash.opCode, Header::IQUERY)
67
+ assert_equal(@hash.auth?, true)
68
+ assert_equal(@hash.truncated?, true)
69
+ assert_equal(@hash.recursive?, false)
70
+ assert_equal(@hash.checking?, true)
71
+ assert_equal(@hash.verified?, false)
72
+ assert_equal(@hash.r_available?, true)
73
+ assert_equal(@hash.rCode.code, Header::RCode::FORMAT)
74
+ assert_equal(@hash.qdCount, 1)
75
+ assert_equal(@hash.anCount, 2)
76
+ assert_equal(@hash.nsCount, 3)
77
+ assert_equal(@hash.arCount, 3)
78
+
79
+ assert_equal(@modified.id, 442)
80
+ assert_equal(@modified.query?, false)
81
+ assert_equal(@modified.response?, true)
82
+ assert_equal(@modified.opCode, Header::IQUERY)
83
+ assert_equal(@modified.auth?, true)
84
+ assert_equal(@modified.truncated?, true)
85
+ assert_equal(@modified.recursive?, false)
86
+ assert_equal(@modified.checking?, true)
87
+ assert_equal(@modified.verified?, false)
88
+ assert_equal(@modified.r_available?, true)
89
+ assert_equal(@modified.rCode.code, Header::RCode::FORMAT)
90
+ assert_equal(@modified.qdCount, 1)
91
+ assert_equal(@modified.anCount, 2)
92
+ assert_equal(@modified.nsCount, 3)
93
+ assert_equal(@modified.arCount, 3)
94
+
95
+ assert_equal(@binary.data, @data)
96
+
97
+ assert_equal(@binary.id, 443)
98
+ assert_equal(@binary.query?, false)
99
+ assert_equal(@binary.response?, true)
100
+ assert_equal(@binary.opCode, Header::IQUERY)
101
+ assert_equal(@binary.auth?, true)
102
+ assert_equal(@binary.truncated?, true)
103
+ assert_equal(@binary.recursive?, false)
104
+ assert_equal(@binary.checking?, true)
105
+ assert_equal(@binary.verified?, false)
106
+ assert_equal(@binary.r_available?, true)
107
+ assert_equal(@binary.rCode.code, Header::RCode::FORMAT)
108
+ assert_equal(@binary.qdCount, 1)
109
+ assert_equal(@binary.anCount, 2)
110
+ assert_equal(@binary.nsCount, 3)
111
+ assert_equal(@binary.arCount, 3)
112
+
113
+ assert_raises(ArgumentError) do
114
+ Header.new(Array.new)
115
+ end
116
+ assert_raises(ArgumentError) do
117
+ Header.parse(Array.new)
118
+ end
119
+ assert_raises(ArgumentError) do
120
+ Header.parse("aa")
121
+ end
122
+ assert_raises(ArgumentError) do
123
+ @default.id = 1000000
124
+ end
125
+ assert_raises(ArgumentError) do
126
+ @default.qr=2
127
+ end
128
+ assert_raises(Header::WrongOpcodeError) do
129
+ @default.opCode=4
130
+ end
131
+ assert_raises(ArgumentError) do
132
+ @default.aa=2
133
+ end
134
+ assert_raises(ArgumentError) do
135
+ @default.tc=2
136
+ end
137
+ assert_raises(Header::WrongRecursiveError) do
138
+ @default.recursive=2
139
+ end
140
+ assert_raises(ArgumentError) do
141
+ @default.ra=2
142
+ end
143
+ assert_raises(ArgumentError) do
144
+ @default.cd=2
145
+ end
146
+ assert_raises(ArgumentError) do
147
+ @default.ad=2
148
+ end
149
+ assert_raises(ArgumentError) do
150
+ @default.rCode=46
151
+ end
152
+ assert_raises(Header::WrongCountError) do
153
+ @default.qdCount=100000
154
+ end
155
+ assert_raises(Header::WrongCountError) do
156
+ @default.anCount=100000
157
+ end
158
+ assert_raises(Header::WrongCountError) do
159
+ @default.nsCount=100000
160
+ end
161
+ assert_raises(Header::WrongCountError) do
162
+ @default.arCount=100000
163
+ end
164
+ end
165
+
166
+ end
167
+