venice 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +10 -10
  4. data/README.md +6 -5
  5. data/bin/iap +6 -9
  6. data/lib/venice/client.rb +2 -0
  7. data/lib/venice/in_app_receipt.rb +17 -1
  8. data/lib/venice/pending_renewal_info.rb +1 -1
  9. data/lib/venice/receipt.rb +4 -1
  10. data/lib/venice/version.rb +1 -1
  11. data/spec/client_spec.rb +13 -5
  12. data/spec/in_app_receipt_spec.rb +9 -0
  13. data/spec/receipt_spec.rb +5 -0
  14. metadata +3 -28
  15. data/coverage/assets/0.10.2/application.css +0 -799
  16. data/coverage/assets/0.10.2/application.js +0 -1707
  17. data/coverage/assets/0.10.2/colorbox/border.png +0 -0
  18. data/coverage/assets/0.10.2/colorbox/controls.png +0 -0
  19. data/coverage/assets/0.10.2/colorbox/loading.gif +0 -0
  20. data/coverage/assets/0.10.2/colorbox/loading_background.png +0 -0
  21. data/coverage/assets/0.10.2/favicon_green.png +0 -0
  22. data/coverage/assets/0.10.2/favicon_red.png +0 -0
  23. data/coverage/assets/0.10.2/favicon_yellow.png +0 -0
  24. data/coverage/assets/0.10.2/loading.gif +0 -0
  25. data/coverage/assets/0.10.2/magnify.png +0 -0
  26. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  27. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  28. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  29. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  30. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  31. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  32. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  33. data/coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  34. data/coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png +0 -0
  35. data/coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  36. data/coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png +0 -0
  37. data/coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png +0 -0
  38. data/coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  39. data/coverage/index.html +0 -2826
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 42ba6b3e3d9dd51125339038c3b8890719e5f030
4
- data.tar.gz: 759e8373824b9cf4fde27520e64dd718c551dc75
2
+ SHA256:
3
+ metadata.gz: 0c85cb5299c9b6adea9a444a3355ad2cfdfd521c2c196d2d0ea9c235a955f26f
4
+ data.tar.gz: 1e0dc8d1193ba43ef60fc109fef35f54ce953d5fd17a5c2131eb37191b025d2b
5
5
  SHA512:
6
- metadata.gz: e7b77d7cfa4941303172da4585b3209c8aa187f30e1d8f13c3615ddd13e1a9a5ff8506b88de6705f476da6935023a56bc982e084394da24e984326c5b777c03c
7
- data.tar.gz: 6bffddf73fa4b43388e25f4b85f0f6fefa88b4486780a997895efff6745b0817e4b5e6325abc13a044869cf65d56785fbe6c258f775203cecc3e5710c3c3e570
6
+ metadata.gz: 95da064fc3b4fe0f25418a308f0bbe2af091901302b2c516ac7a469d9a0aad05201b7d4d4dc430ccde528eb077696ea8630f5014788f4f4a771c21fb2daacb4c
7
+ data.tar.gz: e679ac62fad3a05096fcb08540411597df35d55a4dfd1178899a4ce3f86e0aa1711ba4717802cbff4c6be00e53d8047f2a8810d3e311ec05bf14d6414664d6f3
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in hello-rspec.gemspec
3
6
  gemspec
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- venice (0.4.0)
4
+ venice (0.4.3)
5
5
  commander (~> 4.1)
6
6
  json
7
7
  terminal-table (~> 1.4)
@@ -9,18 +9,18 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- commander (4.4.3)
12
+ commander (4.4.4)
13
13
  highline (~> 1.7.2)
14
14
  diff-lcs (1.3)
15
- docile (1.1.5)
16
- highline (1.7.8)
15
+ docile (1.3.0)
16
+ highline (1.7.10)
17
17
  json (2.1.0)
18
- rake (12.3.0)
18
+ rake (12.3.1)
19
19
  rspec (3.7.0)
20
20
  rspec-core (~> 3.7.0)
21
21
  rspec-expectations (~> 3.7.0)
22
22
  rspec-mocks (~> 3.7.0)
23
- rspec-core (3.7.0)
23
+ rspec-core (3.7.1)
24
24
  rspec-support (~> 3.7.0)
25
25
  rspec-expectations (3.7.0)
26
26
  diff-lcs (>= 1.2.0, < 2.0)
@@ -31,9 +31,9 @@ GEM
31
31
  rspec-mocks (3.7.0)
32
32
  diff-lcs (>= 1.2.0, < 2.0)
33
33
  rspec-support (~> 3.7.0)
34
- rspec-support (3.7.0)
35
- simplecov (0.15.1)
36
- docile (~> 1.1.0)
34
+ rspec-support (3.7.1)
35
+ simplecov (0.16.1)
36
+ docile (~> 1.1)
37
37
  json (>= 1.8, < 3)
38
38
  simplecov-html (~> 0.10.0)
39
39
  simplecov-html (0.10.2)
@@ -52,4 +52,4 @@ DEPENDENCIES
52
52
  venice!
53
53
 
54
54
  BUNDLED WITH
55
- 1.16.0
55
+ 1.16.1
data/README.md CHANGED
@@ -22,7 +22,7 @@ See Apple's [Receipt Validation Programming Guide](https://developer.apple.com/l
22
22
  ```ruby
23
23
  require 'venice'
24
24
 
25
- data = "(Base64-Encoded Receipt Data)"
25
+ data = '(Base64-Encoded Receipt Data)'
26
26
  if receipt = Venice::Receipt.verify(data)
27
27
  p receipt.to_h
28
28
 
@@ -39,12 +39,11 @@ end
39
39
  ```ruby
40
40
  require 'venice'
41
41
 
42
- data = "(Base64-Encoded Receipt Data)"
42
+ data = '(Base64-Encoded Receipt Data)'
43
43
 
44
44
  # You must pass shared secret when verification on Auto-Renewable
45
- opts = {
46
- shared_secret: 'your key'
47
- }
45
+ opts = { shared_secret: 'your key' }
46
+
48
47
  if receipt = Venice::Receipt.verify(data, opts)
49
48
  # Renewed receipts are added into `latest_receipt_info` array.
50
49
  p receipt.latest_receipt_info.map(&:expires_at)
@@ -71,6 +70,7 @@ Venice also comes with the `iap` binary, which provides a convenient way to veri
71
70
  | original_application_version | 123 |
72
71
  | original_purchase_date | Fri, 07 Mar 2014 20:59:24 GMT |
73
72
  | receipt_type | Production |
73
+ | receipt_created_at | Mon, 23 Jun 2014 17:59:38 GMT |
74
74
  | requested_at | Mon, 23 Jun 2014 17:59:38 GMT |
75
75
  +--------------------------------+------------------------------------+
76
76
  | in_app | 1 |
@@ -83,6 +83,7 @@ Venice also comes with the `iap` binary, which provides a convenient way to veri
83
83
  | - purchase_date | |
84
84
  | - quantity | 1 |
85
85
  | - transaction_id | 1000000000000001 |
86
+ | - web_order_line_item_id | 1000000000000001 |
86
87
  | - version_external_identifier | |
87
88
  +--------------------------------+------------------------------------+
88
89
 
data/bin/iap CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  require 'venice'
4
4
 
5
-
6
5
  require 'commander/import'
7
6
  require 'terminal-table'
8
7
 
9
-
10
8
  HighLine.track_eof = false # Fix for built-in Ruby
11
- Signal.trap("INT") {} # Suppress backtrace when exiting command
9
+ Signal.trap('INT') {} # Suppress backtrace when exiting command
12
10
 
13
11
  program :version, Venice::VERSION
14
12
  program :description, 'A command-line interface for verifying Apple In-App Purchase receipts'
@@ -29,8 +27,8 @@ command :verify do |c|
29
27
  c.example 'description', 'iap verify /path/to/receipt [--secret shared_secret]'
30
28
 
31
29
  c.action do |args, options|
32
- say_error "Missing receipt argument" and abort unless file = args.first
33
- say_error "Receipt file does not exist" unless File.exist?(file)
30
+ say_error('Missing receipt argument') and abort unless file = args.first
31
+ say_error 'Receipt file does not exist' unless File.exist?(file)
34
32
 
35
33
  client = options.sandbox ? Venice::Client.development : Venice::Client.production
36
34
  client.shared_secret = options.secret if options.secret
@@ -38,7 +36,7 @@ command :verify do |c|
38
36
  begin
39
37
  receipt = client.verify!(File.read(file))
40
38
 
41
- table = Terminal::Table.new :title => "Receipt" do |t|
39
+ table = Terminal::Table.new title: 'Receipt' do |t|
42
40
  hash = receipt.to_h
43
41
  hash.keys.sort.each do |key|
44
42
  next if key == :in_app
@@ -59,9 +57,8 @@ command :verify do |c|
59
57
  end
60
58
 
61
59
  puts table
62
-
63
- rescue => error
64
- say_error error.message and abort
60
+ rescue StandardError => error
61
+ say_error(error.message) and abort
65
62
  end
66
63
  end
67
64
  end
@@ -46,6 +46,8 @@ module Venice
46
46
  # > Only returned for iOS 6 style transaction receipts for auto-renewable subscriptions.
47
47
  # > The JSON representation of the receipt for the most recent renewal
48
48
  if latest_receipt_info_attributes = json['latest_receipt_info']
49
+ latest_receipt_info_attributes = [latest_receipt_info_attributes] if latest_receipt_info_attributes.is_a?(Hash)
50
+
49
51
  # AppStore returns 'latest_receipt_info' even if we use over iOS 6. Besides, its format is an Array.
50
52
  receipt.latest_receipt_info = []
51
53
  latest_receipt_info_attributes.each do |latest_receipt_info_attribute|
@@ -18,6 +18,10 @@ module Venice
18
18
  # to the transaction’s transactionIdentifier property.
19
19
  attr_reader :transaction_id
20
20
 
21
+ # The primary key for identifying subscription purchases. This value is a unique ID that identifies purchase events across devices, including subscription renewal purchase events.
22
+ # When restoring purchase, transaction_id could change
23
+ attr_reader :web_order_line_item_id
24
+
21
25
  # The date and time this transaction occurred. This value corresponds to the
22
26
  # transaction’s transactionDate property.
23
27
  attr_reader :purchased_at
@@ -46,12 +50,17 @@ module Venice
46
50
  @quantity = Integer(attributes['quantity']) if attributes['quantity']
47
51
  @product_id = attributes['product_id']
48
52
  @transaction_id = attributes['transaction_id']
53
+ @web_order_line_item_id = attributes['web_order_line_item_id']
49
54
  @purchased_at = DateTime.parse(attributes['purchase_date']) if attributes['purchase_date']
50
55
  @app_item_id = attributes['app_item_id']
51
56
  @version_external_identifier = attributes['version_external_identifier']
52
57
 
53
58
  # expires_date is in ms since the Epoch, Time.at expects seconds
54
- @expires_at = Time.at(attributes['expires_date_ms'].to_i / 1000) if attributes['expires_date_ms']
59
+ if attributes['expires_date_ms']
60
+ @expires_at = Time.at(attributes['expires_date_ms'].to_i / 1000)
61
+ elsif attributes['expires_date'] && is_number?(attributes['expires_date'])
62
+ @expires_at = Time.at(attributes['expires_date'].to_i / 1000)
63
+ end
55
64
 
56
65
  # cancellation_date is in ms since the Epoch, Time.at expects seconds
57
66
  @cancellation_at = Time.at(attributes['cancellation_date_ms'].to_i / 1000) if attributes['cancellation_date_ms']
@@ -71,6 +80,7 @@ module Venice
71
80
  quantity: @quantity,
72
81
  product_id: @product_id,
73
82
  transaction_id: @transaction_id,
83
+ web_order_line_item_id: @web_order_line_item_id,
74
84
  purchase_date: (@purchased_at.httpdate rescue nil),
75
85
  original_transaction_id: (@original.transaction_id rescue nil),
76
86
  original_purchase_date: (@original.purchased_at.httpdate rescue nil),
@@ -85,5 +95,11 @@ module Venice
85
95
  def to_json
86
96
  to_hash.to_json
87
97
  end
98
+
99
+ private
100
+
101
+ def is_number?(string)
102
+ !!(string && string.to_s =~ /^[0-9]+$/)
103
+ end
88
104
  end
89
105
  end
@@ -34,7 +34,7 @@ module Venice
34
34
  @auto_renew_product_id = attributes['auto_renew_product_id']
35
35
 
36
36
  if attributes['is_in_billing_retry_period']
37
- @is_in_billing_retry_period = (attributes[is_in_billing_retry_period] == '1')
37
+ @is_in_billing_retry_period = (attributes['is_in_billing_retry_period'] == '1')
38
38
  end
39
39
 
40
40
  @product_id = attributes['product_id']
@@ -28,6 +28,7 @@ module Venice
28
28
  attr_reader :adam_id
29
29
  attr_reader :download_id
30
30
  attr_reader :requested_at
31
+ attr_reader :receipt_created_at
31
32
 
32
33
  # Original json response from AppStore
33
34
  attr_reader :original_json_response
@@ -54,6 +55,7 @@ module Venice
54
55
  @adam_id = attributes['adam_id']
55
56
  @download_id = attributes['download_id']
56
57
  @requested_at = DateTime.parse(attributes['request_date']) if attributes['request_date']
58
+ @receipt_created_at = DateTime.parse(attributes['receipt_creation_date']) if attributes['receipt_creation_date']
57
59
 
58
60
  @in_app = []
59
61
  if attributes['in_app']
@@ -81,6 +83,7 @@ module Venice
81
83
  adam_id: @adam_id,
82
84
  download_id: @download_id,
83
85
  requested_at: (@requested_at.httpdate rescue nil),
86
+ receipt_created_at: (@receipt_created_at.httpdate rescue nil),
84
87
  in_app: @in_app.map(&:to_h),
85
88
  pending_renewal_info: @pending_renewal_info.map(&:to_h),
86
89
  latest_receipt_info: @latest_receipt_info
@@ -134,7 +137,7 @@ module Venice
134
137
  end
135
138
 
136
139
  def retryable?
137
- json['is-retryable']
140
+ json['is_retryable']
138
141
  end
139
142
 
140
143
  def message
@@ -1,3 +1,3 @@
1
1
  module Venice
2
- VERSION = '0.4.2'
2
+ VERSION = '0.4.3'
3
3
  end
@@ -73,10 +73,6 @@ describe Venice::Client do
73
73
  end
74
74
 
75
75
  context 'with a latest receipt info attribute' do
76
- before do
77
- client.stub(:json_response_from_verifying_data).and_return(response)
78
- end
79
-
80
76
  let(:response) do
81
77
  {
82
78
  'status' => 0,
@@ -108,8 +104,20 @@ describe Venice::Client do
108
104
  end
109
105
 
110
106
  it 'should create a latest receipt' do
107
+ client.stub(:json_response_from_verifying_data).and_return(response)
111
108
  receipt = client.verify! 'asdf'
112
109
  receipt.latest_receipt_info.should_not be_nil
110
+ receipt.latest_receipt_info.first.product_id.should eq 'com.ficklebits.nsscreencast.monthly_sub'
111
+ end
112
+
113
+ context 'when latest_receipt_info is a hash instead of an array' do
114
+ it 'should still create a latest receipt' do
115
+ response['latest_receipt_info'] = response['latest_receipt_info'].first
116
+ client.stub(:json_response_from_verifying_data).and_return(response)
117
+ receipt = client.verify! 'asdf'
118
+ receipt.latest_receipt_info.should_not be_nil
119
+ receipt.latest_receipt_info.first.product_id.should eq 'com.ficklebits.nsscreencast.monthly_sub'
120
+ end
113
121
  end
114
122
  end
115
123
 
@@ -145,7 +153,7 @@ describe Venice::Client do
145
153
  {
146
154
  'status' => 21000,
147
155
  'receipt' => {},
148
- 'is-retryable' => true
156
+ 'is_retryable' => true
149
157
  }
150
158
  end
151
159
 
@@ -7,6 +7,7 @@ describe Venice::InAppReceipt do
7
7
  'quantity' => 1,
8
8
  'product_id' => 'com.foo.product1',
9
9
  'transaction_id' => '1000000070107235',
10
+ 'web_order_line_item_id' => '1000000026812043',
10
11
  'purchase_date' => '2014-05-28 14:47:53 Etc/GMT',
11
12
  'purchase_date_ms' => '1401288473000',
12
13
  'purchase_date_pst' => '2014-05-28 07:47:53 America/Los_Angeles',
@@ -29,6 +30,7 @@ describe Venice::InAppReceipt do
29
30
  its(:quantity) { 1 }
30
31
  its(:product_id) { 'com.foo.product1' }
31
32
  its(:transaction_id) { '1000000070107235' }
33
+ its(:web_order_line_item_id) { '1000000026812043' }
32
34
  its(:purchased_at) { should be_instance_of DateTime }
33
35
  its(:app_item_id) { 'com.foo.app1' }
34
36
  its(:version_external_identifier) { '123' }
@@ -40,11 +42,18 @@ describe Venice::InAppReceipt do
40
42
  subject.original.transaction_id.should == '140xxx867509'
41
43
  subject.original.purchased_at.should be_instance_of DateTime
42
44
  end
45
+
46
+ it "should parse expires_date when expires_date_ms is missing and expires_date is the ms epoch" do
47
+ attributes.delete('expires_date_ms')
48
+ attributes['expires_date'] = '1403941685000'
49
+ in_app_receipt.expires_at.should eq Time.at(1403941685000 / 1000)
50
+ end
43
51
 
44
52
  it 'should output a hash with attributes' do
45
53
  in_app_receipt.to_h.should include(quantity: 1,
46
54
  product_id: 'com.foo.product1',
47
55
  transaction_id: '1000000070107235',
56
+ web_order_line_item_id: '1000000026812043',
48
57
  purchase_date: 'Wed, 28 May 2014 14:47:53 GMT',
49
58
  original_purchase_date: 'Wed, 28 May 2014 14:47:53 GMT')
50
59
  end
@@ -12,6 +12,9 @@ describe Venice::Receipt do
12
12
  'bundle_id' => 'com.foo.bar',
13
13
  'application_version' => '2',
14
14
  'download_id' => 1234567,
15
+ 'receipt_creation_date' => '2014-06-04 23:20:47 Etc/GMT',
16
+ 'receipt_creation_date_ms' => '1401924047883',
17
+ 'receipt_creation_date_pst' => '2014-06-04 16:20:47 America/Los_Angeles',
15
18
  'request_date' => '2014-06-04 23:20:47 Etc/GMT',
16
19
  'request_date_ms' => '1401924047883',
17
20
  'request_date_pst' => '2014-06-04 16:20:47 America/Los_Angeles',
@@ -26,6 +29,7 @@ describe Venice::Receipt do
26
29
  'product_id' => 'com.foo.product1',
27
30
  'transaction_id' => '1000000070107111',
28
31
  'original_transaction_id' => '1000000061051111',
32
+ 'web_order_line_item_id' => '1000000026812043',
29
33
  'purchase_date' => '2014-05-28 14:47:53 Etc/GMT',
30
34
  'purchase_date_ms' => '1401288473000',
31
35
  'purchase_date_pst' => '2014-05-28 07:47:53 America/Los_Angeles',
@@ -61,6 +65,7 @@ describe Venice::Receipt do
61
65
  its(:original_purchase_date) { should be_instance_of DateTime }
62
66
  its(:expires_at) { should be_instance_of DateTime }
63
67
  its(:receipt_type) { 'Production' }
68
+ its(:receipt_created_at) { should be_instance_of DateTime }
64
69
  its(:adam_id) { 7654321 }
65
70
  its(:download_id) { 1234567 }
66
71
  its(:requested_at) { should be_instance_of DateTime }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: venice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattt Thompson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-21 00:00:00.000000000 Z
11
+ date: 2018-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -120,31 +120,6 @@ files:
120
120
  - "./LICENSE"
121
121
  - "./README.md"
122
122
  - "./Rakefile"
123
- - "./coverage/assets/0.10.2/application.css"
124
- - "./coverage/assets/0.10.2/application.js"
125
- - "./coverage/assets/0.10.2/colorbox/border.png"
126
- - "./coverage/assets/0.10.2/colorbox/controls.png"
127
- - "./coverage/assets/0.10.2/colorbox/loading.gif"
128
- - "./coverage/assets/0.10.2/colorbox/loading_background.png"
129
- - "./coverage/assets/0.10.2/favicon_green.png"
130
- - "./coverage/assets/0.10.2/favicon_red.png"
131
- - "./coverage/assets/0.10.2/favicon_yellow.png"
132
- - "./coverage/assets/0.10.2/loading.gif"
133
- - "./coverage/assets/0.10.2/magnify.png"
134
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png"
135
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png"
136
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png"
137
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png"
138
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png"
139
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png"
140
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png"
141
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png"
142
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png"
143
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png"
144
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png"
145
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png"
146
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png"
147
- - "./coverage/index.html"
148
123
  - "./lib/venice.rb"
149
124
  - "./lib/venice/client.rb"
150
125
  - "./lib/venice/in_app_receipt.rb"
@@ -179,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
154
  version: '0'
180
155
  requirements: []
181
156
  rubyforge_project:
182
- rubygems_version: 2.6.13
157
+ rubygems_version: 2.7.3
183
158
  signing_key:
184
159
  specification_version: 4
185
160
  summary: iTunes In-App Purchase Receipt Verification
@@ -1,799 +0,0 @@
1
- /* -----------------------------------------------------------------------
2
-
3
-
4
- Blueprint CSS Framework 0.9
5
- http://blueprintcss.org
6
-
7
- * Copyright (c) 2007-Present. See LICENSE for more info.
8
- * See README for instructions on how to use Blueprint.
9
- * For credits and origins, see AUTHORS.
10
- * This is a compressed file. See the sources in the 'src' directory.
11
-
12
- ----------------------------------------------------------------------- */
13
-
14
- /* reset.css */
15
-
16
- html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
17
- article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;}
18
- body {line-height:1.5;}
19
- table {border-collapse:separate;border-spacing:0;}
20
- caption, th, td {text-align:left;font-weight:normal;}
21
- table, td, th {vertical-align:middle;}
22
- blockquote:before, blockquote:after, q:before, q:after {content:"";}
23
- blockquote, q {quotes:"" "";}
24
- a img {border:none;}
25
-
26
- /* typography.css */
27
- html {font-size:100.01%;}
28
- body {font-size:82%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;}
29
- h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
30
- h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
31
- h2 {font-size:2em;margin-bottom:0.75em;}
32
- h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
33
- h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
34
- h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
35
- h6 {font-size:1em;font-weight:bold;}
36
- h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
37
- p {margin:0 0 1.5em;}
38
- p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;}
39
- p img.right {float:right;margin:1.5em 0 1.5em 1.5em;}
40
- a:focus, a:hover {color:#000;}
41
- a {color:#009;text-decoration:underline;}
42
- blockquote {margin:1.5em;color:#666;font-style:italic;}
43
- strong {font-weight:bold;}
44
- em, dfn {font-style:italic;}
45
- dfn {font-weight:bold;}
46
- sup, sub {line-height:0;}
47
- abbr, acronym {border-bottom:1px dotted #666;}
48
- address {margin:0 0 1.5em;font-style:italic;}
49
- del {color:#666;}
50
- pre {margin:1.5em 0;white-space:pre;}
51
- pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
52
- li ul, li ol {margin:0;}
53
- ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;}
54
- ul {list-style-type:disc;}
55
- ol {list-style-type:decimal;}
56
- dl {margin:0 0 1.5em 0;}
57
- dl dt {font-weight:bold;}
58
- dd {margin-left:1.5em;}
59
- table {margin-bottom:1.4em;width:100%;}
60
- th {font-weight:bold;}
61
- thead th {background:#c3d9ff;}
62
- th, td, caption {padding:4px 10px 4px 5px;}
63
- tr.even td {background:#efefef;}
64
- tfoot {font-style:italic;}
65
- caption {background:#eee;}
66
- .small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
67
- .large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
68
- .hide {display:none;}
69
- .quiet {color:#666;}
70
- .loud {color:#000;}
71
- .highlight {background:#ff0;}
72
- .added {background:#060;color:#fff;}
73
- .removed {background:#900;color:#fff;}
74
- .first {margin-left:0;padding-left:0;}
75
- .last {margin-right:0;padding-right:0;}
76
- .top {margin-top:0;padding-top:0;}
77
- .bottom {margin-bottom:0;padding-bottom:0;}
78
-
79
- /* forms.css */
80
- label {font-weight:bold;}
81
- fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
82
- legend {font-weight:bold;font-size:1.2em;}
83
- input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;}
84
- input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;}
85
- input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;}
86
- input.text, input.title {width:300px;padding:5px;}
87
- input.title {font-size:1.5em;}
88
- textarea {width:390px;height:250px;padding:5px;}
89
- input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;}
90
- form.inline {line-height:3;}
91
- form.inline p {margin-bottom:0;}
92
- .error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
93
- .error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
94
- .notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
95
- .success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
96
- .error a {color:#8a1f11;}
97
- .notice a {color:#514721;}
98
- .success a {color:#264409;}
99
- .box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;}
100
- hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
101
- hr.space {background:#fff;color:#fff;visibility:hidden;}
102
- .clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;}
103
- .clearfix, .container {display:block;}
104
- .clear {clear:both;}
105
- /*
106
- github.com style (c) Vasily Polovnyov <vast@whiteants.net>
107
- */
108
-
109
-
110
- pre code {
111
- }
112
-
113
- pre .comment,
114
- pre .template_comment,
115
- pre .diff .header,
116
- pre .javadoc {
117
- color: #998;
118
- font-style: italic
119
- }
120
-
121
- pre .keyword,
122
- pre .css .rule .keyword,
123
- pre .winutils,
124
- pre .javascript .title,
125
- pre .lisp .title {
126
- color: #000;
127
- font-weight: bold
128
- }
129
-
130
- pre .number,
131
- pre .hexcolor {
132
- color: #458
133
- }
134
-
135
-
136
- pre .string,
137
- pre .tag .value,
138
- pre .phpdoc,
139
- pre .tex .formula {
140
- color: #d14
141
- }
142
-
143
- pre .subst {
144
- color: #712;
145
- }
146
-
147
- pre .constant,
148
- pre .title,
149
- pre .id {
150
- color: #900;
151
- font-weight: bold
152
- }
153
-
154
- pre .javascript .title,
155
- pre .lisp .title,
156
- pre .subst {
157
- font-weight: normal
158
- }
159
-
160
- pre .class .title,
161
- pre .haskell .label,
162
- pre .tex .command {
163
- color: #458;
164
- font-weight: bold
165
- }
166
-
167
- pre .tag,
168
- pre .tag .title,
169
- pre .rules .property,
170
- pre .django .tag .keyword {
171
- color: #000080;
172
- font-weight: normal
173
- }
174
-
175
- pre .attribute,
176
- pre .variable,
177
- pre .instancevar,
178
- pre .lisp .body {
179
- color: #008080
180
- }
181
-
182
- pre .regexp {
183
- color: #009926
184
- }
185
-
186
- pre .class {
187
- color: #458;
188
- font-weight: bold
189
- }
190
-
191
- pre .symbol,
192
- pre .ruby .symbol .string,
193
- pre .ruby .symbol .keyword,
194
- pre .ruby .symbol .keymethods,
195
- pre .lisp .keyword,
196
- pre .tex .special,
197
- pre .input_number {
198
- color: #990073
199
- }
200
-
201
- pre .builtin,
202
- pre .built_in,
203
- pre .lisp .title {
204
- color: #0086b3
205
- }
206
-
207
- pre .preprocessor,
208
- pre .pi,
209
- pre .doctype,
210
- pre .shebang,
211
- pre .cdata {
212
- color: #999;
213
- font-weight: bold
214
- }
215
-
216
- pre .deletion {
217
- background: #fdd
218
- }
219
-
220
- pre .addition {
221
- background: #dfd
222
- }
223
-
224
- pre .diff .change {
225
- background: #0086b3
226
- }
227
-
228
- pre .chunk {
229
- color: #aaa
230
- }
231
-
232
- pre .tex .formula {
233
- opacity: 0.5;
234
- }
235
- /*
236
- * jQuery UI CSS Framework @VERSION
237
- *
238
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
239
- * Dual licensed under the MIT or GPL Version 2 licenses.
240
- * http://jquery.org/license
241
- *
242
- * http://docs.jquery.com/UI/Theming/API
243
- */
244
-
245
- /* Layout helpers
246
- ----------------------------------*/
247
-
248
- .ui-helper-hidden { display: none; }
249
- .ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
250
- .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
251
- .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
252
- .ui-helper-clearfix { display: inline-block; }
253
- /* required comment for clearfix to work in Opera \*/
254
- * html .ui-helper-clearfix { height:1%; }
255
- .ui-helper-clearfix { display:block; }
256
- /* end clearfix */
257
- .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
258
-
259
-
260
- /* Interaction Cues
261
- ----------------------------------*/
262
- .ui-state-disabled { cursor: default !important; }
263
-
264
-
265
- /* Icons
266
- ----------------------------------*/
267
-
268
- /* states and images */
269
- .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
270
-
271
-
272
- /* Misc visuals
273
- ----------------------------------*/
274
-
275
- /* Overlays */
276
- .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
277
-
278
-
279
- /*
280
- * jQuery UI CSS Framework @VERSION
281
- *
282
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
283
- * Dual licensed under the MIT or GPL Version 2 licenses.
284
- * http://jquery.org/license
285
- *
286
- * http://docs.jquery.com/UI/Theming/API
287
- *
288
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
289
- */
290
-
291
-
292
- /* Component containers
293
- ----------------------------------*/
294
- .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
295
- .ui-widget .ui-widget { font-size: 1em; }
296
- .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
297
- .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
298
- .ui-widget-content a { color: #222222; }
299
- .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
300
- .ui-widget-header a { color: #222222; }
301
-
302
- /* Interaction states
303
- ----------------------------------*/
304
- .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
305
- .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
306
- .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
307
- .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
308
- .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
309
- .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
310
- .ui-widget :active { outline: none; }
311
-
312
- /* Interaction Cues
313
- ----------------------------------*/
314
- .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
315
- .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
316
- .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
317
- .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
318
- .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
319
- .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
320
- .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
321
- .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
322
-
323
- /* Icons
324
- ----------------------------------*/
325
-
326
- /* states and images */
327
- .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
328
- .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
329
- .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
330
- .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
331
- .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
332
- .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
333
- .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
334
- .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
335
-
336
- /* positioning */
337
- .ui-icon-carat-1-n { background-position: 0 0; }
338
- .ui-icon-carat-1-ne { background-position: -16px 0; }
339
- .ui-icon-carat-1-e { background-position: -32px 0; }
340
- .ui-icon-carat-1-se { background-position: -48px 0; }
341
- .ui-icon-carat-1-s { background-position: -64px 0; }
342
- .ui-icon-carat-1-sw { background-position: -80px 0; }
343
- .ui-icon-carat-1-w { background-position: -96px 0; }
344
- .ui-icon-carat-1-nw { background-position: -112px 0; }
345
- .ui-icon-carat-2-n-s { background-position: -128px 0; }
346
- .ui-icon-carat-2-e-w { background-position: -144px 0; }
347
- .ui-icon-triangle-1-n { background-position: 0 -16px; }
348
- .ui-icon-triangle-1-ne { background-position: -16px -16px; }
349
- .ui-icon-triangle-1-e { background-position: -32px -16px; }
350
- .ui-icon-triangle-1-se { background-position: -48px -16px; }
351
- .ui-icon-triangle-1-s { background-position: -64px -16px; }
352
- .ui-icon-triangle-1-sw { background-position: -80px -16px; }
353
- .ui-icon-triangle-1-w { background-position: -96px -16px; }
354
- .ui-icon-triangle-1-nw { background-position: -112px -16px; }
355
- .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
356
- .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
357
- .ui-icon-arrow-1-n { background-position: 0 -32px; }
358
- .ui-icon-arrow-1-ne { background-position: -16px -32px; }
359
- .ui-icon-arrow-1-e { background-position: -32px -32px; }
360
- .ui-icon-arrow-1-se { background-position: -48px -32px; }
361
- .ui-icon-arrow-1-s { background-position: -64px -32px; }
362
- .ui-icon-arrow-1-sw { background-position: -80px -32px; }
363
- .ui-icon-arrow-1-w { background-position: -96px -32px; }
364
- .ui-icon-arrow-1-nw { background-position: -112px -32px; }
365
- .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
366
- .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
367
- .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
368
- .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
369
- .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
370
- .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
371
- .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
372
- .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
373
- .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
374
- .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
375
- .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
376
- .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
377
- .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
378
- .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
379
- .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
380
- .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
381
- .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
382
- .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
383
- .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
384
- .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
385
- .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
386
- .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
387
- .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
388
- .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
389
- .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
390
- .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
391
- .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
392
- .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
393
- .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
394
- .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
395
- .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
396
- .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
397
- .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
398
- .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
399
- .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
400
- .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
401
- .ui-icon-arrow-4 { background-position: 0 -80px; }
402
- .ui-icon-arrow-4-diag { background-position: -16px -80px; }
403
- .ui-icon-extlink { background-position: -32px -80px; }
404
- .ui-icon-newwin { background-position: -48px -80px; }
405
- .ui-icon-refresh { background-position: -64px -80px; }
406
- .ui-icon-shuffle { background-position: -80px -80px; }
407
- .ui-icon-transfer-e-w { background-position: -96px -80px; }
408
- .ui-icon-transferthick-e-w { background-position: -112px -80px; }
409
- .ui-icon-folder-collapsed { background-position: 0 -96px; }
410
- .ui-icon-folder-open { background-position: -16px -96px; }
411
- .ui-icon-document { background-position: -32px -96px; }
412
- .ui-icon-document-b { background-position: -48px -96px; }
413
- .ui-icon-note { background-position: -64px -96px; }
414
- .ui-icon-mail-closed { background-position: -80px -96px; }
415
- .ui-icon-mail-open { background-position: -96px -96px; }
416
- .ui-icon-suitcase { background-position: -112px -96px; }
417
- .ui-icon-comment { background-position: -128px -96px; }
418
- .ui-icon-person { background-position: -144px -96px; }
419
- .ui-icon-print { background-position: -160px -96px; }
420
- .ui-icon-trash { background-position: -176px -96px; }
421
- .ui-icon-locked { background-position: -192px -96px; }
422
- .ui-icon-unlocked { background-position: -208px -96px; }
423
- .ui-icon-bookmark { background-position: -224px -96px; }
424
- .ui-icon-tag { background-position: -240px -96px; }
425
- .ui-icon-home { background-position: 0 -112px; }
426
- .ui-icon-flag { background-position: -16px -112px; }
427
- .ui-icon-calendar { background-position: -32px -112px; }
428
- .ui-icon-cart { background-position: -48px -112px; }
429
- .ui-icon-pencil { background-position: -64px -112px; }
430
- .ui-icon-clock { background-position: -80px -112px; }
431
- .ui-icon-disk { background-position: -96px -112px; }
432
- .ui-icon-calculator { background-position: -112px -112px; }
433
- .ui-icon-zoomin { background-position: -128px -112px; }
434
- .ui-icon-zoomout { background-position: -144px -112px; }
435
- .ui-icon-search { background-position: -160px -112px; }
436
- .ui-icon-wrench { background-position: -176px -112px; }
437
- .ui-icon-gear { background-position: -192px -112px; }
438
- .ui-icon-heart { background-position: -208px -112px; }
439
- .ui-icon-star { background-position: -224px -112px; }
440
- .ui-icon-link { background-position: -240px -112px; }
441
- .ui-icon-cancel { background-position: 0 -128px; }
442
- .ui-icon-plus { background-position: -16px -128px; }
443
- .ui-icon-plusthick { background-position: -32px -128px; }
444
- .ui-icon-minus { background-position: -48px -128px; }
445
- .ui-icon-minusthick { background-position: -64px -128px; }
446
- .ui-icon-close { background-position: -80px -128px; }
447
- .ui-icon-closethick { background-position: -96px -128px; }
448
- .ui-icon-key { background-position: -112px -128px; }
449
- .ui-icon-lightbulb { background-position: -128px -128px; }
450
- .ui-icon-scissors { background-position: -144px -128px; }
451
- .ui-icon-clipboard { background-position: -160px -128px; }
452
- .ui-icon-copy { background-position: -176px -128px; }
453
- .ui-icon-contact { background-position: -192px -128px; }
454
- .ui-icon-image { background-position: -208px -128px; }
455
- .ui-icon-video { background-position: -224px -128px; }
456
- .ui-icon-script { background-position: -240px -128px; }
457
- .ui-icon-alert { background-position: 0 -144px; }
458
- .ui-icon-info { background-position: -16px -144px; }
459
- .ui-icon-notice { background-position: -32px -144px; }
460
- .ui-icon-help { background-position: -48px -144px; }
461
- .ui-icon-check { background-position: -64px -144px; }
462
- .ui-icon-bullet { background-position: -80px -144px; }
463
- .ui-icon-radio-off { background-position: -96px -144px; }
464
- .ui-icon-radio-on { background-position: -112px -144px; }
465
- .ui-icon-pin-w { background-position: -128px -144px; }
466
- .ui-icon-pin-s { background-position: -144px -144px; }
467
- .ui-icon-play { background-position: 0 -160px; }
468
- .ui-icon-pause { background-position: -16px -160px; }
469
- .ui-icon-seek-next { background-position: -32px -160px; }
470
- .ui-icon-seek-prev { background-position: -48px -160px; }
471
- .ui-icon-seek-end { background-position: -64px -160px; }
472
- .ui-icon-seek-start { background-position: -80px -160px; }
473
- /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
474
- .ui-icon-seek-first { background-position: -80px -160px; }
475
- .ui-icon-stop { background-position: -96px -160px; }
476
- .ui-icon-eject { background-position: -112px -160px; }
477
- .ui-icon-volume-off { background-position: -128px -160px; }
478
- .ui-icon-volume-on { background-position: -144px -160px; }
479
- .ui-icon-power { background-position: 0 -176px; }
480
- .ui-icon-signal-diag { background-position: -16px -176px; }
481
- .ui-icon-signal { background-position: -32px -176px; }
482
- .ui-icon-battery-0 { background-position: -48px -176px; }
483
- .ui-icon-battery-1 { background-position: -64px -176px; }
484
- .ui-icon-battery-2 { background-position: -80px -176px; }
485
- .ui-icon-battery-3 { background-position: -96px -176px; }
486
- .ui-icon-circle-plus { background-position: 0 -192px; }
487
- .ui-icon-circle-minus { background-position: -16px -192px; }
488
- .ui-icon-circle-close { background-position: -32px -192px; }
489
- .ui-icon-circle-triangle-e { background-position: -48px -192px; }
490
- .ui-icon-circle-triangle-s { background-position: -64px -192px; }
491
- .ui-icon-circle-triangle-w { background-position: -80px -192px; }
492
- .ui-icon-circle-triangle-n { background-position: -96px -192px; }
493
- .ui-icon-circle-arrow-e { background-position: -112px -192px; }
494
- .ui-icon-circle-arrow-s { background-position: -128px -192px; }
495
- .ui-icon-circle-arrow-w { background-position: -144px -192px; }
496
- .ui-icon-circle-arrow-n { background-position: -160px -192px; }
497
- .ui-icon-circle-zoomin { background-position: -176px -192px; }
498
- .ui-icon-circle-zoomout { background-position: -192px -192px; }
499
- .ui-icon-circle-check { background-position: -208px -192px; }
500
- .ui-icon-circlesmall-plus { background-position: 0 -208px; }
501
- .ui-icon-circlesmall-minus { background-position: -16px -208px; }
502
- .ui-icon-circlesmall-close { background-position: -32px -208px; }
503
- .ui-icon-squaresmall-plus { background-position: -48px -208px; }
504
- .ui-icon-squaresmall-minus { background-position: -64px -208px; }
505
- .ui-icon-squaresmall-close { background-position: -80px -208px; }
506
- .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
507
- .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
508
- .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
509
- .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
510
- .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
511
- .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
512
-
513
-
514
- /* Misc visuals
515
- ----------------------------------*/
516
-
517
- /* Corner radius */
518
- .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
519
- .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
520
- .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
521
- .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
522
- .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
523
- .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
524
- .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
525
- .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
526
- .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
527
-
528
- /* Overlays */
529
- .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
530
- .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
531
- /*
532
- ColorBox Core Style:
533
- The following CSS is consistent between example themes and should not be altered.
534
- */
535
- #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
536
- #cboxOverlay{position:fixed; width:100%; height:100%;}
537
- #cboxMiddleLeft, #cboxBottomLeft{clear:left;}
538
- #cboxContent{position:relative;}
539
- #cboxLoadedContent{overflow:auto;}
540
- #cboxTitle{margin:0;}
541
- #cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
542
- #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
543
- .cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
544
- .cboxIframe{width:100%; height:100%; display:block; border:0;}
545
- #colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;}
546
-
547
- /*
548
- User Style:
549
- Change the following styles to modify the appearance of ColorBox. They are
550
- ordered & tabbed in a way that represents the nesting of the generated HTML.
551
- */
552
- #cboxOverlay{background:#000;}
553
- #colorbox{}
554
- #cboxTopLeft{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat 0 0;}
555
- #cboxTopCenter{height:14px; background:url(colorbox/border.png) repeat-x top left;}
556
- #cboxTopRight{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat -36px 0;}
557
- #cboxBottomLeft{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat 0 -32px;}
558
- #cboxBottomCenter{height:43px; background:url(colorbox/border.png) repeat-x bottom left;}
559
- #cboxBottomRight{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat -36px -32px;}
560
- #cboxMiddleLeft{width:14px; background:url(colorbox/controls.png) repeat-y -175px 0;}
561
- #cboxMiddleRight{width:14px; background:url(colorbox/controls.png) repeat-y -211px 0;}
562
- #cboxContent{background:#fff; overflow:visible;}
563
- .cboxIframe{background:#fff;}
564
- #cboxError{padding:50px; border:1px solid #ccc;}
565
- #cboxLoadedContent{margin-bottom:5px;}
566
- #cboxLoadingOverlay{background:url(colorbox/loading_background.png) no-repeat center center;}
567
- #cboxLoadingGraphic{background:url(colorbox/loading.gif) no-repeat center center;}
568
- #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
569
- #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
570
-
571
- #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(colorbox/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
572
- #cboxPrevious{left:0px; background-position: -51px -25px;}
573
- #cboxPrevious:hover{background-position:-51px 0px;}
574
- #cboxNext{left:27px; background-position:-75px -25px;}
575
- #cboxNext:hover{background-position:-75px 0px;}
576
- #cboxClose{right:0; background-position:-100px -25px;}
577
- #cboxClose:hover{background-position:-100px 0px;}
578
-
579
- .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
580
- .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;}
581
- .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
582
- .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;}
583
- #loading {
584
- position: fixed;
585
- left: 40%;
586
- top: 50%; }
587
-
588
- a {
589
- color: #333333;
590
- text-decoration: none; }
591
- a:hover {
592
- color: black;
593
- text-decoration: underline; }
594
-
595
- body {
596
- font-family: "Lucida Grande", Helvetica, "Helvetica Neue", Arial, sans-serif;
597
- padding: 12px;
598
- background-color: #333333; }
599
-
600
- h1, h2, h3, h4 {
601
- color: #1c2324;
602
- margin: 0;
603
- padding: 0;
604
- margin-bottom: 12px; }
605
-
606
- table {
607
- width: 100%; }
608
-
609
- #content {
610
- clear: left;
611
- background-color: white;
612
- border: 2px solid #dddddd;
613
- border-top: 8px solid #dddddd;
614
- padding: 18px;
615
- -webkit-border-bottom-left-radius: 5px;
616
- -webkit-border-bottom-right-radius: 5px;
617
- -webkit-border-top-right-radius: 5px;
618
- -moz-border-radius-bottomleft: 5px;
619
- -moz-border-radius-bottomright: 5px;
620
- -moz-border-radius-topright: 5px;
621
- border-bottom-left-radius: 5px;
622
- border-bottom-right-radius: 5px;
623
- border-top-right-radius: 5px; }
624
-
625
- .dataTables_filter, .dataTables_info {
626
- padding: 2px 6px; }
627
-
628
- abbr.timeago {
629
- text-decoration: none;
630
- border: none;
631
- font-weight: bold; }
632
-
633
- .timestamp {
634
- float: right;
635
- color: #dddddd; }
636
-
637
- .group_tabs {
638
- list-style: none;
639
- float: left;
640
- margin: 0;
641
- padding: 0; }
642
- .group_tabs li {
643
- display: inline;
644
- float: left; }
645
- .group_tabs li a {
646
- font-family: Helvetica, Arial, sans-serif;
647
- display: block;
648
- float: left;
649
- text-decoration: none;
650
- padding: 4px 8px;
651
- background-color: #aaaaaa;
652
- background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dddddd), to(#aaaaaa));
653
- background: -moz-linear-gradient(#dddddd, #aaaaaa);
654
- background: linear-gradient(#dddddd, #aaaaaa);
655
- text-shadow: #e5e5e5 1px 1px 0px;
656
- border-bottom: none;
657
- color: #333333;
658
- font-weight: bold;
659
- margin-right: 8px;
660
- border-top: 1px solid #efefef;
661
- -webkit-border-top-left-radius: 2px;
662
- -webkit-border-top-right-radius: 2px;
663
- -moz-border-radius-topleft: 2px;
664
- -moz-border-radius-topright: 2px;
665
- border-top-left-radius: 2px;
666
- border-top-right-radius: 2px; }
667
- .group_tabs li a:hover {
668
- background-color: #cccccc;
669
- background: -webkit-gradient(linear, 0 0, 0 bottom, from(#eeeeee), to(#aaaaaa));
670
- background: -moz-linear-gradient(#eeeeee, #aaaaaa);
671
- background: linear-gradient(#eeeeee, #aaaaaa); }
672
- .group_tabs li a:active {
673
- padding-top: 5px;
674
- padding-bottom: 3px; }
675
- .group_tabs li.active a {
676
- color: black;
677
- text-shadow: white 1px 1px 0px;
678
- background-color: #dddddd;
679
- background: -webkit-gradient(linear, 0 0, 0 bottom, from(white), to(#dddddd));
680
- background: -moz-linear-gradient(white, #dddddd);
681
- background: linear-gradient(white, #dddddd); }
682
-
683
- .file_list {
684
- margin-bottom: 18px; }
685
-
686
- a.src_link {
687
- background: url("./magnify.png") no-repeat left 50%;
688
- padding-left: 18px; }
689
-
690
- tr, td {
691
- margin: 0;
692
- padding: 0; }
693
-
694
- th {
695
- white-space: nowrap; }
696
- th.ui-state-default {
697
- cursor: pointer; }
698
- th span.ui-icon {
699
- float: left; }
700
-
701
- td {
702
- padding: 4px 8px; }
703
- td.strong {
704
- font-weight: bold; }
705
-
706
- .source_table h3, .source_table h4 {
707
- padding: 0;
708
- margin: 0;
709
- margin-bottom: 4px; }
710
- .source_table .header {
711
- padding: 10px; }
712
- .source_table pre {
713
- margin: 0;
714
- padding: 0;
715
- white-space: normal;
716
- color: black;
717
- font-family: "Monaco", "Inconsolata", "Consolas", monospace; }
718
- .source_table code {
719
- color: black;
720
- font-family: "Monaco", "Inconsolata", "Consolas", monospace; }
721
- .source_table pre {
722
- background-color: #333333; }
723
- .source_table pre ol {
724
- margin: 0px;
725
- padding: 0px;
726
- margin-left: 45px;
727
- font-size: 12px;
728
- color: white; }
729
- .source_table pre li {
730
- margin: 0px;
731
- padding: 2px 6px;
732
- border-left: 5px solid white; }
733
- .source_table pre li code {
734
- white-space: pre;
735
- white-space: pre-wrap; }
736
- .source_table pre .hits {
737
- float: right;
738
- margin-left: 10px;
739
- padding: 2px 4px;
740
- background-color: #444444;
741
- background: -webkit-gradient(linear, 0 0, 0 bottom, from(#222222), to(#666666));
742
- background: -moz-linear-gradient(#222222, #666666);
743
- background: linear-gradient(#222222, #666666);
744
- color: white;
745
- font-family: Helvetica, "Helvetica Neue", Arial, sans-serif;
746
- font-size: 10px;
747
- font-weight: bold;
748
- text-align: center;
749
- border-radius: 6px; }
750
-
751
- #footer {
752
- color: #dddddd;
753
- font-size: 12px;
754
- font-weight: bold;
755
- margin-top: 12px;
756
- text-align: right; }
757
- #footer a {
758
- color: #eeeeee;
759
- text-decoration: underline; }
760
- #footer a:hover {
761
- color: white;
762
- text-decoration: none; }
763
-
764
- .green {
765
- color: #009900; }
766
-
767
- .red {
768
- color: #990000; }
769
-
770
- .yellow {
771
- color: #ddaa00; }
772
-
773
- .source_table .covered {
774
- border-color: #009900; }
775
- .source_table .missed {
776
- border-color: #990000; }
777
- .source_table .never {
778
- border-color: black; }
779
- .source_table .skipped {
780
- border-color: #ffcc00; }
781
- .source_table .covered:nth-child(odd) {
782
- background-color: #cdf2cd; }
783
- .source_table .covered:nth-child(even) {
784
- background-color: #dbf2db; }
785
- .source_table .missed:nth-child(odd) {
786
- background-color: #f7c0c0; }
787
- .source_table .missed:nth-child(even) {
788
- background-color: #f7cfcf; }
789
- .source_table .never:nth-child(odd) {
790
- background-color: #efefef; }
791
- .source_table .never:nth-child(even) {
792
- background-color: #f4f4f4; }
793
- .source_table .skipped:nth-child(odd) {
794
- background-color: #fbf0c0; }
795
- .source_table .skipped:nth-child(even) {
796
- background-color: #fbffcf; }
797
-
798
-
799
-