akero 1.0.4 → 1.1.0

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 (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +3 -0
  3. data/.gitignore +0 -2
  4. data/.rubocop.yml +43 -0
  5. data/.travis.yml +3 -7
  6. data/Gemfile +1 -0
  7. data/Guardfile +4 -3
  8. data/Makefile +26 -0
  9. data/README.md +28 -10
  10. data/Rakefile +8 -17
  11. data/akero.gemspec +17 -10
  12. data/bin/akero +6 -0
  13. data/coverage/.last_run.json +5 -0
  14. data/coverage/.resultset.json +367 -0
  15. data/coverage/.resultset.json.lock +0 -0
  16. data/coverage/assets/0.10.0/application.css +799 -0
  17. data/coverage/assets/0.10.0/application.js +1707 -0
  18. data/coverage/assets/0.10.0/colorbox/border.png +0 -0
  19. data/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  20. data/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  21. data/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  22. data/coverage/assets/0.10.0/favicon_green.png +0 -0
  23. data/coverage/assets/0.10.0/favicon_red.png +0 -0
  24. data/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  25. data/coverage/assets/0.10.0/loading.gif +0 -0
  26. data/coverage/assets/0.10.0/magnify.png +0 -0
  27. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  28. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  29. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  30. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  31. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  32. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  33. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  34. data/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  35. data/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  36. data/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  37. data/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  38. data/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  39. data/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  40. data/coverage/assets/0.7.1/application.css +1110 -0
  41. data/coverage/assets/0.7.1/application.js +626 -0
  42. data/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  43. data/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  44. data/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  45. data/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  46. data/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  47. data/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  48. data/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  49. data/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  50. data/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  51. data/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  52. data/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  53. data/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  54. data/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  55. data/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  56. data/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  57. data/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  58. data/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  59. data/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  60. data/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  61. data/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  62. data/coverage/assets/0.7.1/favicon_green.png +0 -0
  63. data/coverage/assets/0.7.1/favicon_red.png +0 -0
  64. data/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  65. data/coverage/assets/0.7.1/loading.gif +0 -0
  66. data/coverage/assets/0.7.1/magnify.png +0 -0
  67. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  68. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  70. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  71. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  72. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  73. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  74. data/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  75. data/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  76. data/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  77. data/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  78. data/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  79. data/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  80. data/coverage/index.html +2248 -0
  81. data/doc/Akero/Message.html +475 -0
  82. data/doc/Akero.html +1148 -0
  83. data/doc/_index.html +125 -0
  84. data/doc/class_list.html +53 -0
  85. data/doc/css/common.css +1 -0
  86. data/doc/css/full_list.css +57 -0
  87. data/doc/css/style.css +338 -0
  88. data/doc/file.README.html +186 -0
  89. data/doc/file_list.html +55 -0
  90. data/doc/frames.html +28 -0
  91. data/doc/index.html +186 -0
  92. data/doc/js/app.js +214 -0
  93. data/doc/js/full_list.js +173 -0
  94. data/doc/js/jquery.js +4 -0
  95. data/doc/method_list.html +148 -0
  96. data/doc/top-level-namespace.html +112 -0
  97. data/lib/akero/benchmark.rb +21 -20
  98. data/lib/akero/cli.rb +74 -0
  99. data/lib/akero/version.rb +2 -1
  100. data/lib/akero.rb +92 -90
  101. data/spec/akero_spec.rb +66 -65
  102. data/spec/spec_helper.rb +1 -0
  103. metadata +164 -52
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f225c55aea3201c19c20e56f02ee12a390a0f34
4
+ data.tar.gz: 1b786e1ba1de3bd0d4842d233eb55cc320edb3b3
5
+ SHA512:
6
+ metadata.gz: fd0e126c6fd6fbd211d1ef49edba1d37f704df66870026c750ed83c5e04aa57485d5a0effe2557b1f56d8f6066650133b4036465dce125d8c4bccdedfcf0351e
7
+ data.tar.gz: c8768afdfecda7c928aee36890176f4ee8f1d1bac9b821dc8be311dd85f575bfd228dc4ead7f950edec5db9afae8db38bbdf08ced65248dd762f0d3a684ba15b
data/.gitattributes ADDED
@@ -0,0 +1,3 @@
1
+ doc/* linguist-documentation
2
+ coverage/* linguist-documentation
3
+ benchmark/* linguist-documentation
data/.gitignore CHANGED
@@ -8,8 +8,6 @@
8
8
  Gemfile.lock
9
9
  InstalledFiles
10
10
  _yardoc
11
- coverage
12
- doc/
13
11
  lib/bundler/man
14
12
  pkg
15
13
  rdoc
data/.rubocop.yml ADDED
@@ -0,0 +1,43 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
4
+ # Offense count: 13
5
+ Lint/AmbiguousRegexpLiteral:
6
+ Exclude:
7
+ - 'spec/akero_spec.rb'
8
+
9
+ # Offense count: 1
10
+ Lint/UnderscorePrefixedVariableName:
11
+ Exclude:
12
+ - 'lib/akero/benchmark.rb'
13
+
14
+ # Offense count: 8
15
+ Lint/UselessAssignment:
16
+ Exclude:
17
+ - 'lib/akero/benchmark.rb'
18
+ - 'spec/akero_spec.rb'
19
+
20
+ # Offense count: 9
21
+ Lint/Void:
22
+ Exclude:
23
+ - 'spec/akero_spec.rb'
24
+
25
+ # Offense count: 7
26
+ Metrics/AbcSize:
27
+ Max: 60
28
+
29
+ # Offense count: 2
30
+ # Configuration parameters: CountComments.
31
+ Metrics/ClassLength:
32
+ Max: 164
33
+
34
+ # Offense count: 45
35
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
36
+ # URISchemes: http, https
37
+ Metrics/LineLength:
38
+ Max: 150
39
+
40
+ # Offense count: 8
41
+ # Configuration parameters: CountComments.
42
+ Metrics/MethodLength:
43
+ Max: 51
data/.travis.yml CHANGED
@@ -1,9 +1,5 @@
1
1
  language: ruby
2
+ before_install:
3
+ - gem install bundler
2
4
  rvm:
3
- - "1.8.7"
4
- - "1.9.2"
5
- - "1.9.3"
6
- # - jruby-18mode # JRuby in 1.8 mode
7
- # - jruby-19mode # JRuby in 1.9 mode
8
- - rbx-18mode
9
- - rbx-19mode
5
+ - "2.3.1"
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  # Specify your gem's dependencies in smime.gemspec
data/Guardfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  my_code = <<'RUBY_CODE'
2
3
  if type == 'failed'
3
4
  system "ssh 192.168.1.106 '~/bin/keyboard_leds -c1 >/dev/null'"
@@ -9,10 +10,10 @@ my_code = <<'RUBY_CODE'
9
10
  end
10
11
  RUBY_CODE
11
12
 
12
- notification :eval_notifier, :code => my_code
13
+ notification :eval_notifier, code: my_code
13
14
 
14
- guard 'rspec', :cli => '--color --format doc' do
15
+ guard 'rspec', cli: '--color --format doc' do
15
16
  watch(%r{^spec/.+_spec\.rb$})
16
17
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
17
- watch('spec/spec_helper.rb') { "spec" }
18
+ watch('spec/spec_helper.rb') { 'spec' }
18
19
  end
data/Makefile ADDED
@@ -0,0 +1,26 @@
1
+ # 0. make test
2
+ # 1. commit changes
3
+ # 2. bump
4
+ # 3. make release
5
+
6
+ .PHONY: test doc release
7
+
8
+ test:
9
+ bundle exec rubocop
10
+ bundle exec rake
11
+
12
+ doc:
13
+ bundle exec yardoc
14
+
15
+ push: test doc
16
+ git add doc coverage README.md
17
+ git commit -m 'Documentation update' doc coverage README.md
18
+ git checkout gh-pages
19
+ git checkout master -- doc coverage
20
+ git commit -m 'Documentation update'
21
+ git checkout master
22
+ git push origin gh-pages
23
+
24
+ release: test doc push
25
+ bundle exec rake release
26
+
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # Akero [![Build Status](https://travis-ci.org/busyloop/akero.png?branch=master)](https://travis-ci.org/busyloop/akero) [![Dependency Status](https://gemnasium.com/busyloop/akero.png)](https://gemnasium.com/busyloop/akero)
1
+ # Akero [![Build Status](https://travis-ci.org/busyloop/akero.png?branch=master)](https://travis-ci.org/busyloop/akero) [![Dependency Status](https://gemnasium.com/busyloop/akero.png)](https://gemnasium.com/busyloop/akero) [![Gem Version](https://badge.fury.io/rb/akero.svg)](https://badge.fury.io/rb/akero)
2
2
 
3
3
  Akero ([ἄγγελος](http://en.wiktionary.org/wiki/%F0%90%80%80%F0%90%80%90%F0%90%80%AB), messenger) is an easy-to-use library for peer-to-peer [public key cryptography](http://en.wikipedia.org/wiki/Public-key_cryptography). It enables two or more endpoints to exchange encrypted and/or signed messages without requiring a pre-shared secret.
4
4
 
5
5
  Under the hood Akero uses standard OpenSSL primitives. Each instance wraps a [RSA](http://en.wikipedia.org/wiki/RSA)-keypair, a corresponding [X.509 certificate](http://en.wikipedia.org/wiki/X.509) and exchanges self-signed messages ([PKCS#7](https://tools.ietf.org/html/rfc2315)) with other instances.
6
6
 
7
- Akero does not try to be a substitute for a fully featured [PKI](http://en.wikipedia.org/wiki/Public_key_infrastructure). It is meant to be used as a building block in scenarios where trust-relationships and keyrings can be externally managed, and where the complexity of traditional solutions (X.509 PKI, OpenPGP, custom RSA) yields no tangible benefits.
7
+ Akero does not try to be a substitute for a fully featured [PKI](http://en.wikipedia.org/wiki/Public_key_infrastructure). It is meant to be used as a building block in scenarios where trust-relationships and keyrings can be managed externally, and where the complexity of traditional solutions (X.509 PKI, OpenPGP, custom RSA) yields no tangible benefits.
8
8
 
9
9
  ## Features
10
10
 
@@ -12,7 +12,7 @@ Akero does not try to be a substitute for a fully featured [PKI](http://en.wikip
12
12
  * Low complexity; easy to use, understand and review (only 192 lines of code)
13
13
  * Transport agnostic; messages and certificates are self-contained and optionally ascii-armored (base64)
14
14
  * Built on standard OpenSSL primitives, no homegrown algorithms
15
- * [100%](https://busyloop.net/oss/akero/coverage/) test coverage
15
+ * [100%](http://busyloop.github.com/akero/coverage/) test coverage
16
16
 
17
17
 
18
18
  ## Installation
@@ -20,7 +20,7 @@ Akero does not try to be a substitute for a fully featured [PKI](http://en.wikip
20
20
  `gem install akero`
21
21
 
22
22
 
23
- ## Usage
23
+ ## Usage (API)
24
24
 
25
25
  ```ruby
26
26
  require 'akero'
@@ -40,15 +40,17 @@ signed_msg = alice.sign("Hello world!")
40
40
  # Alice's fingerprint and public key from it
41
41
  msg = bob.receive(signed_msg)
42
42
  msg.body # => "Hello world!"
43
+ msg.type # => :signed
43
44
  msg.from # => "AK:12:34:56:..."
44
45
  msg.from_pk # => "(alice-public-key)"
45
46
 
46
47
  # Bob encrypts a message for Alice
47
48
  bobs_msg = bob.encrypt(msg.from_pk, "Hello Alice!")
48
-
49
+
49
50
  # Alice can receive it...
50
51
  msg = alice.receive(bobs_msg)
51
52
  msg.body # => "Hello Alice!"
53
+ msg.type # => :encrypted
52
54
  msg.from # => "AK:ab:cd:ef:..."
53
55
  msg.from_pk # => "(bob-public-key)"
54
56
 
@@ -68,20 +70,36 @@ new_alice = Akero.load(File.read('/tmp/alice.akr'))
68
70
  # In production Alice disables the armoring
69
71
  # for better performance.
70
72
  signed_msg = alice.sign("Hello world!", false)
71
- msg = alice.encrypt(alice.public_key, "Hello!", false)
72
- puts alice.receive(msg).body # => "Hello!"
73
+ encrypted_msg = alice.encrypt(alice.public_key, "Hello!", false)
74
+ puts alice.receive(encrypted_msg).body # => "Hello!"
75
+ ```
76
+
77
+ ## Usage (CLI)
78
+
79
+ ```bash
80
+ $ akero id -i /tmp/alice.akr
81
+ Private key not found. Generating a new 4096 bits RSA key and saving to /tmp/alice.akr ...
82
+ AK:8B:33:5B:AB:4C:78:CA:5E:CC:F5:FE:D7:75:F2:A4:74:16:28:FB:C2
83
+
84
+ $ akero id -i /tmp/bob.akr
85
+ Private key not found. Generating a new 4096 bits RSA key and saving to /tmp/bob.akr ...
86
+ AK:CF:B3:4C:BA:7C:9C:2E:31:2D:0D:1D:3F:F9:F4:05:F6:C7:B2:38:3F
87
+
88
+ $ akero pk -i /tmp/bob.akr >/tmp/bob.pk
73
89
 
90
+ $ echo "Hello" | akero encrypt -i /tmp/alice.akr /tmp/bob.pk | akero receive -i /tmp/bob.akr
91
+ Hello
74
92
  ```
75
93
 
76
94
  ## Documentation
77
95
 
78
- * [API Docs](http://rubydoc.info/gems/akero/Akero)
96
+ * [API Docs](http://busyloop.github.com/akero/doc/frames.html)
79
97
  * [Spec](https://github.com/busyloop/akero/blob/master/spec/akero_spec.rb)
80
98
 
81
99
  ## Benchmarks
82
100
 
83
- ![Throughput](http://github.com/busyloop/akero/raw/master/benchmark/bm_rate.png)
84
- ![Message size](http://github.com/busyloop/akero/raw/master/benchmark/bm_size.png)
101
+ ![Throughput](https://github.com/busyloop/akero/raw/master/benchmark/bm_rate.png?raw=true)
102
+ ![Message size](https://github.com/busyloop/akero/raw/master/benchmark/bm_size.png?raw=true)
85
103
 
86
104
  The above charts were generated using MRI 1.9.3p362 (x86_64-linux) on an [AMD Turion II Neo N40L](http://www.cpubenchmark.net/cpu.php?cpu=AMD+Turion+II+Neo+N40L+Dual-Core) CPU.
87
105
  You may run the benchmarks on your own machine with `rake benchmark`.
data/Rakefile CHANGED
@@ -1,29 +1,20 @@
1
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
2
3
 
3
4
  require 'rspec/core/rake_task'
4
5
 
5
- task :default => :test
6
+ task default: :test
6
7
 
7
- RSpec::Core::RakeTask.new("test:spec") do |t|
8
- t.pattern = 'spec/**/*_spec.rb'
9
- t.rspec_opts = '--fail-fast -b -c -f documentation --tag ~benchmark'
8
+ RSpec::Core::RakeTask.new('test:spec') do |t|
9
+ t.pattern = 'spec/**/*_spec.rb'
10
+ t.rspec_opts = '--fail-fast -b -c -f documentation --tag ~benchmark'
10
11
  end
11
12
 
12
13
  desc 'Run test suite'
13
- task :test => [ 'test:spec' ]
14
+ task test: ['test:spec']
14
15
 
15
- desc "Run benchmark suite"
16
+ desc 'Run benchmark suite'
16
17
  task :benchmark do
17
18
  require 'akero/benchmark'
18
19
  Akero::Benchmark.run!
19
20
  end
20
-
21
- namespace :docs do
22
- task :push do
23
- `bl_www_sync akero coverage`
24
- end
25
-
26
- task :loc do
27
- puts `grep -v '^\\s*#' lib/akero.rb | grep -v '^$' | wc -l`
28
- end
29
- end
data/akero.gemspec CHANGED
@@ -1,29 +1,36 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'akero/version'
5
6
 
6
7
  Gem::Specification.new do |gem|
7
- gem.name = "akero"
8
+ gem.name = 'akero'
8
9
  gem.version = Akero::VERSION
9
- gem.authors = ["Moe"]
10
- gem.email = ["moe@busyloop.net"]
11
- gem.description = %q{Easy peer-to-peer public key cryptography}
12
- gem.summary = %q{Easy peer-to-peer public key cryptography}
13
- gem.homepage = "https://github.com/busyloop/akero"
10
+ gem.authors = ['Moe']
11
+ gem.email = ['moe@busyloop.net']
12
+ gem.description = 'Easy peer-to-peer public key cryptography'
13
+ gem.summary = 'Easy peer-to-peer public key cryptography'
14
+ gem.homepage = 'https://github.com/busyloop/akero'
14
15
 
15
- gem.files = `git ls-files`.split($/)
16
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
17
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
- gem.require_paths = ["lib"]
19
+ gem.require_paths = ['lib']
20
+
21
+ gem.required_ruby_version = '>= 2.3.1'
22
+
23
+ gem.add_dependency 'optix'
19
24
 
20
25
  gem.add_development_dependency 'rb-inotify'
21
26
  gem.add_development_dependency 'guard'
22
27
  gem.add_development_dependency 'guard-rspec'
23
28
  gem.add_development_dependency 'rake'
24
29
  gem.add_development_dependency 'simplecov'
25
- gem.add_development_dependency 'rspec'
30
+ gem.add_development_dependency 'rspec', '= 2.12.0'
26
31
  gem.add_development_dependency 'b'
27
32
  gem.add_development_dependency 'gnuplot'
28
33
  gem.add_development_dependency 'yard'
34
+ gem.add_development_dependency 'bump'
35
+ gem.add_development_dependency 'rubocop'
29
36
  end
data/bin/akero ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'akero/cli'
5
+
6
+ Optix.invoke!
@@ -0,0 +1,5 @@
1
+ {
2
+ "result": {
3
+ "covered_percent": 100.0
4
+ }
5
+ }
@@ -0,0 +1,367 @@
1
+ {
2
+ "RSpec": {
3
+ "coverage": {
4
+ "/Users/moe/code/akero/lib/akero.rb": [
5
+ null,
6
+ null,
7
+ null,
8
+ null,
9
+ null,
10
+ null,
11
+ null,
12
+ null,
13
+ null,
14
+ null,
15
+ null,
16
+ null,
17
+ null,
18
+ null,
19
+ null,
20
+ null,
21
+ null,
22
+ null,
23
+ null,
24
+ null,
25
+ null,
26
+ null,
27
+ null,
28
+ null,
29
+ 1,
30
+ null,
31
+ 1,
32
+ 1,
33
+ null,
34
+ null,
35
+ null,
36
+ null,
37
+ null,
38
+ null,
39
+ 1,
40
+ null,
41
+ 1,
42
+ null,
43
+ 1,
44
+ null,
45
+ 1,
46
+ null,
47
+ null,
48
+ 1,
49
+ 9,
50
+ 9,
51
+ 9,
52
+ null,
53
+ null,
54
+ null,
55
+ 1,
56
+ 1,
57
+ null,
58
+ null,
59
+ null,
60
+ null,
61
+ 1,
62
+ 3,
63
+ null,
64
+ null,
65
+ null,
66
+ null,
67
+ 1,
68
+ 2,
69
+ null,
70
+ null,
71
+ null,
72
+ null,
73
+ null,
74
+ 1,
75
+ 1,
76
+ 1,
77
+ 1,
78
+ 1,
79
+ 1,
80
+ 1,
81
+ 1,
82
+ 1,
83
+ 1,
84
+ 1,
85
+ null,
86
+ 1,
87
+ 1,
88
+ 1,
89
+ 1,
90
+ 1,
91
+ null,
92
+ 1,
93
+ 1,
94
+ null,
95
+ null,
96
+ null,
97
+ null,
98
+ 1,
99
+ 19,
100
+ null,
101
+ null,
102
+ null,
103
+ null,
104
+ null,
105
+ null,
106
+ null,
107
+ null,
108
+ null,
109
+ null,
110
+ null,
111
+ null,
112
+ null,
113
+ null,
114
+ null,
115
+ null,
116
+ 1,
117
+ 60,
118
+ null,
119
+ null,
120
+ null,
121
+ null,
122
+ null,
123
+ null,
124
+ null,
125
+ null,
126
+ null,
127
+ 1,
128
+ 2,
129
+ 2,
130
+ 1,
131
+ null,
132
+ 1,
133
+ 1,
134
+ 1,
135
+ 1,
136
+ 1,
137
+ null,
138
+ null,
139
+ null,
140
+ null,
141
+ null,
142
+ null,
143
+ null,
144
+ null,
145
+ 1,
146
+ 27,
147
+ null,
148
+ null,
149
+ null,
150
+ null,
151
+ null,
152
+ null,
153
+ null,
154
+ null,
155
+ null,
156
+ null,
157
+ null,
158
+ null,
159
+ null,
160
+ 1,
161
+ null,
162
+ null,
163
+ 4,
164
+ 4,
165
+ 4,
166
+ 4,
167
+ 4,
168
+ 4,
169
+ null,
170
+ null,
171
+ null,
172
+ null,
173
+ null,
174
+ null,
175
+ null,
176
+ 1,
177
+ 6,
178
+ 6,
179
+ null,
180
+ null,
181
+ null,
182
+ null,
183
+ null,
184
+ null,
185
+ null,
186
+ null,
187
+ null,
188
+ null,
189
+ null,
190
+ null,
191
+ null,
192
+ null,
193
+ null,
194
+ null,
195
+ null,
196
+ null,
197
+ null,
198
+ null,
199
+ null,
200
+ null,
201
+ 1,
202
+ 13,
203
+ 13,
204
+ 23,
205
+ null,
206
+ 21,
207
+ 21,
208
+ null,
209
+ 2,
210
+ null,
211
+ null,
212
+ 2,
213
+ null,
214
+ null,
215
+ 9,
216
+ 7,
217
+ null,
218
+ null,
219
+ null,
220
+ null,
221
+ null,
222
+ null,
223
+ 1,
224
+ 19,
225
+ 11,
226
+ null,
227
+ 19,
228
+ 19,
229
+ null,
230
+ 2,
231
+ null,
232
+ null,
233
+ 15,
234
+ null,
235
+ null,
236
+ 5,
237
+ null,
238
+ null,
239
+ 8,
240
+ 6,
241
+ 4,
242
+ 4,
243
+ null,
244
+ 2,
245
+ null,
246
+ null,
247
+ null,
248
+ 1,
249
+ 3,
250
+ null,
251
+ null,
252
+ null,
253
+ 1,
254
+ 1,
255
+ null,
256
+ null,
257
+ null,
258
+ 2,
259
+ null,
260
+ null,
261
+ null,
262
+ null,
263
+ null,
264
+ null,
265
+ null,
266
+ null,
267
+ null,
268
+ 1,
269
+ 74,
270
+ 74,
271
+ null,
272
+ null,
273
+ null,
274
+ null,
275
+ null,
276
+ 1,
277
+ 23,
278
+ 44,
279
+ null,
280
+ 1,
281
+ null,
282
+ null,
283
+ null,
284
+ 1,
285
+ null,
286
+ 1,
287
+ 8,
288
+ null,
289
+ 2,
290
+ null,
291
+ null,
292
+ 1,
293
+ 9,
294
+ 9,
295
+ null,
296
+ null,
297
+ 1,
298
+ 26,
299
+ 26,
300
+ null,
301
+ 15,
302
+ null,
303
+ 9,
304
+ null,
305
+ 2,
306
+ null,
307
+ 24,
308
+ 24,
309
+ null,
310
+ null,
311
+ 1,
312
+ 26,
313
+ 24,
314
+ null,
315
+ 24,
316
+ 18,
317
+ 2,
318
+ null,
319
+ null,
320
+ 16,
321
+ null,
322
+ null,
323
+ 22,
324
+ 3,
325
+ null,
326
+ null,
327
+ 19,
328
+ null,
329
+ null,
330
+ null,
331
+ null,
332
+ null,
333
+ null,
334
+ null,
335
+ 1,
336
+ 61,
337
+ 61,
338
+ null,
339
+ 61,
340
+ 61,
341
+ 61,
342
+ 61,
343
+ 61,
344
+ 61,
345
+ 61,
346
+ null,
347
+ 61,
348
+ 61,
349
+ null,
350
+ 61,
351
+ 61,
352
+ 61,
353
+ null,
354
+ null,
355
+ null,
356
+ 61,
357
+ null,
358
+ 61,
359
+ 61,
360
+ 61,
361
+ null,
362
+ null
363
+ ]
364
+ },
365
+ "timestamp": 1465614139
366
+ }
367
+ }
File without changes