chawk 0.1.10 → 0.1.13

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29d1fbfc067f4fb5c6e95997d265cc9764987467
4
- data.tar.gz: 93a8956cbe1bf6d3a135285a537ea7c5539e8678
3
+ metadata.gz: 514c9371fbb400d5b4ac66ab41607f90ccf0fff0
4
+ data.tar.gz: f9f124f906aa007c2f30185ec4a8110f5084b955
5
5
  SHA512:
6
- metadata.gz: 0f78c30f040dbf79a534abe849a6aa4831965d1ca0e4b94dd5525e4ce1386795fb9b7ddeec299fbb608e565ec61c949a92770e1fb50895082a177b6bfa7b5b78
7
- data.tar.gz: b72f8375b23223bdbef799936894acb72c99fee92932c023721c2d0a43153b54f45e214d06a075b0f910c4131bd82168c53ca116ce5bcf498a395239c9d4c0a0
6
+ metadata.gz: 5eb9123cdc07938a34d36dd6771602ee7968f3ae1570c59074ea1b85317014deee5643fb80000ae008c5aa0d56214632543b80ed4255001c0255587ad08472b9
7
+ data.tar.gz: eb256ec168c12ac0215b241be7738051eaca7debf9f1f532690ca8b3fda1099206033b953964f3b989395c3a3ce08024e02586b034c1c356775727f39cb5c9ed
data/README.md CHANGED
@@ -1,17 +1,16 @@
1
- # Chawk
1
+ <img src="https://rawgithub.com/queuetue/chawk-gem/master/lib/chawk/Jackdaw.svg" alt="Drawing" width="400px"/>
2
2
 
3
- [![Gem Version][GV img]][Gem Version]
3
+
4
+ [![Gem Version](https://badge.fury.io/rb/chawk.png)](http://badge.fury.io/rb/chawk)
4
5
  [![Build Status][BS img]][Build Status]
5
6
  [![Dependency Status][DS img]][Dependency Status]
6
7
  [![Code Climate][CC img]][Code Climate]
7
8
 
8
- [Gem Version]: https://rubygems.org/gems/chawk
9
9
  [Build Status]: https://travis-ci.org/queuetue/chawk-gem
10
10
  [travis pull requests]: https://travis-ci.org/queuetue/chawk-gem/pull_requests
11
11
  [Dependency Status]: https://gemnasium.com/queuetue/chawk-gem
12
12
  [Code Climate]: https://codeclimate.com/github/queuetue/chawk-gem
13
13
 
14
- [GV img]: https://badge.fury.io/rb/chawk-gem.png
15
14
  [BS img]: https://travis-ci.org/queuetue/chawk-gem.png
16
15
  [DS img]: https://gemnasium.com/queuetue/chawk-gem.png
17
16
  [CC img]: https://codeclimate.com/github/queuetue/chawk-gem.png
@@ -22,7 +21,10 @@ Chawk is a database agnostic time-series database written in Ruby.
22
21
 
23
22
  It tracks both both points (Integers) and values (String) in seperate datastores, and will eventually provide statistical and aggregate tools for numeric data.
24
23
 
25
- This is the gem that powers the server, [chawk-server](http://github.com/queuetue/chawk-server "chawk-server")
24
+ This is the gem that powers the soon-to-be server, chawk-server
25
+
26
+ Docs at [Queuetue.com](http://queuetue.com/Chawk "queuetue.com")
27
+
26
28
 
27
29
  ## Installation
28
30
 
@@ -116,10 +118,10 @@ As well as max and min
116
118
 
117
119
  ## Contributing
118
120
 
119
- 1. Fork it ( http://github.com/<my-github-username>/chawk/fork )
120
- 2. Create your feature branch (`git checkout -b my-new-feature`)
121
- 3. Commit your changes (`git commit -am 'Add some feature'`)
122
- 4. Push to the branch (`git push origin my-new-feature`)
121
+ 1. Fork it at [github](http://github.com/queuetue/chawk-gem/fork "Github")
122
+ 2. Create your feature branch => `git checkout -b my-new-feature`
123
+ 3. Commit your changes => `git commit -am 'Add some feature'`
124
+ 4. Push to the branch => `git push origin my-new-feature`
123
125
  5. Create new Pull Request
124
126
 
125
127
  ## License
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Chawk::VERSION
9
9
  spec.authors = ["Scott Russell"]
10
10
  spec.email = ["queuetue@gmail.com"]
11
- spec.summary = %q{Time Series Storage Server}
12
- spec.description = %q{Time Series Storage Server}
13
- spec.homepage = ""
11
+ spec.summary = %q{Time Series Storage Engine}
12
+ spec.description = %q{A storage engine for time-series data. Eventually to include resampling, statistical and aggregate data management.}
13
+ spec.homepage = "http://www.queuetue.com/Chawk"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -18,18 +18,13 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency "dm-sqlite-adapter", "1.2.0"
22
- spec.add_runtime_dependency "dm-postgres-adapter","1.2.0"
23
21
  spec.add_runtime_dependency "data_mapper", "1.2.0"
24
- spec.add_runtime_dependency "dm-is-tree", "1.2.0"
25
- spec.add_runtime_dependency "dm-aggregates", "1.2.0"
26
-
22
+
27
23
  spec.add_development_dependency "bundler", "~> 1.5"
28
24
  spec.add_development_dependency "rake"
29
25
  spec.add_development_dependency('minitest', '5.3.0')
30
26
  spec.add_development_dependency('rack-test', "0.6.2")
31
27
  spec.add_development_dependency('json', "1.8.1")
32
- spec.add_development_dependency('coveralls', "0.7.0")
33
- spec.add_development_dependency('fakeweb')
28
+ spec.add_development_dependency('simplecov')
34
29
 
35
30
  end
@@ -1,49 +1,67 @@
1
1
  require 'vaddr'
2
2
  require 'paddr'
3
3
  module Chawk
4
+ # Manages addressing of Nodes - all data operations in Chawk are done
5
+ # through an instance of Chawk::Addr.
4
6
  class Addr
5
7
  attr_reader :path, :node, :agent
8
+
9
+ # @param agent [Chawk::Agent] the agent whose permission will be used for this request
10
+ # @param path [String] the string address this addr can be found in the database.
11
+ # If a path does not exist, it will be created and the current agent will be set as an admin for it.
6
12
  def initialize(agent,path)
7
13
  @path = path
8
14
  @agent = agent
9
15
 
10
16
  unless path.is_a?(String)
11
- #DataMapper.logger.debug "NOT A STRING"
12
- raise ArgumentError
17
+ raise entError, "Path must be a String."
13
18
  end
14
19
 
15
- unless path =~ /^[\w\/\:\\]+$/
16
- #DataMapper.logger.debug "BAD MATCH"
17
- raise ArgumentError
20
+ unless path =~ /^[\w\:\$\!\@\*\[\]\~\(\)]+$/
21
+ raise ArgumentError, "Path can only contain [A-Za-z0-9_:$!@*[]~()] (#{path})"
18
22
  end
19
23
 
20
24
  @node = find_or_create_addr(path)
21
25
 
22
26
  unless @node
23
- #DataMapper.logger.debug "NOT A NODE"
24
- raise ArgumentError
27
+ raise ArgumentError,"No node returned."
25
28
  end
26
29
  end
27
30
 
31
+ # An alias for path
32
+ # @return [String] the string address this addr can be found in the database.
28
33
  def address
29
34
  @path
30
35
  end
31
36
 
32
37
 
38
+ # Returns the Value Store at this address
39
+ # @return [Chawk::Vaddr]
33
40
  def values()
34
41
  Chawk::Vaddr.new(self)
35
42
  end
36
43
 
44
+ # Returns the Point Store at this address
45
+ # @return [Chawk::Paddr]
37
46
  def points()
38
47
  Chawk::Paddr.new(self)
39
48
  end
40
49
 
41
- def public_read=(value,options={})
50
+
51
+ # Sets public read flag for this address
52
+ # @param value [Boolean] true if public reading is allowed, false if it is not.
53
+ def public_read=(value)
42
54
  value = value ? true : false
43
55
  #DataMapper.logger.debug "MAKING #{@node.address} PUBLIC (#{value})"
44
56
  @node.update(public_read:value)
45
57
  end
46
58
 
59
+ # Sets permissions flag for this address, for a specific agent. The existing Chawk::Relationship will be destroyed and
60
+ # a new one created as specified. Write access is not yet checked.
61
+ # @param agent [Chawk::Agent] the agent to give permission.
62
+ # @param read [Boolean] true/false can the agent read this address.
63
+ # @param write [Boolean] true/false can the agent write this address. (Read acces is required to write.)
64
+ # @param admin [Boolean] does the agent have ownership/adnim rights for this address. (Read and write are granted if admin is as well.)
47
65
  def set_permissions(agent,read=false,write=false,admin=false)
48
66
  #DataMapper.logger.debug "REVOKING #{@node.address} / #{@agent.name} "
49
67
  @node.relations.all(agent:agent).destroy()
@@ -55,6 +73,8 @@ module Chawk
55
73
  nil
56
74
  end
57
75
 
76
+ private
77
+
58
78
  def check_node_security(node)
59
79
  if node.public_read
60
80
  #DataMapper.logger.debug "NODE IS PUBLIC ACCESSABLE -- #{@agent.name} - #{@agent.id}"
@@ -66,13 +86,13 @@ module Chawk
66
86
  return node
67
87
  else
68
88
  #DataMapper.logger.debug "NODE IS INACCESSABLE -- #{@agent.name} - #{@agent.id}"
69
- raise SecurityError
89
+ raise SecurityError,"You do not have permission to access this node. #{@agent}"
70
90
  end
71
91
  end
72
92
 
73
93
  def find_or_create_addr(addr)
74
94
  #TODO also accept regex-tested string
75
- raise ArgumentError unless addr.is_a?(String)
95
+ raise(ArgumentError,"Path must be a string.") unless addr.is_a?(String)
76
96
 
77
97
  node = Chawk::Models::Node.first(address:self.address)
78
98
  if node
@@ -1,26 +1,38 @@
1
1
  require "chawk/version"
2
2
  require 'data_mapper'
3
- require 'dm-is-tree'
4
3
  require 'quantizer'
5
4
  require 'models'
6
5
  require 'addr'
7
6
 
7
+ # Chawk is a gem for storing and retrieving time seris data.
8
8
  module Chawk
9
9
 
10
+ # Has Chawk been setup yet?
10
11
  @@ready = nil
11
12
 
13
+ # @param agent [Chawk::Agent] the agent whose permission will be used for this request
14
+ # @param path [String] the string address this addr can be found in the database.
15
+ # @return [Chawk::Addr]
16
+ # The primary method for retrieving an Addr. If a path does not exist, it will be created
17
+ # and the current agent will be set as an admin for it.
12
18
  def self.addr(agent,path)
13
19
  if @@ready.nil?
14
20
  raise "Chawk has not been setup yet."
15
21
  end
16
22
 
17
- if agent.is_a?(Chawk::Models::Agent) && path.is_a?(String)
18
- return Chawk::Addr.new(agent,path)
19
- else
20
- raise ArgumentError
23
+ unless agent.is_a?(Chawk::Models::Agent)
24
+ raise ArgumentError, 'Agent must be a Chawk::Models::Agent instance'
21
25
  end
26
+
27
+ unless path.is_a?(String)
28
+ raise ArgumentError, 'Path must be a string.'
29
+ end
30
+
31
+ return Chawk::Addr.new(agent,path)
32
+
22
33
  end
23
34
 
35
+ # Deletes all data in the database. Very dangerous. Backup often!
24
36
  def self.clear_all_data!
25
37
  if @@ready.nil?
26
38
  raise "Chawk has not been setup yet."
@@ -36,6 +48,8 @@ module Chawk
36
48
  end
37
49
 
38
50
 
51
+ # @param database_url [String]
52
+ # Startup routine for Chawk, requires a database URL in DataMapper's standard format.
39
53
  def self.setup(database_url)
40
54
  @@ready = true
41
55
  adapter = DataMapper.setup(:default, database_url)
@@ -0,0 +1,94 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg width="589px" height="442px" viewBox="0 0 589 442" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
3
+ <title>Untitled</title>
4
+ <description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
5
+ <defs></defs>
6
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
7
+ <g id="Chawk-Logo" sketch:type="MSLayerGroup" transform="translate(1.000000, 0.000000)">
8
+ <g id="Graph" transform="translate(10.000000, 12.000000)" sketch:type="MSShapeGroup">
9
+ <path d="M556.229,219.725 L544.612,200.642 L534.386,254.394 L520.908,253.703 C520.908,253.703 508.827,86.94 508.827,83.474 C508.827,80.008 495.348,146.92 495.348,146.92 L483.729,255.78 L462.818,291.749 L447.947,304.228 L435.399,201.975 L423.782,254.394 L411.234,237.031 L399.149,284.125 L387.069,-0.333 L374.517,26.16 L362.059,40.201 L350.819,79.057 L337.805,84.91 L327.117,100.849 L315.036,130.047 L300.893,90.757 L289.94,23.54 L278.315,54.239 L266.702,84.907 L253.687,67.694 L242.535,117.484 L229.525,165.054 L216.978,201.975 L206.753,235.595 L193.277,248.543 L182.589,214.78 L169.574,199.569 L155.168,237.028 L145.409,165.637 L133.326,237.028 C133.326,237.028 121.243,31.466 121.243,29.387 C121.243,27.306 108.695,221.998 108.695,221.998 L97.077,304.226 L84.53,284.813 L72.911,304.227 L61.292,255.78 L48.28,237.028 L35.268,163.556 L24.115,304.226 L11.569,304.226 L-0.05,285.506 L-0.05,375.007 L563.817,375.007 L563.817,220.213 L556.229,219.725 L556.229,219.725 Z" id="Shape" fill="#CCDBDD"></path>
10
+ <path d="M556.229,219.725 L544.612,200.642 L534.386,254.394 L520.908,253.703 C520.908,253.703 508.827,86.94 508.827,83.474 C508.827,80.008 495.348,146.92 495.348,146.92 L483.729,255.78 L462.818,291.749 L447.947,304.228 L435.399,201.975 L423.782,254.394 L411.234,237.031 L399.149,284.125 L387.069,-0.333 L374.517,26.16 L362.059,40.201 L350.819,79.057 L337.805,84.91 L327.117,100.849 L315.036,130.047 L300.893,90.757 L289.94,23.54 L278.315,54.239 L266.702,84.907 L253.687,67.694 L242.535,117.484 L229.525,165.054 L216.978,201.975 L206.753,235.595 L193.277,248.543 L182.589,214.78 L169.574,199.569 L155.168,237.028 L145.409,165.637 L133.326,237.028 C133.326,237.028 121.243,31.466 121.243,29.387 C121.243,27.306 108.695,221.998 108.695,221.998 L97.077,304.226 L84.53,284.813 L72.911,304.227 L61.292,255.78 L48.28,237.028 L35.268,163.556 L24.115,304.226 L11.569,304.226 L-0.05,285.506 L-0.05,375.007 L563.817,375.007 L563.817,220.213 L556.229,219.725 L556.229,219.725 Z" id="Shape" stroke="#A3BEC1" stroke-width="2" fill-opacity="0" fill="#000000"></path>
11
+ </g>
12
+ <g id="Dots" transform="translate(6.000000, 6.000000)" fill="#1F6390" sketch:type="MSShapeGroup">
13
+ <path d="M11.661,286.887 C11.661,290.118 9.042,292.737 5.811,292.737 C2.581,292.737 -0.039,290.118 -0.039,286.887 C-0.039,283.656 2.581,281.037 5.811,281.037 C9.042,281.037 11.661,283.656 11.661,286.887 L11.661,286.887 Z" id="Shape"></path>
14
+ <path d="M40.258,165.204 C37.028,165.204 34.408,162.585 34.408,159.354 C34.408,156.123 37.028,153.504 40.258,153.504 C43.489,153.504 46.108,156.123 46.108,159.354 C46.108,162.585 43.489,165.204 40.258,165.204 Z" id="Shape"></path>
15
+ <path d="M60.733,244.313 C60.733,247.544 58.114,250.163 54.883,250.163 C51.653,250.163 49.033,247.544 49.033,244.313 C49.033,241.082 51.653,238.463 54.883,238.463 C58.114,238.463 60.733,241.082 60.733,244.313 L60.733,244.313 Z" id="Shape"></path>
16
+ <path d="M73.004,261.779 C73.004,265.01 70.385,267.629 67.154,267.629 C63.924,267.629 61.304,265.01 61.304,261.779 C61.304,258.548 63.924,255.929 67.154,255.929 C70.385,255.929 73.004,258.548 73.004,261.779 L73.004,261.779 Z" id="Shape"></path>
17
+ <path d="M84.623,310.229 C84.623,313.46 82.004,316.079 78.773,316.079 C75.543,316.079 72.923,313.46 72.923,310.229 C72.923,306.998 75.543,304.379 78.773,304.379 C82.004,304.379 84.623,306.998 84.623,310.229 L84.623,310.229 Z" id="Shape"></path>
18
+ <path d="M95.249,286.887 C95.249,290.118 92.63,292.737 89.399,292.737 C86.169,292.737 83.549,290.118 83.549,286.887 C83.549,283.656 86.169,281.037 89.399,281.037 C92.63,281.037 95.249,283.656 95.249,286.887 L95.249,286.887 Z" id="Shape"></path>
19
+ <path d="M109.875,312.628 C109.875,315.859 107.256,318.478 104.025,318.478 C100.795,318.478 98.175,315.859 98.175,312.628 C98.175,309.397 100.795,306.778 104.025,306.778 C107.256,306.778 109.875,309.397 109.875,312.628 L109.875,312.628 Z" id="Shape"></path>
20
+ <path d="M132.955,35.39 C132.955,38.621 130.336,41.24 127.105,41.24 C123.875,41.24 121.255,38.621 121.255,35.39 C121.255,32.159 123.875,29.54 127.105,29.54 C130.336,29.54 132.955,32.159 132.955,35.39 L132.955,35.39 Z" id="Shape"></path>
21
+ <path d="M144.655,250.162 C144.655,253.393 142.036,256.012 138.805,256.012 C135.575,256.012 132.955,253.393 132.955,250.162 C132.955,246.931 135.575,244.312 138.805,244.312 C142.036,244.312 144.655,246.931 144.655,250.162 L144.655,250.162 Z" id="Shape"></path>
22
+ <path d="M157.129,165.203 C157.129,168.434 154.51,171.053 151.279,171.053 C148.049,171.053 145.429,168.434 145.429,165.203 C145.429,161.972 148.049,159.353 151.279,159.353 C154.51,159.353 157.129,161.972 157.129,165.203 L157.129,165.203 Z" id="Shape"></path>
23
+ <path d="M181.832,205.569 C181.832,208.8 179.213,211.419 175.982,211.419 C172.752,211.419 170.132,208.8 170.132,205.569 C170.132,202.338 172.752,199.719 175.982,199.719 C179.213,199.719 181.832,202.338 181.832,205.569 L181.832,205.569 Z" id="Shape"></path>
24
+ <path d="M195.436,220.78 C195.436,224.011 192.817,226.63 189.586,226.63 C186.356,226.63 183.736,224.011 183.736,220.78 C183.736,217.549 186.356,214.93 189.586,214.93 C192.817,214.93 195.436,217.549 195.436,220.78 L195.436,220.78 Z" id="Shape"></path>
25
+ <path d="M204.988,250.958 C204.988,254.189 202.369,256.808 199.138,256.808 C195.908,256.808 193.288,254.189 193.288,250.958 C193.288,247.727 195.908,245.108 199.138,245.108 C202.369,245.108 204.988,247.727 204.988,250.958 L204.988,250.958 Z" id="Shape"></path>
26
+ <path d="M218.464,239.258 C218.464,242.489 215.845,245.108 212.614,245.108 C209.384,245.108 206.764,242.489 206.764,239.258 C206.764,236.027 209.384,233.408 212.614,233.408 C215.845,233.408 218.464,236.027 218.464,239.258 L218.464,239.258 Z" id="Shape"></path>
27
+ <path d="M229.718,205.569 C229.718,208.8 227.099,211.419 223.868,211.419 C220.638,211.419 218.018,208.8 218.018,205.569 C218.018,202.338 220.638,199.719 223.868,199.719 C227.099,199.719 229.718,202.338 229.718,205.569 L229.718,205.569 Z" id="Shape"></path>
28
+ <path d="M240.334,171.054 C240.334,174.285 237.715,176.904 234.484,176.904 C231.254,176.904 228.634,174.285 228.634,171.054 C228.634,167.823 231.254,165.204 234.484,165.204 C237.715,165.204 240.334,167.823 240.334,171.054 L240.334,171.054 Z" id="Shape"></path>
29
+ <path d="M255.544,123.484 C255.544,126.715 252.925,129.334 249.694,129.334 C246.464,129.334 243.844,126.715 243.844,123.484 C243.844,120.253 246.464,117.634 249.694,117.634 C252.925,117.634 255.544,120.253 255.544,123.484 L255.544,123.484 Z" id="Shape"></path>
30
+ <path d="M264.905,73.694 C264.905,76.925 262.286,79.544 259.055,79.544 C255.825,79.544 253.205,76.925 253.205,73.694 C253.205,70.463 255.825,67.844 259.055,67.844 C262.286,67.844 264.905,70.463 264.905,73.694 L264.905,73.694 Z" id="Shape"></path>
31
+ <path d="M279.53,90.906 C279.53,94.137 276.911,96.756 273.68,96.756 C270.45,96.756 267.83,94.137 267.83,90.906 C267.83,87.675 270.45,85.056 273.68,85.056 C276.911,85.056 279.53,87.675 279.53,90.906 L279.53,90.906 Z" id="Shape"></path>
32
+ <path d="M291.231,57.9 C291.231,61.131 288.612,63.75 285.381,63.75 C282.151,63.75 279.531,61.131 279.531,57.9 C279.531,54.669 282.151,52.05 285.381,52.05 C288.612,52.05 291.231,54.669 291.231,57.9 L291.231,57.9 Z" id="Shape"></path>
33
+ <path d="M302.239,29.539 C302.239,32.771 299.619,35.391 296.387,35.391 C293.156,35.391 290.535,32.771 290.535,29.539 C290.535,26.307 293.156,23.687 296.387,23.687 C299.619,23.687 302.239,26.307 302.239,29.539 L302.239,29.539 Z" id="Shape"></path>
34
+ <path d="M313.938,96.756 C313.938,99.987 311.319,102.606 308.088,102.606 C304.858,102.606 302.238,99.987 302.238,96.756 C302.238,93.525 304.858,90.906 308.088,90.906 C311.319,90.906 313.938,93.525 313.938,96.756 L313.938,96.756 Z" id="Shape"></path>
35
+ <path d="M326.748,136.046 C326.748,139.277 324.129,141.896 320.898,141.896 C317.668,141.896 315.048,139.277 315.048,136.046 C315.048,132.815 317.668,130.196 320.898,130.196 C324.129,130.196 326.748,132.815 326.748,136.046 L326.748,136.046 Z" id="Shape"></path>
36
+ <path d="M339.245,102.607 C339.245,105.838 336.626,108.457 333.395,108.457 C330.165,108.457 327.545,105.838 327.545,102.607 C327.545,99.376 330.165,96.757 333.395,96.757 C336.626,96.757 339.245,99.376 339.245,102.607 L339.245,102.607 Z" id="Shape"></path>
37
+ <path d="M362.531,85.056 C362.531,88.287 359.912,90.906 356.681,90.906 C353.451,90.906 350.831,88.287 350.831,85.056 C350.831,81.825 353.451,79.206 356.681,79.206 C359.912,79.206 362.531,81.825 362.531,85.056 L362.531,85.056 Z" id="Shape"></path>
38
+ <path d="M350.945,90.906 C350.945,94.137 348.326,96.756 345.095,96.756 C341.865,96.756 339.245,94.137 339.245,90.906 C339.245,87.675 341.865,85.056 345.095,85.056 C348.326,85.056 350.945,87.675 350.945,90.906 L350.945,90.906 Z" id="Shape"></path>
39
+ <path d="M374.231,46.199 C374.231,49.43 371.612,52.049 368.381,52.049 C365.151,52.049 362.531,49.43 362.531,46.199 C362.531,42.968 365.151,40.349 368.381,40.349 C371.612,40.349 374.231,42.968 374.231,46.199 L374.231,46.199 Z" id="Shape"></path>
40
+ <path d="M387.985,29.539 C387.985,32.77 385.366,35.389 382.135,35.389 C378.905,35.389 376.285,32.77 376.285,29.539 C376.285,26.308 378.905,23.689 382.135,23.689 C385.366,23.689 387.985,26.308 387.985,29.539 L387.985,29.539 Z" id="Shape"></path>
41
+ <path d="M400.762,5.665 C400.762,8.896 398.143,11.516 394.911,11.516 C391.68,11.516 389.06,8.896 389.06,5.665 C389.06,2.434 391.68,-0.186 394.911,-0.186 C398.143,-0.186 400.762,2.434 400.762,5.665 L400.762,5.665 Z" id="Shape"></path>
42
+ <path d="M412.461,292.201 C412.461,295.432 409.842,298.051 406.611,298.051 C403.381,298.051 400.761,295.432 400.761,292.201 C400.761,288.97 403.381,286.351 406.611,286.351 C409.842,286.351 412.461,288.97 412.461,292.201 L412.461,292.201 Z" id="Shape"></path>
43
+ <path d="M424.546,245.108 C424.546,248.339 421.927,250.958 418.696,250.958 C415.466,250.958 412.846,248.339 412.846,245.108 C412.846,241.877 415.466,239.258 418.696,239.258 C421.927,239.258 424.546,241.877 424.546,245.108 L424.546,245.108 Z" id="Shape"></path>
44
+ <path d="M446.845,202.341 C446.845,205.572 444.226,208.191 440.995,208.191 C437.765,208.191 435.145,205.572 435.145,202.341 C435.145,199.11 437.765,196.491 440.995,196.491 C444.226,196.491 446.845,199.11 446.845,202.341 L446.845,202.341 Z" id="Shape"></path>
45
+ <path d="M459.659,310.229 C459.659,313.46 457.04,316.079 453.809,316.079 C450.579,316.079 447.959,313.46 447.959,310.229 C447.959,306.998 450.579,304.379 453.809,304.379 C457.04,304.379 459.659,306.998 459.659,310.229 L459.659,310.229 Z" id="Shape"></path>
46
+ <path d="M476.096,298.588 C476.096,301.819 473.477,304.438 470.246,304.438 C467.016,304.438 464.396,301.819 464.396,298.588 C464.396,295.357 467.016,292.738 470.246,292.738 C473.477,292.738 476.096,295.357 476.096,298.588 L476.096,298.588 Z" id="Shape"></path>
47
+ <path d="M495.442,261.779 C495.442,265.01 492.823,267.629 489.592,267.629 C486.362,267.629 483.742,265.01 483.742,261.779 C483.742,258.548 486.362,255.929 489.592,255.929 C492.823,255.929 495.442,258.548 495.442,261.779 L495.442,261.779 Z" id="Shape"></path>
48
+ <path d="M504.762,153.503 C504.762,156.734 502.143,159.353 498.912,159.353 C495.682,159.353 493.062,156.734 493.062,153.503 C493.062,150.272 495.682,147.653 498.912,147.653 C502.143,147.653 504.762,150.272 504.762,153.503 L504.762,153.503 Z" id="Shape"></path>
49
+ <path d="M520.559,90.906 C520.559,94.137 517.94,96.757 514.708,96.757 C511.477,96.757 508.857,94.137 508.857,90.906 C508.857,87.675 511.477,85.055 514.708,85.055 C517.94,85.055 520.559,87.675 520.559,90.906 L520.559,90.906 Z" id="Shape"></path>
50
+ <path d="M532.258,256.808 C532.258,260.039 529.639,262.658 526.409,262.658 C523.178,262.658 520.559,260.039 520.559,256.808 C520.559,253.577 523.178,250.958 526.409,250.958 C529.639,250.958 532.258,253.577 532.258,256.808 L532.258,256.808 Z" id="Shape"></path>
51
+ <path d="M546.097,260.394 C546.097,263.625 543.478,266.244 540.247,266.244 C537.017,266.244 534.398,263.625 534.398,260.394 C534.398,257.163 537.017,254.544 540.247,254.544 C543.478,254.544 546.097,257.163 546.097,260.394 L546.097,260.394 Z" id="Shape"></path>
52
+ <path d="M557.799,205.569 C557.799,208.8 555.18,211.42 551.948,211.42 C548.717,211.42 546.097,208.8 546.097,205.569 C546.097,202.338 548.717,199.718 551.948,199.718 C555.18,199.718 557.799,202.338 557.799,205.569 L557.799,205.569 Z" id="Shape"></path>
53
+ <path d="M567.941,225.725 C567.941,228.956 565.322,231.575 562.091,231.575 C558.861,231.575 556.242,228.956 556.242,225.725 C556.242,222.494 558.861,219.875 562.091,219.875 C565.322,219.875 567.941,222.494 567.941,225.725 L567.941,225.725 Z" id="Shape"></path>
54
+ <path d="M574.745,232.481 C574.745,235.712 572.125,238.331 568.895,238.331 C565.664,238.331 563.045,235.712 563.045,232.481 C563.045,229.25 565.664,226.631 568.895,226.631 C572.125,226.631 574.745,229.25 574.745,232.481 L574.745,232.481 Z" id="Shape"></path>
55
+ </g>
56
+ <g id="Jackdaw" transform="translate(206.000000, 0.000000)" sketch:type="MSShapeGroup">
57
+ <path d="M365.382,5.668 C364.494,4.939 363.515,4.295 362.468,3.773 L362.381,3.803 C362.366,3.812 362.346,3.818 362.325,3.824 C352.117,7.615 342.742,14.869 331.917,16.697 C331.7,16.734 331.496,16.74 331.291,16.751 C326.763,19.424 322.278,21.729 318.145,23.314 C313.568,25.072 308.76,26.365 304.049,27.728 C302.45,28.189 300.836,28.568 299.209,28.902 C299.099,28.912 298.929,28.93 298.723,28.956 C292.77,25.71 284.493,29.04 281.254,34.564 C277.256,41.392 280.111,48.611 285.926,53.015 C282.79,57.213 280.464,62.369 278.601,66.863 C271.754,83.381 271.031,101.29 267.264,118.551 C267.027,118.494 266.785,118.447 266.547,118.39 C266.797,119.737 266.452,121.161 265.383,122.228 C261.762,125.849 256.754,122.557 252.317,120.406 C252.036,120.394 251.75,120.354 251.458,120.285 C243.896,118.423 236.394,116.254 228.838,114.353 C228.365,114.371 227.859,114.306 227.318,114.138 C220.859,112.13 214.141,111.583 207.503,110.532 C197.745,110.23 187.97,110.644 178.153,112.109 C165.952,113.928 153.591,116.493 142.057,120.944 C139.59,121.895 137.034,122.93 134.546,124.14 C132.684,124.38 130.799,124.613 128.848,124.828 C125.952,125.152 123.239,126.091 121.001,127.587 C116.984,127.785 112.968,127.861 108.945,127.886 C108.458,127.724 107.961,127.586 107.446,127.51 C99.717,126.349 91.972,125.564 84.188,124.956 C80.896,124.698 77.605,124.448 74.318,124.164 C72.799,124.032 71.231,123.882 69.743,123.723 C67.647,122.337 65.187,121.556 62.571,121.757 C49.281,122.774 36.662,129.986 27.843,139.861 C25.498,142.482 23.413,145.406 21.796,148.529 C20.827,150.397 20.111,152.399 19.294,154.341 C19.149,154.685 17.914,157.769 17.875,157.962 C17.375,159.011 16.778,159.995 16.147,160.975 C16.836,160.173 16.656,160.398 15.609,161.654 C14.994,162.383 14.373,163.107 13.747,163.829 C11.156,166.832 8.623,169.917 6.491,173.267 C0.563,182.578 8.508,192.997 18.24,193.743 C18.374,193.753 18.509,193.761 18.642,193.769 C20.122,195.107 21.878,196.057 23.84,196.33 C28.449,196.963 32.935,197.345 37.578,197.474 C38.393,197.496 39.206,197.535 40.019,197.576 C40.399,197.887 40.795,198.188 41.22,198.472 C41.992,198.984 42.792,199.449 43.609,199.877 C45.9,204.109 50.304,206.71 55.242,208.714 C55.466,208.803 55.69,208.886 55.913,208.973 C57.061,210.291 58.308,211.449 59.621,212.504 C60.261,213.813 61.111,215.029 62.168,216.096 C65.268,219.221 68.949,221.607 72.824,223.638 C73.607,224.048 74.389,224.456 75.169,224.869 C76.309,226.74 77.895,228.387 79.845,229.636 C81.16,230.478 82.456,231.321 83.744,232.16 C86.146,234.42 88.676,236.517 91.506,238.306 C94.829,240.405 98.652,241.91 102.479,243.259 C103.71,243.849 104.963,244.415 106.25,244.947 C104.503,244.117 105.36,244.464 108.817,245.988 C110.025,246.441 111.226,246.835 112.467,247.188 C113.04,247.353 113.619,247.5 114.202,247.633 C115.332,248.089 116.462,248.514 117.603,248.857 C118.77,249.468 120.008,249.92 121.279,250.317 C121.345,250.338 121.419,250.354 121.487,250.377 C122.086,250.873 122.716,251.356 123.383,251.832 C124.861,252.883 126.674,253.387 128.356,254.031 C129.871,254.335 131.398,254.555 132.939,254.699 C130.39,254.448 131.152,254.567 135.216,255.061 C138.96,255.532 142.807,254.72 146.484,254.022 C147.164,253.882 147.843,253.755 148.53,253.631 C148.666,253.614 148.801,253.6 148.969,253.58 C150.825,253.384 152.693,253.25 154.552,253.096 C169.949,251.816 184.724,247.939 197.284,238.567 C200.125,236.45 202.676,234.296 204.779,231.885 C206.167,231.704 207.511,231.418 208.772,231.038 C214.46,229.321 220.432,226.002 225.674,223.163 C231.129,220.209 236.762,215.846 239.612,210.121 C242.009,209.454 244.428,208.85 246.824,208.183 C257.355,205.246 267.572,200.182 276.395,193.753 C284.551,187.812 293.515,179.738 301.319,171.47 C308.445,163.917 315.26,156.084 322.809,148.938 C326.307,145.626 327.572,140.284 326.309,135.702 C325.91,134.242 325.289,132.96 324.528,131.822 C321.555,132.418 318.559,132.924 315.674,133.892 C310.235,135.58 308.02,127.219 313.341,125.428 C313.873,125.263 314.374,125.05 314.867,124.824 C315.225,124.193 315.811,123.636 316.68,123.238 C318.209,122.536 319.73,121.997 321.308,121.559 C322.966,118.172 324.205,114.922 325.442,112.144 C327.777,106.887 330.363,101.744 332.868,96.565 C337.949,86.063 342.875,75.307 345.624,63.927 C346.161,61.711 346.176,59.453 345.707,57.33 C348.828,49.9 352.602,42.885 357.199,36.434 C358.434,30.95 358.984,24.766 361.782,20.133 C361.553,19.442 361.472,18.684 361.629,17.886 C362.139,15.27 362.983,12.834 364.155,10.475 C364.304,10.167 364.428,9.837 364.559,9.512 C364.398,8.848 364.416,8.12 364.701,7.352 C364.916,6.775 365.145,6.217 365.382,5.668 L365.382,5.668 Z" id="Shape" fill="#33618E"></path>
58
+ <path d="M62.401,275.23 L50.528,291.088 L47.467,278.455 L76.966,265.659 L83.541,264.161 L102.292,251.6 L105.748,248.371 L84.906,238.975 L53.594,213.163 L40.146,203.631 L26.721,200.846 L27.113,200.078 L27.679,201.472 L27.1,203.226 L6.455,190.2 L3.435,189.596 L0.411,178.896 L12.729,157.248 L18.301,147.92 L19.132,146.645 L22.071,139.413 L47.982,120.494 L75.428,119.223 L98.122,122.801 L108.417,126.372 L123.897,125.325 L151.498,117.118 L179.465,110.754 L208.009,110 L236.237,114.668 L263.693,124.478 L268.679,106.326 L276.67,66.283 L278.298,30.334 L281.281,27.178 L287.938,25.619 L314.682,21.721 L319.161,21.347 L333.419,16.241 L364.815,2.983 L370.317,0 L362.984,19.962 L348.931,63.002 L326.844,107.151 L318.019,131.28 L328.575,129.323 L333.353,131.41 L321.6,155.813 L321.668,155.776 L321.127,158.999 L310.581,168.013 L303.918,176.075 L268.592,198.974 L263.955,200.063 L243.17,213.72 L205.729,264.612 L199.396,270.835 L212.323,278.104 L211.594,280.807 L205.129,281.918 L192.417,279.151 L190.754,279.089 L182.074,289.798 L180.078,297.476 L175.996,299.602 L172.017,296.044 L174.308,283.241 L169.897,285.957 L168.189,294.881 L164.102,296.025 L161.371,286.419 L172.363,279.756 L186.513,273.025 L201.93,257.173 L218.133,233.441 L220.205,229.446 L212.711,232.734 L176.261,250.407 L138.407,257.276 L111.969,252.028 L105.198,254.242 L90.93,265.509 L86.577,267.225 L96.248,274.719 L98.577,277.196 L93.719,278.214 L79.356,274.864 L76.001,277.602 L73.439,280.426 L71.876,288.737 L72.927,293.372 L68.071,292.85 L61.571,278.234 L62.401,275.23 L62.401,275.23 Z M231.831,206.157 L175.474,198.765 L138.166,166.407 L136.636,156.803 L137.95,161.512 L148.574,177.614 L170.94,191.825 L216.035,201.713 L245.455,198.291 L280.152,187.037 L294.402,176.417 L294.237,176.422 L273.37,183.693 L252.9,191.215 L231.584,189.922 L233.305,189.132 L273.28,180.816 L295.259,172.388 L311.142,155.946 L321.82,139.688 L319.258,139.51 L318.364,138.709 L324.176,135.801 L324.015,134.646 L313.56,135.915 L302.205,143.439 L287.96,135.377 L298.278,133.596 L306.71,128.904 L312.553,117.676 L329.531,90.678 L337.426,74.87 L344.913,55.44 L360.883,12.569 L362.973,4.985 L305.133,35.944 L303.996,34.048 L310.313,29.736 L285.337,30.424 L285.345,35.913 L289.738,33.738 L286.749,49.915 L284.324,75.16 L277.526,102.294 L270.255,125.419 L288.083,132.757 L281.771,133.552 L227.446,117.872 L189.217,113.496 L169.791,118.238 L141.488,125.236 L130.621,129.928 L91.889,126.044 L56.686,122.825 L28.936,140.427 L14.77,169.205 L6.127,183.514 L7.249,183.996 L8.452,187.122 L8.659,185.759 L23.076,182.109 L39.261,182.02 L23.986,158.416 L28.334,158.375 L40.157,174.576 L49.186,184.085 L42.733,184.452 L41.943,190.981 L48.046,201.404 L54.516,207.949 L90.917,237.331 L129.519,253.976 L170.662,248.927 L205.761,231.11 L227.016,211.963 L231.831,206.157 L231.831,206.157 Z M10.064,187.384 L10.55,188.294 L15.677,191.855 L29.796,197.224 L39.836,190.436 L33.514,183.268 L26.05,184.086 L10.064,187.384 L10.064,187.384 Z M239.068,205.485 L230.797,216.329 L239.068,205.485 L239.068,205.485 Z" id="Shape" fill="#000000"></path>
59
+ <path d="M238.483,205.583 L230.133,217.507 L238.483,205.583 L238.483,205.583 Z" id="Shape" fill="#FFFFFF"></path>
60
+ <path d="M219.897,186.009 L247.114,167.736 L270.807,146.07 L259.856,160.005 L260.519,161.055 L315.979,141.55 L316.623,142.947 L300.892,148.845 L278.133,157.299 L258.724,163.568 L251.141,167.494 L221.041,185.195 L219.988,184.981 L219.897,186.009 Z" id="Shape" fill="#000000"></path>
61
+ <g id="Group" transform="translate(37.000000, 138.000000)">
62
+ <path d="M1.746,12.792 L5.526,16.852 L21.341,4.144 L33.275,-0.395 L38.645,0.457 L43.736,21.251 L35.787,26.62 L18.166,29.724 L14.289,29.174 L9.089,25.278 L4.459,24.009 L0.47,13.308 L1.746,12.792 L1.746,12.792 Z M19.017,27.203 L30.962,24.81 L39.031,8.946 L31.601,2.86 L24.697,7.761 L21.635,14.302 L19.017,27.203 L19.017,27.203 Z" id="Shape" fill="#000000"></path>
63
+ <path d="M18.616,27.489 L20.663,14.289 L24.719,7.809 L32.37,4.229 L39.631,8.812 L30.973,24.844 L18.616,27.489 Z" id="Shape" fill="#FFFFFF"></path>
64
+ </g>
65
+ </g>
66
+ <g id="CHAWK" transform="translate(0.000000, 262.000000)" fill="#000000" sketch:type="MSShapeGroup">
67
+ <path d="M95.021,24.697 L92.864,26.875 C90.749,24.845 88.296,23.111 85.505,21.672 L85.505,46.416 L89.185,50.728 L86.647,52.504 L85.505,51.108 L85.505,56.308 L82.333,56.308 L82.333,47.749 C76.918,42.966 69.644,40.573 60.507,40.573 C51.793,40.573 44.836,43.302 39.633,48.758 C34.43,54.214 31.829,61.342 31.829,70.14 C31.829,78.431 34.577,84.988 40.077,89.808 C45.322,94.376 52.132,96.662 60.507,96.662 C68.965,96.662 76.537,93.833 83.221,88.17 L83.221,80.927 L86.393,80.927 L86.393,85.085 L88.931,86.975 L86.393,89.621 L86.393,116.078 L92.103,112.397 L94.133,114.977 C91.932,116.699 89.353,118.331 86.393,119.877 L86.393,128.004 L83.22,128.004 L83.22,121.278 C73.406,125.758 64.989,128.004 57.968,128.004 C40.965,128.004 26.984,122.696 16.03,112.078 C5.073,101.463 -0.403,87.695 -0.403,70.774 C-0.403,53.94 5.032,39.983 15.903,28.899 C26.772,17.818 40.625,12.277 57.461,12.277 C66.427,12.277 74.718,13.756 82.332,16.715 L82.332,12.277 L85.504,12.277 L85.504,18.037 C89.311,19.834 92.483,22.053 95.021,24.697 L95.021,24.697 Z M6.831,77.505 C4.969,74.206 3.615,71.585 2.77,69.638 L2.77,70.782 C2.685,74.928 3.065,79.074 3.912,83.218 C4.419,80.509 5.391,78.605 6.831,77.505 L6.831,77.505 Z M29.925,118.364 L28.149,114.682 C27.048,112.825 23.855,109.84 18.568,105.738 C13.28,101.634 9.664,98.059 7.719,95.014 C12.37,105.338 19.773,113.12 29.925,118.364 L29.925,118.364 Z M27.768,90.194 C27.175,89.347 26.582,87.929 25.992,85.943 C25.399,83.957 24.85,82.539 24.343,81.692 C24.172,83.298 23.708,85.372 22.947,87.91 C24.044,88.335 25.652,89.096 27.768,90.194 L27.768,90.194 Z M83.22,117.73 L83.22,109.864 C82.119,111.302 80.216,113.291 77.51,115.829 C76.241,118.283 74.592,120.353 72.561,122.047 C76.283,120.86 79.835,119.424 83.22,117.73 L83.22,117.73 Z M83.22,98.823 L83.22,92.095 C80.343,94.296 77.044,96.074 73.322,97.424 C73.659,98.863 74.294,100.641 75.225,102.754 C78.947,100.136 81.612,98.823 83.22,98.823 L83.22,98.823 Z M82.332,43.624 L82.332,38.295 C80.639,39.057 78.862,39.184 77.002,38.676 C76.324,39.354 75.69,39.692 75.099,39.692 C77.72,40.706 80.131,42.019 82.332,43.624 L82.332,43.624 Z" id="Shape"></path>
68
+ <path d="M203.261,124.963 L196.662,124.963 L196.662,131.435 L193.49,131.435 L193.49,124.963 L167.604,124.963 L167.604,128.136 L164.432,128.136 L164.432,124.963 L157.834,124.963 L157.834,121.791 L164.432,121.791 L164.432,80.424 L130.17,80.424 L130.17,121.791 L136.007,121.791 L136.007,124.963 L130.17,124.963 L130.17,130.673 L126.998,130.673 L126.998,124.963 L100.985,124.963 L100.985,136.764 L97.813,136.764 L97.813,124.963 L95.783,124.963 L95.783,121.791 L97.813,121.791 L97.813,18.373 L93.499,18.373 L93.499,15.2 L97.813,15.2 L97.813,3.398 L100.985,3.398 L100.985,15.2 L126.998,15.2 L126.998,7.079 L130.17,7.079 L130.17,15.2 L134.358,15.2 L134.358,18.373 L130.17,18.373 L130.17,55.299 L164.431,55.299 L164.431,18.373 L158.721,18.373 L158.721,15.2 L164.431,15.2 L164.431,-0.154 L167.603,-0.154 L167.603,15.2 L193.489,15.2 L193.489,8.726 L196.661,8.726 L196.661,15.2 L202.371,15.2 L202.371,18.373 L196.661,18.373 L196.661,121.791 L203.26,121.791 L203.26,124.963 L203.261,124.963 L203.261,124.963 Z M105.807,18.373 L100.985,18.373 L100.985,38.803 C101.915,36.265 102.93,34.407 104.03,33.219 C104.96,26.96 105.553,22.011 105.807,18.373 L105.807,18.373 Z M102.888,48.191 L102.761,47.049 C102.083,46.541 101.492,45.906 100.985,45.146 L100.985,50.348 C101.322,49.589 101.956,48.871 102.888,48.191 L102.888,48.191 Z M108.091,121.791 C105.468,117.223 104.157,113.967 104.157,112.02 C104.157,110.751 104.494,109.442 105.172,108.086 L104.537,107.325 C103.183,106.902 101.999,106.224 100.984,105.295 L100.984,121.791 L108.091,121.791 L108.091,121.791 Z M126.998,40.452 L126.998,18.373 L122.049,18.373 L121.922,20.53 C124.797,23.829 126.236,26.494 126.236,28.522 C126.236,31.823 125.475,34.278 123.952,35.881 L124.967,37.403 C125.136,38.165 125.389,38.967 125.729,39.813 L126.363,40.322 L126.998,40.452 L126.998,40.452 Z M126.998,103.519 C125.559,105.634 123.953,107.581 122.176,109.356 C122.513,110.373 123.445,112.401 124.968,115.449 C126.321,117.901 126.998,120.015 126.998,121.794 L126.998,103.519 L126.998,103.519 Z M150.092,77.251 C148.823,76.236 147.891,74.926 147.3,73.316 C144.255,73.402 141.378,73.615 138.671,73.952 C138.501,75.138 138.037,76.236 137.275,77.251 L150.092,77.251 L150.092,77.251 Z M175.471,18.373 L167.603,18.373 L167.603,41.721 L168.618,40.452 C169.126,37.577 169.633,34.7 170.141,31.823 C170.817,27.931 171.537,25.349 172.298,24.083 L172.171,23.448 L172.805,23.321 L174.201,21.799 L175.471,18.373 L175.471,18.373 Z M170.395,121.791 C169.209,120.605 168.28,119.126 167.603,117.35 L167.603,121.791 L170.395,121.791 L170.395,121.791 Z M178.644,86.134 C177.712,85.965 176.909,85.67 176.233,85.245 L176.233,86.007 L176.613,87.783 L178.263,89.557 L178.644,86.134 L178.644,86.134 Z M193.49,121.791 L193.49,111.132 C193.32,116.124 191.924,119.677 189.302,121.791 L193.49,121.791 L193.49,121.791 Z" id="Shape"></path>
69
+ <path d="M320.255,124.963 L315.306,124.963 L319.62,136.13 L316.575,137.272 L311.88,124.963 L285.74,124.963 L287.643,130.42 L284.598,131.435 L282.314,124.963 L271.147,124.963 L271.147,121.791 L281.299,121.791 L275.462,105.422 L239.805,105.422 L233.714,121.791 L241.581,121.791 L241.581,124.963 L232.572,124.963 L229.78,132.703 L226.735,131.559 L229.146,124.96 L203.64,124.96 L198.887,136.381 L195.969,135.238 L200.215,124.96 L192.855,124.96 L192.855,121.788 L201.484,121.788 L241.709,18.37 L232.319,18.37 L232.319,15.197 L269.372,15.197 L266.58,8.092 L269.625,6.949 L272.797,15.197 L293.483,15.197 L293.483,18.37 L273.94,18.37 L314.038,121.788 L320.256,121.788 L320.255,124.963 L320.255,124.963 Z M216.329,121.791 C211.337,118.999 208.799,115.743 208.716,112.02 L204.909,121.791 L216.329,121.791 L216.329,121.791 Z M217.344,97.301 C216.497,96.624 215.822,95.822 215.314,94.89 L211.888,103.772 C212.986,102.251 214.255,100.897 215.695,99.711 C215.102,100.219 214.636,100.771 214.299,101.361 C215.397,100.177 216.413,98.823 217.344,97.301 L217.344,97.301 Z M230.795,61.136 C230.795,60.545 230.732,59.677 230.605,58.534 C230.478,57.39 230.415,56.567 230.415,56.057 L224.578,71.16 C228.721,65.069 230.795,61.729 230.795,61.136 L230.795,61.136 Z M274.446,102.249 L272.67,101.487 L274.066,102.122 C273.134,101.868 271.823,101.446 270.132,100.851 L271.274,101.361 L268.609,100.597 L269.497,100.978 C257.315,100.387 250.971,100.089 250.463,100.089 L245.514,100.089 C244.328,100.089 243.398,100.343 242.722,100.851 L242.722,102.247 L274.446,102.249 L274.446,102.249 Z M262.772,18.373 L245.134,18.373 L243.992,21.291 L243.865,21.418 C246.825,19.813 249.616,19.007 252.24,19.007 C254.778,19.007 257.23,19.727 259.6,21.164 C260.444,19.98 261.503,19.051 262.772,18.373 L262.772,18.373 Z M266.833,81.438 L257.443,55.298 L248.18,81.438 L266.833,81.438 L266.833,81.438 Z M256.301,48.827 C254.778,47.305 253.593,45.486 252.748,43.371 C250.464,48.617 249.322,52.297 249.322,54.41 C249.322,54.496 249.449,55.216 249.703,56.566 C250.972,56.397 252.241,56.525 253.51,56.948 L256.301,48.827 L256.301,48.827 Z M292.084,121.791 L291.196,121.029 C290.435,120.519 289.8,119.843 289.293,118.999 C284.554,115.531 281.382,111.893 279.776,108.086 L284.598,121.791 L292.084,121.791 L292.084,121.791 Z M305.154,107.832 L286.501,59.486 C287.008,63.039 286.923,66.424 286.247,69.635 L286.374,69.889 L286.501,69.762 L286.501,70.016 L287.008,71.16 L286.627,70.143 C287.896,72.343 289.334,75.812 290.941,80.548 L290.814,79.786 C291.068,80.125 291.405,80.928 291.829,82.197 L291.576,81.433 C292.42,82.955 293.35,85.328 294.367,88.539 C294.958,89.808 295.678,92.431 296.524,96.406 C297.115,99.368 298.425,101.779 300.459,103.636 L300.078,103.256 C301.852,104.358 303.333,105.752 304.517,107.444 L305.154,107.832 L305.154,107.832 Z M310.611,121.791 L308.834,117.35 C308.495,119.043 307.775,120.522 306.678,121.791 L310.611,121.791 L310.611,121.791 Z" id="Shape"></path>
70
+ <path d="M481.534,18.119 L475.316,18.119 L442.832,121.664 L451.08,121.664 L451.08,124.836 L441.817,124.836 L438.771,134.859 L435.724,133.97 L438.515,124.833 L414.786,124.833 L416.182,129.021 L413.263,130.039 L411.489,124.836 L402.478,124.836 L402.478,121.664 L410.472,121.664 L392.579,67.861 L374.941,121.664 L380.141,121.664 L380.141,124.836 L373.923,124.836 L370.116,136.384 L367.071,135.368 L370.624,124.836 L346.895,124.836 L348.798,130.673 L345.752,131.689 L343.595,124.836 L337.504,124.836 L337.504,121.664 L342.58,121.664 L310.349,18.119 L304.766,18.119 L304.766,14.945 L309.334,14.945 L307.431,8.98 L310.476,8.092 L312.633,14.945 L338.52,14.945 L337.885,12.535 L340.93,11.772 L341.821,14.945 L347.404,14.945 L347.404,18.119 L342.71,18.119 L360.094,80.804 L379.636,18.119 L369.74,18.119 L369.74,14.945 L380.526,14.945 L382.681,8.092 L385.727,9.107 L383.826,14.945 L415.422,14.945 L415.422,18.119 L405.271,18.119 L426.335,80.551 L443.72,18.119 L438.263,18.119 L438.263,14.945 L444.481,14.945 L445.372,12.154 L448.417,12.916 L447.783,14.945 L472.908,14.945 L476.08,4.922 L479.126,5.811 L476.207,14.949 L481.536,14.949 L481.534,18.119 L481.534,18.119 Z M327.359,18.119 L313.655,18.119 L315.937,25.349 C316.871,21.288 319.448,19.258 323.677,19.258 C324.355,19.258 324.989,19.344 325.58,19.512 C326.091,19.007 326.682,18.543 327.359,18.119 L327.359,18.119 Z M342.714,30.047 L339.414,18.119 L335.734,18.119 C338.184,19.724 339.414,21.97 339.414,24.845 C339.414,26.116 339.075,27.382 338.399,28.654 C340.005,28.65 341.444,29.117 342.714,30.047 L342.714,30.047 Z M352.738,121.664 C351.215,121.495 348.212,119.17 343.726,114.685 L345.883,121.664 L352.738,121.664 L352.738,121.664 Z M358.829,88.164 L349.692,55.045 L349.182,59.359 C352.057,66.38 354.893,76.743 357.684,90.448 L358.829,88.164 L358.829,88.164 Z M375.959,40.706 L363.904,79.408 L371.389,67.097 C371.56,59.486 373.083,50.688 375.959,40.706 L375.959,40.706 Z M387.634,18.119 L382.941,18.119 L377.612,35.249 C379.554,29.666 382.134,25.269 385.35,22.053 C386.111,20.275 386.872,18.966 387.634,18.119 L387.634,18.119 Z M388.775,69.257 L386.999,72.43 L386.999,74.586 L388.775,69.257 L388.775,69.257 Z M409.078,107.579 C409.162,104.45 408.739,99.965 407.807,94.128 C406.538,90.575 403.536,84.696 398.797,76.49 L409.078,107.579 L409.078,107.579 Z M406.033,30.555 L401.845,18.119 L399.053,18.119 C400.324,19.473 401.04,21.123 401.21,23.067 C401.887,23.914 402.436,25.181 402.859,26.875 C403.367,28.905 403.748,30.218 404.002,30.809 L404.891,30.428 L406.033,30.555 L406.033,30.555 Z M417.453,120.521 C415.253,119.845 413.307,118.029 411.616,115.066 L413.773,121.666 L417.2,121.666 L417.453,120.521 L417.453,120.521 Z M449.558,18.119 L446.893,18.119 L429.636,80.17 L431.539,83.977 C431.961,81.102 433.018,77.041 434.711,71.795 C436.402,66.551 437.459,62.575 437.884,59.867 C441.183,39.227 445.072,25.311 449.558,18.119 L449.558,18.119 Z M455.141,71.668 C453.282,75.982 450.932,82.497 448.099,91.209 C445.263,99.924 443.001,106.354 441.31,110.497 L441.947,114.177 L455.141,71.668 L455.141,71.668 Z M471.891,18.119 L468.719,18.119 C468.719,17.441 468.802,20.53 468.973,27.382 L471.891,18.119 L471.891,18.119 Z" id="Shape"></path>
71
+ <path d="M587.109,124.963 L581.526,124.963 L584.826,129.151 L582.415,131.181 L577.466,124.963 L545.742,124.963 L548.026,128.009 L545.489,129.912 L541.679,124.963 L533.559,124.963 L533.559,121.791 L539.143,121.791 L509.956,84.611 L509.956,121.791 L513.128,121.791 L513.128,124.963 L509.956,124.963 L509.956,129.404 L506.783,129.404 L506.783,124.963 L480.9,124.963 L480.9,136.764 L477.725,136.764 L477.725,124.963 L469.35,124.963 L469.35,121.791 L477.725,121.791 L477.725,18.373 L474.172,18.373 L474.172,15.2 L477.725,15.2 L477.725,3.398 L480.9,3.398 L480.9,15.2 L506.786,15.2 L506.786,11.645 L509.959,11.645 L509.959,15.2 L517.318,15.2 L517.318,18.373 L509.959,18.373 L509.959,56.821 L538.129,18.373 L533.815,18.373 L533.815,15.2 L540.416,15.2 L545.492,8.221 L548.029,10.124 L544.347,15.199 L574.548,15.199 L579.623,8.598 L582.161,10.628 L578.607,15.196 L582.919,15.196 L582.919,18.369 L576.067,18.369 L536.474,69.38 L578.985,121.787 L587.104,121.787 L587.104,124.961 L587.109,124.963 L587.109,124.963 Z M483.945,18.373 L480.9,18.373 L480.9,21.545 C481.745,20.361 482.76,19.305 483.945,18.373 L483.945,18.373 Z M489.529,121.791 C489.275,121.2 489.102,120.563 489.021,119.888 C487.667,119.719 486.947,119.592 486.864,119.507 C486.525,119.338 486.142,118.745 485.719,117.731 C484.958,116.378 484.156,114.96 483.309,113.48 C482.462,112.001 482.039,110.626 482.039,109.356 C482.039,107.752 482.42,106.227 483.182,104.79 C482.249,103.436 481.491,102.169 480.9,100.981 L480.9,121.793 L489.529,121.791 L489.529,121.791 Z M506.786,113.67 L506.786,93.493 C505.515,97.217 503.995,100.431 502.218,103.138 C503.572,104.999 504.459,107.368 504.883,110.243 C505.812,111.175 506.447,112.316 506.786,113.67 L506.786,113.67 Z M506.786,23.066 L506.786,18.373 L503.741,18.373 L504.249,19.894 L504.122,20.276 C504.459,21.038 504.756,21.924 505.01,22.939 L506.786,23.066 L506.786,23.066 Z M506.786,121.791 L506.786,119.507 L505.642,121.791 L506.786,121.791 L506.786,121.791 Z M531.911,32.204 L525.312,41.214 L528.485,39.944 L531.53,36.008 C531.53,34.742 531.657,33.473 531.911,32.204 L531.911,32.204 Z M549.55,121.791 C545.911,119.931 541.429,115.997 536.099,109.989 L534.83,111.132 L543.205,121.791 L549.55,121.791 L549.55,121.791 Z M572.137,18.373 L556.53,18.373 C557.8,19.978 558.431,21.843 558.431,23.956 C558.431,24.971 558.261,25.944 557.924,26.875 C560.122,27.214 561.901,28.187 563.253,29.793 L572.137,18.373 L572.137,18.373 Z M574.928,121.791 L561.478,105.295 C560.799,106.564 559.872,107.579 558.686,108.34 C562.748,110.033 564.821,110.922 564.906,111.005 C566.764,112.191 567.698,114.136 567.698,116.842 C567.698,118.704 567.103,120.354 565.922,121.791 L574.928,121.791 L574.928,121.791 Z" id="Shape"></path>
72
+ </g>
73
+ <g id="TIME-SERIES" transform="translate(12.000000, 402.000000)" fill="#000000" sketch:type="MSShapeGroup">
74
+ <path d="M11.691,37.884 L11.691,8.672 L-0.049,8.672 L-0.049,0.955 L32.194,0.955 L32.194,8.672 L20.504,8.672 L20.504,37.884 L11.691,37.884 L11.691,37.884 Z" id="Shape"></path>
75
+ <path d="M36.523,37.884 L36.523,0.955 L45.335,0.955 L45.335,37.884 L36.523,37.884 L36.523,37.884 Z" id="Shape"></path>
76
+ <path d="M50.913,37.884 L58.579,-0.242 L59.216,-0.242 L73.148,23.8 L86.29,-0.242 L86.952,-0.242 L94.669,37.884 L86.29,37.884 L83.157,21.024 L73.25,39.235 L72.665,39.235 L62.019,20.768 L58.785,37.883 L50.913,37.884 L50.913,37.884 Z" id="Shape"></path>
77
+ <path d="M100.041,37.884 L100.041,0.955 L122.785,0.955 L122.785,8.569 L108.599,8.569 L108.599,15.242 L120.747,15.242 L120.747,22.804 L108.599,22.804 L108.599,30.116 L122.989,30.116 L122.989,37.884 L100.041,37.884 L100.041,37.884 Z" id="Shape"></path>
78
+ <path d="M143.108,27.441 C145.383,28.836 147.314,29.81 148.902,30.373 C150.489,30.933 152.039,31.213 153.55,31.213 C155.078,31.213 156.305,30.878 157.23,30.207 C158.155,29.536 158.618,28.675 158.618,27.622 C158.618,26.111 156.971,24.413 153.677,22.528 C153.151,22.22 152.743,21.985 152.454,21.814 L149.958,20.414 C147.53,19.039 145.73,17.485 144.559,15.754 C143.388,14.022 142.802,12.061 142.802,9.87 C142.802,6.899 143.923,4.463 146.164,2.559 C148.405,0.659 151.3,-0.294 154.849,-0.294 C156.157,-0.294 157.574,-0.142 159.102,0.164 C160.63,0.47 162.328,0.945 164.196,1.591 L164.196,10.25 C162.413,9.129 160.723,8.263 159.128,7.651 C157.532,7.041 156.174,6.735 155.053,6.735 C153.813,6.735 152.837,7.002 152.124,7.537 C151.411,8.072 151.055,8.798 151.055,9.715 C151.055,10.361 151.267,10.963 151.692,11.526 C152.116,12.086 152.753,12.593 153.602,13.051 L157.932,15.447 C161.548,17.451 163.98,19.301 165.228,20.999 C166.476,22.697 167.1,24.709 167.1,27.035 C167.1,30.635 165.873,33.542 163.42,35.758 C160.966,37.974 157.711,39.082 153.653,39.082 C152.278,39.082 150.783,38.936 149.171,38.647 C147.558,38.359 145.784,37.91 143.848,37.296 L143.108,27.441 L143.108,27.441 Z" id="Shape"></path>
79
+ <path d="M173.518,37.884 L173.518,0.955 L196.262,0.955 L196.262,8.569 L182.076,8.569 L182.076,15.242 L194.224,15.242 L194.224,22.804 L182.076,22.804 L182.076,30.116 L196.466,30.116 L196.466,37.884 L173.518,37.884 L173.518,37.884 Z" id="Shape"></path>
80
+ <path d="M203.188,37.884 L203.188,0.955 L212.688,0.955 C215.727,0.955 218.083,1.154 219.755,1.553 C221.427,1.952 222.909,2.619 224.199,3.553 C225.574,4.537 226.639,5.756 227.395,7.207 C228.15,8.659 228.528,10.191 228.528,11.804 C228.528,14.131 227.938,16.168 226.758,17.917 C225.578,19.666 223.876,21.032 221.652,22.017 L232.909,37.884 L222.849,37.884 L212.993,23.393 L211.745,23.393 L211.745,37.884 L203.188,37.884 L203.188,37.884 Z M213.197,7.679 L211.745,7.679 L211.745,17.917 L213.604,17.917 C215.828,17.917 217.526,17.467 218.697,16.564 C219.869,15.667 220.454,14.376 220.454,12.695 C220.454,10.927 219.885,9.652 218.748,8.862 C217.612,8.073 215.761,7.679 213.197,7.679 L213.197,7.679 Z" id="Shape"></path>
81
+ <path d="M236.526,37.884 L236.526,0.955 L245.338,0.955 L245.338,37.884 L236.526,37.884 L236.526,37.884 Z" id="Shape"></path>
82
+ <path d="M253.947,37.884 L253.947,0.955 L276.691,0.955 L276.691,8.569 L262.505,8.569 L262.505,15.242 L274.653,15.242 L274.653,22.804 L262.505,22.804 L262.505,30.116 L276.895,30.116 L276.895,37.884 L253.947,37.884 L253.947,37.884 Z" id="Shape"></path>
83
+ <path d="M281.938,27.441 C284.212,28.836 286.143,29.81 287.733,30.373 C289.321,30.933 290.87,31.213 292.379,31.213 C293.906,31.213 295.133,30.878 296.059,30.207 C296.987,29.536 297.449,28.675 297.449,27.622 C297.449,26.111 295.803,24.413 292.509,22.528 C291.985,22.22 291.575,21.985 291.286,21.814 L288.79,20.414 C286.362,19.039 284.561,17.485 283.392,15.754 C282.22,14.022 281.634,12.061 281.634,9.87 C281.634,6.899 282.755,4.463 284.996,2.559 C287.237,0.659 290.132,-0.294 293.681,-0.294 C294.99,-0.294 296.408,-0.142 297.934,0.164 C299.462,0.47 301.162,0.945 303.03,1.591 L303.03,10.25 C301.247,9.129 299.555,8.263 297.962,7.651 C296.366,7.041 295.008,6.735 293.887,6.735 C292.648,6.735 291.671,7.002 290.958,7.537 C290.245,8.072 289.889,8.798 289.889,9.715 C289.889,10.361 290.101,10.963 290.528,11.526 C290.952,12.086 291.589,12.593 292.436,13.051 L296.765,15.447 C300.382,17.451 302.815,19.301 304.062,20.999 C305.31,22.697 305.934,24.709 305.934,27.035 C305.934,30.635 304.707,33.542 302.253,35.758 C299.8,37.974 296.544,39.082 292.486,39.082 C291.111,39.082 289.616,38.936 288.004,38.647 C286.391,38.359 284.616,37.91 282.681,37.296 L281.938,27.441 L281.938,27.441 Z" id="Shape"></path>
84
+ <path d="M325.742,27.441 C328.015,28.836 329.948,29.81 331.536,30.373 C333.124,30.933 334.673,31.213 336.182,31.213 C337.709,31.213 338.938,30.878 339.864,30.207 C340.79,29.536 341.252,28.675 341.252,27.622 C341.252,26.111 339.606,24.413 336.314,22.528 C335.788,22.22 335.378,21.985 335.089,21.814 L332.593,20.414 C330.165,19.039 328.365,17.485 327.197,15.754 C326.025,14.022 325.439,12.061 325.439,9.87 C325.439,6.899 326.558,4.463 328.799,2.559 C331.04,0.659 333.935,-0.294 337.486,-0.294 C338.793,-0.294 340.211,-0.142 341.739,0.164 C343.265,0.47 344.965,0.945 346.833,1.591 L346.833,10.25 C345.05,9.129 343.36,8.263 341.765,7.651 C340.169,7.041 338.811,6.735 337.691,6.735 C336.453,6.735 335.474,7.002 334.761,7.537 C334.048,8.072 333.694,8.798 333.694,9.715 C333.694,10.361 333.906,10.963 334.331,11.526 C334.755,12.086 335.392,12.593 336.241,13.051 L340.57,15.447 C344.185,17.451 346.619,19.301 347.867,20.999 C349.115,22.697 349.739,24.709 349.739,27.035 C349.739,30.635 348.51,33.542 346.056,35.758 C343.603,37.974 340.347,39.082 336.289,39.082 C334.914,39.082 333.419,38.936 331.807,38.647 C330.196,38.359 328.419,37.91 326.486,37.296 L325.742,27.441 L325.742,27.441 Z" id="Shape"></path>
85
+ <path d="M363.665,37.884 L363.665,8.672 L351.924,8.672 L351.924,0.955 L384.167,0.955 L384.167,8.672 L372.477,8.672 L372.477,37.884 L363.665,37.884 L363.665,37.884 Z" id="Shape"></path>
86
+ <path d="M386.103,19.419 C386.103,16.686 386.577,14.126 387.516,11.74 C388.458,9.353 389.847,7.219 391.68,5.335 C393.412,3.536 395.424,2.156 397.716,1.196 C400.009,0.237 402.411,-0.242 404.924,-0.242 C407.439,-0.242 409.843,0.241 412.144,1.209 C414.447,2.177 416.489,3.568 418.27,5.386 C420.071,7.203 421.432,9.305 422.359,11.69 C423.285,14.078 423.748,16.655 423.748,19.419 C423.748,21.729 423.425,23.9 422.78,25.94 C422.134,27.977 421.176,29.836 419.902,31.517 C418.1,33.913 415.888,35.77 413.265,37.095 C410.643,38.419 407.864,39.081 404.924,39.081 C402.428,39.081 400.038,38.597 397.754,37.629 C395.471,36.661 393.446,35.27 391.68,33.452 C389.847,31.566 388.458,29.441 387.516,27.072 C386.574,24.704 386.103,22.153 386.103,19.419 L386.103,19.419 Z M395.169,19.419 C395.169,22.628 396.107,25.315 397.983,27.48 C399.859,29.645 402.171,30.728 404.921,30.728 C407.691,30.728 410.006,29.65 411.874,27.496 C413.741,25.34 414.675,22.646 414.675,19.422 C414.675,16.18 413.741,13.476 411.874,11.311 C410.006,9.146 407.688,8.064 404.921,8.064 C402.17,8.064 399.859,9.146 397.983,11.311 C396.107,13.476 395.169,16.177 395.169,19.419 L395.169,19.419 Z" id="Shape"></path>
87
+ <path d="M429.908,37.884 L429.908,0.955 L439.408,0.955 C442.447,0.955 444.803,1.154 446.473,1.553 C448.146,1.952 449.626,2.619 450.917,3.553 C452.292,4.537 453.357,5.756 454.113,7.207 C454.868,8.659 455.246,10.191 455.246,11.804 C455.246,14.131 454.656,16.168 453.475,17.917 C452.294,19.666 450.592,21.032 448.371,22.017 L459.628,37.884 L449.568,37.884 L439.712,23.393 L438.464,23.393 L438.464,37.884 L429.908,37.884 L429.908,37.884 Z M439.918,7.679 L438.466,7.679 L438.466,17.917 L440.325,17.917 C442.549,17.917 444.247,17.467 445.419,16.564 C446.59,15.667 447.176,14.376 447.176,12.695 C447.176,10.927 446.609,9.652 445.47,8.862 C444.332,8.073 442.481,7.679 439.918,7.679 L439.918,7.679 Z" id="Shape"></path>
88
+ <path d="M457.362,37.884 L476.181,-0.191 L476.743,-0.191 L495.156,37.884 L485.934,37.884 L483.591,32.51 L468.615,32.51 L466.219,37.884 L457.362,37.884 L457.362,37.884 Z M471.166,26.143 L480.87,26.143 L476.082,14.581 L471.166,26.143 L471.166,26.143 Z" id="Shape"></path>
89
+ <path d="M529.285,17.382 L529.285,35.337 C526.806,36.576 524.389,37.511 522.04,38.139 C519.686,38.767 517.408,39.081 515.201,39.081 C509.581,39.081 504.916,37.226 501.206,33.516 C497.496,29.807 495.642,25.124 495.642,19.47 C495.642,13.766 497.522,9.045 501.286,5.31 C505.047,1.577 509.805,-0.293 515.558,-0.293 C517.734,-0.293 519.803,0.004 521.775,0.598 C523.744,1.195 525.635,2.093 527.455,3.298 L526.513,12.543 C524.797,10.811 523.091,9.542 521.394,8.735 C519.698,7.926 517.915,7.525 516.045,7.525 C512.733,7.525 509.991,8.631 507.818,10.846 C505.642,13.062 504.556,15.834 504.556,19.161 C504.556,22.659 505.604,25.515 507.702,27.729 C509.799,29.947 512.503,31.053 515.811,31.053 C516.578,31.053 517.347,30.987 518.128,30.849 C518.909,30.713 519.724,30.518 520.573,30.263 L520.573,24.889 L513.569,24.889 L513.569,17.376 L529.283,17.376 L529.285,17.382 L529.285,17.382 Z" id="Shape"></path>
90
+ <path d="M536.595,37.884 L536.595,0.955 L559.338,0.955 L559.338,8.569 L545.152,8.569 L545.152,15.242 L557.3,15.242 L557.3,22.804 L545.154,22.804 L545.154,30.116 L559.544,30.116 L559.544,37.884 L536.595,37.884 L536.595,37.884 Z" id="Shape"></path>
91
+ </g>
92
+ </g>
93
+ </g>
94
+ </svg>
@@ -1,3 +1,4 @@
1
1
  module Chawk
2
- VERSION = "0.1.10"
2
+ # The current version of Chawk
3
+ VERSION = "0.1.13"
3
4
  end
@@ -1,9 +1,14 @@
1
1
  require 'data_mapper'
2
2
  require 'dm-aggregates'
3
3
  module Chawk
4
+ # Models used in Chawk. Most are DataMapper classes.
4
5
  module Models
5
6
 
7
+ # Base stored item, imported into other DataMapper classes.
6
8
  module Datum
9
+
10
+ protected
11
+
7
12
  def self.included(base)
8
13
  base.class_eval do
9
14
  include DataMapper::Resource
@@ -26,6 +31,8 @@ module Chawk
26
31
 
27
32
  end
28
33
 
34
+ # Agent DataMapper classes.
35
+ # Contains a foreign_id for use as a proxy to another table.
29
36
  class Agent
30
37
  include DataMapper::Resource
31
38
  property :id, Serial
@@ -36,6 +43,7 @@ module Chawk
36
43
  has n, :relations
37
44
  end
38
45
 
46
+ # Agent Relation DataMapper classes, with permission flags.
39
47
  class Relation
40
48
  include DataMapper::Resource
41
49
  property :id, Serial
@@ -46,6 +54,8 @@ module Chawk
46
54
  belongs_to :node
47
55
  end
48
56
 
57
+ # Agent Tags.
58
+ # Not implimented yet.
49
59
  class AgentTag
50
60
  include DataMapper::Resource
51
61
  property :id, Serial
@@ -55,6 +65,8 @@ module Chawk
55
65
  belongs_to :agent
56
66
  end
57
67
 
68
+ # Item Tags.
69
+ # Not implimented yet.
58
70
  class Tag
59
71
  include DataMapper::Resource
60
72
  property :description, Text
@@ -62,6 +74,7 @@ module Chawk
62
74
  property :name, String, length:100
63
75
  end
64
76
 
77
+ # The Node, where most Chawk:Addr information is persisted..
65
78
  class Node
66
79
  include DataMapper::Resource
67
80
  property :id, Serial
@@ -74,11 +87,13 @@ module Chawk
74
87
  has n, :relations
75
88
  end
76
89
 
90
+ # The Node, where most Chawk point information is persisted..
77
91
  class Point
78
92
  include Chawk::Models::Datum
79
93
  property :value, Integer
80
94
  end
81
95
 
96
+ # The Node, where most Chawk value information is persisted..
82
97
  class Value
83
98
  include Chawk::Models::Datum
84
99
  property :value, Text
@@ -1,21 +1,15 @@
1
1
  require 'store'
2
2
 
3
3
  module Chawk
4
+
5
+ # The Point Store - where time series integer data is stored, retrieved and aggregated through an instance of Chawk::Addr.
4
6
  class Paddr
5
7
 
6
8
  include Chawk::Store
7
9
 
8
- def model
9
- Chawk::Models::Point
10
- end
11
-
12
- def coll
13
- @node.points
14
- end
15
-
16
- def stored_type
17
- Integer
18
- end
10
+ # @param other [Integer] the integer to add to the value at this address.
11
+ # Increment the most recent point observed at this address. The most recent observed is
12
+ # not necessarily the most recent stored, as data can arrive out of order.
19
13
 
20
14
  def +(other = 1)
21
15
  raise ArgumentError unless other.is_a?(Numeric) && other.integer?
@@ -23,6 +17,9 @@ module Chawk
23
17
  self << int
24
18
  end
25
19
 
20
+ # @param other [Integer] the integer to subtract to the value at this address.
21
+ # Decrement the most recent point observed at this address. The most recent observed is
22
+ # not necessarily the most recent stored, as data can arrive out of order.
26
23
  def -(other = 1)
27
24
  raise ArgumentError unless other.is_a?(Numeric) && other.integer?
28
25
  self + (-other)
@@ -32,13 +29,30 @@ module Chawk
32
29
  coll.length
33
30
  end
34
31
 
32
+ # @return [Integer] the largest value stored.
33
+ # Returns the largest value currently stored at this address.
35
34
  def max
36
35
  coll.max(:value)
37
36
  end
38
37
 
38
+ # @return [Integer] the smallest value stored.
39
+ # Returns the smallest value currently stored at this address.
39
40
  def min
40
41
  coll.min(:value)
41
42
  end
43
+ private
44
+
45
+ def model
46
+ Chawk::Models::Point
47
+ end
48
+
49
+ def coll
50
+ @node.points
51
+ end
52
+
53
+ def stored_type
54
+ Integer
55
+ end
42
56
 
43
57
  end
44
58
 
@@ -1,5 +1,7 @@
1
1
  module Chawk
2
+ # This is not implimented yet.
2
3
  module Quantizer
4
+ # This is not implimented yet.
3
5
  def starting_step(x,step_width)
4
6
  if (x % step_width) == 0
5
7
  step = x
@@ -8,6 +10,7 @@ module Chawk
8
10
  end
9
11
  end
10
12
 
13
+ # This is not implimented yet.
11
14
  def ending_step(x,step_width)
12
15
  if (x % step_width) == 0
13
16
  step = x
@@ -16,6 +19,7 @@ module Chawk
16
19
  end
17
20
  end
18
21
 
22
+ # This is not implimented yet.
19
23
  def quantize(ary,step_width,steps=nil)
20
24
  # TODO: Needs lots more testing, then faster implementation
21
25
  # with caching (probaby at data add point)
@@ -1,11 +1,19 @@
1
1
  module Chawk
2
+ # The base store object, included by both Chawk::Vaddr and Chawk::Paddr
3
+ # To add a custom datastore, you would begin here.
2
4
  module Store
3
5
 
6
+ # @param addr [Chawk::Addr] an address instance created from Chawk#addr.
4
7
  def initialize(addr)
5
8
  @addr = addr
6
9
  @node = addr.node
7
10
  end
8
11
 
12
+ # @param val [Object] value to store at this address.
13
+ # @param ts [Time::Time]
14
+ # @param options [Hash] Meta and Source information can be stored as well.
15
+ # This is an internal function to add a value to the datastore and specify the observed_at time. It can be used
16
+ # by external code, but do so carefully.
9
17
  def _insert(val,ts,options={})
10
18
  #DataMapper.logger.debug "PREINSERT #{val} -- #{ts.to_f}"
11
19
 
@@ -15,14 +23,19 @@ module Chawk
15
23
  coll.create(values)
16
24
  end
17
25
 
26
+ # This will clear out all of the data stored at this address for this datastore. Use with caution.
18
27
  def clear_history!
19
28
  model.all(node_id:@node.id).destroy
20
29
  end
21
30
 
31
+ # The number of stores data points in this datastore at this address.
22
32
  def length
23
33
  coll.length
24
34
  end
25
35
 
36
+ # @param args [Object, Array of Objects]
37
+ # @param options [Hash] You can also pass in :meta and :timestamp
38
+ # Add an item or an array of items (one at a time) to the datastore.
26
39
  def <<(args,options={})
27
40
  dt = Time.now
28
41
  if args.is_a?(Array)
@@ -43,28 +56,37 @@ module Chawk
43
56
  self.last
44
57
  end
45
58
 
46
- def last(count=1)
47
- if count == 1
48
- if coll.length > 0
49
- coll.last
50
- #PPoint.new(self, coll.last)
51
- else
52
- nil
53
- end
54
- else
55
- vals = coll.all(limit:count,order:[:observed_at.asc, :id.asc])
56
- #last_items = vals #.each.collect{|val|PPoint.new(self, val)}
59
+ # @param count [Integer] returns an array with the last [0..count] items in the datastore. If set to 1 or left empty, this returns a single item.
60
+ # Either the last item added to the datastore or an array of the last n items added to the datastore.
61
+ def last(count=1)
62
+ if count == 1
63
+ if coll.length > 0
64
+ coll.last
65
+ #PPoint.new(self, coll.last)
66
+ else
67
+ nil
68
+ end
69
+ else
70
+ vals = coll.all(limit:count,order:[:observed_at.asc, :id.asc])
71
+ #last_items = vals #.each.collect{|val|PPoint.new(self, val)}
72
+ end
57
73
  end
58
- end
59
74
 
60
- def range(dt_from, dt_to,options={})
61
- vals = coll.all(:observed_at.gte => dt_from, :observed_at.lte =>dt_to, limit:1000,order:[:observed_at.asc, :id.asc])
62
- return vals
63
- end
75
+ # Returns items whose observed_at times fit within from a range.
76
+ # @param dt_from [Time::Time] The start time.
77
+ # @param dt_to [Time::Time] The end time.
78
+ # @return [Array of Objects]
79
+ def range(dt_from, dt_to,options={})
80
+ vals = coll.all(:observed_at.gte => dt_from, :observed_at.lte =>dt_to, limit:1000,order:[:observed_at.asc, :id.asc])
81
+ return vals
82
+ end
64
83
 
65
- def since(dt_from)
66
- self.range(dt_from,Time.now)
67
- end
84
+ # Returns items whose observed_at times fit within from a range ending now.
85
+ # @param dt_from [Time::Time] The start time.
86
+ # @return [Array of Objects]
87
+ def since(dt_from)
88
+ self.range(dt_from,Time.now)
89
+ end
68
90
 
69
91
  end
70
92
  end
@@ -1,10 +1,12 @@
1
1
  require 'store'
2
2
 
3
3
  module Chawk
4
+ # The Value Store - where time series string data is stored and retrieved through an instance of Chawk::Addr.
4
5
  class Vaddr
5
6
 
6
7
  include Chawk::Store
7
8
 
9
+ private
8
10
  def coll
9
11
  @node.values
10
12
  end
@@ -5,7 +5,7 @@ describe Chawk::Addr do
5
5
  before do
6
6
  Chawk.clear_all_data!
7
7
  @agent = Chawk::Models::Agent.first || Chawk::Models::Agent.create(:name=>"Test User")
8
- @addr = Chawk.addr(@agent,'a/b')
8
+ @addr = Chawk.addr(@agent,'a:b')
9
9
  end
10
10
 
11
11
  it "has path" do
@@ -16,10 +16,12 @@ describe Chawk::Addr do
16
16
  @addr.must_respond_to(:address)
17
17
  end
18
18
 
19
- it "address is a/b" do
20
- @addr.address.must_equal("a/b")
21
- Chawk.addr(@agent,'a/b').address.must_equal("a/b")
22
- Chawk.addr(@agent,'0/x/z').address.must_equal("0/x/z")
19
+ it "address is valid" do
20
+ @addr.address.must_equal("a:b")
21
+ Chawk.addr(@agent,'a:b').address.must_equal("a:b")
22
+ Chawk.addr(@agent,'0:x:z').address.must_equal("0:x:z")
23
+ path = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345689_:$!@*[]~()"
24
+ Chawk.addr(@agent,path).address.must_equal(path)
23
25
  end
24
26
 
25
27
  it "rejects invalid paths" do
@@ -29,21 +31,25 @@ describe Chawk::Addr do
29
31
  lambda {Chawk.addr(@agent,Object.new)}.must_raise(ArgumentError)
30
32
  lambda {Chawk.addr(@agent,String.new)}.must_raise(ArgumentError)
31
33
  lambda {Chawk.addr(@agent,"")}.must_raise(ArgumentError)
34
+ lambda {Chawk.addr(@agent,"/")}.must_raise(ArgumentError)
35
+ lambda {Chawk.addr(@agent,"\\")}.must_raise(ArgumentError)
36
+ lambda {Chawk.addr(@agent,"&")}.must_raise(ArgumentError)
37
+ lambda {Chawk.addr(@agent,"?")}.must_raise(ArgumentError)
32
38
  end
33
39
 
34
40
  it "stops unauthorized access" do
35
41
  agent2 = Chawk::Models::Agent.first(name:"Steve Austin") || Chawk::Models::Agent.create(name:"Steve Austin")
36
- lambda{@addr = Chawk.addr(agent2,'a/b')}.must_raise SecurityError
42
+ lambda{@addr = Chawk.addr(agent2,'a:b')}.must_raise SecurityError
37
43
  @addr.public_read=true
38
- Chawk.addr(agent2,'a/b').address.must_equal "a/b"
44
+ Chawk.addr(agent2,'a:b').address.must_equal "a:b"
39
45
  @addr.public_read=false
40
- lambda{@addr = Chawk.addr(agent2,'a/b')}.must_raise SecurityError
46
+ lambda{@addr = Chawk.addr(agent2,'a:b')}.must_raise SecurityError
41
47
  @addr.set_permissions(agent2,true,false,false)
42
- Chawk.addr(agent2,'a/b').address.must_equal "a/b"
48
+ Chawk.addr(agent2,'a:b').address.must_equal "a:b"
43
49
  @addr.set_permissions(agent2,false,false,false)
44
- lambda{@addr = Chawk.addr(agent2,'a/b')}.must_raise SecurityError
50
+ lambda{@addr = Chawk.addr(agent2,'a:b')}.must_raise SecurityError
45
51
  @addr.set_permissions(agent2,false,false,true)
46
- Chawk.addr(agent2,'a/b').address.must_equal "a/b"
52
+ Chawk.addr(agent2,'a:b').address.must_equal "a:b"
47
53
  end
48
54
 
49
55
  end
@@ -4,7 +4,7 @@ describe Chawk::Paddr do
4
4
  before do
5
5
  #@board = Chawk::Board.new()
6
6
  @agent = Chawk::Models::Agent.first || Chawk::Models::Agent.create(:name=>"Test User")
7
- @addr = Chawk.addr(@agent,'a/b')
7
+ @addr = Chawk.addr(@agent,'a:b')
8
8
  @addr.points.clear_history!
9
9
  end
10
10
 
@@ -5,7 +5,7 @@ describe Chawk::Vaddr do
5
5
  before do
6
6
  #@board = Chawk::Board.new()
7
7
  @agent = Chawk::Models::Agent.first || Chawk::Models::Agent.create(:name=>"Test User")
8
- @addr = Chawk.addr(@agent,'a/b')
8
+ @addr = Chawk.addr(@agent,'a:b')
9
9
  @addr.values.clear_history!
10
10
  end
11
11
 
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chawk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Russell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-14 00:00:00.000000000 Z
11
+ date: 2014-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: dm-sqlite-adapter
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '='
18
- - !ruby/object:Gem::Version
19
- version: 1.2.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '='
25
- - !ruby/object:Gem::Version
26
- version: 1.2.0
27
- - !ruby/object:Gem::Dependency
28
- name: dm-postgres-adapter
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '='
32
- - !ruby/object:Gem::Version
33
- version: 1.2.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '='
39
- - !ruby/object:Gem::Version
40
- version: 1.2.0
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: data_mapper
43
15
  requirement: !ruby/object:Gem::Requirement
@@ -52,34 +24,6 @@ dependencies:
52
24
  - - '='
53
25
  - !ruby/object:Gem::Version
54
26
  version: 1.2.0
55
- - !ruby/object:Gem::Dependency
56
- name: dm-is-tree
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 1.2.0
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '='
67
- - !ruby/object:Gem::Version
68
- version: 1.2.0
69
- - !ruby/object:Gem::Dependency
70
- name: dm-aggregates
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '='
74
- - !ruby/object:Gem::Version
75
- version: 1.2.0
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '='
81
- - !ruby/object:Gem::Version
82
- version: 1.2.0
83
27
  - !ruby/object:Gem::Dependency
84
28
  name: bundler
85
29
  requirement: !ruby/object:Gem::Requirement
@@ -151,21 +95,7 @@ dependencies:
151
95
  - !ruby/object:Gem::Version
152
96
  version: 1.8.1
153
97
  - !ruby/object:Gem::Dependency
154
- name: coveralls
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - '='
158
- - !ruby/object:Gem::Version
159
- version: 0.7.0
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - '='
165
- - !ruby/object:Gem::Version
166
- version: 0.7.0
167
- - !ruby/object:Gem::Dependency
168
- name: fakeweb
98
+ name: simplecov
169
99
  requirement: !ruby/object:Gem::Requirement
170
100
  requirements:
171
101
  - - '>='
@@ -178,7 +108,8 @@ dependencies:
178
108
  - - '>='
179
109
  - !ruby/object:Gem::Version
180
110
  version: '0'
181
- description: Time Series Storage Server
111
+ description: A storage engine for time-series data. Eventually to include resampling,
112
+ statistical and aggregate data management.
182
113
  email:
183
114
  - queuetue@gmail.com
184
115
  executables: []
@@ -194,6 +125,7 @@ files:
194
125
  - chawk.gemspec
195
126
  - lib/addr.rb
196
127
  - lib/chawk.rb
128
+ - lib/chawk/Jackdaw.svg
197
129
  - lib/chawk/version.rb
198
130
  - lib/models.rb
199
131
  - lib/paddr.rb
@@ -205,7 +137,7 @@ files:
205
137
  - test/lib/quantizer_test.rb
206
138
  - test/lib/vaddr_test.rb
207
139
  - test/test_helper.rb
208
- homepage: ''
140
+ homepage: http://www.queuetue.com/Chawk
209
141
  licenses:
210
142
  - MIT
211
143
  metadata: {}
@@ -228,10 +160,11 @@ rubyforge_project:
228
160
  rubygems_version: 2.2.2
229
161
  signing_key:
230
162
  specification_version: 4
231
- summary: Time Series Storage Server
163
+ summary: Time Series Storage Engine
232
164
  test_files:
233
165
  - test/lib/addr_test.rb
234
166
  - test/lib/paddr_test.rb
235
167
  - test/lib/quantizer_test.rb
236
168
  - test/lib/vaddr_test.rb
237
169
  - test/test_helper.rb
170
+ has_rdoc: