radiospiel-app 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -14,6 +14,12 @@ gem "htmlentities"
14
14
  group :development do
15
15
  gem "bundler"
16
16
  gem "jeweler"
17
+
18
+ # vcr stuff: this needs psych or else will crash
19
+ gem "vcr"
20
+ gem "webmock"
21
+ gem "psych"
22
+
17
23
  gem 'simplecov', :require => false
18
24
  gem "ruby-debug19"
19
25
  end
data/Gemfile.lock CHANGED
@@ -1,8 +1,10 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ addressable (2.2.7)
4
5
  archive-tar-minitar (0.5.2)
5
6
  columnize (0.3.6)
7
+ crack (0.3.1)
6
8
  git (1.2.5)
7
9
  htmlentities (4.3.1)
8
10
  jeweler (1.8.3)
@@ -18,6 +20,7 @@ GEM
18
20
  sqlite3
19
21
  multi_json (1.2.0)
20
22
  pg (0.13.2)
23
+ psych (1.3.1)
21
24
  rake (0.9.2.2)
22
25
  rdoc (3.12)
23
26
  json (~> 1.4)
@@ -37,6 +40,10 @@ GEM
37
40
  simplecov-html (~> 0.5.3)
38
41
  simplecov-html (0.5.3)
39
42
  sqlite3 (1.3.5)
43
+ vcr (2.0.1)
44
+ webmock (1.8.5)
45
+ addressable (>= 2.2.7)
46
+ crack (>= 0.1.7)
40
47
 
41
48
  PLATFORMS
42
49
  ruby
@@ -47,7 +54,10 @@ DEPENDENCIES
47
54
  jeweler
48
55
  micro_sql
49
56
  pg
57
+ psych
50
58
  redis
51
59
  ruby-debug19
52
60
  simplecov
53
61
  sqlite3
62
+ vcr
63
+ webmock
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/app.tmproj CHANGED
@@ -12,9 +12,7 @@
12
12
  <key>name</key>
13
13
  <string>app</string>
14
14
  <key>regexFolderFilter</key>
15
- <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
16
- <key>selected</key>
17
- <true/>
15
+ <string>!.*/(\.[^/]*|CVS|_darcs|coverage|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
18
16
  <key>sourceDirectory</key>
19
17
  <string></string>
20
18
  </dict>
data/lib/app.rb CHANGED
@@ -7,3 +7,7 @@ end
7
7
  Dir.glob("#{File.dirname(__FILE__)}/app/*.rb").sort.each do |file|
8
8
  load file
9
9
  end
10
+
11
+ Dir.glob("#{File.dirname(__FILE__)}/extensions/*.rb").sort.each do |file|
12
+ load file
13
+ end
@@ -48,3 +48,12 @@ class String
48
48
  end
49
49
  end
50
50
 
51
+ class String
52
+ def starts_with?(other)
53
+ length >= other.length && self[0, other.length] == other
54
+ end
55
+
56
+ def ends_with?(other)
57
+ length >= other.length && self[length - other.length .. -1] == other
58
+ end
59
+ end
@@ -11,12 +11,28 @@ module Http
11
11
  # the default expiration time for get requests.
12
12
  attr :max_age
13
13
 
14
- def get(url, max_age = HTTP.max_age)
15
- LOGGER.benchmark("[GET] #{url}", :minimum => 20) do
16
- Cache.cached(url, max_age) do
17
- uri = URI(url)
18
- Net::HTTP.get(uri)
19
- end
14
+ def get(url, max_age = self.max_age)
15
+ App.logger.benchmark("[GET] #{url}", :minimum => 20) do
16
+ App.cached(url, max_age) do get_(url) end
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def get_(uri_str, limit = 10)
23
+ raise 'too many redirections' if limit == 0
24
+
25
+ response = Net::HTTP.get_response(URI(uri_str))
26
+
27
+ case response
28
+ when Net::HTTPSuccess then
29
+ response.body
30
+ when Net::HTTPRedirection then
31
+ location = response['location']
32
+ App.logger.debug "redirected to #{location}"
33
+ get_(location, limit - 1)
34
+ else
35
+ response.value
20
36
  end
21
37
  end
22
38
  end
@@ -0,0 +1,110 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "radiospiel-app"
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["radiospiel"]
12
+ s.date = "2012-04-03"
13
+ s.description = "Some basics that your application could benefit from."
14
+ s.email = "eno@open-lab.org"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "app.gemspec",
28
+ "app.tmproj",
29
+ "config/app.yml",
30
+ "lib/app.rb",
31
+ "lib/app/app.rb",
32
+ "lib/app/app/cache.rb",
33
+ "lib/app/app/config.rb",
34
+ "lib/app/app/logger.rb",
35
+ "lib/app/app/root.rb",
36
+ "lib/core-extensions/benchmark-logger.rb",
37
+ "lib/core-extensions/cgi_ext.rb",
38
+ "lib/core-extensions/object_ext.rb",
39
+ "lib/core-extensions/string_ext.rb",
40
+ "lib/core-extensions/string_without_accents.rb",
41
+ "lib/core-extensions/tls.rb",
42
+ "lib/core-extensions/uids.rb",
43
+ "lib/extensions/http.rb",
44
+ "lib/extensions/zz_geocoder.rb",
45
+ "radiospiel-app.gemspec",
46
+ "script/watchr",
47
+ "test/app_test.rb",
48
+ "test/cache_test.rb",
49
+ "test/cgi_ext_test.rb",
50
+ "test/config.yml",
51
+ "test/config_test.rb",
52
+ "test/fixtures-vcr/http_test.yml",
53
+ "test/helper.rb",
54
+ "test/http_test.rb",
55
+ "test/string_ext_test.rb",
56
+ "test/tls_test.rb",
57
+ "test/uid_test.rb"
58
+ ]
59
+ s.homepage = "http://github.com/radiospiel/app"
60
+ s.licenses = ["MIT"]
61
+ s.require_paths = ["lib"]
62
+ s.rubygems_version = "1.8.17"
63
+ s.summary = "Application base code"
64
+
65
+ if s.respond_to? :specification_version then
66
+ s.specification_version = 3
67
+
68
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
69
+ s.add_runtime_dependency(%q<pg>, [">= 0"])
70
+ s.add_runtime_dependency(%q<sqlite3>, [">= 0"])
71
+ s.add_runtime_dependency(%q<redis>, [">= 0"])
72
+ s.add_runtime_dependency(%q<micro_sql>, [">= 0"])
73
+ s.add_runtime_dependency(%q<htmlentities>, [">= 0"])
74
+ s.add_development_dependency(%q<bundler>, [">= 0"])
75
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
76
+ s.add_development_dependency(%q<vcr>, [">= 0"])
77
+ s.add_development_dependency(%q<webmock>, [">= 0"])
78
+ s.add_development_dependency(%q<psych>, [">= 0"])
79
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
80
+ s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
81
+ else
82
+ s.add_dependency(%q<pg>, [">= 0"])
83
+ s.add_dependency(%q<sqlite3>, [">= 0"])
84
+ s.add_dependency(%q<redis>, [">= 0"])
85
+ s.add_dependency(%q<micro_sql>, [">= 0"])
86
+ s.add_dependency(%q<htmlentities>, [">= 0"])
87
+ s.add_dependency(%q<bundler>, [">= 0"])
88
+ s.add_dependency(%q<jeweler>, [">= 0"])
89
+ s.add_dependency(%q<vcr>, [">= 0"])
90
+ s.add_dependency(%q<webmock>, [">= 0"])
91
+ s.add_dependency(%q<psych>, [">= 0"])
92
+ s.add_dependency(%q<simplecov>, [">= 0"])
93
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
94
+ end
95
+ else
96
+ s.add_dependency(%q<pg>, [">= 0"])
97
+ s.add_dependency(%q<sqlite3>, [">= 0"])
98
+ s.add_dependency(%q<redis>, [">= 0"])
99
+ s.add_dependency(%q<micro_sql>, [">= 0"])
100
+ s.add_dependency(%q<htmlentities>, [">= 0"])
101
+ s.add_dependency(%q<bundler>, [">= 0"])
102
+ s.add_dependency(%q<jeweler>, [">= 0"])
103
+ s.add_dependency(%q<vcr>, [">= 0"])
104
+ s.add_dependency(%q<webmock>, [">= 0"])
105
+ s.add_dependency(%q<psych>, [">= 0"])
106
+ s.add_dependency(%q<simplecov>, [">= 0"])
107
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
108
+ end
109
+ end
110
+
data/test/cache_test.rb CHANGED
@@ -2,27 +2,14 @@ require 'helper'
2
2
 
3
3
  class CacheTest < Test::Unit::TestCase
4
4
  def test_caching
5
- unless App::Cache.store
6
- App.logger.warn "No cache configed. Skipping cache tests"
7
- return
8
- end
9
-
10
5
  App::Cache.clear
11
6
 
12
7
  done = 0
13
- r = App.cached("six") do
14
- done += 1
15
- 2 * 3
16
- end
17
8
 
18
- assert_equal(6, r)
9
+ r = App.cached("six") { done += 1; 2 * 3 }
10
+ assert_equal([1, 6], [done, r])
19
11
 
20
- r = App.cached("six") do
21
- done += 1
22
- 2 * 3
23
- end
24
-
25
- assert_equal(1, done)
26
- assert_equal(6, r)
12
+ r = App.cached("six") { done += 1; 2 * 3 }
13
+ assert_equal([1, 6], [done, r])
27
14
  end
28
15
  end
@@ -0,0 +1,389 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://google.de/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ accept:
11
+ - ! '*/*'
12
+ user-agent:
13
+ - Ruby
14
+ response:
15
+ status:
16
+ code: 301
17
+ message: Moved Permanently
18
+ headers:
19
+ !binary "bG9jYXRpb24=":
20
+ - !binary |-
21
+ aHR0cDovL3d3dy5nb29nbGUuZGUv
22
+ !binary "Y29udGVudC10eXBl":
23
+ - !binary |-
24
+ dGV4dC9odG1sOyBjaGFyc2V0PVVURi04
25
+ !binary "ZGF0ZQ==":
26
+ - !binary |-
27
+ VHVlLCAwMyBBcHIgMjAxMiAxMToxMTowNiBHTVQ=
28
+ !binary "ZXhwaXJlcw==":
29
+ - !binary |-
30
+ VGh1LCAwMyBNYXkgMjAxMiAxMToxMTowNiBHTVQ=
31
+ !binary "Y2FjaGUtY29udHJvbA==":
32
+ - !binary |-
33
+ cHVibGljLCBtYXgtYWdlPTI1OTIwMDA=
34
+ !binary "c2VydmVy":
35
+ - !binary |-
36
+ Z3dz
37
+ !binary "Y29udGVudC1sZW5ndGg=":
38
+ - !binary |-
39
+ MjE4
40
+ !binary "eC14c3MtcHJvdGVjdGlvbg==":
41
+ - !binary |-
42
+ MTsgbW9kZT1ibG9jaw==
43
+ !binary "eC1mcmFtZS1vcHRpb25z":
44
+ - !binary |-
45
+ U0FNRU9SSUdJTg==
46
+ body:
47
+ encoding: US-ASCII
48
+ string: ! "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301
49
+ Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A
50
+ HREF=\"http://www.google.de/\">here</A>.\r\n</BODY></HTML>\r\n"
51
+ http_version: '1.1'
52
+ recorded_at: Tue, 03 Apr 2012 11:11:06 GMT
53
+ - request:
54
+ method: get
55
+ uri: http://www.google.de/
56
+ body:
57
+ encoding: US-ASCII
58
+ string: ''
59
+ headers:
60
+ accept:
61
+ - ! '*/*'
62
+ user-agent:
63
+ - Ruby
64
+ response:
65
+ status:
66
+ code: 200
67
+ message: OK
68
+ headers:
69
+ !binary "ZGF0ZQ==":
70
+ - !binary |-
71
+ VHVlLCAwMyBBcHIgMjAxMiAxMToxMTowNyBHTVQ=
72
+ !binary "ZXhwaXJlcw==":
73
+ - !binary |-
74
+ LTE=
75
+ !binary "Y2FjaGUtY29udHJvbA==":
76
+ - !binary |-
77
+ cHJpdmF0ZSwgbWF4LWFnZT0w
78
+ !binary "Y29udGVudC10eXBl":
79
+ - !binary |-
80
+ dGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTE=
81
+ !binary "c2V0LWNvb2tpZQ==":
82
+ - !binary |-
83
+ UFJFRj1JRD0wODQ1ZWFlMzMzOGQwZmI5OkZGPTA6VE09MTMzMzQ1MTQ2NzpM
84
+ TT0xMzMzNDUxNDY3OlM9cEtDQ0liOVZmSmM5SnY1ZzsgZXhwaXJlcz1UaHUs
85
+ IDAzLUFwci0yMDE0IDExOjExOjA3IEdNVDsgcGF0aD0vOyBkb21haW49Lmdv
86
+ b2dsZS5kZQ==
87
+ - !binary |-
88
+ TklEPTU4PVFZd05pTUlUbDMyQVdaMTRwQzNQdVhfeVZSczZEMU9NLVl2dkUt
89
+ WDd5QnNjeXR2aU9XeFlCU3hlQ19GbHZxbm5uYS1qLVh1aVdyS0tUU2plQnVU
90
+ cmhfU1NzSE94QVc2MmJtbV9sSWVuWnFlY05wUmRQd2xkYVJWaHNfTUhSbW9n
91
+ OyBleHBpcmVzPVdlZCwgMDMtT2N0LTIwMTIgMTE6MTE6MDcgR01UOyBwYXRo
92
+ PS87IGRvbWFpbj0uZ29vZ2xlLmRlOyBIdHRwT25seQ==
93
+ !binary "cDNw":
94
+ - !binary |-
95
+ Q1A9IlRoaXMgaXMgbm90IGEgUDNQIHBvbGljeSEgU2VlIGh0dHA6Ly93d3cu
96
+ Z29vZ2xlLmNvbS9zdXBwb3J0L2FjY291bnRzL2Jpbi9hbnN3ZXIucHk/aGw9
97
+ ZW4mYW5zd2VyPTE1MTY1NyBmb3IgbW9yZSBpbmZvLiI=
98
+ !binary "c2VydmVy":
99
+ - !binary |-
100
+ Z3dz
101
+ !binary "eC14c3MtcHJvdGVjdGlvbg==":
102
+ - !binary |-
103
+ MTsgbW9kZT1ibG9jaw==
104
+ !binary "eC1mcmFtZS1vcHRpb25z":
105
+ - !binary |-
106
+ U0FNRU9SSUdJTg==
107
+ !binary "dHJhbnNmZXItZW5jb2Rpbmc=":
108
+ - !binary |-
109
+ Y2h1bmtlZA==
110
+ body:
111
+ encoding: ASCII-8BIT
112
+ string: !binary |-
113
+ PCFkb2N0eXBlIGh0bWw+PGh0bWwgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRw
114
+ Oi8vc2NoZW1hLm9yZy9XZWJQYWdlIj48aGVhZD48bWV0YSBodHRwLWVxdWl2
115
+ PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1J
116
+ U08tODg1OS0xIj48bWV0YSBpdGVtcHJvcD0iaW1hZ2UiIGNvbnRlbnQ9Ii9p
117
+ bWFnZXMvZ29vZ2xlX2Zhdmljb25fMTI4LnBuZyI+PHRpdGxlPkdvb2dsZTwv
118
+ dGl0bGU+PHNjcmlwdD53aW5kb3cuZ29vZ2xlPXtrRUk6Ink5cDZUOXo3QVlI
119
+ MnNnYWU3ZkNrQ0EiLGdldEVJOmZ1bmN0aW9uKGEpe3ZhciBiO3doaWxlKGEm
120
+ JiEoYS5nZXRBdHRyaWJ1dGUmJihiPWEuZ2V0QXR0cmlidXRlKCJlaWQiKSkp
121
+ KWE9YS5wYXJlbnROb2RlO3JldHVybiBifHxnb29nbGUua0VJfSxodHRwczpm
122
+ dW5jdGlvbigpe3JldHVybiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w9PSJo
123
+ dHRwczoifSxrRVhQSToiMzY2ODMsMzY4ODgsMzY5MzQsMzc1MDEsMzc1NzMs
124
+ Mzc2NDYsMzc2NzUsMzc2ODIsMzc4NTgsMzc5NTIsMzc5OTQsMzgxMDgiLGtD
125
+ U0k6e2U6IjM2NjgzLDM2ODg4LDM2OTM0LDM3NTAxLDM3NTczLDM3NjQ2LDM3
126
+ Njc1LDM3NjgyLDM3ODU4LDM3OTUyLDM3OTk0LDM4MTA4IixlaToieTlwNlQ5
127
+ ejdBWUgyc2dhZTdmQ2tDQSJ9LGF1dGh1c2VyOjAsCm1sOmZ1bmN0aW9uKCl7
128
+ fSxrSEw6ImRlIix0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5n
129
+ ZXRUaW1lKCl9LGxvZzpmdW5jdGlvbihhLGIsYyxlKXt2YXIgZD1uZXcgSW1h
130
+ Z2UsaD1nb29nbGUsaT1oLmxjLGY9aC5saSxqPSIiO2Qub25lcnJvcj0oZC5v
131
+ bmxvYWQ9KGQub25hYm9ydD1mdW5jdGlvbigpe2RlbGV0ZSBpW2ZdfSkpO2lb
132
+ Zl09ZDtpZighYyYmYi5zZWFyY2goIiZlaT0iKT09LTEpaj0iJmVpPSIrZ29v
133
+ Z2xlLmdldEVJKGUpO3ZhciBnPWN8fCIvZ2VuXzIwND9hdHlwPWkmY3Q9Iith
134
+ KyImY2FkPSIrYitqKyImeng9Iitnb29nbGUudGltZSgpOwp2YXIgaz0vXmh0
135
+ dHA6L2k7aWYoay50ZXN0KGcpJiZnb29nbGUuaHR0cHMoKSl7Z29vZ2xlLm1s
136
+ KG5ldyBFcnJvcigiR0xNTSIpLGZhbHNlLHtzcmM6Z30pO2RlbGV0ZSBpW2Zd
137
+ O3JldHVybn1kLnNyYz1nO2gubGk9ZisxfSxsYzpbXSxsaTowLFRvb2xiZWx0
138
+ Ont9LHk6e30seDpmdW5jdGlvbihhLGIpe2dvb2dsZS55W2EuaWRdPVthLGJd
139
+ O3JldHVybiBmYWxzZX19Owp3aW5kb3cuZ29vZ2xlLnNuPSJ3ZWJocCI7d2lu
140
+ ZG93Lmdvb2dsZS50aW1lcnM9e307d2luZG93Lmdvb2dsZS5zdGFydFRpY2s9
141
+ ZnVuY3Rpb24oYSxiKXt3aW5kb3cuZ29vZ2xlLnRpbWVyc1thXT17dDp7c3Rh
142
+ cnQ6KG5ldyBEYXRlKS5nZXRUaW1lKCl9LGJmcjohKCFiKX19O3dpbmRvdy5n
143
+ b29nbGUudGljaz1mdW5jdGlvbihhLGIsYyl7aWYoIXdpbmRvdy5nb29nbGUu
144
+ dGltZXJzW2FdKWdvb2dsZS5zdGFydFRpY2soYSk7d2luZG93Lmdvb2dsZS50
145
+ aW1lcnNbYV0udFtiXT1jfHwobmV3IERhdGUpLmdldFRpbWUoKX07Z29vZ2xl
146
+ LnN0YXJ0VGljaygibG9hZCIsdHJ1ZSk7dHJ5e31jYXRjaCh1KXt9CnZhciBf
147
+ Z2p3bD1sb2NhdGlvbjtmdW5jdGlvbiBfZ2p1Yygpe3ZhciBlPV9nandsLmhy
148
+ ZWYuaW5kZXhPZigiIyIpO2lmKGU+PTApe3ZhciBhPV9nandsLmhyZWYuc3Vi
149
+ c3RyaW5nKGUpO2lmKGEuaW5kZXhPZigiJnE9Iik+MHx8YS5pbmRleE9mKCIj
150
+ cT0iKT49MCl7YT1hLnN1YnN0cmluZygxKTtpZihhLmluZGV4T2YoIiMiKT09
151
+ LTEpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7KXt2YXIgZD1jO2lmKGEuY2hh
152
+ ckF0KGQpPT0iJiIpKytkO3ZhciBiPWEuaW5kZXhPZigiJiIsZCk7aWYoYj09
153
+ LTEpYj1hLmxlbmd0aDt2YXIgZj1hLnN1YnN0cmluZyhkLGIpO2lmKGYuaW5k
154
+ ZXhPZigiZnA9Iik9PTApe2E9YS5zdWJzdHJpbmcoMCxjKSthLnN1YnN0cmlu
155
+ ZyhiLGEubGVuZ3RoKTtiPWN9ZWxzZSBpZihmPT0iY2FkPWgiKXJldHVybiAw
156
+ O2M9Yn1fZ2p3bC5ocmVmPSIvc2VhcmNoPyIrYSsiJmNhZD1oIjtyZXR1cm4g
157
+ MX19fXJldHVybiAwfWZ1bmN0aW9uIF9nanAoKXshKHdpbmRvdy5fZ2p3bC5o
158
+ YXNoJiYKd2luZG93Ll9nanVjKCkpJiZzZXRUaW1lb3V0KF9nanAsNTAwKX07
159
+ CndpbmRvdy5fZ2pwICYmIF9nanAoKTwvc2NyaXB0PjxzdHlsZT4jZ2Jhciwj
160
+ Z3VzZXJ7Zm9udC1zaXplOjEzcHg7cGFkZGluZy10b3A6MXB4ICFpbXBvcnRh
161
+ bnQ7fSNnYmFye2hlaWdodDoyMnB4fSNndXNlcntwYWRkaW5nLWJvdHRvbTo3
162
+ cHggIWltcG9ydGFudDt0ZXh0LWFsaWduOnJpZ2h0fS5nYmgsLmdiZHtib3Jk
163
+ ZXItdG9wOjFweCBzb2xpZCAjYzlkN2YxO2ZvbnQtc2l6ZToxcHh9LmdiaHto
164
+ ZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjRweDt3aWR0aDoxMDAl
165
+ fUBtZWRpYSBhbGx7LmdiMXtoZWlnaHQ6MjJweDttYXJnaW4tcmlnaHQ6LjVl
166
+ bTt2ZXJ0aWNhbC1hbGlnbjp0b3B9I2diYXJ7ZmxvYXQ6bGVmdH19YS5nYjEs
167
+ YS5nYjR7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSAhaW1wb3J0YW50fWEu
168
+ Z2IxLGEuZ2I0e2NvbG9yOiMwMGMgIWltcG9ydGFudH08L3N0eWxlPjxzdHls
169
+ ZSBpZD1nc3R5bGU+Ym9keXttYXJnaW46MDtvdmVyZmxvdy15OnNjcm9sbH0j
170
+ Z29ne3BhZGRpbmc6M3B4IDhweCAwfXRke2xpbmUtaGVpZ2h0Oi44ZW19Lmdh
171
+ Y19tIHRke2xpbmUtaGVpZ2h0OjE3cHh9Zm9ybXttYXJnaW4tYm90dG9tOjIw
172
+ cHh9Ym9keSx0ZCxhLHAsLmh7Zm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJp
173
+ Zn0uaHtjb2xvcjojMzZjO2ZvbnQtc2l6ZToyMHB4fS5xe2NvbG9yOiMwMGN9
174
+ LnRzIHRke3BhZGRpbmc6MH0udHN7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNl
175
+ fWVte2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHlsZTpub3JtYWx9LmxzdHto
176
+ ZWlnaHQ6MjVweDt3aWR0aDo0OTZweH0uZ3NmaSwubHN0e2ZvbnQ6MThweCBh
177
+ cmlhbCxzYW5zLXNlcmlmfS5nc2Zze2ZvbnQ6MTdweCBhcmlhbCxzYW5zLXNl
178
+ cmlmfS5kc3tkaXNwbGF5Oi1tb3otaW5saW5lLWJveDtkaXNwbGF5OmlubGlu
179
+ ZS1ibG9jazttYXJnaW46M3B4IDAgNHB4O21hcmdpbi1sZWZ0OjRweH1pbnB1
180
+ dHtmb250LWZhbWlseTppbmhlcml0fWEuZ2IxLGEuZ2IyLGEuZ2IzLGEuZ2I0
181
+ e2NvbG9yOiMxMWMgIWltcG9ydGFudH1ib2R5e2JhY2tncm91bmQ6I2ZmZjtj
182
+ b2xvcjpibGFja31he2NvbG9yOiMxMWM7dGV4dC1kZWNvcmF0aW9uOm5vbmV9
183
+ YTpob3ZlcixhOmFjdGl2ZXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5m
184
+ bCBhe2NvbG9yOiMzNmN9YTp2aXNpdGVke2NvbG9yOiM1NTFhOGJ9YS5nYjEs
185
+ YS5nYjR7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hLmdiMzpob3Zlcnt0
186
+ ZXh0LWRlY29yYXRpb246bm9uZX0jZ2hlYWQgYS5nYjI6aG92ZXJ7Y29sb3I6
187
+ I2ZmZiFpbXBvcnRhbnR9LnNibGN7cGFkZGluZy10b3A6NXB4fS5zYmxjIGF7
188
+ ZGlzcGxheTpibG9jazttYXJnaW46MnB4IDA7bWFyZ2luLWxlZnQ6MTNweDtm
189
+ b250LXNpemU6MTFweDt9LmxzYmJ7YmFja2dyb3VuZDojZWVlO2JvcmRlcjpz
190
+ b2xpZCAxcHg7Ym9yZGVyLWNvbG9yOiNjY2MgIzk5OSAjOTk5ICNjY2M7aGVp
191
+ Z2h0OjMwcHg7ZGlzcGxheTpibG9ja30uZnRsLCNmbGwgYXtkaXNwbGF5Omlu
192
+ bGluZS1ibG9jazttYXJnaW46MCAxMnB4fS5sc2J7YmFja2dyb3VuZDp1cmwo
193
+ L2ltYWdlcy9zcnByL25hdl9sb2dvODAucG5nKSAwIC0yNThweCByZXBlYXQt
194
+ eDtib3JkZXI6bm9uZTtjb2xvcjojMDAwO2N1cnNvcjpwb2ludGVyO2hlaWdo
195
+ dDozMHB4O21hcmdpbjowO291dGxpbmU6MDtmb250OjE1cHggYXJpYWwsc2Fu
196
+ cy1zZXJpZjt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmxzYjphY3RpdmV7YmFja2dy
197
+ b3VuZDojY2NjfS5sc3Q6Zm9jdXN7b3V0bGluZTpub25lfSNhZGRsYW5nIGF7
198
+ cGFkZGluZzowIDNweH0uZ2FjX3YgZGl2e2Rpc3BsYXk6bm9uZX0uZ2FjX3Yg
199
+ LmdhY192MiwuZ2FjX2J0e2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fXRhYmxl
200
+ Lmdzc2JfY3t6LWluZGV4Ojk4NiAgfS5uYmNse2JhY2tncm91bmQ6dXJsKC9p
201
+ bWFnZXMvc3Jwci9uYXZfbG9nbzgwLnBuZykgbm8tcmVwZWF0IDtoZWlnaHQ6
202
+ cHg7d2lkdGg6cHh9PC9zdHlsZT48c2NyaXB0PihmdW5jdGlvbigpewp2YXIg
203
+ aD0wLGksaj1wYXJzZUludCgiMSIpO2Z1bmN0aW9uIF9tbFRva2VuKGEsZCxl
204
+ LGIpe2lmKGo8MCl7aWYod2luZG93LmNvbnNvbGUpd2luZG93LmNvbnNvbGUu
205
+ bG9nKCJqY2F0Y2hlciBleGNlcHRpb246ICIsYSwiIERhdGE6ICIsZSk7aWYo
206
+ aj09LTIpdGhyb3cgYTtyZXR1cm4gbnVsbH1pZighYXx8IWEubWVzc2FnZXx8
207
+ YS5tZXNzYWdlPT0iRXJyb3IgbG9hZGluZyBzY3JpcHQiKXJldHVybiBudWxs
208
+ O2lmKCFrKCkmJiFiKXJldHVybiBudWxsO2grKztpZihkKWk9YSYmYS5tZXNz
209
+ YWdlO3ZhciBjPWwoYSwiL2dlbl8yMDQ/YXR5cD1pIixlfHx7fSksZj1nb29n
210
+ bGUuX2FlbShhLGMpO2lmKCFiKWdvb2dsZS5sb2coMCwwLGYpO3JldHVybiBm
211
+ fWdvb2dsZS5tbD1fbWxUb2tlbjtmdW5jdGlvbiBrKCl7cmV0dXJuIGg8MX1m
212
+ dW5jdGlvbiBsKGEsZCxlKXt2YXIgYj1lbmNvZGVVUklDb21wb25lbnQsYz1b
213
+ ZCwiJmVpPSIsYihnb29nbGUua0VJKSwiJmpleHBpZD0iLApiKGdvb2dsZS5r
214
+ RVhQSSksIiZzcmNwZz0iLGIoImhwIiksIiZqc3I9IixiKCIxIiksIiZidmVy
215
+ PSIsYigiMjMyIildO2Zvcih2YXIgZiBpbiBlKXtjLnB1c2goIiYiKTtjLnB1
216
+ c2goYihmKSk7Yy5wdXNoKCI9Iik7Yy5wdXNoKGIoZVtmXSkpfWMucHVzaCgi
217
+ JmVtc2c9Iik7Yy5wdXNoKGIoYS5uYW1lKyI6ICIrYS5tZXNzYWdlKSk7dmFy
218
+ IGc9Yy5qb2luKCIiKTtpZihnb29nbGUuX2l0bChnKSlnPWcuc3Vic3RyKDAs
219
+ MjAwMCk7cmV0dXJuIGd9Z29vZ2xlLl9pdGw9ZnVuY3Rpb24oYSl7cmV0dXJu
220
+ IGEubGVuZ3RoPj0yMDAwfTtnb29nbGUuX2FlbT1mdW5jdGlvbihhLGQpe3Jl
221
+ dHVybiBkfTtmdW5jdGlvbiBfb25FcnJvclRva2VuKGEpe2lmKGkhPT1hKWdv
222
+ b2dsZS5tbChuZXcgRXJyb3IoYSksZmFsc2UpO2k9bnVsbDtpZighaygpKXdp
223
+ bmRvdy5vbmVycm9yPW51bGx9d2luZG93Lm9uZXJyb3I9X29uRXJyb3JUb2tl
224
+ bjsKfSkoKTsKd2luZG93LnJ3dD1mdW5jdGlvbihhLGYsZyxsLG0saCxjLG4s
225
+ aSl7dHJ5e2lmKGE9PT13aW5kb3cpe2E9d2luZG93LmV2ZW50LnNyY0VsZW1l
226
+ bnQ7d2hpbGUoYSl7aWYoYS5ocmVmKWJyZWFrO2E9YS5wYXJlbnROb2RlfX12
227
+ YXIgYj1lbmNvZGVVUklDb21wb25lbnR8fGVzY2FwZSxkO2Q9YS5nZXRBdHRy
228
+ aWJ1dGUoImhyZWYiKTtpZihjJiZjLnN1YnN0cmluZygwLDYpIT0iJnNpZzI9
229
+ IiljPSImc2lnMj0iK2M7dmFyIG89WyIvdXJsP3NhPXQiLCIiLCImY2Q9Iixi
230
+ KG0pLGk/IiZhdXRodXNlcj0iK2IoaSk6IiIsZ29vZ2xlLmomJmdvb2dsZS5q
231
+ LnBmPyImc3FpPTIiOiIiLCImdmVkPSIsYihuKSwiJnVybD0iLGIoZCkucmVw
232
+ bGFjZSgvXCsvZywiJTJCIiksIiZlaT0iLCJ5OXA2VDl6N0FZSDJzZ2FlN2ZD
233
+ a0NBIixoPyImdXNnPSIraDoiIixjXS5qb2luKCIiKTthLmhyZWY9bzthLm9u
234
+ bW91c2Vkb3duPSIifWNhdGNoKHApe31yZXR1cm4gdHJ1ZX07Cjwvc2NyaXB0
235
+ PjwvaGVhZD48Ym9keSBiZ2NvbG9yPSNmZmZmZmYgdGV4dD0jMDAwMDAwIGxp
236
+ bms9IzAwMDBjYyB2bGluaz0jNTUxYThiIGFsaW5rPSNmZjAwMDAgb25sb2Fk
237
+ PSJkb2N1bWVudC5mJiZkb2N1bWVudC5mLnEuZm9jdXMoKTtkb2N1bWVudC5n
238
+ YnFmJiZkb2N1bWVudC5nYnFmLnEuZm9jdXMoKTtpZihkb2N1bWVudC5pbWFn
239
+ ZXMpbmV3IEltYWdlKCkuc3JjPScvaW1hZ2VzL3NycHIvbmF2X2xvZ284MC5w
240
+ bmcnIiA+PHRleHRhcmVhIGlkPWNzaSBzdHlsZT1kaXNwbGF5Om5vbmU+PC90
241
+ ZXh0YXJlYT48ZGl2IGlkPW1uZ2I+PGRpdiBpZD1nYmFyPjxub2JyPjxiIGNs
242
+ YXNzPWdiMT5TdWNoZTwvYj4gPGEgY2xhc3M9Z2IxIGhyZWY9Imh0dHA6Ly93
243
+ d3cuZ29vZ2xlLmRlL2ltZ2hwP2hsPWRlJnRhYj13aSI+QmlsZGVyPC9hPiA8
244
+ YSBjbGFzcz1nYjEgaHJlZj0iaHR0cDovL3ZpZGVvLmdvb2dsZS5kZS8/aGw9
245
+ ZGUmdGFiPXd2Ij5WaWRlb3M8L2E+IDxhIGNsYXNzPWdiMSBocmVmPSJodHRw
246
+ Oi8vbWFwcy5nb29nbGUuZGUvbWFwcz9obD1kZSZ0YWI9d2wiPk1hcHM8L2E+
247
+ IDxhIGNsYXNzPWdiMSBocmVmPSJodHRwOi8vbmV3cy5nb29nbGUuZGUvbndz
248
+ aHA/aGw9ZGUmdGFiPXduIj5OZXdzPC9hPiA8YSBjbGFzcz1nYjEgaHJlZj0i
249
+ aHR0cDovL3d3dy5nb29nbGUuZGUvc2hvcHBpbmc/aGw9ZGUmdGFiPXdmIj5T
250
+ aG9wcGluZzwvYT4gPGEgY2xhc3M9Z2IxIGhyZWY9Imh0dHBzOi8vbWFpbC5n
251
+ b29nbGUuY29tL21haWwvP3RhYj13bSI+TWFpbDwvYT4gPGEgY2xhc3M9Z2Ix
252
+ IHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZSIgaHJlZj0iaHR0cDovL3d3
253
+ dy5nb29nbGUuZGUvaW50bC9kZS9vcHRpb25zLyI+PHU+TWVocjwvdT4gJnJh
254
+ cXVvOzwvYT48L25vYnI+PC9kaXY+PGRpdiBpZD1ndXNlciB3aWR0aD0xMDAl
255
+ Pjxub2JyPjxzcGFuIGlkPWdibiBjbGFzcz1nYmk+PC9zcGFuPjxzcGFuIGlk
256
+ PWdiZiBjbGFzcz1nYmY+PC9zcGFuPjxzcGFuIGlkPWdiZT48YSAgaHJlZj0i
257
+ L3VybD9zYT1wJnByZWY9aWcmcHZhbD0zJnE9aHR0cDovL3d3dy5nb29nbGUu
258
+ ZGUvaWclM0ZobCUzRGRlJTI2c291cmNlJTNEaWdsayZ1c2c9QUZRakNORmpm
259
+ UGF2UlBCSnJPS0pTM01CMnV6aHBmTjZ6dyIgY2xhc3M9Z2I0PmlHb29nbGU8
260
+ L2E+IHwgPC9zcGFuPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmRlL2hp
261
+ c3Rvcnkvb3B0b3V0P2hsPWRlIiBjbGFzcz1nYjQ+V2VicHJvdG9rb2xsPC9h
262
+ PiB8IDxhICBocmVmPSIvcHJlZmVyZW5jZXM/aGw9ZGUiIGNsYXNzPWdiND5F
263
+ aW5zdGVsbHVuZ2VuPC9hPiB8IDxhIGlkPWdiXzcwIGhyZWY9Imh0dHBzOi8v
264
+ YWNjb3VudHMuZ29vZ2xlLmNvbS9TZXJ2aWNlTG9naW4/aGw9ZGUmY29udGlu
265
+ dWU9aHR0cDovL3d3dy5nb29nbGUuZGUvIiBjbGFzcz1nYjQ+QW5tZWxkZW48
266
+ L2E+PC9ub2JyPjwvZGl2PjxkaXYgY2xhc3M9Z2JoIHN0eWxlPWxlZnQ6MD48
267
+ L2Rpdj48ZGl2IGNsYXNzPWdiaCBzdHlsZT1yaWdodDowPjwvZGl2PjwvZGl2
268
+ PjxjZW50ZXI+PGJyIGNsZWFyPWFsbCBpZD1sZ3BkPjxkaXYgaWQ9bGdhPjxk
269
+ aXYgc3R5bGU9InBhZGRpbmc6MjhweCAwIDNweCI+PGRpdiBhbGlnbj1sZWZ0
270
+ IHN0eWxlPSJiYWNrZ3JvdW5kOnVybCgvaW1hZ2VzL3NycHIvbG9nbzF3LnBu
271
+ Zykgbm8tcmVwZWF0O2hlaWdodDoxMTBweDt3aWR0aDoyNzZweCIgdGl0bGU9
272
+ Ikdvb2dsZSIgaWQ9aHBsb2dvIG9ubG9hZD0id2luZG93LmxvbCYmbG9sKCki
273
+ PjxkaXYgbm93cmFwIHN0eWxlPSJjb2xvcjojNzc3O2ZvbnQtc2l6ZToxNnB4
274
+ O2ZvbnQtd2VpZ2h0OmJvbGQ7bGVmdDoyMTRweDtwb3NpdGlvbjpyZWxhdGl2
275
+ ZTt0b3A6NzBweCI+RGV1dHNjaGxhbmQ8L2Rpdj48L2Rpdj48L2Rpdj48YnI+
276
+ PC9kaXY+PGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBuYW1lPWY+PHRhYmxlIGNl
277
+ bGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD48dHIgdmFsaWduPXRvcD48dGQg
278
+ d2lkdGg9MjUlPiZuYnNwOzwvdGQ+PHRkIGFsaWduPWNlbnRlciBub3dyYXA+
279
+ PGlucHV0IG5hbWU9aGwgdHlwZT1oaWRkZW4gdmFsdWU9ZGU+PGlucHV0IG5h
280
+ bWU9c291cmNlIHR5cGU9aGlkZGVuIHZhbHVlPWhwPjxpbnB1dCB0eXBlPWhp
281
+ ZGRlbiBuYW1lPWllIHZhbHVlPSJJU08tODg1OS0xIj48ZGl2IGNsYXNzPWRz
282
+ IHN0eWxlPSJoZWlnaHQ6MzJweDttYXJnaW46NHB4IDAiPjxpbnB1dCBhdXRv
283
+ Y29tcGxldGU9b2ZmIG1heGxlbmd0aD0yMDQ4IG5hbWU9cSBjbGFzcz0ibHN0
284
+ IiB0aXRsZT0iR29vZ2xlLVN1Y2hlIiB2YWx1ZT0iIiBzaXplPTU3IHN0eWxl
285
+ PSJjb2xvcjojMDAwO21hcmdpbjowO3BhZGRpbmc6NXB4IDhweCAwIDZweDt2
286
+ ZXJ0aWNhbC1hbGlnbjp0b3AiPjwvZGl2PjxiciBzdHlsZT0ibGluZS1oZWln
287
+ aHQ6MCI+PHNwYW4gY2xhc3M9ZHMgPjxzcGFuIGNsYXNzPWxzYmI+PGlucHV0
288
+ IG5hbWU9YnRuRyB0eXBlPXN1Ym1pdCB2YWx1ZT0iR29vZ2xlLVN1Y2hlIiBj
289
+ bGFzcz1sc2I+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1kcz48c3BhbiBj
290
+ bGFzcz1sc2JiPjxpbnB1dCBuYW1lPWJ0bkkgdHlwZT1zdWJtaXQgY2xhc3M9
291
+ bHNiIHZhbHVlPSJBdWYgZ3V0IEds/GNrISI+PC9zcGFuPjwvc3Bhbj48L3Rk
292
+ Pjx0ZCBub3dyYXAgd2lkdGg9MjUlIGFsaWduPWxlZnQgY2xhc3M9ImZsIHNi
293
+ bGMiPjxhIGhyZWY9Ii9hZHZhbmNlZF9zZWFyY2g/aGw9ZGUiPkVyd2VpdGVy
294
+ dGUgU3VjaGU8L2E+PGEgaHJlZj0iL2xhbmd1YWdlX3Rvb2xzP2hsPWRlIj5T
295
+ cHJhY2hvcHRpb25lbjwvYT48L3RkPjwvdHI+PC90YWJsZT48aW5wdXQgdHlw
296
+ ZT1oaWRkZW4gaWQ9Z2J2IG5hbWU9Z2J2IHZhbHVlPSIxIj48L2Zvcm0+PGRp
297
+ diBzdHlsZT0iZm9udC1zaXplOjgzJTttaW4taGVpZ2h0OjMuNWVtIj48YnI+
298
+ PC9kaXY+PHNwYW4gaWQ9Zm9vdGVyPjxjZW50ZXIgaWQ9ZmN0cj48ZGl2IHN0
299
+ eWxlPSJmb250LXNpemU6MTBwdCI+PGRpdiBpZD1mbGwgc3R5bGU9Im1hcmdp
300
+ bjoxOXB4IGF1dG87dGV4dC1hbGlnbjpjZW50ZXIiPjxhIGhyZWY9Ii9pbnRs
301
+ L2RlL2Fkcy8iPldlcmJlbiBtaXQgR29vZ2xlPC9hPjxhIGhyZWY9Ii9zZXJ2
302
+ aWNlcy8iPlVudGVybmVobWVuc2FuZ2Vib3RlPC9hPjxhIGhyZWY9Ii9pbnRs
303
+ L2RlL2Fib3V0Lmh0bWwiPtxiZXIgR29vZ2xlPC9hPjxhIGhyZWY9Imh0dHA6
304
+ Ly93d3cuZ29vZ2xlLmNvbS9uY3IiIGNsYXNzPSJnbCBub2JyIj5Hb29nbGUu
305
+ Y29tIGluIEVuZ2xpc2g8L2E+PC9kaXY+PC9kaXY+PHAgc3R5bGU9ImNvbG9y
306
+ OiM3Njc2NzY7Zm9udC1zaXplOjhwdCI+JmNvcHk7IDIwMTIgLSA8YSBocmVm
307
+ PSIvaW50bC9kZS9wb2xpY2llcy8iPkRhdGVuc2NodXR6ZXJrbORydW5nICYg
308
+ TnV0enVuZ3NiZWRpbmd1bmdlbjwvYT48L3A+PC9jZW50ZXI+PC9zcGFuPiA8
309
+ L2NlbnRlcj48ZGl2IGlkPXhqc2Q+PC9kaXY+PGRpdiBpZD14anNpPjxzY3Jp
310
+ cHQ+aWYoZ29vZ2xlLnkpZ29vZ2xlLnkuZmlyc3Q9W107Z29vZ2xlLnJlZ2lz
311
+ dGVyPWdvb2dsZS5yZWdpc3Rlcnx8ZnVuY3Rpb24oaSxsKXtnb29nbGUueS5m
312
+ aXJzdC5wdXNoKGZ1bmN0aW9uKCl7Z29vZ2xlLnJlZ2lzdGVyKGksbCk7fSk7
313
+ fTtnb29nbGUuZGxqPWZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1
314
+ bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0
315
+ Iik7YS5zcmM9Yjtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieGpzZCIpLmFw
316
+ cGVuZENoaWxkKGEpfSwwKX07CmlmKGdvb2dsZS55KWdvb2dsZS55LmZpcnN0
317
+ PVtdO2lmKCFnb29nbGUueGpzKXtnb29nbGUuZHN0cj1bXTtnb29nbGUucmVp
318
+ bj1bXTtpZihnb29nbGUudGltZXJzJiZnb29nbGUudGltZXJzLmxvYWQudCl7
319
+ Z29vZ2xlLnRpbWVycy5sb2FkLnQueGpzbHM9bmV3IERhdGUoKS5nZXRUaW1l
320
+ KCk7fWdvb2dsZS5kbGooJy9leHRlcm5fanMvZi9DZ0prWlJJQ1pHVWdBQ3N3
321
+ UlRnQUxDc3dXamdBTENzd0RqZ0FMQ3N3RnpnQUxDc3dQRGdBTENzd1VUZ0FM
322
+ Q3N3Q2pnQW1nSUNhR1VzS3pDWUFUZ0FMQ3N3RmpnQUxDc3dHVGdCTENzd1FU
323
+ Z0FMQ3N3VFRnQUxDc3dUamdBTENzd1ZEZ0FMQ3N3YVRnQUxDc3drQUU0QUN3
324
+ ck1KSUJPQUFzS3pEVkFUZ0FMQ3N3MkFFNEFDd3JNQmc0QUN3ck1DWTRBQ3lB
325
+ QWxDUUFuQS9RNFY5Q2JwN2Z1by5qcycpO2dvb2dsZS54anM9MX1nb29nbGUu
326
+ bmVlZ2c9MTtnb29nbGUubWM9W107Z29vZ2xlLm1jPWdvb2dsZS5tYy5jb25j
327
+ YXQoW1s2OSx7fV0sWzE0LHt9XSxbNjAse31dLFsyMyx7fV0sWzgxLHt9XSxb
328
+ MTAseyJjbGllbnQiOiJocCIsImRoIjp0cnVlLCJkcyI6IiIsImV4cCI6ImZy
329
+ Z2JsZCIsImZsIjp0cnVlLCJob3N0IjoiZ29vZ2xlLmRlIiwianNvbnAiOnRy
330
+ dWUsIm1zZ3MiOnsibGNreSI6IkF1ZiBndXQgR2z8Y2shIiwibG1sIjoiV2Vp
331
+ dGVyZSBJbmZvcm1hdGlvbmVuIiwicHNyYyI6IkRpZXNlIFN1Y2hhbmZyYWdl
332
+ IHd1cmRlIGF1cyBJaHJlbSBcdTAwM0NhIGhyZWY9XCIvaGlzdG9yeVwiXHUw
333
+ MDNFV2VicHJvdG9rb2xsXHUwMDNDL2FcdTAwM0UgZW50ZmVybnQuIiwicHNy
334
+ bCI6IkVudGZlcm5lbiIsInNyY2giOiJHb29nbGUtU3VjaGUifSwib3ZyIjp7
335
+ ImZtIjoxLCJsbSI6MSwicGYiOjEsInN3IjoxfSwicHEiOiIiLCJzY2QiOjEw
336
+ LCJzY2UiOjV9XSxbMTUyLHt9XSxbNjUse31dLFsyMTMseyJwYmVyciI6Ilx1
337
+ MDAzQ2ZvbnQgY29sb3I9cmVkXHUwMDNFRmVobGVyOlx1MDAzQy9mb250XHUw
338
+ MDNFIERlciBTZXJ2ZXIga29ubnRlIElocmUgQW5mb3JkZXJ1bmcgbmljaHQg
339
+ YXVzZvxocmVuLiBWZXJzdWNoZW4gU2llIGVzIGluIDMwIFNla3VuZGVuIG5v
340
+ Y2ggZWlubWFsLiJ9XSxbNzgse31dLFsyNSx7ImciOjgsImsiOmZhbHNlLCJt
341
+ Ijp7ImFwcCI6dHJ1ZSwiYmtzIjp0cnVlLCJibGciOnRydWUsImRzYyI6dHJ1
342
+ ZSwiZXZuIjp0cnVlLCJmaW4iOnRydWUsImZsbSI6dHJ1ZSwiZnJtIjp0cnVl
343
+ LCJpc2NoIjp0cnVlLCJrbGciOnRydWUsIm1ibCI6dHJ1ZSwibndzIjp0cnVl
344
+ LCJwbGNzIjp0cnVlLCJwcGwiOnRydWUsInByYyI6dHJ1ZSwicHRzIjp0cnVl
345
+ LCJyY3AiOnRydWUsInNob3AiOnRydWUsInZpZCI6dHJ1ZX0sInQiOm51bGx9
346
+ XSxbMjE2LHt9XSxbMTA1LHt9XSxbMjIseyJkYiI6ZmFsc2UsIm1fZXJyb3Jz
347
+ Ijp7IjMyIjoiRXMgZ2lidCBsZWlkZXIga2VpbmUgd2VpdGVyZW4gRXJnZWJu
348
+ aXNzZS4iLCJkZWZhdWx0IjoiXHUwMDNDZm9udCBjb2xvcj1yZWRcdTAwM0VG
349
+ ZWhsZXI6XHUwMDNDL2ZvbnRcdTAwM0UgRGVyIFNlcnZlciBrb25udGUgSWhy
350
+ ZSBBbmZvcmRlcnVuZyBuaWNodCBhdXNm/GhyZW4uIFZlcnN1Y2hlbiBTaWUg
351
+ ZXMgaW4gMzAgU2VrdW5kZW4gbm9jaCBlaW5tYWwuIn0sIm1fdGlwIjoiS2xp
352
+ Y2tlbiBTaWUgaGllciwgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVy
353
+ aGFsdGVuLiIsIm5scG0iOiItMTUzcHggLTg0cHgiLCJubHBwIjoiLTE1M3B4
354
+ IC03MHB4IiwidXRwIjpmYWxzZX1dLFs3Nyx7fV0sWzE0Nix7fV0sWzE0NCx7
355
+ fV0sWzg0LHsidHRfa2Z0Ijp0cnVlfV0sWzI0LHt9XSxbMzgse31dXSk7Z29v
356
+ Z2xlLnkuZmlyc3QucHVzaChmdW5jdGlvbigpe2lmKGdvb2dsZS5tZWQpe2dv
357
+ b2dsZS5tZWQoJ2luaXQnKTtnb29nbGUuaW5pdEhpc3RvcnkoKTtnb29nbGUu
358
+ bWVkKCdoaXN0b3J5Jyk7fWdvb2dsZS5IaXN0b3J5JiZnb29nbGUuSGlzdG9y
359
+ eS5pbml0aWFsaXplKCcvJyl9KTtpZihnb29nbGUuaiYmZ29vZ2xlLmouZW4m
360
+ Jmdvb2dsZS5qLnhpKXt3aW5kb3cuc2V0VGltZW91dChnb29nbGUuai54aSww
361
+ KTt9PC9zY3JpcHQ+PC9kaXY+PHNjcmlwdD4oZnVuY3Rpb24oKXsKdmFyIGIs
362
+ ZCxlLGY7ZnVuY3Rpb24gZyhhLGMpe2lmKGEucmVtb3ZlRXZlbnRMaXN0ZW5l
363
+ cil7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixjLGZhbHNlKTthLnJl
364
+ bW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixjLGZhbHNlKX1lbHNle2EuZGV0
365
+ YWNoRXZlbnQoIm9ubG9hZCIsYyk7YS5kZXRhY2hFdmVudCgib25lcnJvciIs
366
+ Yyl9fWZ1bmN0aW9uIGgoYSl7Zj0obmV3IERhdGUpLmdldFRpbWUoKTsrK2Q7
367
+ YT1hfHx3aW5kb3cuZXZlbnQ7dmFyIGM9YS50YXJnZXR8fGEuc3JjRWxlbWVu
368
+ dDtnKGMsaCl9dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUo
369
+ ImltZyIpO2I9aS5sZW5ndGg7ZD0wO2Zvcih2YXIgaj0wLGs7ajxiOysrail7
370
+ az1pW2pdO2lmKGsuY29tcGxldGV8fHR5cGVvZiBrLnNyYyE9InN0cmluZyJ8
371
+ fCFrLnNyYykrK2Q7ZWxzZSBpZihrLmFkZEV2ZW50TGlzdGVuZXIpe2suYWRk
372
+ RXZlbnRMaXN0ZW5lcigibG9hZCIsaCxmYWxzZSk7ay5hZGRFdmVudExpc3Rl
373
+ bmVyKCJlcnJvciIsCmgsZmFsc2UpfWVsc2V7ay5hdHRhY2hFdmVudCgib25s
374
+ b2FkIixoKTtrLmF0dGFjaEV2ZW50KCJvbmVycm9yIixoKX19ZT1iLWQ7ZnVu
375
+ Y3Rpb24gbCgpe2lmKCFnb29nbGUudGltZXJzLmxvYWQudClyZXR1cm47Z29v
376
+ Z2xlLnRpbWVycy5sb2FkLnQub2w9KG5ldyBEYXRlKS5nZXRUaW1lKCk7Z29v
377
+ Z2xlLnRpbWVycy5sb2FkLnQuaW1sPWY7Z29vZ2xlLmtDU0kuaW1jPWQ7Z29v
378
+ Z2xlLmtDU0kuaW1uPWI7Z29vZ2xlLmtDU0kuaW1wPWU7aWYoZ29vZ2xlLnN0
379
+ dCE9PXVuZGVmaW5lZClnb29nbGUua0NTSS5zdHQ9Z29vZ2xlLnN0dDtnb29n
380
+ bGUudGltZXJzLmxvYWQudC54anMmJmdvb2dsZS5yZXBvcnQmJmdvb2dsZS5y
381
+ ZXBvcnQoZ29vZ2xlLnRpbWVycy5sb2FkLGdvb2dsZS5rQ1NJKX1pZih3aW5k
382
+ b3cuYWRkRXZlbnRMaXN0ZW5lcil3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigi
383
+ bG9hZCIsCmwsZmFsc2UpO2Vsc2UgaWYod2luZG93LmF0dGFjaEV2ZW50KXdp
384
+ bmRvdy5hdHRhY2hFdmVudCgib25sb2FkIixsKTtnb29nbGUudGltZXJzLmxv
385
+ YWQudC5wcnQ9KGY9KG5ldyBEYXRlKS5nZXRUaW1lKCkpOwp9KSgpOwo8L3Nj
386
+ cmlwdD4=
387
+ http_version: '1.1'
388
+ recorded_at: Tue, 03 Apr 2012 11:11:07 GMT
389
+ recorded_with: VCR 2.0.1
data/test/http_test.rb ADDED
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require 'helper'
4
+ require 'vcr'
5
+
6
+ VCR.configure do |c|
7
+ c.cassette_library_dir = "#{File.dirname(__FILE__)}/fixtures-vcr"
8
+ c.hook_into :webmock
9
+ end
10
+
11
+ class HttpTest < Test::Unit::TestCase
12
+ def test_get
13
+ VCR.use_cassette('http_test') do
14
+ google = Http.get("http://google.de")
15
+ assert google.starts_with?("<!doctype html>")
16
+ end
17
+ end
18
+ end
@@ -12,4 +12,15 @@ class StringExtTest < Test::Unit::TestCase
12
12
  assert_equal("actual", "actual".sortkey)
13
13
  assert_equal("schreck003012", "der schreck 3/12".sortkey)
14
14
  end
15
+
16
+ def test_starts_ends_with
17
+ s = "foo bar baz"
18
+ assert s.starts_with?("foo")
19
+ assert !s.starts_with?("baz")
20
+ assert !s.ends_with?("foo")
21
+ assert s.ends_with?("baz")
22
+
23
+ assert s.starts_with?("")
24
+ assert s.ends_with?("")
25
+ end
15
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: radiospiel-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-03 00:00:00.000000000Z
12
+ date: 2012-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pg
16
- requirement: &70231006859040 !ruby/object:Gem::Requirement
16
+ requirement: &70271405711240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70231006859040
24
+ version_requirements: *70271405711240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sqlite3
27
- requirement: &70231006858260 !ruby/object:Gem::Requirement
27
+ requirement: &70271405698820 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70231006858260
35
+ version_requirements: *70271405698820
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: redis
38
- requirement: &70231006857520 !ruby/object:Gem::Requirement
38
+ requirement: &70271405698060 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70231006857520
46
+ version_requirements: *70271405698060
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: micro_sql
49
- requirement: &70231006854220 !ruby/object:Gem::Requirement
49
+ requirement: &70271405697360 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70231006854220
57
+ version_requirements: *70271405697360
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: htmlentities
60
- requirement: &70231006853600 !ruby/object:Gem::Requirement
60
+ requirement: &70271405696380 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70231006853600
68
+ version_requirements: *70271405696380
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &70231006852760 !ruby/object:Gem::Requirement
71
+ requirement: &70271405695800 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70231006852760
79
+ version_requirements: *70271405695800
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: jeweler
82
- requirement: &70231006851660 !ruby/object:Gem::Requirement
82
+ requirement: &70271405695240 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,43 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70231006851660
90
+ version_requirements: *70271405695240
91
+ - !ruby/object:Gem::Dependency
92
+ name: vcr
93
+ requirement: &70271405694400 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70271405694400
102
+ - !ruby/object:Gem::Dependency
103
+ name: webmock
104
+ requirement: &70271405693540 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70271405693540
113
+ - !ruby/object:Gem::Dependency
114
+ name: psych
115
+ requirement: &70271405692440 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *70271405692440
91
124
  - !ruby/object:Gem::Dependency
92
125
  name: simplecov
93
- requirement: &70231006830480 !ruby/object:Gem::Requirement
126
+ requirement: &70271405691160 !ruby/object:Gem::Requirement
94
127
  none: false
95
128
  requirements:
96
129
  - - ! '>='
@@ -98,10 +131,10 @@ dependencies:
98
131
  version: '0'
99
132
  type: :development
100
133
  prerelease: false
101
- version_requirements: *70231006830480
134
+ version_requirements: *70271405691160
102
135
  - !ruby/object:Gem::Dependency
103
136
  name: ruby-debug19
104
- requirement: &70231006829160 !ruby/object:Gem::Requirement
137
+ requirement: &70271405685820 !ruby/object:Gem::Requirement
105
138
  none: false
106
139
  requirements:
107
140
  - - ! '>='
@@ -109,7 +142,7 @@ dependencies:
109
142
  version: '0'
110
143
  type: :development
111
144
  prerelease: false
112
- version_requirements: *70231006829160
145
+ version_requirements: *70271405685820
113
146
  description: Some basics that your application could benefit from.
114
147
  email: eno@open-lab.org
115
148
  executables: []
@@ -143,13 +176,16 @@ files:
143
176
  - lib/core-extensions/uids.rb
144
177
  - lib/extensions/http.rb
145
178
  - lib/extensions/zz_geocoder.rb
179
+ - radiospiel-app.gemspec
146
180
  - script/watchr
147
181
  - test/app_test.rb
148
182
  - test/cache_test.rb
149
183
  - test/cgi_ext_test.rb
150
184
  - test/config.yml
151
185
  - test/config_test.rb
186
+ - test/fixtures-vcr/http_test.yml
152
187
  - test/helper.rb
188
+ - test/http_test.rb
153
189
  - test/string_ext_test.rb
154
190
  - test/tls_test.rb
155
191
  - test/uid_test.rb
@@ -168,7 +204,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
168
204
  version: '0'
169
205
  segments:
170
206
  - 0
171
- hash: -159245804892419013
207
+ hash: -1719039008368843771
172
208
  required_rubygems_version: !ruby/object:Gem::Requirement
173
209
  none: false
174
210
  requirements: