venice 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
-