numru-units-1.9.0/0000755000175000017500000000000013025004163013655 5ustar uwabamiuwabaminumru-units-1.9.0/Rakefile0000644000175000017500000000003513025004162015317 0ustar uwabamiuwabamirequire "bundler/gem_tasks" numru-units-1.9.0/Gemfile0000644000175000017500000000014013025004162015142 0ustar uwabamiuwabamisource 'https://rubygems.org' # Specify your gem's dependencies in numru-units.gemspec gemspec numru-units-1.9.0/doc/0000755000175000017500000000000013025004162014421 5ustar uwabamiuwabaminumru-units-1.9.0/doc/units.html0000644000175000017500000002204313025004162016452 0ustar uwabamiuwabami units.rd

class NumRu::Units

Overview

A class of units of physical quantities.

This class covers most functionality of UNIDATA's UDUNITS Library, however, with a more sophisticated handling of string expressions.

UDUNITS always decomposes units into the four base units and discards the original string expressions. Therefore, 'hPa' always becomes '100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the other hand, this library tries to keep the original expressions as much as possible by default, while allowing partial to complete decompositions if needed.

Installation

Move to the top directly of this library (where you find the file install.rb). Then, type in the following:

% ruby install.rb

Usage Examples

Here is an example using the "irb" interactive shell ("%" is the command prompt, and ">>" is the irb prompt -- Type in those after it to test. "=>" shows the result.):

% irb --simple-prompt
>> require "numru/units"
=> true
>> un1 = NumRu::Units.new('kg.m2/s')
=> Units{kg.m2/s}
>> un2 = NumRu::Units.new('g.m')
=> Units{g.m}
>> un3 = un1 / un2
=> Units[Multi[Pow[Name[g], Number[-1]], Name[kg], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
>> un1.to_s
=> "kg.m2/s"
>> un2.to_s
=> "g.m"
>> un3.to_s
=> "g-1 kg.m1 s-1"
>> un3.reduce5
=> Units[Multi[Number[1000], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
>> un3.to_s
=> "1000 m1 s-1"

Note the difference between the results of un3.to_s before and after un3.reduce5, where the former retains the literal expression of each atomic unit, while the latter does the maximum reduction. You can change the default behavior by using the class method reduce_level=:

>> NumRu::Units.reduce_level = 5
=> :reduce5
>> un3.to_s
=> "1000 m1 s-1"

Note that you can eliminate the prefix NumRu:: by "including" it:

>> require "numru/units"
=> true
>> include NumRu
=> Object
>> un1 = Units.new('kg.m2/s')
=> Units{kg.m2/s}
>> Units.reduce_level = 5
=> :reduce5

Class Methods

In what follows, the prefix NumRu:: is omitted for conciseness. See Usage Examples on this issue.

Units.new(string)

Constructor.

ARGUMENTS

RETURN VALUE

EXAMPLE

units = Units.new('kg.m2/s')
units = Units.new('100 m')
units = Units.new('g/kg')
units = Units.new('hour since 2003-10-01 00:00:0 +0:00')
units = Units.new('hour since 2003-10-01')   # same as above
units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00')

Units[string]

Same as Units.new

Units.reduce_level=(n)

Set the reduction level before to_s is applied.

ARGUMENTS

Instance Methods

to_s

Returns a string expression of the units.

*(other)

Multiplies self with another units. Applies reduce4 to format the string expression of the result.

ARGUMENTS

RETURN VALUE

/(other)

Divides self with another units. Applies reduce4 to format the string expression of the result.

ARGUMENTS

RETURN VALUE

**(pow)

Power. Applies reduce4 to format the string expression of the result.

ARGUMENTS

RETURN VALUE

==(other)

Whether the two units are the same. ('m/s' and 'm.s-1' are the same, for instance.)

===(other)

Same as ==.

=~(other)

Whether the two units are compatible (i.e., with the same dimensionality). ('m/s' and '10 m.s-1' are compatible, for instance.)

reduce4

Moderately reduces the string expression of the units (destructive method). This method preserves string expression of atomic units. See also reduce5.

RETURN VALUE

EXAMPLE

Untis.new('hour/hour').reduce4.to_s
  # => "1"
Units.new('mm/m').reduce4.to_s
  # => "mm.m-1"

reduce5

Aggressively reduces the string expression of the units (destructive method). See also reduce4.

RETURN VALUE

EXAMPLE

Units.new('hour/hour').reduce4.to_s
  # => "1"
Units.new('mm/m').reduce5.to_s
  # => "0.001"

convert(numeric, to_units)

Converts a numeric of the current units (=self) to to_units.

ARGUMENTS

RETURN VALUE

EXCEPTIONS

convert2(val, to_units)

Like convert, but (1) accpets any Numeric-like objects, and (2) does not raise an exception even if the two units are incompatible -- in this case, simply returns val (warned).

ARGUMENTS

RETURN VALUE

factor_and_offset(to_units)

Returns the factor and offset to convert from self to to_units. The conversion is done as scale_factor * operand + add_offset.

ARGUMENTS

RETURN VALUE

EXAMPLE

scale_factor, add_offset = from_units.factor_and_offset(to_units)
to = scale_factor * from + add_offset
numru-units-1.9.0/doc/units.rd0000644000175000017500000001407513025004162016121 0ustar uwabamiuwabami=begin =class NumRu::Units * (()) * (()) * (()) * (()) * (()) * (()) (Plural form allowed if the second field is "P") ==Overview A class of units of physical quantities. This class covers most functionality of UNIDATA's (()), however, with a more sophisticated handling of string expressions. UDUNITS always decomposes units into the four base units and discards the original string expressions. Therefore, 'hPa' always becomes '100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the other hand, this library tries to keep the original expressions as much as possible by default, while allowing partial to complete decompositions if needed. ==Installation Move to the top directly of this library (where you find the file install.rb). Then, type in the following: % ruby install.rb ==Usage Examples Here is an example using the "irb" interactive shell ("(('%'))" is the command prompt, and "(('>>'))" is the irb prompt -- Type in those after it to test. "(('=>'))" shows the result.): % irb --simple-prompt >> require "numru/units" => true >> un1 = NumRu::Units.new('kg.m2/s') => Units{kg.m2/s} >> un2 = NumRu::Units.new('g.m') => Units{g.m} >> un3 = un1 / un2 => Units[Multi[Pow[Name[g], Number[-1]], Name[kg], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]] >> un1.to_s => "kg.m2/s" >> un2.to_s => "g.m" >> un3.to_s => "g-1 kg.m1 s-1" >> un3.reduce5 => Units[Multi[Number[1000], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]] >> un3.to_s => "1000 m1 s-1" Note the difference between the results of (('un3.to_s')) before and after (('un3.reduce5')), where the former retains the literal expression of each atomic unit, while the latter does the maximum reduction. You can change the default behavior by using the class method (('reduce_level=')): >> NumRu::Units.reduce_level = 5 => :reduce5 >> un3.to_s => "1000 m1 s-1" Note that you can eliminate the prefix (('NumRu::')) by "including" it: >> require "numru/units" => true >> include NumRu => Object >> un1 = Units.new('kg.m2/s') => Units{kg.m2/s} >> Units.reduce_level = 5 => :reduce5 ==Class Methods In what follows, the prefix (('NumRu::')) is omitted for conciseness. See (()) on this issue. ---Units.new(string) Constructor. ARGUMENTS * string (String): string expression of the units. [factor] units; [factor] time units [since ...] (see EXAMPLES below) RETURN VALUE * a Units EXAMPLE units = Units.new('kg.m2/s') units = Units.new('100 m') units = Units.new('g/kg') units = Units.new('hour since 2003-10-01 00:00:0 +0:00') units = Units.new('hour since 2003-10-01') # same as above units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00') ---Units[string] Same as (()) ---Units.reduce_level=(n) Set the reduction level before (()) is applied. ARGUMENTS * n (Integer): the reduction level. The default value is 4. Use 5 if you want a full reduction. Levels lower than 4 will not be needed. ==Instance Methods ---to_s Returns a string expression of the units. ---*(other) Multiplies self with another units. Applies (()) to format the string expression of the result. ARGUMENTS * other [Units]: the other units RETURN VALUE * a Units ---/(other) Divides self with another units. Applies (()) to format the string expression of the result. ARGUMENTS * other [Units]: the other units RETURN VALUE * a Units ---**(pow) Power. Applies (()) to format the string expression of the result. ARGUMENTS * pow [Numeric -- Integer, Rational, or Float] RETURN VALUE * a Units ---==(other) Whether the two units are the same. ('m/s' and 'm.s-1' are the same, for instance.) ---===(other) Same as ((<==>)). ---=~(other) Whether the two units are compatible (i.e., with the same dimensionality). ('m/s' and '10 m.s-1' are compatible, for instance.) ---reduce4 Moderately reduces the string expression of the units (destructive method). This method preserves string expression of atomic units. See also (()). RETURN VALUE * self EXAMPLE Untis.new('hour/hour').reduce4.to_s # => "1" Units.new('mm/m').reduce4.to_s # => "mm.m-1" ---reduce5 Aggressively reduces the string expression of the units (destructive method). See also (()). RETURN VALUE * self EXAMPLE Units.new('hour/hour').reduce4.to_s # => "1" Units.new('mm/m').reduce5.to_s # => "0.001" ---convert(numeric, to_units) Converts a numeric of the current units (=self) to ((|to_units|)). ARGUMENTS * numeric [Numeric]: the numeric to convert * to_units [Units]: the units converted into RETURN VALUE * a Numeric EXCEPTIONS * ((|self|)) and ((|to_units|)) are incompatible. ---convert2(val, to_units) Like (()), but (1) accpets any Numeric-like objects, and (2) does not raise an exception even if the two units are incompatible -- in this case, simply returns ((|val|)) (warned). ARGUMENTS * val [a Numeric-like class, for which (('*')) and (('+')) are defined]: the value to convert * to_units [Units]: the units converted into RETURN VALUE * an object with the same class as ((|val|)). ---factor_and_offset(to_units) Returns the factor and offset to convert from ((|self|)) to ((|to_units|)). The conversion is done as (('scale_factor * operand + add_offset')). ARGUMENTS * to_units [Units]: the units to be converted into RETURN VALUE * [ scale_factor, add_offset ] (a 2-element Array, where both are Numeric) EXAMPLE scale_factor, add_offset = from_units.factor_and_offset(to_units) to = scale_factor * from + add_offset =end numru-units-1.9.0/doc/Makefile0000644000175000017500000000020613025004162016057 0ustar uwabamiuwabamiall: units.html units.html: units.rd rd2 units.rd | sed -e 's/
/

/' -e 's/<\/dt>/<\/h4><\/dt>/' \ > units.html numru-units-1.9.0/src/0000755000175000017500000000000013025004163014444 5ustar uwabamiuwabaminumru-units-1.9.0/src/makeutab.rb0000644000175000017500000000326313025004163016566 0ustar uwabamiuwabami SI_ABBREV = { 'E' => 18, 'P' => 15, 'T' => 12, 'G' => 9, 'M' => 6, 'k' => 3, 'h' => 2, 'da' => 1, 'd' => -1, 'c' => -2, 'm' => -3, 'u' => -6, 'n' => -9, 'p' => -12, 'f' => -15, 'a' => -18, } SI_PREFIX = { 'exa' => 18, 'peta' => 15, 'tela' => 12, 'giga' => 9, 'mega' => 6, 'kilo' => 3, 'hecto' => 2, 'deca' => 1, 'deci' => -1, 'centi' => -2, 'milli' => -3, 'micro' => -6, 'nano' => -9, 'pico' => -12, 'femto' => -15, 'atto' => -18, } def plural(string) case string when /^([^_]+)(_.*)/ pre, post = $1, $2 plural(pre) + post when /[szoj]$/ string.sub(/$/, "es") when /[^aeou]y$/ string.sub(/y$/, "ies") else string.sub(/$/, "s") end end udefs = {} ualiases = {} uplurals = {} while (line = gets) next if /^#/ =~ line case line.strip when /(\S+)\s+(\S)\s+(\S.*)/ name, mode, definition = $1, $2, $3 udefs[name] = definition when /(\S+)\s+(\S)/ name, mode = $1, $2 else next end case mode when /^S/ for prefix, power in SI_ABBREV next if prefix + name == 'kg' ualiases[prefix + name] = [power, name] end when /^P/ pname = plural(name) ualiases[pname] = [0, name] uplurals[pname] = name for prefix, power in SI_PREFIX ualiases[prefix + name] = [power, name] end end end def dumphash(hname, h) puts "#{hname} = {" s = "" for name in h.keys.sort a = " #{name.dump} => #{h[name].inspect}," if s.length + a.length > 72 puts s s = "" end s += a end if s.length > 0 puts s s = "" end puts "}" end puts "class NameNode" dumphash('UDEFS', udefs) dumphash('UALIASES', ualiases) dumphash('UPLURALS', uplurals) puts "end" numru-units-1.9.0/src/numbernode.rb0000644000175000017500000000170313025004163017130 0ustar uwabamiuwabamiclass NumberNode < TerminalNode def initialize(arg) raise TypeError unless Numeric === arg @a = arg end UNITY = NumberNode.new(1) ZERO = NumberNode.new(0) def to_s if @a == @a.to_i sprintf("%d",@a) else String(@a) end end attr_reader :a alias :value :a alias :factor :a def == (other) case other when NumberNode @a == other.a else false end end def add_eval(another) raise TypeError unless NumberNode === another NumberNode.new(@a + another.value) end def mul_eval(another) case another when NumberNode then NumberNode.new(@a * another.a) when PowNode raise TypeError unless NumberNode === another.lhs raise TypeError unless NumberNode === another.rhs NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value)) else raise TypeError end end def name; "1"; end def power; UNITY; end end numru-units-1.9.0/src/pownode.rb0000644000175000017500000000320213025004163016441 0ustar uwabamiuwabamiclass PowNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs raise TypeError unless NumberNode === @rhs end def to_s lhs = @lhs.to_s case lhs when /\d$/, /[\d\.]/ lhs = "(#{lhs})" end rhs = @rhs.to_s if rhs == '1' lhs else rhs = "^(#{rhs})" if (/\./ =~ rhs) lhs + rhs end end attr_reader :lhs, :rhs alias :power :rhs def pow_eval(other) case other when NumberNode PowNode.new(@lhs, @rhs.mul_eval(other)) else super(other) end end def flatten2 x = @lhs.flatten2 case x when NumberNode a = @lhs.pow_eval(@rhs) when TerminalNode a = self when PowNode a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs)) when MulNode, MultiNode a = MultiNode.new() for gc in x a.append(gc.pow_eval(@rhs)) end else raise "internal error" end return a end def name case @lhs when NumberNode, NameNode @lhs.name else raise "internal error" end end def value case @lhs when NumberNode Units::pow_f(@lhs.value, @rhs.value) else raise(format('%s#value: internal error', self.class.to_s)) end end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value) else self.class.new(@lhs, @rhs.add_eval(another.power)) end end def sort case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value)) else self end end def factor Units::pow_f(@lhs.factor, @rhs.value) end end numru-units-1.9.0/src/rules.rb0000644000175000017500000000240113025004163016120 0ustar uwabamiuwabamiclass NumRu::Units token INT ERR SHIFT SPACE MULTIPLY DIVIDE EXPONENT REAL NAME DATE TIME ZONE options no_result_var rule unit_spec: /* { yyaccept; } */ /* <-- to acccept empty unit_spec */ | origin_exp { val[0] } | error { yyerrok } ; origin_exp: unit_exp | unit_exp SHIFT value_exp { val[0].shift(val[2]) } | unit_exp SHIFT timestamp { val[0].shift(val[2]) } ; unit_exp: power_exp | number_exp | unit_exp power_exp { val[0].mul(val[1]) } | unit_exp MULTIPLY power_exp { val[0].mul(val[2]) } | unit_exp DIVIDE power_exp { val[0].divide(val[2]) } | unit_exp MULTIPLY number_exp { val[0].mul(val[2]) } | unit_exp DIVIDE number_exp { val[0].divide(val[2]) } ; power_exp: NAME { NameNode.new(val[0]) } | power_exp number_exp { val[0].pow(val[1]) } | power_exp EXPONENT value_exp { val[0].pow(val[2]) } | '(' origin_exp ')' { val[1] } ; value_exp: number_exp | '(' value_exp ')' { val[1] } ; number_exp: INT { NumberNode.new(val[0]) } | REAL { NumberNode.new(val[0]) } ; timestamp: time_exp | '(' timestamp ')' { val[1] } ; time_exp: DATE { TimeNode.new(val[0], 0.0, 0) } | DATE TIME { TimeNode.new(val[0], val[1], 0) } | DATE TIME ZONE { TimeNode.new(val[0], val[1], val[2]) } ; end ---- header require 'date' ---- inner numru-units-1.9.0/src/timenode.rb0000644000175000017500000000546213025004163016604 0ustar uwabamiuwabamiclass XDate def initialize(year, month, day) @year, @month, @day = year.to_i, month.to_i, day.to_i end attr_reader :year, :month, :day def to_s format('%04d-%02d-%02d', @year, @month, @day) end alias :inspect :to_s def to_time Time.gm(@year, @month, @day) end def to_date Date.new(@year, @month, @day) end def -(other) case other when XDate (to_date - other.to_date) when Time to_time - other when Date (to_date - other.to_date) else to_date - other end end def +(other) t = to_date + other self.class.new(t.year, t.month, t.mday) end end class TimeNode < TerminalNode def initialize(date, time, zone) @date, @time, @zone = date, time, zone if :now === @date then now = Time.now.utc @date = XDate.new(now.year, now.month, now.day) @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec)) else qdays = (@time / 86400).floor if not qdays.zero? @date += qdays @time -= (qdays * 86400) end end raise TypeError unless XDate === @date @time = 0.0 unless @time raise TypeError unless Float === @time @zone = 0 unless @zone raise TypeError unless Integer === @zone end attr_reader :date, :time, :zone def to_s hr = @time.floor / 3600 mi = (@time.floor / 60) % 60 sc = @time % 60 tzm = @zone.abs tzh = tzm / 60 tzm %= 60 tzh = -tzh if @zone < 0 format("%sT%02d:%02d:%05.2f %+03d:%02d", \ @date.to_s, hr, mi, sc, tzh, tzm) end def self::pentad(d) (d > 25) ? 5 : ((d - 1) / 5) end def add_time(increment) inc = increment.reduce5 case inc.name when 's' t2 = @time + inc.factor d2 = @date + (t2 / 86400) t2 = t2 % 86400 self.class.new(d2, t2, @zone) when 'pentad' ifac = Integer(inc.factor) ipen = ifac % 6 imon = ifac / 6 spen = self.class.pentad(@date.day) smon = @date.month + imon + spen / 6 spen = spen % 6 sday = spen * 5 + (@date.day - 1) % 5 + 1 syear = @date.year + (smon - 1) / 12 smon = (smon - 1) % 12 + 1 sdate = XDate.new(syear, smon, sday) self.class.new(sdate, @time, @zone) else raise "bad time unit '#{inc.name}'" end end def utcsod @time - @zone * 60 end def div_time(units) base = units.ref inc = units.deref.reduce5 begin incname = inc.name rescue Exception incname = "(undefined)" end case incname when 's' dif = (@date - base.date) * 86400 + (utcsod - base.utcsod) dif / inc.factor when 'pentad' dif = (@date.year - base.date.year) * 72 dif += (@date.month - base.date.month) * 6 dif += self.class.pentad(@date.day) dif -= self.class.pentad(base.date.day) dif = Float(dif) if dif % inc.factor != 0 dif / inc.factor else raise "bad time unit '#{incname}'" end end end numru-units-1.9.0/src/dcunits.txt0000644000175000017500000000757213025004163016671 0ustar uwabamiuwabami# Unit description table # # Each line consitsts of # # name mode definition # # Here, mode is S, P, or N: # # S: the unit is in the sigular form only (does not take the plural form), # and it can be prefixed. (such as A --> mA etc.) # P: the unit can take the plural form (such as second --> seconds). # Prefixes are not allowed. # N: same as S, but the unit cannot be prefixed (thus it is used only # in the original form). # s S second P s m S metre P m meter P metre kg N kilogram P kg A S ampere P A K S kelvin P K degK P K deg_K P K degreeK P K mol S mole P mol rad S radian P rad sr S steradian P sr cd S candela P cd # # --- standard named units --- # Hz S 1/s hertz P Hz N S kg.m.s-2 newton P N Pa S N.m-2 pascal P Pa Pascal P Pa J S N.m joule P J W S J/s watt P W C S A.s coulomb P C V S J/C volt P V F S C/V ohm S V/A S S A/V Wb S V.s weber P Wb farad P coulomb/volt T S Wb.m-2 tesla P Wb.m-2 H S Wb.A-1 degC S K @ 273.15 deg_C S K @ 273.15 degree_C S K @ 273.15 degree_c S K @ 273.15 degreeC S K @ 273.15 Celsius P K @ 273.15 celsius P K @ 273.15 centigrade P K @ 273.15 degree_R S K / 1.8 degree_f S degree_R @ 459.67 degree_F S degree_R @ 459.67 Fahrenheit P degree_F fahrenheit P degree_F degF S degree_F deg_F S degree_F degreeF S degree_F lm S cd.sr lx S lm.m-2 Bq S s-1 Gy S J.kg-1 Sv S J.kg-1 # # === non-SI units === # # --- basic numbers --- # pi N 3.141592653589793238462 # # --- nondimensional units --- # percent P 1e-2 % N 1e-2 permil N 1e-3 # # --- length --- # fermi P 1.0e-15 m angstrom P 1.0e-10 m micron P 1.0e-6 m astronomical_unit N 1.49597870e11 m astronomical_units N 1.49597870e11 m Au S astronomical_unit parsec P 3.0857e16 m pc S parsec light_year N 9.46e15 m light_years N 9.46e15 m ly S light_year nautical_mile N 1852 m nautical_miles N 1852 m # inch P 2.54 cm in S inch foot N 12 inch feet N foot ft N foot yard P 6 feet yd P yard chain P 22 yard mile P 1760 yard # # --- time --- # minute P 60 s min S 60 s hour P 60 min hr S 60 min h S 60 min day P 24 hour d N 24 hour Julian_year P 365.25 day common_year P 365 day # # --- date --- # # date is NOT time intentionally # pentad P month P 6 pentad mon S month year P 12 month yr S year century P 100 year # # --- area --- # are P 100 m2 a S are hectare P 100 are litre P 1.0e-3 m3 L S litre acre P 10 chain2 ac S acre # # --- angle --- # degree P pi.rad/180 angular_degree P degree minute_angle P pi.rad/180/60 angular_minute P minute_angle second_angle P pi.rad/180/60/60 angular_second P second_angle degree_N S degree degree_E S degree degree_W S degree degree_S S degree degree_north S degree_N degree_east S degree_E degree_west S degree_W degree_south S degree_S degrees_north S degree_N degrees_east S degree_E degrees_west S degree_W degrees_south S degree_S # # --- mass --- # ton P 1000 kg tonne P ton t S ton gram P kg/1000 g S kg/1000 pound P 453.6 g lb S pound ounce P pound / 16 oz S ounce # # --- CGS --- # dyne P g.cm.s-2 dyn S g.cm.s-2 bar S 1e6 dyn.cm-2 mb S bar / 1000 millibar P bar / 1000 gal P cm s-2 Gal S cm s-2 mgal S cm s-2 / 1000 erg S dyn cm erg P dyn cm poise P dyn s / cm2 P S poise stokes P cm2 / s St S stokes gauss P T / 10000 G S gauss # # --- conventional --- # calorie P 4.18605 J cal S calorie kgf S kilogram-force force S 9.80665 m.s-2 knot P nautical_mile / hour horse_power N 75 m kilogram-force / s atmosphere P 101325 Pa atm S atmosphere light_speed N 299792458 m/s mph S mile / hour kph S km / hour torr P 133.322 Pa psi S pound-force / inch2 gravity S 9.806650 meter/second2 conventional_mercury S gravity 13595.10 kg/m3 mercury S conventional_mercury Hg S mercury hg S mercury # # --- meteorological --- # gpm N m numru-units-1.9.0/src/units.rd0000644000175000017500000000745513025004163016150 0ustar uwabamiuwabami=begin =class Units A class of units of physical quantities. This class covers most functionality of UNIDATA's UDUNITS Library (http://www.unidata.ucar.edu/packages/udunits/), however, with a more sophisticated handling of string expressions. UDUNITS always decomposes units into the four base units and discards the original string expressions. Therefore, 'hPa' always becomes '100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the otehr hand, this library tries to keep the original expressions as much as possible by default, while allowing partial to complete decompositions if needed. ==class methods ---Units.new(string) Constructor. ARGUMENTS * string (String): string expression of the units. [factor] units; [factor] time units [since ...] (see EXAMPLES below) RETURN VALUE * a Units EXAMPLE units = Units.new('kg.m2/s') units = Units.new('100 m') units = Units.new('g/kg') units = Units.new('hour since 2003-10-01 00:00:0 +0:00') units = Units.new('hour since 2003-10-01') # same as above units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00') ---reduce_level by default returns 4. ---reduce_level = i Integer value within 1..5 is acceptable for ((|i|)). After this call, ((*reduce*))((|i|)) is used in ((<*>)), ((<"/">)), ((<**>)) instance methods. ==instance methods ---to_s Returns a string expression of the units. ---*(other) Multiplies self with another units. Applies (()) to format the string expression of the result. ARGUMENTS * other [Units]: the other units RETURN VALUE * a Units ---/(other) Divides self with another units. Applies (()) to format the string expression of the result. ARGUMENTS * other [Units]: the other units RETURN VALUE * a Units ---**(pow) Power. Applies (()) to format the string expression of the result. ARGUMENTS * pow [Integer] RETURN VALUE * a Units ---==(other) Judges whether the two units are the same. Comparison is done after (()) operation is applied to both self and other. ('m/s' and 'm.s-1' will be the same, for instance.) ---===(other) Similar to ((<==>)), but reference date or shift value is ignored. ---=~(other) Similar to ((<===>)), but numerical factor is also ignored. When (units1 =~ units2) is true, you may add or subtract two quantities in units1 and units2. ---reduce4 Moderately parses the string expression of the units (destructive method). This method preserves string expression of atomic units, but plural form and SI prefixes are normalized. See also (()). RETURN VALUE * self EXAMPLE Untis.new('hour/hour').reduce4.to_s # => "" Units.new('mm/m').reduce4.to_s # => "m-1 mm" ---reduce5 Parses and aggressively reduces the string expression of the units (destructive method). See also (()). RETURN VALUE * self EXAMPLE Units.new('hour/hour').reduce5.to_s # => "1.0" Units.new('mm/m').reduce5.to_s # => "0.001" ---convert(numeric, to_units) converts Numeric value ((|numeric|)) into new units ((|to_units|)). EXAMPLE Units.new('degree_F').convert(32, Units.new('K')).to_s # => "273.15" ---convert2(numeric_etc, to_units) Similat to (()), but the first argument is more flexible to accept not only numerics but also NArray etc etc. EXAMPLE require "narray" na = NArray[-40.0, 0.0] Units.new('degree_F').convert(na, Units.new('degC')) # => NArray.float(2): [ -40.0, -17.7778 ] =end numru-units-1.9.0/src/shiftnode.rb0000644000175000017500000000151613025004163016757 0ustar uwabamiuwabamiclass ShiftNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end attr_reader :lhs, :rhs alias :ref :rhs def to_s "(#{@lhs.to_s} @ #{@rhs.to_s})" end def trim2; @lhs; end def trim self.class.new(@lhs.trim, @rhs.trim2) end def flatten2; @lhs; end def flatten lf = @lhs.flatten case lf when ShiftNode rf = lf.rhs.add_eval(@rhs) self.class.new(lf.lhs, rf) else self.class.new(lf, @rhs.flatten) end end def sort self.class.new(@lhs.sort, @rhs.sort) end def ref case @lhs when ShiftNode @lhs.ref.add_eval(@rhs) else @rhs end end def deref case @lhs when ShiftNode @lhs.deref else @lhs end end def name @lhs.name end def factor @lhs.factor end end numru-units-1.9.0/src/lex.rb0000644000175000017500000001776513025004163015601 0ustar uwabamiuwabamidef initialize string case string when String @string, @ptree = string, nil when Node @string, @ptree = nil, string else @string, @ptree = String(string), nil end @copy = @lexstat = nil end # # === LEXICAL ANALYZER === # def rewind @copy = @string.dup.strip @lexstat = nil end RE_SPACE = '([ \t])' RE_INTEGER = '([-+]?\d+)' RE_EXP = '([eE][-+]?[0-9]+)' RE_REAL = "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))" RE_YEAR = "([-+]?[0-9]{1,4})" RE_MONTH = "(0?[1-9]|1[0-2])" RE_DAY = "([12][0-9]|30|31|0?[1-9])" RE_HOUR = "(2[0-3]|[0-1]?[0-9])" RE_MINUTE = "([0-5]?[0-9])" RE_SECOND = "((#{RE_MINUTE}|60)(\\.[0-9]*)?)" RE_NAME = "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)" RE_DATE = "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}" RE_TIME = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?" RE_HandM = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?" def next_token # decomment @copy.sub!(/^#.*/, ''); if @copy.sub!(%r{^\s*(\))}, '') then @lexstat = nil return [$1, $1] end if @copy.sub!(%r{^\s*(\()\s*}, '') then return [$1, $1] end if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then @lexstat = :SHIFT_SEEN return [:SHIFT, $1] end if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then @lexstat = nil return [:DIVIDE, $1] end if @copy.sub!(%r{^(\^|\*\*)}, '') then @lexstat = nil return [:EXPONENT, $1] end if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then y, m, d = $1, $2, $3 @lexstat = :DATE_SEEN return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^now[ \t]*}, '') then @lexstat = nil return [:DATE, :now] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then h, m, s = $1, $3, $5 m = m.sub(/:/,'') if m s = 0 if s.nil? @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^(UTC|Z)[ \t]*}, '') then @lexstat = nil return [:ZONE, 0] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then sgn, h, m = $1, $2, $4 m = m.sub(/:/,'') if m @lexstat = nil h = h.to_i h = -h if sgn == "-" m = m.to_i m = -m if sgn == "-" return [:ZONE, ((h * 60) + m)] end if @copy.sub!(%r{^#{RE_NAME}}, '') then @lexstat = nil return [:NAME, $1] end if @copy.sub!(%r{^#{RE_REAL}}, '') then @lexstat = nil return [:REAL, $1.to_f] end if @copy.sub!(%r{^#{RE_INTEGER}}, '') then @lexstat = nil return [:INT, $1.to_i] end if @copy.sub!(%r{^(-)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if @copy.sub!(%r{^(.)}, '') then return [$1, $1] end return [false, false] end # # === USER LEVEL METHODS === # def tokens rewind x = [] while (t = next_token).first x.push t end x end def do_parse2 rewind return NumberNode.new(1) if @string.nil? or @string.empty? pa = do_parse pa ? pa : ErrorNode.new(@string) end def ptree @ptree = do_parse2 if not @ptree @ptree end def dup @string ? self.class.new(@string) : self.class.new(@ptree) end def parse dup.parse! end def parse! @ptree = do_parse2 if not @ptree self end def self::parse(string) new(string).parse! end =begin --- reduce0 just do nothing. =end def reduce0 self end =begin --- reduce1 removes unnecessary parentheses. =end def reduce1 @string = ptree.to_s self end =begin --- reduce2 removes shift operator within multiplication/division/exponent =end def reduce2 @ptree = ptree.reduce2 @string = nil self end =begin --- reduce3 flattens expression and collects all factors =end def reduce3 @ptree = ptree.reduce3 @string = nil self end =begin --- reduce4 collects terms with the same name =end def reduce4 @ptree = ptree.reduce4 @string = nil self end =begin --- reduce5 expands all terms recursively =end def reduce5 @ptree = ptree.reduce5 @string = nil self end attr_reader :string def to_s @string = @ptree.to_s if @string.nil? @string end def inspect if @ptree.nil? then "Units{#{@string}}" else "Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[') end end def self::[](string) new(string) end def self::parse(string) new(string).parse! end def eval(x = 0) r5 = ptree.reduce5 case r = r5.ref when TimeNode r.add(x, r5.name) else fac = NumberNode.new(x + r.value) self.class.new(MulNode.new(fac, r5.deref)) end end def convert(numeric, to_units) to_units = Units.new( to_units ) if to_units.is_a?(String) r5 = dup.ptree.reduce5 case r = r5.ref when TimeNode r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree) else shift1 = r.value numeric = shift1 + numeric if shift1 != 0 fact = r5.divide(tp = to_units.dup.ptree).reduce5.value numeric *= fact if fact != 1 shift2 = tp.reduce5.ref.value numeric = numeric - shift2 if shift2 != 0 numeric end end def factor_and_offset(to_units) # To convert a numeric from self to to_units: # scale_factor * numeric + add_offset to_units = Units.new( to_units ) if to_units.is_a?(String) add_offset = convert(0, to_units) scale_factor = convert(1, to_units) - add_offset [ scale_factor, add_offset ] end def convert2(val, to_units) # Like Units#convert, but applicable to any Numeric-like objects. # Returns the original value if the units are incompatible. to_units = Units.new( to_units ) if to_units.is_a?(String) if ( self == to_units ) val elsif ( self =~ to_units ) if Numeric===val convert( val, to_units ) else factor, offset = factor_and_offset( to_units ) val*factor + offset end else unless $VERBOSE.nil? $stderr.print( "*WARNING*: " + "incompatible units: #{self.to_s} and #{to_units.to_s}\n") caller(0).each{|c| $stderr.print "\t* ",c,"\n"} end val end end @@reduce = :reduce4 def self::reduce_level @@reduce.to_s[-1] end def self::reduce_level=(n) @@reduce = case n when 1 then :reduce1 when 2 then :reduce2 when 3 then :reduce3 when 4 then :reduce4 else :reduce5 end end def binop(op, other) case other when Numeric other = NumberNode.new(other) when Units other = other.ptree end q = self.ptree.send(op, other).send(@@reduce) Units.new(q) end def *(other) binop(:mul, other) end def **(other) binop(:pow, other) end def /(other) binop(:divide, other) end def ^(other) binop(:shift, other) end def ==(other) case other when self.class dup.reduce5.to_s == other.dup.reduce5.to_s else false end end #def === (other) # reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s #end alias === == #def === (other) # # returns true if other is within a factor and/or offset of difference. # case other # when self.class # (self/other).reduce5.ptree.children.each do |child| # return false if !( NumberNode === child ) # end # true # else # false # end #end def =~(other) case other when self.class (self/other).reduce5.ptree.children.each{ |node| return false unless NumberNode === node } true else false end end def self::pow_f(a, b) if Integer === b and b < 0 then a ** b.to_f else a ** b end end numru-units-1.9.0/src/test.rb0000644000175000017500000001036513025004163015755 0ustar uwabamiuwabamirequire './units' # Use require "numru/units" after installation. include NumRu def assert(test, seikai) raise "#{test.inspect} != #{seikai.inspect}" if test != seikai puts "ok #{seikai.inspect}" end puts "=== reduce1 ===" assert Units.new('').reduce1.to_s, "1" assert Units.new('m').reduce1.to_s, "m" assert Units.new('3').reduce1.to_s, "3" assert Units.new('3.14').reduce1.to_s, "3.14" assert Units.new('m2').reduce1.to_s, "m2" assert Units.new('m.s').reduce1.to_s, "m.s" assert Units.new('m/s').reduce1.to_s, "m.s-1" assert Units.new('kg.m/s2').reduce1.to_s, "kg.m.(s2)-1" assert Units.new('s @ 2003-11-29').reduce1.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('s @ 2003-11-29T11:24').reduce1.to_s, "(s @ 2003-11-29T11:24:00.00 +00:00)" assert Units.new('s @ 2003-11-29T11:24:11 -09:00').reduce1.to_s, "(s @ 2003-11-29T11:24:11.00 -09:00)" assert Units.new('100').reduce1.to_s, "100" assert Units.new('(10)^2').reduce1.to_s, "(10)2" assert Units.new('(10)^2/100').reduce1.to_s, "(10)2.(100)-1" puts "=== reduce2 ===" assert Units.new('s @ 2003-11-29').reduce2.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('m/(s @ 2003-11-29)').reduce2.to_s, "m.s-1" assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce2.to_s, "m.(K.s)-1" assert Units.new('(10)^2/100').reduce2.to_s, "(10)2.(100)-1" puts "=== reduce3 ===" assert Units::MultiNode.new(Units::NameNode.new('a'), \ Units::NumberNode.new(1), \ Units::NameNode.new('b')).to_s, 'a.1 b' assert Units.new('kg').reduce3.inspect, "Units[Name[kg]]" assert Units.new('kg.m').reduce3.inspect, "Units[Multi[Name[kg], Name[m]]]" assert Units.new('kg.m.s').reduce3.inspect, "Units[Multi[Name[kg], Name[m], Name[s]]]" assert Units.new('(m.s)^2').reduce3.inspect, "Units[Multi[Pow[Name[m], Number[2]], Pow[Name[s], Number[2]]]]" assert Units.new('K @ 273.15').reduce3.inspect, "Units[Shift[Name[K], Number[273.15]]]" assert Units.new('((a.b)^2)^2').reduce3.inspect, "Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]]]]" assert Units.new('((a.b)^2 c4 d)^2').reduce3.inspect, "Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]], Pow[Name[c], Number[8]], Pow[Name[d], Number[2]]]]" assert Units.new('((a.b)^2 c4 d)^2').reduce3.to_s, "a4 b4 c8 d2" assert Units.new('((a.b)^2 a4 b)^2').reduce3.to_s, "a4 b4 a8 b2" assert Units.new('s @ 2003-11-29').reduce3.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('m/(s @ 2003-11-29)').reduce3.to_s, "m.s-1" assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce3.to_s, "m.K-1 s-1" assert Units.new('(10)^2/100').reduce3.to_s, "(10)2.(100)-1" puts "=== reduce4 ===" assert Units.new('((a.b)^2 a4 b @ now)^2 @ 273.15').reduce4.to_s, "(a12 b6 @ 273.15)" assert Units.new('km2').reduce4.to_s, "km2" assert Units.new('hours.hour').reduce4.to_s, "hour2" assert Units.new('(10)^2').reduce4.to_s, "100" assert Units.new('100/10').reduce4.to_s, "10" assert Units.new('(10)^2/100').reduce4.to_s, "1" puts "=== reduce5 ===" assert Units.new('km2').reduce5.to_s, "1000000 m2" assert Units.new('(10)^2/100').reduce5.to_s, "1" assert Units.new('hPa').reduce5.to_s, "100 kg.m-1 s-2" assert Units.new('mb').reduce5.to_s, "100 kg.m-1 s-2" assert Units.new('hPa/mb').reduce5.to_s, "1" assert Units.new('(K @ 273.15)@ 10').reduce5.to_s, "(K @ 283.15)" puts "=== APPLICATIONS ===" assert Units.new('km @ 2').convert(3, Units.new('m @ 100')), 4900 assert Units.new('degree_F').convert(32, Units.new('K')).to_s, ((32+459.67)*(1.8**-1)).to_s u1 = Units.new('m/s') u2 = Units.new('mm/s') assert((u1/u2).to_s, "m.mm-1") assert((u1*u2).to_s, "m.mm.s-2") u1 = Units.new('years since 1999-01-01 00:00').reduce4 u2 = Units.new('hours since 2001-01-01 00:00').reduce4 assert u1.convert(3, u2), 24 * 365 u3 = Units.new('months since 2001-01-01 00:00').reduce4 assert u1.convert(3, u3), 12.0 Units.reduce_level = 3 assert((Units.new('hours') ** 2).to_s, "hours2") Units.reduce_level = 4 assert((Units.new('hours') ** 2).to_s, "hour2") Units.reduce_level = 5 assert((Units.new('hours') ** 2).to_s, "12960000 s2") assert(Units.new('day') =~ Units.new('s since 2002-01-01'), true) assert(Units.new('m') =~ Units.new('1'), false) un1 = Units['day since 2000-01-01'] un2 = Units['s since 2000-01-01'] assert(un1.convert(0, un2), 0.0) assert(un1.convert(1, un2), 86400.0) numru-units-1.9.0/src/version.rb0000644000175000017500000000002113025004163016447 0ustar uwabamiuwabamiVERSION = "1.9" numru-units-1.9.0/src/units.racc0000644000175000017500000032264713025004163016456 0ustar uwabamiuwabamiclass NumRu::Units token INT ERR SHIFT SPACE MULTIPLY DIVIDE EXPONENT REAL NAME DATE TIME ZONE options no_result_var rule unit_spec: /* { yyaccept; } */ /* <-- to acccept empty unit_spec */ | origin_exp { val[0] } | error { yyerrok } ; origin_exp: unit_exp | unit_exp SHIFT value_exp { val[0].shift(val[2]) } | unit_exp SHIFT timestamp { val[0].shift(val[2]) } ; unit_exp: power_exp | number_exp | unit_exp power_exp { val[0].mul(val[1]) } | unit_exp MULTIPLY power_exp { val[0].mul(val[2]) } | unit_exp DIVIDE power_exp { val[0].divide(val[2]) } | unit_exp MULTIPLY number_exp { val[0].mul(val[2]) } | unit_exp DIVIDE number_exp { val[0].divide(val[2]) } ; power_exp: NAME { NameNode.new(val[0]) } | power_exp number_exp { val[0].pow(val[1]) } | power_exp EXPONENT value_exp { val[0].pow(val[2]) } | '(' origin_exp ')' { val[1] } ; value_exp: number_exp | '(' value_exp ')' { val[1] } ; number_exp: INT { NumberNode.new(val[0]) } | REAL { NumberNode.new(val[0]) } ; timestamp: time_exp | '(' timestamp ')' { val[1] } ; time_exp: DATE { TimeNode.new(val[0], 0.0, 0) } | DATE TIME { TimeNode.new(val[0], val[1], 0) } | DATE TIME ZONE { TimeNode.new(val[0], val[1], val[2]) } ; end ---- header require 'date' ---- inner VERSION = "1.9" =begin = class Node Node is a parent class for classes of parse tree node. This is not expected to be instanciated directly. =end class Node def initialize(*args) raise "#{self.class} is virtual." end def to_s(*args) raise "#{self.class}#to_s is virtual." end =begin --- pow other simply constructs a PowNode object. No reduction is performed. =end def pow(other) PowNode.new(self, other) end =begin --- mul other simply constructs a MulNode object. No reduction is performed. =end def mul(other) other = NumberNode.new(other) if Numeric === other MulNode.new(self, other) end =begin --- divide other simply constructs a MulNode object. No reduction is performed. =end def divide(other) MulNode.new(self, PowNode.new(other, NumberNode.new(-1))) end =begin --- shift other simply constructs a ShiftNode object. No reduction is performed. =end def shift(other) ShiftNode.new(self, other) end =begin --- pow_eval other similar to (()), but reduces PowNode[PowNode[...]] into single PowNode[...], so overriden at PowNode class. =end def pow_eval(other) pow(other) end =begin --- inspect =end def inspect2; "#{self.class}[#{to_s}]"; end def inspect; inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '['); end =begin --- trim in most subclasses, "trim" is redirected into "trim2". =end def trim trim2 end =begin --- flatten in most subclasses, "flatten" is redirected into "flatten2". =end def flatten flatten2 end =begin --- sort =end def sort raise "#{self.class}#sort is virtual: call after flatten" end =begin --- reduce1 --- reduce2 --- reduce3 --- reduce4 --- reduce5 =end def reduce1 self end def reduce2 trim end def reduce3 trim.flatten end def reduce4 # unalias(Hash.new).trim.flatten.sort foldnumber(nil).trim.flatten.sort end def reduce5 expand(Hash.new).trim.flatten.sort end =begin --- ref to be overriden at ShiftNode --- deref to be overriden at ShiftNode =end def ref NumberNode::ZERO end def deref self end end class ErrorNode < Node def initialize(string) @a = string end def to_s; @a; end end class ContainerNode < Node def trim2 x = [] for child in self x.push child.trim2 end self.class.new(*x) end def inspect2 a = [] for child in self a.push child.inspect2 end "#{self.class}[#{a.join(', ')}]" end end module BinaryNode def each yield @lhs yield @rhs end def expand(stopper) self.class.new(@lhs.expand(stopper), @rhs.expand(stopper)) end def unalias(stopper) self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper)) end def foldnumber(stopper) self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper)) end end class TerminalNode < Node def trim2; self; end def flatten2; self; end def expand(stopper); self; end alias :unalias :expand alias :foldnumber :expand def sort; self; end end class NameNode < TerminalNode def initialize(string) @a = string end def to_s; @a; end alias :name :to_s def power; NumberNode::UNITY; end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name PowNode.new(self, self.power.add_eval(another.power)) end def expand(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self if basic? return CACHE[@a] if CACHE.include?(@a) CACHE[@a] = expand2(stopper) end def expand2(stopper) newstopper = stopper.dup newstopper[@a] = true if UDEFS.include?(@a) then Units.new(UDEFS[@a]).ptree.expand(newstopper) else p, n = UALIASES[@a] u = Units.new(UDEFS[n] || n).ptree.expand(newstopper) MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p))) end end def unalias(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self unless UALIASES.include?(@a) p, n = UALIASES[@a] u = NameNode.new(n) q = PowNode.new(NumberNode.new(10), NumberNode.new(p)) MulNode.new(u, q) end def foldnumber(stopper) return self unless UPLURALS.include?(@a) n = UPLURALS[@a] NameNode.new(n) end def basic? not (UDEFS.include?(@a) or UALIASES.include?(@a)) end CACHE = {} def factor 1 end end class NameNode UDEFS = { "%" => "1e-2", "Au" => "astronomical_unit", "Bq" => "s-1", "C" => "A.s", "Celsius" => "K @ 273.15", "F" => "C/V", "Fahrenheit" => "degree_F", "G" => "gauss", "Gal" => "cm s-2", "Gy" => "J.kg-1", "H" => "Wb.A-1", "Hg" => "mercury", "Hz" => "1/s", "J" => "N.m", "Julian_year" => "365.25 day", "L" => "litre", "N" => "kg.m.s-2", "P" => "poise", "Pa" => "N.m-2", "Pascal" => "Pa", "S" => "A/V", "St" => "stokes", "Sv" => "J.kg-1", "T" => "Wb.m-2", "V" => "J/C", "W" => "J/s", "Wb" => "V.s", "a" => "are", "ac" => "acre", "acre" => "10 chain2", "ampere" => "A", "angstrom" => "1.0e-10 m", "angular_degree" => "degree", "angular_minute" => "minute_angle", "angular_second" => "second_angle", "are" => "100 m2", "astronomical_unit" => "1.49597870e11 m", "astronomical_units" => "1.49597870e11 m", "atm" => "atmosphere", "atmosphere" => "101325 Pa", "bar" => "1e6 dyn.cm-2", "cal" => "calorie", "calorie" => "4.18605 J", "candela" => "cd", "celsius" => "K @ 273.15", "centigrade" => "K @ 273.15", "century" => "100 year", "chain" => "22 yard", "common_year" => "365 day", "conventional_mercury" => "gravity 13595.10 kg/m3", "coulomb" => "C", "d" => "24 hour", "day" => "24 hour", "degC" => "K @ 273.15", "degF" => "degree_F", "degK" => "K", "deg_C" => "K @ 273.15", "deg_F" => "degree_F", "deg_K" => "K", "degree" => "pi.rad/180", "degreeC" => "K @ 273.15", "degreeF" => "degree_F", "degreeK" => "K", "degree_C" => "K @ 273.15", "degree_E" => "degree", "degree_F" => "degree_R @ 459.67", "degree_N" => "degree", "degree_R" => "K / 1.8", "degree_S" => "degree", "degree_W" => "degree", "degree_c" => "K @ 273.15", "degree_east" => "degree_E", "degree_f" => "degree_R @ 459.67", "degree_north" => "degree_N", "degree_south" => "degree_S", "degree_west" => "degree_W", "degrees_east" => "degree_E", "degrees_north" => "degree_N", "degrees_south" => "degree_S", "degrees_west" => "degree_W", "dyn" => "g.cm.s-2", "dyne" => "g.cm.s-2", "erg" => "dyn cm", "fahrenheit" => "degree_F", "farad" => "coulomb/volt", "feet" => "foot", "fermi" => "1.0e-15 m", "foot" => "12 inch", "force" => "9.80665 m.s-2", "ft" => "foot", "g" => "kg/1000", "gal" => "cm s-2", "gauss" => "T / 10000", "gpm" => "m", "gram" => "kg/1000", "gravity" => "9.806650 meter/second2", "h" => "60 min", "hectare" => "100 are", "hertz" => "Hz", "hg" => "mercury", "horse_power" => "75 m kilogram-force / s", "hour" => "60 min", "hr" => "60 min", "in" => "inch", "inch" => "2.54 cm", "joule" => "J", "kelvin" => "K", "kgf" => "kilogram-force", "kilogram" => "kg", "knot" => "nautical_mile / hour", "kph" => "km / hour", "lb" => "pound", "light_speed" => "299792458 m/s", "light_year" => "9.46e15 m", "light_years" => "9.46e15 m", "litre" => "1.0e-3 m3", "lm" => "cd.sr", "lx" => "lm.m-2", "ly" => "light_year", "mb" => "bar / 1000", "mercury" => "conventional_mercury", "meter" => "metre", "metre" => "m", "mgal" => "cm s-2 / 1000", "micron" => "1.0e-6 m", "mile" => "1760 yard", "millibar" => "bar / 1000", "min" => "60 s", "minute" => "60 s", "minute_angle" => "pi.rad/180/60", "mole" => "mol", "mon" => "month", "month" => "6 pentad", "mph" => "mile / hour", "nautical_mile" => "1852 m", "nautical_miles" => "1852 m", "newton" => "N", "ohm" => "V/A", "ounce" => "pound / 16", "oz" => "ounce", "parsec" => "3.0857e16 m", "pascal" => "Pa", "pc" => "parsec", "percent" => "1e-2", "permil" => "1e-3", "pi" => "3.141592653589793238462", "poise" => "dyn s / cm2", "pound" => "453.6 g", "psi" => "pound-force / inch2", "radian" => "rad", "second" => "s", "second_angle" => "pi.rad/180/60/60", "steradian" => "sr", "stokes" => "cm2 / s", "t" => "ton", "tesla" => "Wb.m-2", "ton" => "1000 kg", "tonne" => "ton", "torr" => "133.322 Pa", "volt" => "V", "watt" => "W", "weber" => "Wb", "yard" => "6 feet", "yd" => "yard", "year" => "12 month", "yr" => "year", } UALIASES = { "Celsiuses" => [0, "Celsius"], "EA" => [18, "A"], "EAu" => [18, "Au"], "EBq" => [18, "Bq"], "EC" => [18, "C"], "EF" => [18, "F"], "EG" => [18, "G"], "EGal" => [18, "Gal"], "EGy" => [18, "Gy"], "EH" => [18, "H"], "EHg" => [18, "Hg"], "EHz" => [18, "Hz"], "EJ" => [18, "J"], "EK" => [18, "K"], "EL" => [18, "L"], "EN" => [18, "N"], "EP" => [18, "P"], "EPa" => [18, "Pa"], "ES" => [18, "S"], "ESt" => [18, "St"], "ESv" => [18, "Sv"], "ET" => [18, "T"], "EV" => [18, "V"], "EW" => [18, "W"], "EWb" => [18, "Wb"], "Ea" => [18, "a"], "Eac" => [18, "ac"], "Eatm" => [18, "atm"], "Ebar" => [18, "bar"], "Ecal" => [18, "cal"], "Ecd" => [18, "cd"], "Econventional_mercury" => [18, "conventional_mercury"], "EdegC" => [18, "degC"], "EdegF" => [18, "degF"], "Edeg_C" => [18, "deg_C"], "Edeg_F" => [18, "deg_F"], "EdegreeC" => [18, "degreeC"], "EdegreeF" => [18, "degreeF"], "Edegree_C" => [18, "degree_C"], "Edegree_E" => [18, "degree_E"], "Edegree_F" => [18, "degree_F"], "Edegree_N" => [18, "degree_N"], "Edegree_R" => [18, "degree_R"], "Edegree_S" => [18, "degree_S"], "Edegree_W" => [18, "degree_W"], "Edegree_c" => [18, "degree_c"], "Edegree_east" => [18, "degree_east"], "Edegree_f" => [18, "degree_f"], "Edegree_north" => [18, "degree_north"], "Edegree_south" => [18, "degree_south"], "Edegree_west" => [18, "degree_west"], "Edegrees_east" => [18, "degrees_east"], "Edegrees_north" => [18, "degrees_north"], "Edegrees_south" => [18, "degrees_south"], "Edegrees_west" => [18, "degrees_west"], "Edyn" => [18, "dyn"], "Eerg" => [18, "erg"], "Eforce" => [18, "force"], "Eg" => [18, "g"], "Egravity" => [18, "gravity"], "Eh" => [18, "h"], "Ehg" => [18, "hg"], "Ehr" => [18, "hr"], "Ein" => [18, "in"], "Ekgf" => [18, "kgf"], "Ekph" => [18, "kph"], "Elb" => [18, "lb"], "Elm" => [18, "lm"], "Elx" => [18, "lx"], "Ely" => [18, "ly"], "Em" => [18, "m"], "Emb" => [18, "mb"], "Emercury" => [18, "mercury"], "Emgal" => [18, "mgal"], "Emin" => [18, "min"], "Emol" => [18, "mol"], "Emon" => [18, "mon"], "Emph" => [18, "mph"], "Eohm" => [18, "ohm"], "Eoz" => [18, "oz"], "Epc" => [18, "pc"], "Epsi" => [18, "psi"], "Erad" => [18, "rad"], "Es" => [18, "s"], "Esr" => [18, "sr"], "Et" => [18, "t"], "Eyr" => [18, "yr"], "Fahrenheits" => [0, "Fahrenheit"], "GA" => [9, "A"], "GAu" => [9, "Au"], "GBq" => [9, "Bq"], "GC" => [9, "C"], "GF" => [9, "F"], "GG" => [9, "G"], "GGal" => [9, "Gal"], "GGy" => [9, "Gy"], "GH" => [9, "H"], "GHg" => [9, "Hg"], "GHz" => [9, "Hz"], "GJ" => [9, "J"], "GK" => [9, "K"], "GL" => [9, "L"], "GN" => [9, "N"], "GP" => [9, "P"], "GPa" => [9, "Pa"], "GS" => [9, "S"], "GSt" => [9, "St"], "GSv" => [9, "Sv"], "GT" => [9, "T"], "GV" => [9, "V"], "GW" => [9, "W"], "GWb" => [9, "Wb"], "Ga" => [9, "a"], "Gac" => [9, "ac"], "Gatm" => [9, "atm"], "Gbar" => [9, "bar"], "Gcal" => [9, "cal"], "Gcd" => [9, "cd"], "Gconventional_mercury" => [9, "conventional_mercury"], "GdegC" => [9, "degC"], "GdegF" => [9, "degF"], "Gdeg_C" => [9, "deg_C"], "Gdeg_F" => [9, "deg_F"], "GdegreeC" => [9, "degreeC"], "GdegreeF" => [9, "degreeF"], "Gdegree_C" => [9, "degree_C"], "Gdegree_E" => [9, "degree_E"], "Gdegree_F" => [9, "degree_F"], "Gdegree_N" => [9, "degree_N"], "Gdegree_R" => [9, "degree_R"], "Gdegree_S" => [9, "degree_S"], "Gdegree_W" => [9, "degree_W"], "Gdegree_c" => [9, "degree_c"], "Gdegree_east" => [9, "degree_east"], "Gdegree_f" => [9, "degree_f"], "Gdegree_north" => [9, "degree_north"], "Gdegree_south" => [9, "degree_south"], "Gdegree_west" => [9, "degree_west"], "Gdegrees_east" => [9, "degrees_east"], "Gdegrees_north" => [9, "degrees_north"], "Gdegrees_south" => [9, "degrees_south"], "Gdegrees_west" => [9, "degrees_west"], "Gdyn" => [9, "dyn"], "Gerg" => [9, "erg"], "Gforce" => [9, "force"], "Gg" => [9, "g"], "Ggravity" => [9, "gravity"], "Gh" => [9, "h"], "Ghg" => [9, "hg"], "Ghr" => [9, "hr"], "Gin" => [9, "in"], "Gkgf" => [9, "kgf"], "Gkph" => [9, "kph"], "Glb" => [9, "lb"], "Glm" => [9, "lm"], "Glx" => [9, "lx"], "Gly" => [9, "ly"], "Gm" => [9, "m"], "Gmb" => [9, "mb"], "Gmercury" => [9, "mercury"], "Gmgal" => [9, "mgal"], "Gmin" => [9, "min"], "Gmol" => [9, "mol"], "Gmon" => [9, "mon"], "Gmph" => [9, "mph"], "Gohm" => [9, "ohm"], "Goz" => [9, "oz"], "Gpc" => [9, "pc"], "Gpsi" => [9, "psi"], "Grad" => [9, "rad"], "Gs" => [9, "s"], "Gsr" => [9, "sr"], "Gt" => [9, "t"], "Gyr" => [9, "yr"], "Julians_year" => [0, "Julian_year"], "MA" => [6, "A"], "MAu" => [6, "Au"], "MBq" => [6, "Bq"], "MC" => [6, "C"], "MF" => [6, "F"], "MG" => [6, "G"], "MGal" => [6, "Gal"], "MGy" => [6, "Gy"], "MH" => [6, "H"], "MHg" => [6, "Hg"], "MHz" => [6, "Hz"], "MJ" => [6, "J"], "MK" => [6, "K"], "ML" => [6, "L"], "MN" => [6, "N"], "MP" => [6, "P"], "MPa" => [6, "Pa"], "MS" => [6, "S"], "MSt" => [6, "St"], "MSv" => [6, "Sv"], "MT" => [6, "T"], "MV" => [6, "V"], "MW" => [6, "W"], "MWb" => [6, "Wb"], "Ma" => [6, "a"], "Mac" => [6, "ac"], "Matm" => [6, "atm"], "Mbar" => [6, "bar"], "Mcal" => [6, "cal"], "Mcd" => [6, "cd"], "Mconventional_mercury" => [6, "conventional_mercury"], "MdegC" => [6, "degC"], "MdegF" => [6, "degF"], "Mdeg_C" => [6, "deg_C"], "Mdeg_F" => [6, "deg_F"], "MdegreeC" => [6, "degreeC"], "MdegreeF" => [6, "degreeF"], "Mdegree_C" => [6, "degree_C"], "Mdegree_E" => [6, "degree_E"], "Mdegree_F" => [6, "degree_F"], "Mdegree_N" => [6, "degree_N"], "Mdegree_R" => [6, "degree_R"], "Mdegree_S" => [6, "degree_S"], "Mdegree_W" => [6, "degree_W"], "Mdegree_c" => [6, "degree_c"], "Mdegree_east" => [6, "degree_east"], "Mdegree_f" => [6, "degree_f"], "Mdegree_north" => [6, "degree_north"], "Mdegree_south" => [6, "degree_south"], "Mdegree_west" => [6, "degree_west"], "Mdegrees_east" => [6, "degrees_east"], "Mdegrees_north" => [6, "degrees_north"], "Mdegrees_south" => [6, "degrees_south"], "Mdegrees_west" => [6, "degrees_west"], "Mdyn" => [6, "dyn"], "Merg" => [6, "erg"], "Mforce" => [6, "force"], "Mg" => [6, "g"], "Mgravity" => [6, "gravity"], "Mh" => [6, "h"], "Mhg" => [6, "hg"], "Mhr" => [6, "hr"], "Min" => [6, "in"], "Mkgf" => [6, "kgf"], "Mkph" => [6, "kph"], "Mlb" => [6, "lb"], "Mlm" => [6, "lm"], "Mlx" => [6, "lx"], "Mly" => [6, "ly"], "Mm" => [6, "m"], "Mmb" => [6, "mb"], "Mmercury" => [6, "mercury"], "Mmgal" => [6, "mgal"], "Mmin" => [6, "min"], "Mmol" => [6, "mol"], "Mmon" => [6, "mon"], "Mmph" => [6, "mph"], "Mohm" => [6, "ohm"], "Moz" => [6, "oz"], "Mpc" => [6, "pc"], "Mpsi" => [6, "psi"], "Mrad" => [6, "rad"], "Ms" => [6, "s"], "Msr" => [6, "sr"], "Mt" => [6, "t"], "Myr" => [6, "yr"], "PA" => [15, "A"], "PAu" => [15, "Au"], "PBq" => [15, "Bq"], "PC" => [15, "C"], "PF" => [15, "F"], "PG" => [15, "G"], "PGal" => [15, "Gal"], "PGy" => [15, "Gy"], "PH" => [15, "H"], "PHg" => [15, "Hg"], "PHz" => [15, "Hz"], "PJ" => [15, "J"], "PK" => [15, "K"], "PL" => [15, "L"], "PN" => [15, "N"], "PP" => [15, "P"], "PPa" => [15, "Pa"], "PS" => [15, "S"], "PSt" => [15, "St"], "PSv" => [15, "Sv"], "PT" => [15, "T"], "PV" => [15, "V"], "PW" => [15, "W"], "PWb" => [15, "Wb"], "Pa" => [15, "a"], "Pac" => [15, "ac"], "Pascals" => [0, "Pascal"], "Patm" => [15, "atm"], "Pbar" => [15, "bar"], "Pcal" => [15, "cal"], "Pcd" => [15, "cd"], "Pconventional_mercury" => [15, "conventional_mercury"], "PdegC" => [15, "degC"], "PdegF" => [15, "degF"], "Pdeg_C" => [15, "deg_C"], "Pdeg_F" => [15, "deg_F"], "PdegreeC" => [15, "degreeC"], "PdegreeF" => [15, "degreeF"], "Pdegree_C" => [15, "degree_C"], "Pdegree_E" => [15, "degree_E"], "Pdegree_F" => [15, "degree_F"], "Pdegree_N" => [15, "degree_N"], "Pdegree_R" => [15, "degree_R"], "Pdegree_S" => [15, "degree_S"], "Pdegree_W" => [15, "degree_W"], "Pdegree_c" => [15, "degree_c"], "Pdegree_east" => [15, "degree_east"], "Pdegree_f" => [15, "degree_f"], "Pdegree_north" => [15, "degree_north"], "Pdegree_south" => [15, "degree_south"], "Pdegree_west" => [15, "degree_west"], "Pdegrees_east" => [15, "degrees_east"], "Pdegrees_north" => [15, "degrees_north"], "Pdegrees_south" => [15, "degrees_south"], "Pdegrees_west" => [15, "degrees_west"], "Pdyn" => [15, "dyn"], "Perg" => [15, "erg"], "Pforce" => [15, "force"], "Pg" => [15, "g"], "Pgravity" => [15, "gravity"], "Ph" => [15, "h"], "Phg" => [15, "hg"], "Phr" => [15, "hr"], "Pin" => [15, "in"], "Pkgf" => [15, "kgf"], "Pkph" => [15, "kph"], "Plb" => [15, "lb"], "Plm" => [15, "lm"], "Plx" => [15, "lx"], "Ply" => [15, "ly"], "Pm" => [15, "m"], "Pmb" => [15, "mb"], "Pmercury" => [15, "mercury"], "Pmgal" => [15, "mgal"], "Pmin" => [15, "min"], "Pmol" => [15, "mol"], "Pmon" => [15, "mon"], "Pmph" => [15, "mph"], "Pohm" => [15, "ohm"], "Poz" => [15, "oz"], "Ppc" => [15, "pc"], "Ppsi" => [15, "psi"], "Prad" => [15, "rad"], "Ps" => [15, "s"], "Psr" => [15, "sr"], "Pt" => [15, "t"], "Pyr" => [15, "yr"], "TA" => [12, "A"], "TAu" => [12, "Au"], "TBq" => [12, "Bq"], "TC" => [12, "C"], "TF" => [12, "F"], "TG" => [12, "G"], "TGal" => [12, "Gal"], "TGy" => [12, "Gy"], "TH" => [12, "H"], "THg" => [12, "Hg"], "THz" => [12, "Hz"], "TJ" => [12, "J"], "TK" => [12, "K"], "TL" => [12, "L"], "TN" => [12, "N"], "TP" => [12, "P"], "TPa" => [12, "Pa"], "TS" => [12, "S"], "TSt" => [12, "St"], "TSv" => [12, "Sv"], "TT" => [12, "T"], "TV" => [12, "V"], "TW" => [12, "W"], "TWb" => [12, "Wb"], "Ta" => [12, "a"], "Tac" => [12, "ac"], "Tatm" => [12, "atm"], "Tbar" => [12, "bar"], "Tcal" => [12, "cal"], "Tcd" => [12, "cd"], "Tconventional_mercury" => [12, "conventional_mercury"], "TdegC" => [12, "degC"], "TdegF" => [12, "degF"], "Tdeg_C" => [12, "deg_C"], "Tdeg_F" => [12, "deg_F"], "TdegreeC" => [12, "degreeC"], "TdegreeF" => [12, "degreeF"], "Tdegree_C" => [12, "degree_C"], "Tdegree_E" => [12, "degree_E"], "Tdegree_F" => [12, "degree_F"], "Tdegree_N" => [12, "degree_N"], "Tdegree_R" => [12, "degree_R"], "Tdegree_S" => [12, "degree_S"], "Tdegree_W" => [12, "degree_W"], "Tdegree_c" => [12, "degree_c"], "Tdegree_east" => [12, "degree_east"], "Tdegree_f" => [12, "degree_f"], "Tdegree_north" => [12, "degree_north"], "Tdegree_south" => [12, "degree_south"], "Tdegree_west" => [12, "degree_west"], "Tdegrees_east" => [12, "degrees_east"], "Tdegrees_north" => [12, "degrees_north"], "Tdegrees_south" => [12, "degrees_south"], "Tdegrees_west" => [12, "degrees_west"], "Tdyn" => [12, "dyn"], "Terg" => [12, "erg"], "Tforce" => [12, "force"], "Tg" => [12, "g"], "Tgravity" => [12, "gravity"], "Th" => [12, "h"], "Thg" => [12, "hg"], "Thr" => [12, "hr"], "Tin" => [12, "in"], "Tkgf" => [12, "kgf"], "Tkph" => [12, "kph"], "Tlb" => [12, "lb"], "Tlm" => [12, "lm"], "Tlx" => [12, "lx"], "Tly" => [12, "ly"], "Tm" => [12, "m"], "Tmb" => [12, "mb"], "Tmercury" => [12, "mercury"], "Tmgal" => [12, "mgal"], "Tmin" => [12, "min"], "Tmol" => [12, "mol"], "Tmon" => [12, "mon"], "Tmph" => [12, "mph"], "Tohm" => [12, "ohm"], "Toz" => [12, "oz"], "Tpc" => [12, "pc"], "Tpsi" => [12, "psi"], "Trad" => [12, "rad"], "Ts" => [12, "s"], "Tsr" => [12, "sr"], "Tt" => [12, "t"], "Tyr" => [12, "yr"], "aA" => [-18, "A"], "aAu" => [-18, "Au"], "aBq" => [-18, "Bq"], "aC" => [-18, "C"], "aF" => [-18, "F"], "aG" => [-18, "G"], "aGal" => [-18, "Gal"], "aGy" => [-18, "Gy"], "aH" => [-18, "H"], "aHg" => [-18, "Hg"], "aHz" => [-18, "Hz"], "aJ" => [-18, "J"], "aK" => [-18, "K"], "aL" => [-18, "L"], "aN" => [-18, "N"], "aP" => [-18, "P"], "aPa" => [-18, "Pa"], "aS" => [-18, "S"], "aSt" => [-18, "St"], "aSv" => [-18, "Sv"], "aT" => [-18, "T"], "aV" => [-18, "V"], "aW" => [-18, "W"], "aWb" => [-18, "Wb"], "aa" => [-18, "a"], "aac" => [-18, "ac"], "aatm" => [-18, "atm"], "abar" => [-18, "bar"], "acal" => [-18, "cal"], "acd" => [-18, "cd"], "aconventional_mercury" => [-18, "conventional_mercury"], "acres" => [0, "acre"], "adegC" => [-18, "degC"], "adegF" => [-18, "degF"], "adeg_C" => [-18, "deg_C"], "adeg_F" => [-18, "deg_F"], "adegreeC" => [-18, "degreeC"], "adegreeF" => [-18, "degreeF"], "adegree_C" => [-18, "degree_C"], "adegree_E" => [-18, "degree_E"], "adegree_F" => [-18, "degree_F"], "adegree_N" => [-18, "degree_N"], "adegree_R" => [-18, "degree_R"], "adegree_S" => [-18, "degree_S"], "adegree_W" => [-18, "degree_W"], "adegree_c" => [-18, "degree_c"], "adegree_east" => [-18, "degree_east"], "adegree_f" => [-18, "degree_f"], "adegree_north" => [-18, "degree_north"], "adegree_south" => [-18, "degree_south"], "adegree_west" => [-18, "degree_west"], "adegrees_east" => [-18, "degrees_east"], "adegrees_north" => [-18, "degrees_north"], "adegrees_south" => [-18, "degrees_south"], "adegrees_west" => [-18, "degrees_west"], "adyn" => [-18, "dyn"], "aerg" => [-18, "erg"], "aforce" => [-18, "force"], "ag" => [-18, "g"], "agravity" => [-18, "gravity"], "ah" => [-18, "h"], "ahg" => [-18, "hg"], "ahr" => [-18, "hr"], "ain" => [-18, "in"], "akgf" => [-18, "kgf"], "akph" => [-18, "kph"], "alb" => [-18, "lb"], "alm" => [-18, "lm"], "alx" => [-18, "lx"], "aly" => [-18, "ly"], "am" => [-18, "m"], "amb" => [-18, "mb"], "amercury" => [-18, "mercury"], "amgal" => [-18, "mgal"], "amin" => [-18, "min"], "amol" => [-18, "mol"], "amon" => [-18, "mon"], "amperes" => [0, "ampere"], "amph" => [-18, "mph"], "angstroms" => [0, "angstrom"], "angulars_degree" => [0, "angular_degree"], "angulars_minute" => [0, "angular_minute"], "angulars_second" => [0, "angular_second"], "aohm" => [-18, "ohm"], "aoz" => [-18, "oz"], "apc" => [-18, "pc"], "apsi" => [-18, "psi"], "arad" => [-18, "rad"], "ares" => [0, "are"], "as" => [-18, "s"], "asr" => [-18, "sr"], "at" => [-18, "t"], "atmospheres" => [0, "atmosphere"], "attoCelsius" => [-18, "Celsius"], "attoFahrenheit" => [-18, "Fahrenheit"], "attoJulian_year" => [-18, "Julian_year"], "attoPascal" => [-18, "Pascal"], "attoacre" => [-18, "acre"], "attoampere" => [-18, "ampere"], "attoangstrom" => [-18, "angstrom"], "attoangular_degree" => [-18, "angular_degree"], "attoangular_minute" => [-18, "angular_minute"], "attoangular_second" => [-18, "angular_second"], "attoare" => [-18, "are"], "attoatmosphere" => [-18, "atmosphere"], "attocalorie" => [-18, "calorie"], "attocandela" => [-18, "candela"], "attocelsius" => [-18, "celsius"], "attocentigrade" => [-18, "centigrade"], "attocentury" => [-18, "century"], "attochain" => [-18, "chain"], "attocommon_year" => [-18, "common_year"], "attocoulomb" => [-18, "coulomb"], "attoday" => [-18, "day"], "attodegK" => [-18, "degK"], "attodeg_K" => [-18, "deg_K"], "attodegree" => [-18, "degree"], "attodegreeK" => [-18, "degreeK"], "attodyne" => [-18, "dyne"], "attoerg" => [-18, "erg"], "attofahrenheit" => [-18, "fahrenheit"], "attofarad" => [-18, "farad"], "attofermi" => [-18, "fermi"], "attogal" => [-18, "gal"], "attogauss" => [-18, "gauss"], "attogram" => [-18, "gram"], "attohectare" => [-18, "hectare"], "attohertz" => [-18, "hertz"], "attohour" => [-18, "hour"], "attoinch" => [-18, "inch"], "attojoule" => [-18, "joule"], "attokelvin" => [-18, "kelvin"], "attokilogram" => [-18, "kilogram"], "attoknot" => [-18, "knot"], "attolitre" => [-18, "litre"], "attometer" => [-18, "meter"], "attometre" => [-18, "metre"], "attomicron" => [-18, "micron"], "attomile" => [-18, "mile"], "attomillibar" => [-18, "millibar"], "attominute" => [-18, "minute"], "attominute_angle" => [-18, "minute_angle"], "attomole" => [-18, "mole"], "attomonth" => [-18, "month"], "attonewton" => [-18, "newton"], "attoounce" => [-18, "ounce"], "attoparsec" => [-18, "parsec"], "attopascal" => [-18, "pascal"], "attopentad" => [-18, "pentad"], "attopercent" => [-18, "percent"], "attopoise" => [-18, "poise"], "attopound" => [-18, "pound"], "attoradian" => [-18, "radian"], "attosecond" => [-18, "second"], "attosecond_angle" => [-18, "second_angle"], "attosteradian" => [-18, "steradian"], "attostokes" => [-18, "stokes"], "attotesla" => [-18, "tesla"], "attoton" => [-18, "ton"], "attotonne" => [-18, "tonne"], "attotorr" => [-18, "torr"], "attovolt" => [-18, "volt"], "attowatt" => [-18, "watt"], "attoweber" => [-18, "weber"], "attoyard" => [-18, "yard"], "attoyd" => [-18, "yd"], "attoyear" => [-18, "year"], "ayr" => [-18, "yr"], "cA" => [-2, "A"], "cAu" => [-2, "Au"], "cBq" => [-2, "Bq"], "cC" => [-2, "C"], "cF" => [-2, "F"], "cG" => [-2, "G"], "cGal" => [-2, "Gal"], "cGy" => [-2, "Gy"], "cH" => [-2, "H"], "cHg" => [-2, "Hg"], "cHz" => [-2, "Hz"], "cJ" => [-2, "J"], "cK" => [-2, "K"], "cL" => [-2, "L"], "cN" => [-2, "N"], "cP" => [-2, "P"], "cPa" => [-2, "Pa"], "cS" => [-2, "S"], "cSt" => [-2, "St"], "cSv" => [-2, "Sv"], "cT" => [-2, "T"], "cV" => [-2, "V"], "cW" => [-2, "W"], "cWb" => [-2, "Wb"], "ca" => [-2, "a"], "cac" => [-2, "ac"], "calories" => [0, "calorie"], "candelas" => [0, "candela"], "catm" => [-2, "atm"], "cbar" => [-2, "bar"], "ccal" => [-2, "cal"], "ccd" => [-2, "cd"], "cconventional_mercury" => [-2, "conventional_mercury"], "cdegC" => [-2, "degC"], "cdegF" => [-2, "degF"], "cdeg_C" => [-2, "deg_C"], "cdeg_F" => [-2, "deg_F"], "cdegreeC" => [-2, "degreeC"], "cdegreeF" => [-2, "degreeF"], "cdegree_C" => [-2, "degree_C"], "cdegree_E" => [-2, "degree_E"], "cdegree_F" => [-2, "degree_F"], "cdegree_N" => [-2, "degree_N"], "cdegree_R" => [-2, "degree_R"], "cdegree_S" => [-2, "degree_S"], "cdegree_W" => [-2, "degree_W"], "cdegree_c" => [-2, "degree_c"], "cdegree_east" => [-2, "degree_east"], "cdegree_f" => [-2, "degree_f"], "cdegree_north" => [-2, "degree_north"], "cdegree_south" => [-2, "degree_south"], "cdegree_west" => [-2, "degree_west"], "cdegrees_east" => [-2, "degrees_east"], "cdegrees_north" => [-2, "degrees_north"], "cdegrees_south" => [-2, "degrees_south"], "cdegrees_west" => [-2, "degrees_west"], "cdyn" => [-2, "dyn"], "celsiuses" => [0, "celsius"], "centiCelsius" => [-2, "Celsius"], "centiFahrenheit" => [-2, "Fahrenheit"], "centiJulian_year" => [-2, "Julian_year"], "centiPascal" => [-2, "Pascal"], "centiacre" => [-2, "acre"], "centiampere" => [-2, "ampere"], "centiangstrom" => [-2, "angstrom"], "centiangular_degree" => [-2, "angular_degree"], "centiangular_minute" => [-2, "angular_minute"], "centiangular_second" => [-2, "angular_second"], "centiare" => [-2, "are"], "centiatmosphere" => [-2, "atmosphere"], "centicalorie" => [-2, "calorie"], "centicandela" => [-2, "candela"], "centicelsius" => [-2, "celsius"], "centicentigrade" => [-2, "centigrade"], "centicentury" => [-2, "century"], "centichain" => [-2, "chain"], "centicommon_year" => [-2, "common_year"], "centicoulomb" => [-2, "coulomb"], "centiday" => [-2, "day"], "centidegK" => [-2, "degK"], "centideg_K" => [-2, "deg_K"], "centidegree" => [-2, "degree"], "centidegreeK" => [-2, "degreeK"], "centidyne" => [-2, "dyne"], "centierg" => [-2, "erg"], "centifahrenheit" => [-2, "fahrenheit"], "centifarad" => [-2, "farad"], "centifermi" => [-2, "fermi"], "centigal" => [-2, "gal"], "centigauss" => [-2, "gauss"], "centigrades" => [0, "centigrade"], "centigram" => [-2, "gram"], "centihectare" => [-2, "hectare"], "centihertz" => [-2, "hertz"], "centihour" => [-2, "hour"], "centiinch" => [-2, "inch"], "centijoule" => [-2, "joule"], "centikelvin" => [-2, "kelvin"], "centikilogram" => [-2, "kilogram"], "centiknot" => [-2, "knot"], "centilitre" => [-2, "litre"], "centimeter" => [-2, "meter"], "centimetre" => [-2, "metre"], "centimicron" => [-2, "micron"], "centimile" => [-2, "mile"], "centimillibar" => [-2, "millibar"], "centiminute" => [-2, "minute"], "centiminute_angle" => [-2, "minute_angle"], "centimole" => [-2, "mole"], "centimonth" => [-2, "month"], "centinewton" => [-2, "newton"], "centiounce" => [-2, "ounce"], "centiparsec" => [-2, "parsec"], "centipascal" => [-2, "pascal"], "centipentad" => [-2, "pentad"], "centipercent" => [-2, "percent"], "centipoise" => [-2, "poise"], "centipound" => [-2, "pound"], "centiradian" => [-2, "radian"], "centisecond" => [-2, "second"], "centisecond_angle" => [-2, "second_angle"], "centisteradian" => [-2, "steradian"], "centistokes" => [-2, "stokes"], "centitesla" => [-2, "tesla"], "centiton" => [-2, "ton"], "centitonne" => [-2, "tonne"], "centitorr" => [-2, "torr"], "centivolt" => [-2, "volt"], "centiwatt" => [-2, "watt"], "centiweber" => [-2, "weber"], "centiyard" => [-2, "yard"], "centiyd" => [-2, "yd"], "centiyear" => [-2, "year"], "centuries" => [0, "century"], "cerg" => [-2, "erg"], "cforce" => [-2, "force"], "cg" => [-2, "g"], "cgravity" => [-2, "gravity"], "ch" => [-2, "h"], "chains" => [0, "chain"], "chg" => [-2, "hg"], "chr" => [-2, "hr"], "cin" => [-2, "in"], "ckgf" => [-2, "kgf"], "ckph" => [-2, "kph"], "clb" => [-2, "lb"], "clm" => [-2, "lm"], "clx" => [-2, "lx"], "cly" => [-2, "ly"], "cm" => [-2, "m"], "cmb" => [-2, "mb"], "cmercury" => [-2, "mercury"], "cmgal" => [-2, "mgal"], "cmin" => [-2, "min"], "cmol" => [-2, "mol"], "cmon" => [-2, "mon"], "cmph" => [-2, "mph"], "cohm" => [-2, "ohm"], "commons_year" => [0, "common_year"], "coulombs" => [0, "coulomb"], "coz" => [-2, "oz"], "cpc" => [-2, "pc"], "cpsi" => [-2, "psi"], "crad" => [-2, "rad"], "cs" => [-2, "s"], "csr" => [-2, "sr"], "ct" => [-2, "t"], "cyr" => [-2, "yr"], "dA" => [-1, "A"], "dAu" => [-1, "Au"], "dBq" => [-1, "Bq"], "dC" => [-1, "C"], "dF" => [-1, "F"], "dG" => [-1, "G"], "dGal" => [-1, "Gal"], "dGy" => [-1, "Gy"], "dH" => [-1, "H"], "dHg" => [-1, "Hg"], "dHz" => [-1, "Hz"], "dJ" => [-1, "J"], "dK" => [-1, "K"], "dL" => [-1, "L"], "dN" => [-1, "N"], "dP" => [-1, "P"], "dPa" => [-1, "Pa"], "dS" => [-1, "S"], "dSt" => [-1, "St"], "dSv" => [-1, "Sv"], "dT" => [-1, "T"], "dV" => [-1, "V"], "dW" => [-1, "W"], "dWb" => [-1, "Wb"], "da" => [-1, "a"], "daA" => [1, "A"], "daAu" => [1, "Au"], "daBq" => [1, "Bq"], "daC" => [1, "C"], "daF" => [1, "F"], "daG" => [1, "G"], "daGal" => [1, "Gal"], "daGy" => [1, "Gy"], "daH" => [1, "H"], "daHg" => [1, "Hg"], "daHz" => [1, "Hz"], "daJ" => [1, "J"], "daK" => [1, "K"], "daL" => [1, "L"], "daN" => [1, "N"], "daP" => [1, "P"], "daPa" => [1, "Pa"], "daS" => [1, "S"], "daSt" => [1, "St"], "daSv" => [1, "Sv"], "daT" => [1, "T"], "daV" => [1, "V"], "daW" => [1, "W"], "daWb" => [1, "Wb"], "daa" => [1, "a"], "daac" => [1, "ac"], "daatm" => [1, "atm"], "dabar" => [1, "bar"], "dac" => [-1, "ac"], "dacal" => [1, "cal"], "dacd" => [1, "cd"], "daconventional_mercury" => [1, "conventional_mercury"], "dadegC" => [1, "degC"], "dadegF" => [1, "degF"], "dadeg_C" => [1, "deg_C"], "dadeg_F" => [1, "deg_F"], "dadegreeC" => [1, "degreeC"], "dadegreeF" => [1, "degreeF"], "dadegree_C" => [1, "degree_C"], "dadegree_E" => [1, "degree_E"], "dadegree_F" => [1, "degree_F"], "dadegree_N" => [1, "degree_N"], "dadegree_R" => [1, "degree_R"], "dadegree_S" => [1, "degree_S"], "dadegree_W" => [1, "degree_W"], "dadegree_c" => [1, "degree_c"], "dadegree_east" => [1, "degree_east"], "dadegree_f" => [1, "degree_f"], "dadegree_north" => [1, "degree_north"], "dadegree_south" => [1, "degree_south"], "dadegree_west" => [1, "degree_west"], "dadegrees_east" => [1, "degrees_east"], "dadegrees_north" => [1, "degrees_north"], "dadegrees_south" => [1, "degrees_south"], "dadegrees_west" => [1, "degrees_west"], "dadyn" => [1, "dyn"], "daerg" => [1, "erg"], "daforce" => [1, "force"], "dag" => [1, "g"], "dagravity" => [1, "gravity"], "dah" => [1, "h"], "dahg" => [1, "hg"], "dahr" => [1, "hr"], "dain" => [1, "in"], "dakgf" => [1, "kgf"], "dakph" => [1, "kph"], "dalb" => [1, "lb"], "dalm" => [1, "lm"], "dalx" => [1, "lx"], "daly" => [1, "ly"], "dam" => [1, "m"], "damb" => [1, "mb"], "damercury" => [1, "mercury"], "damgal" => [1, "mgal"], "damin" => [1, "min"], "damol" => [1, "mol"], "damon" => [1, "mon"], "damph" => [1, "mph"], "daohm" => [1, "ohm"], "daoz" => [1, "oz"], "dapc" => [1, "pc"], "dapsi" => [1, "psi"], "darad" => [1, "rad"], "das" => [1, "s"], "dasr" => [1, "sr"], "dat" => [1, "t"], "datm" => [-1, "atm"], "dayr" => [1, "yr"], "days" => [0, "day"], "dbar" => [-1, "bar"], "dcal" => [-1, "cal"], "dcd" => [-1, "cd"], "dconventional_mercury" => [-1, "conventional_mercury"], "ddegC" => [-1, "degC"], "ddegF" => [-1, "degF"], "ddeg_C" => [-1, "deg_C"], "ddeg_F" => [-1, "deg_F"], "ddegreeC" => [-1, "degreeC"], "ddegreeF" => [-1, "degreeF"], "ddegree_C" => [-1, "degree_C"], "ddegree_E" => [-1, "degree_E"], "ddegree_F" => [-1, "degree_F"], "ddegree_N" => [-1, "degree_N"], "ddegree_R" => [-1, "degree_R"], "ddegree_S" => [-1, "degree_S"], "ddegree_W" => [-1, "degree_W"], "ddegree_c" => [-1, "degree_c"], "ddegree_east" => [-1, "degree_east"], "ddegree_f" => [-1, "degree_f"], "ddegree_north" => [-1, "degree_north"], "ddegree_south" => [-1, "degree_south"], "ddegree_west" => [-1, "degree_west"], "ddegrees_east" => [-1, "degrees_east"], "ddegrees_north" => [-1, "degrees_north"], "ddegrees_south" => [-1, "degrees_south"], "ddegrees_west" => [-1, "degrees_west"], "ddyn" => [-1, "dyn"], "decaCelsius" => [1, "Celsius"], "decaFahrenheit" => [1, "Fahrenheit"], "decaJulian_year" => [1, "Julian_year"], "decaPascal" => [1, "Pascal"], "decaacre" => [1, "acre"], "decaampere" => [1, "ampere"], "decaangstrom" => [1, "angstrom"], "decaangular_degree" => [1, "angular_degree"], "decaangular_minute" => [1, "angular_minute"], "decaangular_second" => [1, "angular_second"], "decaare" => [1, "are"], "decaatmosphere" => [1, "atmosphere"], "decacalorie" => [1, "calorie"], "decacandela" => [1, "candela"], "decacelsius" => [1, "celsius"], "decacentigrade" => [1, "centigrade"], "decacentury" => [1, "century"], "decachain" => [1, "chain"], "decacommon_year" => [1, "common_year"], "decacoulomb" => [1, "coulomb"], "decaday" => [1, "day"], "decadegK" => [1, "degK"], "decadeg_K" => [1, "deg_K"], "decadegree" => [1, "degree"], "decadegreeK" => [1, "degreeK"], "decadyne" => [1, "dyne"], "decaerg" => [1, "erg"], "decafahrenheit" => [1, "fahrenheit"], "decafarad" => [1, "farad"], "decafermi" => [1, "fermi"], "decagal" => [1, "gal"], "decagauss" => [1, "gauss"], "decagram" => [1, "gram"], "decahectare" => [1, "hectare"], "decahertz" => [1, "hertz"], "decahour" => [1, "hour"], "decainch" => [1, "inch"], "decajoule" => [1, "joule"], "decakelvin" => [1, "kelvin"], "decakilogram" => [1, "kilogram"], "decaknot" => [1, "knot"], "decalitre" => [1, "litre"], "decameter" => [1, "meter"], "decametre" => [1, "metre"], "decamicron" => [1, "micron"], "decamile" => [1, "mile"], "decamillibar" => [1, "millibar"], "decaminute" => [1, "minute"], "decaminute_angle" => [1, "minute_angle"], "decamole" => [1, "mole"], "decamonth" => [1, "month"], "decanewton" => [1, "newton"], "decaounce" => [1, "ounce"], "decaparsec" => [1, "parsec"], "decapascal" => [1, "pascal"], "decapentad" => [1, "pentad"], "decapercent" => [1, "percent"], "decapoise" => [1, "poise"], "decapound" => [1, "pound"], "decaradian" => [1, "radian"], "decasecond" => [1, "second"], "decasecond_angle" => [1, "second_angle"], "decasteradian" => [1, "steradian"], "decastokes" => [1, "stokes"], "decatesla" => [1, "tesla"], "decaton" => [1, "ton"], "decatonne" => [1, "tonne"], "decatorr" => [1, "torr"], "decavolt" => [1, "volt"], "decawatt" => [1, "watt"], "decaweber" => [1, "weber"], "decayard" => [1, "yard"], "decayd" => [1, "yd"], "decayear" => [1, "year"], "deciCelsius" => [-1, "Celsius"], "deciFahrenheit" => [-1, "Fahrenheit"], "deciJulian_year" => [-1, "Julian_year"], "deciPascal" => [-1, "Pascal"], "deciacre" => [-1, "acre"], "deciampere" => [-1, "ampere"], "deciangstrom" => [-1, "angstrom"], "deciangular_degree" => [-1, "angular_degree"], "deciangular_minute" => [-1, "angular_minute"], "deciangular_second" => [-1, "angular_second"], "deciare" => [-1, "are"], "deciatmosphere" => [-1, "atmosphere"], "decicalorie" => [-1, "calorie"], "decicandela" => [-1, "candela"], "decicelsius" => [-1, "celsius"], "decicentigrade" => [-1, "centigrade"], "decicentury" => [-1, "century"], "decichain" => [-1, "chain"], "decicommon_year" => [-1, "common_year"], "decicoulomb" => [-1, "coulomb"], "deciday" => [-1, "day"], "decidegK" => [-1, "degK"], "decideg_K" => [-1, "deg_K"], "decidegree" => [-1, "degree"], "decidegreeK" => [-1, "degreeK"], "decidyne" => [-1, "dyne"], "decierg" => [-1, "erg"], "decifahrenheit" => [-1, "fahrenheit"], "decifarad" => [-1, "farad"], "decifermi" => [-1, "fermi"], "decigal" => [-1, "gal"], "decigauss" => [-1, "gauss"], "decigram" => [-1, "gram"], "decihectare" => [-1, "hectare"], "decihertz" => [-1, "hertz"], "decihour" => [-1, "hour"], "deciinch" => [-1, "inch"], "decijoule" => [-1, "joule"], "decikelvin" => [-1, "kelvin"], "decikilogram" => [-1, "kilogram"], "deciknot" => [-1, "knot"], "decilitre" => [-1, "litre"], "decimeter" => [-1, "meter"], "decimetre" => [-1, "metre"], "decimicron" => [-1, "micron"], "decimile" => [-1, "mile"], "decimillibar" => [-1, "millibar"], "deciminute" => [-1, "minute"], "deciminute_angle" => [-1, "minute_angle"], "decimole" => [-1, "mole"], "decimonth" => [-1, "month"], "decinewton" => [-1, "newton"], "deciounce" => [-1, "ounce"], "deciparsec" => [-1, "parsec"], "decipascal" => [-1, "pascal"], "decipentad" => [-1, "pentad"], "decipercent" => [-1, "percent"], "decipoise" => [-1, "poise"], "decipound" => [-1, "pound"], "deciradian" => [-1, "radian"], "decisecond" => [-1, "second"], "decisecond_angle" => [-1, "second_angle"], "decisteradian" => [-1, "steradian"], "decistokes" => [-1, "stokes"], "decitesla" => [-1, "tesla"], "deciton" => [-1, "ton"], "decitonne" => [-1, "tonne"], "decitorr" => [-1, "torr"], "decivolt" => [-1, "volt"], "deciwatt" => [-1, "watt"], "deciweber" => [-1, "weber"], "deciyard" => [-1, "yard"], "deciyd" => [-1, "yd"], "deciyear" => [-1, "year"], "degKs" => [0, "degK"], "degreeKs" => [0, "degreeK"], "degrees" => [0, "degree"], "degs_K" => [0, "deg_K"], "derg" => [-1, "erg"], "dforce" => [-1, "force"], "dg" => [-1, "g"], "dgravity" => [-1, "gravity"], "dh" => [-1, "h"], "dhg" => [-1, "hg"], "dhr" => [-1, "hr"], "din" => [-1, "in"], "dkgf" => [-1, "kgf"], "dkph" => [-1, "kph"], "dlb" => [-1, "lb"], "dlm" => [-1, "lm"], "dlx" => [-1, "lx"], "dly" => [-1, "ly"], "dm" => [-1, "m"], "dmb" => [-1, "mb"], "dmercury" => [-1, "mercury"], "dmgal" => [-1, "mgal"], "dmin" => [-1, "min"], "dmol" => [-1, "mol"], "dmon" => [-1, "mon"], "dmph" => [-1, "mph"], "dohm" => [-1, "ohm"], "doz" => [-1, "oz"], "dpc" => [-1, "pc"], "dpsi" => [-1, "psi"], "drad" => [-1, "rad"], "ds" => [-1, "s"], "dsr" => [-1, "sr"], "dt" => [-1, "t"], "dynes" => [0, "dyne"], "dyr" => [-1, "yr"], "ergs" => [0, "erg"], "exaCelsius" => [18, "Celsius"], "exaFahrenheit" => [18, "Fahrenheit"], "exaJulian_year" => [18, "Julian_year"], "exaPascal" => [18, "Pascal"], "exaacre" => [18, "acre"], "exaampere" => [18, "ampere"], "exaangstrom" => [18, "angstrom"], "exaangular_degree" => [18, "angular_degree"], "exaangular_minute" => [18, "angular_minute"], "exaangular_second" => [18, "angular_second"], "exaare" => [18, "are"], "exaatmosphere" => [18, "atmosphere"], "exacalorie" => [18, "calorie"], "exacandela" => [18, "candela"], "exacelsius" => [18, "celsius"], "exacentigrade" => [18, "centigrade"], "exacentury" => [18, "century"], "exachain" => [18, "chain"], "exacommon_year" => [18, "common_year"], "exacoulomb" => [18, "coulomb"], "exaday" => [18, "day"], "exadegK" => [18, "degK"], "exadeg_K" => [18, "deg_K"], "exadegree" => [18, "degree"], "exadegreeK" => [18, "degreeK"], "exadyne" => [18, "dyne"], "exaerg" => [18, "erg"], "exafahrenheit" => [18, "fahrenheit"], "exafarad" => [18, "farad"], "exafermi" => [18, "fermi"], "exagal" => [18, "gal"], "exagauss" => [18, "gauss"], "exagram" => [18, "gram"], "exahectare" => [18, "hectare"], "exahertz" => [18, "hertz"], "exahour" => [18, "hour"], "exainch" => [18, "inch"], "exajoule" => [18, "joule"], "exakelvin" => [18, "kelvin"], "exakilogram" => [18, "kilogram"], "exaknot" => [18, "knot"], "exalitre" => [18, "litre"], "exameter" => [18, "meter"], "exametre" => [18, "metre"], "examicron" => [18, "micron"], "examile" => [18, "mile"], "examillibar" => [18, "millibar"], "examinute" => [18, "minute"], "examinute_angle" => [18, "minute_angle"], "examole" => [18, "mole"], "examonth" => [18, "month"], "exanewton" => [18, "newton"], "exaounce" => [18, "ounce"], "exaparsec" => [18, "parsec"], "exapascal" => [18, "pascal"], "exapentad" => [18, "pentad"], "exapercent" => [18, "percent"], "exapoise" => [18, "poise"], "exapound" => [18, "pound"], "exaradian" => [18, "radian"], "exasecond" => [18, "second"], "exasecond_angle" => [18, "second_angle"], "exasteradian" => [18, "steradian"], "exastokes" => [18, "stokes"], "exatesla" => [18, "tesla"], "exaton" => [18, "ton"], "exatonne" => [18, "tonne"], "exatorr" => [18, "torr"], "exavolt" => [18, "volt"], "exawatt" => [18, "watt"], "exaweber" => [18, "weber"], "exayard" => [18, "yard"], "exayd" => [18, "yd"], "exayear" => [18, "year"], "fA" => [-15, "A"], "fAu" => [-15, "Au"], "fBq" => [-15, "Bq"], "fC" => [-15, "C"], "fF" => [-15, "F"], "fG" => [-15, "G"], "fGal" => [-15, "Gal"], "fGy" => [-15, "Gy"], "fH" => [-15, "H"], "fHg" => [-15, "Hg"], "fHz" => [-15, "Hz"], "fJ" => [-15, "J"], "fK" => [-15, "K"], "fL" => [-15, "L"], "fN" => [-15, "N"], "fP" => [-15, "P"], "fPa" => [-15, "Pa"], "fS" => [-15, "S"], "fSt" => [-15, "St"], "fSv" => [-15, "Sv"], "fT" => [-15, "T"], "fV" => [-15, "V"], "fW" => [-15, "W"], "fWb" => [-15, "Wb"], "fa" => [-15, "a"], "fac" => [-15, "ac"], "fahrenheits" => [0, "fahrenheit"], "farads" => [0, "farad"], "fatm" => [-15, "atm"], "fbar" => [-15, "bar"], "fcal" => [-15, "cal"], "fcd" => [-15, "cd"], "fconventional_mercury" => [-15, "conventional_mercury"], "fdegC" => [-15, "degC"], "fdegF" => [-15, "degF"], "fdeg_C" => [-15, "deg_C"], "fdeg_F" => [-15, "deg_F"], "fdegreeC" => [-15, "degreeC"], "fdegreeF" => [-15, "degreeF"], "fdegree_C" => [-15, "degree_C"], "fdegree_E" => [-15, "degree_E"], "fdegree_F" => [-15, "degree_F"], "fdegree_N" => [-15, "degree_N"], "fdegree_R" => [-15, "degree_R"], "fdegree_S" => [-15, "degree_S"], "fdegree_W" => [-15, "degree_W"], "fdegree_c" => [-15, "degree_c"], "fdegree_east" => [-15, "degree_east"], "fdegree_f" => [-15, "degree_f"], "fdegree_north" => [-15, "degree_north"], "fdegree_south" => [-15, "degree_south"], "fdegree_west" => [-15, "degree_west"], "fdegrees_east" => [-15, "degrees_east"], "fdegrees_north" => [-15, "degrees_north"], "fdegrees_south" => [-15, "degrees_south"], "fdegrees_west" => [-15, "degrees_west"], "fdyn" => [-15, "dyn"], "femtoCelsius" => [-15, "Celsius"], "femtoFahrenheit" => [-15, "Fahrenheit"], "femtoJulian_year" => [-15, "Julian_year"], "femtoPascal" => [-15, "Pascal"], "femtoacre" => [-15, "acre"], "femtoampere" => [-15, "ampere"], "femtoangstrom" => [-15, "angstrom"], "femtoangular_degree" => [-15, "angular_degree"], "femtoangular_minute" => [-15, "angular_minute"], "femtoangular_second" => [-15, "angular_second"], "femtoare" => [-15, "are"], "femtoatmosphere" => [-15, "atmosphere"], "femtocalorie" => [-15, "calorie"], "femtocandela" => [-15, "candela"], "femtocelsius" => [-15, "celsius"], "femtocentigrade" => [-15, "centigrade"], "femtocentury" => [-15, "century"], "femtochain" => [-15, "chain"], "femtocommon_year" => [-15, "common_year"], "femtocoulomb" => [-15, "coulomb"], "femtoday" => [-15, "day"], "femtodegK" => [-15, "degK"], "femtodeg_K" => [-15, "deg_K"], "femtodegree" => [-15, "degree"], "femtodegreeK" => [-15, "degreeK"], "femtodyne" => [-15, "dyne"], "femtoerg" => [-15, "erg"], "femtofahrenheit" => [-15, "fahrenheit"], "femtofarad" => [-15, "farad"], "femtofermi" => [-15, "fermi"], "femtogal" => [-15, "gal"], "femtogauss" => [-15, "gauss"], "femtogram" => [-15, "gram"], "femtohectare" => [-15, "hectare"], "femtohertz" => [-15, "hertz"], "femtohour" => [-15, "hour"], "femtoinch" => [-15, "inch"], "femtojoule" => [-15, "joule"], "femtokelvin" => [-15, "kelvin"], "femtokilogram" => [-15, "kilogram"], "femtoknot" => [-15, "knot"], "femtolitre" => [-15, "litre"], "femtometer" => [-15, "meter"], "femtometre" => [-15, "metre"], "femtomicron" => [-15, "micron"], "femtomile" => [-15, "mile"], "femtomillibar" => [-15, "millibar"], "femtominute" => [-15, "minute"], "femtominute_angle" => [-15, "minute_angle"], "femtomole" => [-15, "mole"], "femtomonth" => [-15, "month"], "femtonewton" => [-15, "newton"], "femtoounce" => [-15, "ounce"], "femtoparsec" => [-15, "parsec"], "femtopascal" => [-15, "pascal"], "femtopentad" => [-15, "pentad"], "femtopercent" => [-15, "percent"], "femtopoise" => [-15, "poise"], "femtopound" => [-15, "pound"], "femtoradian" => [-15, "radian"], "femtosecond" => [-15, "second"], "femtosecond_angle" => [-15, "second_angle"], "femtosteradian" => [-15, "steradian"], "femtostokes" => [-15, "stokes"], "femtotesla" => [-15, "tesla"], "femtoton" => [-15, "ton"], "femtotonne" => [-15, "tonne"], "femtotorr" => [-15, "torr"], "femtovolt" => [-15, "volt"], "femtowatt" => [-15, "watt"], "femtoweber" => [-15, "weber"], "femtoyard" => [-15, "yard"], "femtoyd" => [-15, "yd"], "femtoyear" => [-15, "year"], "ferg" => [-15, "erg"], "fermis" => [0, "fermi"], "fforce" => [-15, "force"], "fg" => [-15, "g"], "fgravity" => [-15, "gravity"], "fh" => [-15, "h"], "fhg" => [-15, "hg"], "fhr" => [-15, "hr"], "fin" => [-15, "in"], "fkgf" => [-15, "kgf"], "fkph" => [-15, "kph"], "flb" => [-15, "lb"], "flm" => [-15, "lm"], "flx" => [-15, "lx"], "fly" => [-15, "ly"], "fm" => [-15, "m"], "fmb" => [-15, "mb"], "fmercury" => [-15, "mercury"], "fmgal" => [-15, "mgal"], "fmin" => [-15, "min"], "fmol" => [-15, "mol"], "fmon" => [-15, "mon"], "fmph" => [-15, "mph"], "fohm" => [-15, "ohm"], "foz" => [-15, "oz"], "fpc" => [-15, "pc"], "fpsi" => [-15, "psi"], "frad" => [-15, "rad"], "fs" => [-15, "s"], "fsr" => [-15, "sr"], "ft" => [-15, "t"], "fyr" => [-15, "yr"], "gals" => [0, "gal"], "gausses" => [0, "gauss"], "gigaCelsius" => [9, "Celsius"], "gigaFahrenheit" => [9, "Fahrenheit"], "gigaJulian_year" => [9, "Julian_year"], "gigaPascal" => [9, "Pascal"], "gigaacre" => [9, "acre"], "gigaampere" => [9, "ampere"], "gigaangstrom" => [9, "angstrom"], "gigaangular_degree" => [9, "angular_degree"], "gigaangular_minute" => [9, "angular_minute"], "gigaangular_second" => [9, "angular_second"], "gigaare" => [9, "are"], "gigaatmosphere" => [9, "atmosphere"], "gigacalorie" => [9, "calorie"], "gigacandela" => [9, "candela"], "gigacelsius" => [9, "celsius"], "gigacentigrade" => [9, "centigrade"], "gigacentury" => [9, "century"], "gigachain" => [9, "chain"], "gigacommon_year" => [9, "common_year"], "gigacoulomb" => [9, "coulomb"], "gigaday" => [9, "day"], "gigadegK" => [9, "degK"], "gigadeg_K" => [9, "deg_K"], "gigadegree" => [9, "degree"], "gigadegreeK" => [9, "degreeK"], "gigadyne" => [9, "dyne"], "gigaerg" => [9, "erg"], "gigafahrenheit" => [9, "fahrenheit"], "gigafarad" => [9, "farad"], "gigafermi" => [9, "fermi"], "gigagal" => [9, "gal"], "gigagauss" => [9, "gauss"], "gigagram" => [9, "gram"], "gigahectare" => [9, "hectare"], "gigahertz" => [9, "hertz"], "gigahour" => [9, "hour"], "gigainch" => [9, "inch"], "gigajoule" => [9, "joule"], "gigakelvin" => [9, "kelvin"], "gigakilogram" => [9, "kilogram"], "gigaknot" => [9, "knot"], "gigalitre" => [9, "litre"], "gigameter" => [9, "meter"], "gigametre" => [9, "metre"], "gigamicron" => [9, "micron"], "gigamile" => [9, "mile"], "gigamillibar" => [9, "millibar"], "gigaminute" => [9, "minute"], "gigaminute_angle" => [9, "minute_angle"], "gigamole" => [9, "mole"], "gigamonth" => [9, "month"], "giganewton" => [9, "newton"], "gigaounce" => [9, "ounce"], "gigaparsec" => [9, "parsec"], "gigapascal" => [9, "pascal"], "gigapentad" => [9, "pentad"], "gigapercent" => [9, "percent"], "gigapoise" => [9, "poise"], "gigapound" => [9, "pound"], "gigaradian" => [9, "radian"], "gigasecond" => [9, "second"], "gigasecond_angle" => [9, "second_angle"], "gigasteradian" => [9, "steradian"], "gigastokes" => [9, "stokes"], "gigatesla" => [9, "tesla"], "gigaton" => [9, "ton"], "gigatonne" => [9, "tonne"], "gigatorr" => [9, "torr"], "gigavolt" => [9, "volt"], "gigawatt" => [9, "watt"], "gigaweber" => [9, "weber"], "gigayard" => [9, "yard"], "gigayd" => [9, "yd"], "gigayear" => [9, "year"], "grams" => [0, "gram"], "hA" => [2, "A"], "hAu" => [2, "Au"], "hBq" => [2, "Bq"], "hC" => [2, "C"], "hF" => [2, "F"], "hG" => [2, "G"], "hGal" => [2, "Gal"], "hGy" => [2, "Gy"], "hH" => [2, "H"], "hHg" => [2, "Hg"], "hHz" => [2, "Hz"], "hJ" => [2, "J"], "hK" => [2, "K"], "hL" => [2, "L"], "hN" => [2, "N"], "hP" => [2, "P"], "hPa" => [2, "Pa"], "hS" => [2, "S"], "hSt" => [2, "St"], "hSv" => [2, "Sv"], "hT" => [2, "T"], "hV" => [2, "V"], "hW" => [2, "W"], "hWb" => [2, "Wb"], "ha" => [2, "a"], "hac" => [2, "ac"], "hatm" => [2, "atm"], "hbar" => [2, "bar"], "hcal" => [2, "cal"], "hcd" => [2, "cd"], "hconventional_mercury" => [2, "conventional_mercury"], "hdegC" => [2, "degC"], "hdegF" => [2, "degF"], "hdeg_C" => [2, "deg_C"], "hdeg_F" => [2, "deg_F"], "hdegreeC" => [2, "degreeC"], "hdegreeF" => [2, "degreeF"], "hdegree_C" => [2, "degree_C"], "hdegree_E" => [2, "degree_E"], "hdegree_F" => [2, "degree_F"], "hdegree_N" => [2, "degree_N"], "hdegree_R" => [2, "degree_R"], "hdegree_S" => [2, "degree_S"], "hdegree_W" => [2, "degree_W"], "hdegree_c" => [2, "degree_c"], "hdegree_east" => [2, "degree_east"], "hdegree_f" => [2, "degree_f"], "hdegree_north" => [2, "degree_north"], "hdegree_south" => [2, "degree_south"], "hdegree_west" => [2, "degree_west"], "hdegrees_east" => [2, "degrees_east"], "hdegrees_north" => [2, "degrees_north"], "hdegrees_south" => [2, "degrees_south"], "hdegrees_west" => [2, "degrees_west"], "hdyn" => [2, "dyn"], "hectares" => [0, "hectare"], "hectoCelsius" => [2, "Celsius"], "hectoFahrenheit" => [2, "Fahrenheit"], "hectoJulian_year" => [2, "Julian_year"], "hectoPascal" => [2, "Pascal"], "hectoacre" => [2, "acre"], "hectoampere" => [2, "ampere"], "hectoangstrom" => [2, "angstrom"], "hectoangular_degree" => [2, "angular_degree"], "hectoangular_minute" => [2, "angular_minute"], "hectoangular_second" => [2, "angular_second"], "hectoare" => [2, "are"], "hectoatmosphere" => [2, "atmosphere"], "hectocalorie" => [2, "calorie"], "hectocandela" => [2, "candela"], "hectocelsius" => [2, "celsius"], "hectocentigrade" => [2, "centigrade"], "hectocentury" => [2, "century"], "hectochain" => [2, "chain"], "hectocommon_year" => [2, "common_year"], "hectocoulomb" => [2, "coulomb"], "hectoday" => [2, "day"], "hectodegK" => [2, "degK"], "hectodeg_K" => [2, "deg_K"], "hectodegree" => [2, "degree"], "hectodegreeK" => [2, "degreeK"], "hectodyne" => [2, "dyne"], "hectoerg" => [2, "erg"], "hectofahrenheit" => [2, "fahrenheit"], "hectofarad" => [2, "farad"], "hectofermi" => [2, "fermi"], "hectogal" => [2, "gal"], "hectogauss" => [2, "gauss"], "hectogram" => [2, "gram"], "hectohectare" => [2, "hectare"], "hectohertz" => [2, "hertz"], "hectohour" => [2, "hour"], "hectoinch" => [2, "inch"], "hectojoule" => [2, "joule"], "hectokelvin" => [2, "kelvin"], "hectokilogram" => [2, "kilogram"], "hectoknot" => [2, "knot"], "hectolitre" => [2, "litre"], "hectometer" => [2, "meter"], "hectometre" => [2, "metre"], "hectomicron" => [2, "micron"], "hectomile" => [2, "mile"], "hectomillibar" => [2, "millibar"], "hectominute" => [2, "minute"], "hectominute_angle" => [2, "minute_angle"], "hectomole" => [2, "mole"], "hectomonth" => [2, "month"], "hectonewton" => [2, "newton"], "hectoounce" => [2, "ounce"], "hectoparsec" => [2, "parsec"], "hectopascal" => [2, "pascal"], "hectopentad" => [2, "pentad"], "hectopercent" => [2, "percent"], "hectopoise" => [2, "poise"], "hectopound" => [2, "pound"], "hectoradian" => [2, "radian"], "hectosecond" => [2, "second"], "hectosecond_angle" => [2, "second_angle"], "hectosteradian" => [2, "steradian"], "hectostokes" => [2, "stokes"], "hectotesla" => [2, "tesla"], "hectoton" => [2, "ton"], "hectotonne" => [2, "tonne"], "hectotorr" => [2, "torr"], "hectovolt" => [2, "volt"], "hectowatt" => [2, "watt"], "hectoweber" => [2, "weber"], "hectoyard" => [2, "yard"], "hectoyd" => [2, "yd"], "hectoyear" => [2, "year"], "herg" => [2, "erg"], "hertzes" => [0, "hertz"], "hforce" => [2, "force"], "hg" => [2, "g"], "hgravity" => [2, "gravity"], "hh" => [2, "h"], "hhg" => [2, "hg"], "hhr" => [2, "hr"], "hin" => [2, "in"], "hkgf" => [2, "kgf"], "hkph" => [2, "kph"], "hlb" => [2, "lb"], "hlm" => [2, "lm"], "hlx" => [2, "lx"], "hly" => [2, "ly"], "hm" => [2, "m"], "hmb" => [2, "mb"], "hmercury" => [2, "mercury"], "hmgal" => [2, "mgal"], "hmin" => [2, "min"], "hmol" => [2, "mol"], "hmon" => [2, "mon"], "hmph" => [2, "mph"], "hohm" => [2, "ohm"], "hours" => [0, "hour"], "hoz" => [2, "oz"], "hpc" => [2, "pc"], "hpsi" => [2, "psi"], "hrad" => [2, "rad"], "hs" => [2, "s"], "hsr" => [2, "sr"], "ht" => [2, "t"], "hyr" => [2, "yr"], "inchs" => [0, "inch"], "joules" => [0, "joule"], "kA" => [3, "A"], "kAu" => [3, "Au"], "kBq" => [3, "Bq"], "kC" => [3, "C"], "kF" => [3, "F"], "kG" => [3, "G"], "kGal" => [3, "Gal"], "kGy" => [3, "Gy"], "kH" => [3, "H"], "kHg" => [3, "Hg"], "kHz" => [3, "Hz"], "kJ" => [3, "J"], "kK" => [3, "K"], "kL" => [3, "L"], "kN" => [3, "N"], "kP" => [3, "P"], "kPa" => [3, "Pa"], "kS" => [3, "S"], "kSt" => [3, "St"], "kSv" => [3, "Sv"], "kT" => [3, "T"], "kV" => [3, "V"], "kW" => [3, "W"], "kWb" => [3, "Wb"], "ka" => [3, "a"], "kac" => [3, "ac"], "katm" => [3, "atm"], "kbar" => [3, "bar"], "kcal" => [3, "cal"], "kcd" => [3, "cd"], "kconventional_mercury" => [3, "conventional_mercury"], "kdegC" => [3, "degC"], "kdegF" => [3, "degF"], "kdeg_C" => [3, "deg_C"], "kdeg_F" => [3, "deg_F"], "kdegreeC" => [3, "degreeC"], "kdegreeF" => [3, "degreeF"], "kdegree_C" => [3, "degree_C"], "kdegree_E" => [3, "degree_E"], "kdegree_F" => [3, "degree_F"], "kdegree_N" => [3, "degree_N"], "kdegree_R" => [3, "degree_R"], "kdegree_S" => [3, "degree_S"], "kdegree_W" => [3, "degree_W"], "kdegree_c" => [3, "degree_c"], "kdegree_east" => [3, "degree_east"], "kdegree_f" => [3, "degree_f"], "kdegree_north" => [3, "degree_north"], "kdegree_south" => [3, "degree_south"], "kdegree_west" => [3, "degree_west"], "kdegrees_east" => [3, "degrees_east"], "kdegrees_north" => [3, "degrees_north"], "kdegrees_south" => [3, "degrees_south"], "kdegrees_west" => [3, "degrees_west"], "kdyn" => [3, "dyn"], "kelvins" => [0, "kelvin"], "kerg" => [3, "erg"], "kforce" => [3, "force"], "kgravity" => [3, "gravity"], "kh" => [3, "h"], "khg" => [3, "hg"], "khr" => [3, "hr"], "kiloCelsius" => [3, "Celsius"], "kiloFahrenheit" => [3, "Fahrenheit"], "kiloJulian_year" => [3, "Julian_year"], "kiloPascal" => [3, "Pascal"], "kiloacre" => [3, "acre"], "kiloampere" => [3, "ampere"], "kiloangstrom" => [3, "angstrom"], "kiloangular_degree" => [3, "angular_degree"], "kiloangular_minute" => [3, "angular_minute"], "kiloangular_second" => [3, "angular_second"], "kiloare" => [3, "are"], "kiloatmosphere" => [3, "atmosphere"], "kilocalorie" => [3, "calorie"], "kilocandela" => [3, "candela"], "kilocelsius" => [3, "celsius"], "kilocentigrade" => [3, "centigrade"], "kilocentury" => [3, "century"], "kilochain" => [3, "chain"], "kilocommon_year" => [3, "common_year"], "kilocoulomb" => [3, "coulomb"], "kiloday" => [3, "day"], "kilodegK" => [3, "degK"], "kilodeg_K" => [3, "deg_K"], "kilodegree" => [3, "degree"], "kilodegreeK" => [3, "degreeK"], "kilodyne" => [3, "dyne"], "kiloerg" => [3, "erg"], "kilofahrenheit" => [3, "fahrenheit"], "kilofarad" => [3, "farad"], "kilofermi" => [3, "fermi"], "kilogal" => [3, "gal"], "kilogauss" => [3, "gauss"], "kilogram" => [3, "gram"], "kilograms" => [0, "kilogram"], "kilohectare" => [3, "hectare"], "kilohertz" => [3, "hertz"], "kilohour" => [3, "hour"], "kiloinch" => [3, "inch"], "kilojoule" => [3, "joule"], "kilokelvin" => [3, "kelvin"], "kilokilogram" => [3, "kilogram"], "kiloknot" => [3, "knot"], "kilolitre" => [3, "litre"], "kilometer" => [3, "meter"], "kilometre" => [3, "metre"], "kilomicron" => [3, "micron"], "kilomile" => [3, "mile"], "kilomillibar" => [3, "millibar"], "kilominute" => [3, "minute"], "kilominute_angle" => [3, "minute_angle"], "kilomole" => [3, "mole"], "kilomonth" => [3, "month"], "kilonewton" => [3, "newton"], "kiloounce" => [3, "ounce"], "kiloparsec" => [3, "parsec"], "kilopascal" => [3, "pascal"], "kilopentad" => [3, "pentad"], "kilopercent" => [3, "percent"], "kilopoise" => [3, "poise"], "kilopound" => [3, "pound"], "kiloradian" => [3, "radian"], "kilosecond" => [3, "second"], "kilosecond_angle" => [3, "second_angle"], "kilosteradian" => [3, "steradian"], "kilostokes" => [3, "stokes"], "kilotesla" => [3, "tesla"], "kiloton" => [3, "ton"], "kilotonne" => [3, "tonne"], "kilotorr" => [3, "torr"], "kilovolt" => [3, "volt"], "kilowatt" => [3, "watt"], "kiloweber" => [3, "weber"], "kiloyard" => [3, "yard"], "kiloyd" => [3, "yd"], "kiloyear" => [3, "year"], "kin" => [3, "in"], "kkgf" => [3, "kgf"], "kkph" => [3, "kph"], "klb" => [3, "lb"], "klm" => [3, "lm"], "klx" => [3, "lx"], "kly" => [3, "ly"], "km" => [3, "m"], "kmb" => [3, "mb"], "kmercury" => [3, "mercury"], "kmgal" => [3, "mgal"], "kmin" => [3, "min"], "kmol" => [3, "mol"], "kmon" => [3, "mon"], "kmph" => [3, "mph"], "knots" => [0, "knot"], "kohm" => [3, "ohm"], "koz" => [3, "oz"], "kpc" => [3, "pc"], "kpsi" => [3, "psi"], "krad" => [3, "rad"], "ks" => [3, "s"], "ksr" => [3, "sr"], "kt" => [3, "t"], "kyr" => [3, "yr"], "litres" => [0, "litre"], "mA" => [-3, "A"], "mAu" => [-3, "Au"], "mBq" => [-3, "Bq"], "mC" => [-3, "C"], "mF" => [-3, "F"], "mG" => [-3, "G"], "mGal" => [-3, "Gal"], "mGy" => [-3, "Gy"], "mH" => [-3, "H"], "mHg" => [-3, "Hg"], "mHz" => [-3, "Hz"], "mJ" => [-3, "J"], "mK" => [-3, "K"], "mL" => [-3, "L"], "mN" => [-3, "N"], "mP" => [-3, "P"], "mPa" => [-3, "Pa"], "mS" => [-3, "S"], "mSt" => [-3, "St"], "mSv" => [-3, "Sv"], "mT" => [-3, "T"], "mV" => [-3, "V"], "mW" => [-3, "W"], "mWb" => [-3, "Wb"], "ma" => [-3, "a"], "mac" => [-3, "ac"], "matm" => [-3, "atm"], "mbar" => [-3, "bar"], "mcal" => [-3, "cal"], "mcd" => [-3, "cd"], "mconventional_mercury" => [-3, "conventional_mercury"], "mdegC" => [-3, "degC"], "mdegF" => [-3, "degF"], "mdeg_C" => [-3, "deg_C"], "mdeg_F" => [-3, "deg_F"], "mdegreeC" => [-3, "degreeC"], "mdegreeF" => [-3, "degreeF"], "mdegree_C" => [-3, "degree_C"], "mdegree_E" => [-3, "degree_E"], "mdegree_F" => [-3, "degree_F"], "mdegree_N" => [-3, "degree_N"], "mdegree_R" => [-3, "degree_R"], "mdegree_S" => [-3, "degree_S"], "mdegree_W" => [-3, "degree_W"], "mdegree_c" => [-3, "degree_c"], "mdegree_east" => [-3, "degree_east"], "mdegree_f" => [-3, "degree_f"], "mdegree_north" => [-3, "degree_north"], "mdegree_south" => [-3, "degree_south"], "mdegree_west" => [-3, "degree_west"], "mdegrees_east" => [-3, "degrees_east"], "mdegrees_north" => [-3, "degrees_north"], "mdegrees_south" => [-3, "degrees_south"], "mdegrees_west" => [-3, "degrees_west"], "mdyn" => [-3, "dyn"], "megaCelsius" => [6, "Celsius"], "megaFahrenheit" => [6, "Fahrenheit"], "megaJulian_year" => [6, "Julian_year"], "megaPascal" => [6, "Pascal"], "megaacre" => [6, "acre"], "megaampere" => [6, "ampere"], "megaangstrom" => [6, "angstrom"], "megaangular_degree" => [6, "angular_degree"], "megaangular_minute" => [6, "angular_minute"], "megaangular_second" => [6, "angular_second"], "megaare" => [6, "are"], "megaatmosphere" => [6, "atmosphere"], "megacalorie" => [6, "calorie"], "megacandela" => [6, "candela"], "megacelsius" => [6, "celsius"], "megacentigrade" => [6, "centigrade"], "megacentury" => [6, "century"], "megachain" => [6, "chain"], "megacommon_year" => [6, "common_year"], "megacoulomb" => [6, "coulomb"], "megaday" => [6, "day"], "megadegK" => [6, "degK"], "megadeg_K" => [6, "deg_K"], "megadegree" => [6, "degree"], "megadegreeK" => [6, "degreeK"], "megadyne" => [6, "dyne"], "megaerg" => [6, "erg"], "megafahrenheit" => [6, "fahrenheit"], "megafarad" => [6, "farad"], "megafermi" => [6, "fermi"], "megagal" => [6, "gal"], "megagauss" => [6, "gauss"], "megagram" => [6, "gram"], "megahectare" => [6, "hectare"], "megahertz" => [6, "hertz"], "megahour" => [6, "hour"], "megainch" => [6, "inch"], "megajoule" => [6, "joule"], "megakelvin" => [6, "kelvin"], "megakilogram" => [6, "kilogram"], "megaknot" => [6, "knot"], "megalitre" => [6, "litre"], "megameter" => [6, "meter"], "megametre" => [6, "metre"], "megamicron" => [6, "micron"], "megamile" => [6, "mile"], "megamillibar" => [6, "millibar"], "megaminute" => [6, "minute"], "megaminute_angle" => [6, "minute_angle"], "megamole" => [6, "mole"], "megamonth" => [6, "month"], "meganewton" => [6, "newton"], "megaounce" => [6, "ounce"], "megaparsec" => [6, "parsec"], "megapascal" => [6, "pascal"], "megapentad" => [6, "pentad"], "megapercent" => [6, "percent"], "megapoise" => [6, "poise"], "megapound" => [6, "pound"], "megaradian" => [6, "radian"], "megasecond" => [6, "second"], "megasecond_angle" => [6, "second_angle"], "megasteradian" => [6, "steradian"], "megastokes" => [6, "stokes"], "megatesla" => [6, "tesla"], "megaton" => [6, "ton"], "megatonne" => [6, "tonne"], "megatorr" => [6, "torr"], "megavolt" => [6, "volt"], "megawatt" => [6, "watt"], "megaweber" => [6, "weber"], "megayard" => [6, "yard"], "megayd" => [6, "yd"], "megayear" => [6, "year"], "merg" => [-3, "erg"], "meters" => [0, "meter"], "metres" => [0, "metre"], "mforce" => [-3, "force"], "mg" => [-3, "g"], "mgravity" => [-3, "gravity"], "mh" => [-3, "h"], "mhg" => [-3, "hg"], "mhr" => [-3, "hr"], "microCelsius" => [-6, "Celsius"], "microFahrenheit" => [-6, "Fahrenheit"], "microJulian_year" => [-6, "Julian_year"], "microPascal" => [-6, "Pascal"], "microacre" => [-6, "acre"], "microampere" => [-6, "ampere"], "microangstrom" => [-6, "angstrom"], "microangular_degree" => [-6, "angular_degree"], "microangular_minute" => [-6, "angular_minute"], "microangular_second" => [-6, "angular_second"], "microare" => [-6, "are"], "microatmosphere" => [-6, "atmosphere"], "microcalorie" => [-6, "calorie"], "microcandela" => [-6, "candela"], "microcelsius" => [-6, "celsius"], "microcentigrade" => [-6, "centigrade"], "microcentury" => [-6, "century"], "microchain" => [-6, "chain"], "microcommon_year" => [-6, "common_year"], "microcoulomb" => [-6, "coulomb"], "microday" => [-6, "day"], "microdegK" => [-6, "degK"], "microdeg_K" => [-6, "deg_K"], "microdegree" => [-6, "degree"], "microdegreeK" => [-6, "degreeK"], "microdyne" => [-6, "dyne"], "microerg" => [-6, "erg"], "microfahrenheit" => [-6, "fahrenheit"], "microfarad" => [-6, "farad"], "microfermi" => [-6, "fermi"], "microgal" => [-6, "gal"], "microgauss" => [-6, "gauss"], "microgram" => [-6, "gram"], "microhectare" => [-6, "hectare"], "microhertz" => [-6, "hertz"], "microhour" => [-6, "hour"], "microinch" => [-6, "inch"], "microjoule" => [-6, "joule"], "microkelvin" => [-6, "kelvin"], "microkilogram" => [-6, "kilogram"], "microknot" => [-6, "knot"], "microlitre" => [-6, "litre"], "micrometer" => [-6, "meter"], "micrometre" => [-6, "metre"], "micromicron" => [-6, "micron"], "micromile" => [-6, "mile"], "micromillibar" => [-6, "millibar"], "microminute" => [-6, "minute"], "microminute_angle" => [-6, "minute_angle"], "micromole" => [-6, "mole"], "micromonth" => [-6, "month"], "micronewton" => [-6, "newton"], "microns" => [0, "micron"], "microounce" => [-6, "ounce"], "microparsec" => [-6, "parsec"], "micropascal" => [-6, "pascal"], "micropentad" => [-6, "pentad"], "micropercent" => [-6, "percent"], "micropoise" => [-6, "poise"], "micropound" => [-6, "pound"], "microradian" => [-6, "radian"], "microsecond" => [-6, "second"], "microsecond_angle" => [-6, "second_angle"], "microsteradian" => [-6, "steradian"], "microstokes" => [-6, "stokes"], "microtesla" => [-6, "tesla"], "microton" => [-6, "ton"], "microtonne" => [-6, "tonne"], "microtorr" => [-6, "torr"], "microvolt" => [-6, "volt"], "microwatt" => [-6, "watt"], "microweber" => [-6, "weber"], "microyard" => [-6, "yard"], "microyd" => [-6, "yd"], "microyear" => [-6, "year"], "miles" => [0, "mile"], "milliCelsius" => [-3, "Celsius"], "milliFahrenheit" => [-3, "Fahrenheit"], "milliJulian_year" => [-3, "Julian_year"], "milliPascal" => [-3, "Pascal"], "milliacre" => [-3, "acre"], "milliampere" => [-3, "ampere"], "milliangstrom" => [-3, "angstrom"], "milliangular_degree" => [-3, "angular_degree"], "milliangular_minute" => [-3, "angular_minute"], "milliangular_second" => [-3, "angular_second"], "milliare" => [-3, "are"], "milliatmosphere" => [-3, "atmosphere"], "millibars" => [0, "millibar"], "millicalorie" => [-3, "calorie"], "millicandela" => [-3, "candela"], "millicelsius" => [-3, "celsius"], "millicentigrade" => [-3, "centigrade"], "millicentury" => [-3, "century"], "millichain" => [-3, "chain"], "millicommon_year" => [-3, "common_year"], "millicoulomb" => [-3, "coulomb"], "milliday" => [-3, "day"], "millidegK" => [-3, "degK"], "millideg_K" => [-3, "deg_K"], "millidegree" => [-3, "degree"], "millidegreeK" => [-3, "degreeK"], "millidyne" => [-3, "dyne"], "millierg" => [-3, "erg"], "millifahrenheit" => [-3, "fahrenheit"], "millifarad" => [-3, "farad"], "millifermi" => [-3, "fermi"], "milligal" => [-3, "gal"], "milligauss" => [-3, "gauss"], "milligram" => [-3, "gram"], "millihectare" => [-3, "hectare"], "millihertz" => [-3, "hertz"], "millihour" => [-3, "hour"], "milliinch" => [-3, "inch"], "millijoule" => [-3, "joule"], "millikelvin" => [-3, "kelvin"], "millikilogram" => [-3, "kilogram"], "milliknot" => [-3, "knot"], "millilitre" => [-3, "litre"], "millimeter" => [-3, "meter"], "millimetre" => [-3, "metre"], "millimicron" => [-3, "micron"], "millimile" => [-3, "mile"], "millimillibar" => [-3, "millibar"], "milliminute" => [-3, "minute"], "milliminute_angle" => [-3, "minute_angle"], "millimole" => [-3, "mole"], "millimonth" => [-3, "month"], "millinewton" => [-3, "newton"], "milliounce" => [-3, "ounce"], "milliparsec" => [-3, "parsec"], "millipascal" => [-3, "pascal"], "millipentad" => [-3, "pentad"], "millipercent" => [-3, "percent"], "millipoise" => [-3, "poise"], "millipound" => [-3, "pound"], "milliradian" => [-3, "radian"], "millisecond" => [-3, "second"], "millisecond_angle" => [-3, "second_angle"], "millisteradian" => [-3, "steradian"], "millistokes" => [-3, "stokes"], "millitesla" => [-3, "tesla"], "milliton" => [-3, "ton"], "millitonne" => [-3, "tonne"], "millitorr" => [-3, "torr"], "millivolt" => [-3, "volt"], "milliwatt" => [-3, "watt"], "milliweber" => [-3, "weber"], "milliyard" => [-3, "yard"], "milliyd" => [-3, "yd"], "milliyear" => [-3, "year"], "min" => [-3, "in"], "minutes" => [0, "minute"], "minutes_angle" => [0, "minute_angle"], "mkgf" => [-3, "kgf"], "mkph" => [-3, "kph"], "mlb" => [-3, "lb"], "mlm" => [-3, "lm"], "mlx" => [-3, "lx"], "mly" => [-3, "ly"], "mm" => [-3, "m"], "mmb" => [-3, "mb"], "mmercury" => [-3, "mercury"], "mmgal" => [-3, "mgal"], "mmin" => [-3, "min"], "mmol" => [-3, "mol"], "mmon" => [-3, "mon"], "mmph" => [-3, "mph"], "mohm" => [-3, "ohm"], "moles" => [0, "mole"], "months" => [0, "month"], "moz" => [-3, "oz"], "mpc" => [-3, "pc"], "mpsi" => [-3, "psi"], "mrad" => [-3, "rad"], "ms" => [-3, "s"], "msr" => [-3, "sr"], "mt" => [-3, "t"], "myr" => [-3, "yr"], "nA" => [-9, "A"], "nAu" => [-9, "Au"], "nBq" => [-9, "Bq"], "nC" => [-9, "C"], "nF" => [-9, "F"], "nG" => [-9, "G"], "nGal" => [-9, "Gal"], "nGy" => [-9, "Gy"], "nH" => [-9, "H"], "nHg" => [-9, "Hg"], "nHz" => [-9, "Hz"], "nJ" => [-9, "J"], "nK" => [-9, "K"], "nL" => [-9, "L"], "nN" => [-9, "N"], "nP" => [-9, "P"], "nPa" => [-9, "Pa"], "nS" => [-9, "S"], "nSt" => [-9, "St"], "nSv" => [-9, "Sv"], "nT" => [-9, "T"], "nV" => [-9, "V"], "nW" => [-9, "W"], "nWb" => [-9, "Wb"], "na" => [-9, "a"], "nac" => [-9, "ac"], "nanoCelsius" => [-9, "Celsius"], "nanoFahrenheit" => [-9, "Fahrenheit"], "nanoJulian_year" => [-9, "Julian_year"], "nanoPascal" => [-9, "Pascal"], "nanoacre" => [-9, "acre"], "nanoampere" => [-9, "ampere"], "nanoangstrom" => [-9, "angstrom"], "nanoangular_degree" => [-9, "angular_degree"], "nanoangular_minute" => [-9, "angular_minute"], "nanoangular_second" => [-9, "angular_second"], "nanoare" => [-9, "are"], "nanoatmosphere" => [-9, "atmosphere"], "nanocalorie" => [-9, "calorie"], "nanocandela" => [-9, "candela"], "nanocelsius" => [-9, "celsius"], "nanocentigrade" => [-9, "centigrade"], "nanocentury" => [-9, "century"], "nanochain" => [-9, "chain"], "nanocommon_year" => [-9, "common_year"], "nanocoulomb" => [-9, "coulomb"], "nanoday" => [-9, "day"], "nanodegK" => [-9, "degK"], "nanodeg_K" => [-9, "deg_K"], "nanodegree" => [-9, "degree"], "nanodegreeK" => [-9, "degreeK"], "nanodyne" => [-9, "dyne"], "nanoerg" => [-9, "erg"], "nanofahrenheit" => [-9, "fahrenheit"], "nanofarad" => [-9, "farad"], "nanofermi" => [-9, "fermi"], "nanogal" => [-9, "gal"], "nanogauss" => [-9, "gauss"], "nanogram" => [-9, "gram"], "nanohectare" => [-9, "hectare"], "nanohertz" => [-9, "hertz"], "nanohour" => [-9, "hour"], "nanoinch" => [-9, "inch"], "nanojoule" => [-9, "joule"], "nanokelvin" => [-9, "kelvin"], "nanokilogram" => [-9, "kilogram"], "nanoknot" => [-9, "knot"], "nanolitre" => [-9, "litre"], "nanometer" => [-9, "meter"], "nanometre" => [-9, "metre"], "nanomicron" => [-9, "micron"], "nanomile" => [-9, "mile"], "nanomillibar" => [-9, "millibar"], "nanominute" => [-9, "minute"], "nanominute_angle" => [-9, "minute_angle"], "nanomole" => [-9, "mole"], "nanomonth" => [-9, "month"], "nanonewton" => [-9, "newton"], "nanoounce" => [-9, "ounce"], "nanoparsec" => [-9, "parsec"], "nanopascal" => [-9, "pascal"], "nanopentad" => [-9, "pentad"], "nanopercent" => [-9, "percent"], "nanopoise" => [-9, "poise"], "nanopound" => [-9, "pound"], "nanoradian" => [-9, "radian"], "nanosecond" => [-9, "second"], "nanosecond_angle" => [-9, "second_angle"], "nanosteradian" => [-9, "steradian"], "nanostokes" => [-9, "stokes"], "nanotesla" => [-9, "tesla"], "nanoton" => [-9, "ton"], "nanotonne" => [-9, "tonne"], "nanotorr" => [-9, "torr"], "nanovolt" => [-9, "volt"], "nanowatt" => [-9, "watt"], "nanoweber" => [-9, "weber"], "nanoyard" => [-9, "yard"], "nanoyd" => [-9, "yd"], "nanoyear" => [-9, "year"], "natm" => [-9, "atm"], "nbar" => [-9, "bar"], "ncal" => [-9, "cal"], "ncd" => [-9, "cd"], "nconventional_mercury" => [-9, "conventional_mercury"], "ndegC" => [-9, "degC"], "ndegF" => [-9, "degF"], "ndeg_C" => [-9, "deg_C"], "ndeg_F" => [-9, "deg_F"], "ndegreeC" => [-9, "degreeC"], "ndegreeF" => [-9, "degreeF"], "ndegree_C" => [-9, "degree_C"], "ndegree_E" => [-9, "degree_E"], "ndegree_F" => [-9, "degree_F"], "ndegree_N" => [-9, "degree_N"], "ndegree_R" => [-9, "degree_R"], "ndegree_S" => [-9, "degree_S"], "ndegree_W" => [-9, "degree_W"], "ndegree_c" => [-9, "degree_c"], "ndegree_east" => [-9, "degree_east"], "ndegree_f" => [-9, "degree_f"], "ndegree_north" => [-9, "degree_north"], "ndegree_south" => [-9, "degree_south"], "ndegree_west" => [-9, "degree_west"], "ndegrees_east" => [-9, "degrees_east"], "ndegrees_north" => [-9, "degrees_north"], "ndegrees_south" => [-9, "degrees_south"], "ndegrees_west" => [-9, "degrees_west"], "ndyn" => [-9, "dyn"], "nerg" => [-9, "erg"], "newtons" => [0, "newton"], "nforce" => [-9, "force"], "ng" => [-9, "g"], "ngravity" => [-9, "gravity"], "nh" => [-9, "h"], "nhg" => [-9, "hg"], "nhr" => [-9, "hr"], "nin" => [-9, "in"], "nkgf" => [-9, "kgf"], "nkph" => [-9, "kph"], "nlb" => [-9, "lb"], "nlm" => [-9, "lm"], "nlx" => [-9, "lx"], "nly" => [-9, "ly"], "nm" => [-9, "m"], "nmb" => [-9, "mb"], "nmercury" => [-9, "mercury"], "nmgal" => [-9, "mgal"], "nmin" => [-9, "min"], "nmol" => [-9, "mol"], "nmon" => [-9, "mon"], "nmph" => [-9, "mph"], "nohm" => [-9, "ohm"], "noz" => [-9, "oz"], "npc" => [-9, "pc"], "npsi" => [-9, "psi"], "nrad" => [-9, "rad"], "ns" => [-9, "s"], "nsr" => [-9, "sr"], "nt" => [-9, "t"], "nyr" => [-9, "yr"], "ounces" => [0, "ounce"], "pA" => [-12, "A"], "pAu" => [-12, "Au"], "pBq" => [-12, "Bq"], "pC" => [-12, "C"], "pF" => [-12, "F"], "pG" => [-12, "G"], "pGal" => [-12, "Gal"], "pGy" => [-12, "Gy"], "pH" => [-12, "H"], "pHg" => [-12, "Hg"], "pHz" => [-12, "Hz"], "pJ" => [-12, "J"], "pK" => [-12, "K"], "pL" => [-12, "L"], "pN" => [-12, "N"], "pP" => [-12, "P"], "pPa" => [-12, "Pa"], "pS" => [-12, "S"], "pSt" => [-12, "St"], "pSv" => [-12, "Sv"], "pT" => [-12, "T"], "pV" => [-12, "V"], "pW" => [-12, "W"], "pWb" => [-12, "Wb"], "pa" => [-12, "a"], "pac" => [-12, "ac"], "parsecs" => [0, "parsec"], "pascals" => [0, "pascal"], "patm" => [-12, "atm"], "pbar" => [-12, "bar"], "pcal" => [-12, "cal"], "pcd" => [-12, "cd"], "pconventional_mercury" => [-12, "conventional_mercury"], "pdegC" => [-12, "degC"], "pdegF" => [-12, "degF"], "pdeg_C" => [-12, "deg_C"], "pdeg_F" => [-12, "deg_F"], "pdegreeC" => [-12, "degreeC"], "pdegreeF" => [-12, "degreeF"], "pdegree_C" => [-12, "degree_C"], "pdegree_E" => [-12, "degree_E"], "pdegree_F" => [-12, "degree_F"], "pdegree_N" => [-12, "degree_N"], "pdegree_R" => [-12, "degree_R"], "pdegree_S" => [-12, "degree_S"], "pdegree_W" => [-12, "degree_W"], "pdegree_c" => [-12, "degree_c"], "pdegree_east" => [-12, "degree_east"], "pdegree_f" => [-12, "degree_f"], "pdegree_north" => [-12, "degree_north"], "pdegree_south" => [-12, "degree_south"], "pdegree_west" => [-12, "degree_west"], "pdegrees_east" => [-12, "degrees_east"], "pdegrees_north" => [-12, "degrees_north"], "pdegrees_south" => [-12, "degrees_south"], "pdegrees_west" => [-12, "degrees_west"], "pdyn" => [-12, "dyn"], "pentads" => [0, "pentad"], "percents" => [0, "percent"], "perg" => [-12, "erg"], "petaCelsius" => [15, "Celsius"], "petaFahrenheit" => [15, "Fahrenheit"], "petaJulian_year" => [15, "Julian_year"], "petaPascal" => [15, "Pascal"], "petaacre" => [15, "acre"], "petaampere" => [15, "ampere"], "petaangstrom" => [15, "angstrom"], "petaangular_degree" => [15, "angular_degree"], "petaangular_minute" => [15, "angular_minute"], "petaangular_second" => [15, "angular_second"], "petaare" => [15, "are"], "petaatmosphere" => [15, "atmosphere"], "petacalorie" => [15, "calorie"], "petacandela" => [15, "candela"], "petacelsius" => [15, "celsius"], "petacentigrade" => [15, "centigrade"], "petacentury" => [15, "century"], "petachain" => [15, "chain"], "petacommon_year" => [15, "common_year"], "petacoulomb" => [15, "coulomb"], "petaday" => [15, "day"], "petadegK" => [15, "degK"], "petadeg_K" => [15, "deg_K"], "petadegree" => [15, "degree"], "petadegreeK" => [15, "degreeK"], "petadyne" => [15, "dyne"], "petaerg" => [15, "erg"], "petafahrenheit" => [15, "fahrenheit"], "petafarad" => [15, "farad"], "petafermi" => [15, "fermi"], "petagal" => [15, "gal"], "petagauss" => [15, "gauss"], "petagram" => [15, "gram"], "petahectare" => [15, "hectare"], "petahertz" => [15, "hertz"], "petahour" => [15, "hour"], "petainch" => [15, "inch"], "petajoule" => [15, "joule"], "petakelvin" => [15, "kelvin"], "petakilogram" => [15, "kilogram"], "petaknot" => [15, "knot"], "petalitre" => [15, "litre"], "petameter" => [15, "meter"], "petametre" => [15, "metre"], "petamicron" => [15, "micron"], "petamile" => [15, "mile"], "petamillibar" => [15, "millibar"], "petaminute" => [15, "minute"], "petaminute_angle" => [15, "minute_angle"], "petamole" => [15, "mole"], "petamonth" => [15, "month"], "petanewton" => [15, "newton"], "petaounce" => [15, "ounce"], "petaparsec" => [15, "parsec"], "petapascal" => [15, "pascal"], "petapentad" => [15, "pentad"], "petapercent" => [15, "percent"], "petapoise" => [15, "poise"], "petapound" => [15, "pound"], "petaradian" => [15, "radian"], "petasecond" => [15, "second"], "petasecond_angle" => [15, "second_angle"], "petasteradian" => [15, "steradian"], "petastokes" => [15, "stokes"], "petatesla" => [15, "tesla"], "petaton" => [15, "ton"], "petatonne" => [15, "tonne"], "petatorr" => [15, "torr"], "petavolt" => [15, "volt"], "petawatt" => [15, "watt"], "petaweber" => [15, "weber"], "petayard" => [15, "yard"], "petayd" => [15, "yd"], "petayear" => [15, "year"], "pforce" => [-12, "force"], "pg" => [-12, "g"], "pgravity" => [-12, "gravity"], "ph" => [-12, "h"], "phg" => [-12, "hg"], "phr" => [-12, "hr"], "picoCelsius" => [-12, "Celsius"], "picoFahrenheit" => [-12, "Fahrenheit"], "picoJulian_year" => [-12, "Julian_year"], "picoPascal" => [-12, "Pascal"], "picoacre" => [-12, "acre"], "picoampere" => [-12, "ampere"], "picoangstrom" => [-12, "angstrom"], "picoangular_degree" => [-12, "angular_degree"], "picoangular_minute" => [-12, "angular_minute"], "picoangular_second" => [-12, "angular_second"], "picoare" => [-12, "are"], "picoatmosphere" => [-12, "atmosphere"], "picocalorie" => [-12, "calorie"], "picocandela" => [-12, "candela"], "picocelsius" => [-12, "celsius"], "picocentigrade" => [-12, "centigrade"], "picocentury" => [-12, "century"], "picochain" => [-12, "chain"], "picocommon_year" => [-12, "common_year"], "picocoulomb" => [-12, "coulomb"], "picoday" => [-12, "day"], "picodegK" => [-12, "degK"], "picodeg_K" => [-12, "deg_K"], "picodegree" => [-12, "degree"], "picodegreeK" => [-12, "degreeK"], "picodyne" => [-12, "dyne"], "picoerg" => [-12, "erg"], "picofahrenheit" => [-12, "fahrenheit"], "picofarad" => [-12, "farad"], "picofermi" => [-12, "fermi"], "picogal" => [-12, "gal"], "picogauss" => [-12, "gauss"], "picogram" => [-12, "gram"], "picohectare" => [-12, "hectare"], "picohertz" => [-12, "hertz"], "picohour" => [-12, "hour"], "picoinch" => [-12, "inch"], "picojoule" => [-12, "joule"], "picokelvin" => [-12, "kelvin"], "picokilogram" => [-12, "kilogram"], "picoknot" => [-12, "knot"], "picolitre" => [-12, "litre"], "picometer" => [-12, "meter"], "picometre" => [-12, "metre"], "picomicron" => [-12, "micron"], "picomile" => [-12, "mile"], "picomillibar" => [-12, "millibar"], "picominute" => [-12, "minute"], "picominute_angle" => [-12, "minute_angle"], "picomole" => [-12, "mole"], "picomonth" => [-12, "month"], "piconewton" => [-12, "newton"], "picoounce" => [-12, "ounce"], "picoparsec" => [-12, "parsec"], "picopascal" => [-12, "pascal"], "picopentad" => [-12, "pentad"], "picopercent" => [-12, "percent"], "picopoise" => [-12, "poise"], "picopound" => [-12, "pound"], "picoradian" => [-12, "radian"], "picosecond" => [-12, "second"], "picosecond_angle" => [-12, "second_angle"], "picosteradian" => [-12, "steradian"], "picostokes" => [-12, "stokes"], "picotesla" => [-12, "tesla"], "picoton" => [-12, "ton"], "picotonne" => [-12, "tonne"], "picotorr" => [-12, "torr"], "picovolt" => [-12, "volt"], "picowatt" => [-12, "watt"], "picoweber" => [-12, "weber"], "picoyard" => [-12, "yard"], "picoyd" => [-12, "yd"], "picoyear" => [-12, "year"], "pin" => [-12, "in"], "pkgf" => [-12, "kgf"], "pkph" => [-12, "kph"], "plb" => [-12, "lb"], "plm" => [-12, "lm"], "plx" => [-12, "lx"], "ply" => [-12, "ly"], "pm" => [-12, "m"], "pmb" => [-12, "mb"], "pmercury" => [-12, "mercury"], "pmgal" => [-12, "mgal"], "pmin" => [-12, "min"], "pmol" => [-12, "mol"], "pmon" => [-12, "mon"], "pmph" => [-12, "mph"], "pohm" => [-12, "ohm"], "poises" => [0, "poise"], "pounds" => [0, "pound"], "poz" => [-12, "oz"], "ppc" => [-12, "pc"], "ppsi" => [-12, "psi"], "prad" => [-12, "rad"], "ps" => [-12, "s"], "psr" => [-12, "sr"], "pt" => [-12, "t"], "pyr" => [-12, "yr"], "radians" => [0, "radian"], "seconds" => [0, "second"], "seconds_angle" => [0, "second_angle"], "steradians" => [0, "steradian"], "stokeses" => [0, "stokes"], "telaCelsius" => [12, "Celsius"], "telaFahrenheit" => [12, "Fahrenheit"], "telaJulian_year" => [12, "Julian_year"], "telaPascal" => [12, "Pascal"], "telaacre" => [12, "acre"], "telaampere" => [12, "ampere"], "telaangstrom" => [12, "angstrom"], "telaangular_degree" => [12, "angular_degree"], "telaangular_minute" => [12, "angular_minute"], "telaangular_second" => [12, "angular_second"], "telaare" => [12, "are"], "telaatmosphere" => [12, "atmosphere"], "telacalorie" => [12, "calorie"], "telacandela" => [12, "candela"], "telacelsius" => [12, "celsius"], "telacentigrade" => [12, "centigrade"], "telacentury" => [12, "century"], "telachain" => [12, "chain"], "telacommon_year" => [12, "common_year"], "telacoulomb" => [12, "coulomb"], "teladay" => [12, "day"], "teladegK" => [12, "degK"], "teladeg_K" => [12, "deg_K"], "teladegree" => [12, "degree"], "teladegreeK" => [12, "degreeK"], "teladyne" => [12, "dyne"], "telaerg" => [12, "erg"], "telafahrenheit" => [12, "fahrenheit"], "telafarad" => [12, "farad"], "telafermi" => [12, "fermi"], "telagal" => [12, "gal"], "telagauss" => [12, "gauss"], "telagram" => [12, "gram"], "telahectare" => [12, "hectare"], "telahertz" => [12, "hertz"], "telahour" => [12, "hour"], "telainch" => [12, "inch"], "telajoule" => [12, "joule"], "telakelvin" => [12, "kelvin"], "telakilogram" => [12, "kilogram"], "telaknot" => [12, "knot"], "telalitre" => [12, "litre"], "telameter" => [12, "meter"], "telametre" => [12, "metre"], "telamicron" => [12, "micron"], "telamile" => [12, "mile"], "telamillibar" => [12, "millibar"], "telaminute" => [12, "minute"], "telaminute_angle" => [12, "minute_angle"], "telamole" => [12, "mole"], "telamonth" => [12, "month"], "telanewton" => [12, "newton"], "telaounce" => [12, "ounce"], "telaparsec" => [12, "parsec"], "telapascal" => [12, "pascal"], "telapentad" => [12, "pentad"], "telapercent" => [12, "percent"], "telapoise" => [12, "poise"], "telapound" => [12, "pound"], "telaradian" => [12, "radian"], "telasecond" => [12, "second"], "telasecond_angle" => [12, "second_angle"], "telasteradian" => [12, "steradian"], "telastokes" => [12, "stokes"], "telatesla" => [12, "tesla"], "telaton" => [12, "ton"], "telatonne" => [12, "tonne"], "telatorr" => [12, "torr"], "telavolt" => [12, "volt"], "telawatt" => [12, "watt"], "telaweber" => [12, "weber"], "telayard" => [12, "yard"], "telayd" => [12, "yd"], "telayear" => [12, "year"], "teslas" => [0, "tesla"], "tonnes" => [0, "tonne"], "tons" => [0, "ton"], "torrs" => [0, "torr"], "uA" => [-6, "A"], "uAu" => [-6, "Au"], "uBq" => [-6, "Bq"], "uC" => [-6, "C"], "uF" => [-6, "F"], "uG" => [-6, "G"], "uGal" => [-6, "Gal"], "uGy" => [-6, "Gy"], "uH" => [-6, "H"], "uHg" => [-6, "Hg"], "uHz" => [-6, "Hz"], "uJ" => [-6, "J"], "uK" => [-6, "K"], "uL" => [-6, "L"], "uN" => [-6, "N"], "uP" => [-6, "P"], "uPa" => [-6, "Pa"], "uS" => [-6, "S"], "uSt" => [-6, "St"], "uSv" => [-6, "Sv"], "uT" => [-6, "T"], "uV" => [-6, "V"], "uW" => [-6, "W"], "uWb" => [-6, "Wb"], "ua" => [-6, "a"], "uac" => [-6, "ac"], "uatm" => [-6, "atm"], "ubar" => [-6, "bar"], "ucal" => [-6, "cal"], "ucd" => [-6, "cd"], "uconventional_mercury" => [-6, "conventional_mercury"], "udegC" => [-6, "degC"], "udegF" => [-6, "degF"], "udeg_C" => [-6, "deg_C"], "udeg_F" => [-6, "deg_F"], "udegreeC" => [-6, "degreeC"], "udegreeF" => [-6, "degreeF"], "udegree_C" => [-6, "degree_C"], "udegree_E" => [-6, "degree_E"], "udegree_F" => [-6, "degree_F"], "udegree_N" => [-6, "degree_N"], "udegree_R" => [-6, "degree_R"], "udegree_S" => [-6, "degree_S"], "udegree_W" => [-6, "degree_W"], "udegree_c" => [-6, "degree_c"], "udegree_east" => [-6, "degree_east"], "udegree_f" => [-6, "degree_f"], "udegree_north" => [-6, "degree_north"], "udegree_south" => [-6, "degree_south"], "udegree_west" => [-6, "degree_west"], "udegrees_east" => [-6, "degrees_east"], "udegrees_north" => [-6, "degrees_north"], "udegrees_south" => [-6, "degrees_south"], "udegrees_west" => [-6, "degrees_west"], "udyn" => [-6, "dyn"], "uerg" => [-6, "erg"], "uforce" => [-6, "force"], "ug" => [-6, "g"], "ugravity" => [-6, "gravity"], "uh" => [-6, "h"], "uhg" => [-6, "hg"], "uhr" => [-6, "hr"], "uin" => [-6, "in"], "ukgf" => [-6, "kgf"], "ukph" => [-6, "kph"], "ulb" => [-6, "lb"], "ulm" => [-6, "lm"], "ulx" => [-6, "lx"], "uly" => [-6, "ly"], "um" => [-6, "m"], "umb" => [-6, "mb"], "umercury" => [-6, "mercury"], "umgal" => [-6, "mgal"], "umin" => [-6, "min"], "umol" => [-6, "mol"], "umon" => [-6, "mon"], "umph" => [-6, "mph"], "uohm" => [-6, "ohm"], "uoz" => [-6, "oz"], "upc" => [-6, "pc"], "upsi" => [-6, "psi"], "urad" => [-6, "rad"], "us" => [-6, "s"], "usr" => [-6, "sr"], "ut" => [-6, "t"], "uyr" => [-6, "yr"], "volts" => [0, "volt"], "watts" => [0, "watt"], "webers" => [0, "weber"], "yards" => [0, "yard"], "yds" => [0, "yd"], "years" => [0, "year"], } UPLURALS = { "Celsiuses" => "Celsius", "Fahrenheits" => "Fahrenheit", "Julians_year" => "Julian_year", "Pascals" => "Pascal", "acres" => "acre", "amperes" => "ampere", "angstroms" => "angstrom", "angulars_degree" => "angular_degree", "angulars_minute" => "angular_minute", "angulars_second" => "angular_second", "ares" => "are", "atmospheres" => "atmosphere", "calories" => "calorie", "candelas" => "candela", "celsiuses" => "celsius", "centigrades" => "centigrade", "centuries" => "century", "chains" => "chain", "commons_year" => "common_year", "coulombs" => "coulomb", "days" => "day", "degKs" => "degK", "degreeKs" => "degreeK", "degrees" => "degree", "degs_K" => "deg_K", "dynes" => "dyne", "ergs" => "erg", "fahrenheits" => "fahrenheit", "farads" => "farad", "fermis" => "fermi", "gals" => "gal", "gausses" => "gauss", "grams" => "gram", "hectares" => "hectare", "hertzes" => "hertz", "hours" => "hour", "inchs" => "inch", "joules" => "joule", "kelvins" => "kelvin", "kilograms" => "kilogram", "knots" => "knot", "litres" => "litre", "meters" => "meter", "metres" => "metre", "microns" => "micron", "miles" => "mile", "millibars" => "millibar", "minutes" => "minute", "minutes_angle" => "minute_angle", "moles" => "mole", "months" => "month", "newtons" => "newton", "ounces" => "ounce", "parsecs" => "parsec", "pascals" => "pascal", "pentads" => "pentad", "percents" => "percent", "poises" => "poise", "pounds" => "pound", "radians" => "radian", "seconds" => "second", "seconds_angle" => "second_angle", "steradians" => "steradian", "stokeses" => "stokes", "teslas" => "tesla", "tonnes" => "tonne", "tons" => "ton", "torrs" => "torr", "volts" => "volt", "watts" => "watt", "webers" => "weber", "yards" => "yard", "yds" => "yd", "years" => "year", } end class NumberNode < TerminalNode def initialize(arg) raise TypeError unless Numeric === arg @a = arg end UNITY = NumberNode.new(1) ZERO = NumberNode.new(0) def to_s if @a == @a.to_i sprintf("%d",@a) else String(@a) end end attr_reader :a alias :value :a alias :factor :a def == (other) case other when NumberNode @a == other.a else false end end def add_eval(another) raise TypeError unless NumberNode === another NumberNode.new(@a + another.value) end def mul_eval(another) case another when NumberNode then NumberNode.new(@a * another.a) when PowNode raise TypeError unless NumberNode === another.lhs raise TypeError unless NumberNode === another.rhs NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value)) else raise TypeError end end def name; "1"; end def power; UNITY; end end class XDate def initialize(year, month, day) @year, @month, @day = year.to_i, month.to_i, day.to_i end attr_reader :year, :month, :day def to_s format('%04d-%02d-%02d', @year, @month, @day) end alias :inspect :to_s def to_time Time.gm(@year, @month, @day) end def to_date Date.new(@year, @month, @day) end def -(other) case other when XDate (to_date - other.to_date) when Time to_time - other when Date (to_date - other.to_date) else to_date - other end end def +(other) t = to_date + other self.class.new(t.year, t.month, t.mday) end end class TimeNode < TerminalNode def initialize(date, time, zone) @date, @time, @zone = date, time, zone if :now === @date then now = Time.now.utc @date = XDate.new(now.year, now.month, now.day) @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec)) else qdays = (@time / 86400).floor if not qdays.zero? @date += qdays @time -= (qdays * 86400) end end raise TypeError unless XDate === @date @time = 0.0 unless @time raise TypeError unless Float === @time @zone = 0 unless @zone raise TypeError unless Integer === @zone end attr_reader :date, :time, :zone def to_s hr = @time.floor / 3600 mi = (@time.floor / 60) % 60 sc = @time % 60 tzm = @zone.abs tzh = tzm / 60 tzm %= 60 tzh = -tzh if @zone < 0 format("%sT%02d:%02d:%05.2f %+03d:%02d", \ @date.to_s, hr, mi, sc, tzh, tzm) end def self::pentad(d) (d > 25) ? 5 : ((d - 1) / 5) end def add_time(increment) inc = increment.reduce5 case inc.name when 's' t2 = @time + inc.factor d2 = @date + (t2 / 86400) t2 = t2 % 86400 self.class.new(d2, t2, @zone) when 'pentad' ifac = Integer(inc.factor) ipen = ifac % 6 imon = ifac / 6 spen = self.class.pentad(@date.day) smon = @date.month + imon + spen / 6 spen = spen % 6 sday = spen * 5 + (@date.day - 1) % 5 + 1 syear = @date.year + (smon - 1) / 12 smon = (smon - 1) % 12 + 1 sdate = XDate.new(syear, smon, sday) self.class.new(sdate, @time, @zone) else raise "bad time unit '#{inc.name}'" end end def utcsod @time - @zone * 60 end def div_time(units) base = units.ref inc = units.deref.reduce5 begin incname = inc.name rescue Exception incname = "(undefined)" end case incname when 's' dif = (@date - base.date) * 86400 + (utcsod - base.utcsod) dif / inc.factor when 'pentad' dif = (@date.year - base.date.year) * 72 dif += (@date.month - base.date.month) * 6 dif += self.class.pentad(@date.day) dif -= self.class.pentad(base.date.day) dif = Float(dif) if dif % inc.factor != 0 dif / inc.factor else raise "bad time unit '#{incname}'" end end end class PowNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs raise TypeError unless NumberNode === @rhs end def to_s lhs = @lhs.to_s case lhs when /\d$/, /[\d\.]/ lhs = "(#{lhs})" end rhs = @rhs.to_s if rhs == '1' lhs else rhs = "^(#{rhs})" if (/\./ =~ rhs) lhs + rhs end end attr_reader :lhs, :rhs alias :power :rhs def pow_eval(other) case other when NumberNode PowNode.new(@lhs, @rhs.mul_eval(other)) else super(other) end end def flatten2 x = @lhs.flatten2 case x when NumberNode a = @lhs.pow_eval(@rhs) when TerminalNode a = self when PowNode a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs)) when MulNode, MultiNode a = MultiNode.new() for gc in x a.append(gc.pow_eval(@rhs)) end else raise "internal error" end return a end def name case @lhs when NumberNode, NameNode @lhs.name else raise "internal error" end end def value case @lhs when NumberNode Units::pow_f(@lhs.value, @rhs.value) else raise(format('%s#value: internal error', self.class.to_s)) end end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value) else self.class.new(@lhs, @rhs.add_eval(another.power)) end end def sort case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value)) else self end end def factor Units::pow_f(@lhs.factor, @rhs.value) end end module Kakezan def flatten2 r = MultiNode.new() each do |child| case child when MultiNode r.append child when MulNode r.append child.flatten2 when ContainerNode r.append child.flatten2 else r.append child end end r end def name n = nil for c in @children next if NumberNode === c na = c.name if n.nil? n = na else raise "multiple names found" if na != n end end n = "1" if n.nil? n end def factor f = 1 for c in @children f *= c.factor end f end end class MulNode < ContainerNode include BinaryNode include Kakezan def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end def to_s lhs = @lhs.to_s rhs = @rhs.to_s if (/\d$/ =~ lhs && /^\w/ =~ rhs) then "#{lhs} #{rhs}" else "#{lhs}.#{rhs}" end end end class MultiNode < ContainerNode include Kakezan def initialize(*children) @children = children for c in @children raise "# MultiNode.new(#{children.inspect})" unless Node === c end end def to_s s = @children.join(';') s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.') end def each @children.each {|child| yield child } end attr_reader :children def append(other) case other when MultiNode @children += other.children else @children.push other end end def sort table = {} for child in self name = child.name if (table.include?(name)) then table[name] = table[name].mul_eval(child) else table[name] = child end end list = [] for name in table.keys.sort candi = table[name] if PowNode === candi and NumberNode === candi.lhs then v = candi.value list.push NumberNode.new(v) unless v == 1 next end next if candi.power.value == 0 list.push candi end if list.length > 1 list.delete(NumberNode::UNITY) end self.class.new(*list) end def collect_hash(stopper, op) list = [] for child in self list.push(child.send(op, stopper)) end self.class.new(*list).flatten2 end def expand(stopper) collect_hash(stopper, :expand) end def unalias(stopper) collect_hash(stopper, :unalias) end def foldnumber(stopper) collect_hash(stopper, :foldnumber) end def value raise "this is dimensional units" if (@children.size > 1) @children.first ? @children.first.value : NumberNode::UNITY.value end end class ShiftNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end attr_reader :lhs, :rhs alias :ref :rhs def to_s "(#{@lhs.to_s} @ #{@rhs.to_s})" end def trim2; @lhs; end def trim self.class.new(@lhs.trim, @rhs.trim2) end def flatten2; @lhs; end def flatten lf = @lhs.flatten case lf when ShiftNode rf = lf.rhs.add_eval(@rhs) self.class.new(lf.lhs, rf) else self.class.new(lf, @rhs.flatten) end end def sort self.class.new(@lhs.sort, @rhs.sort) end def ref case @lhs when ShiftNode @lhs.ref.add_eval(@rhs) else @rhs end end def deref case @lhs when ShiftNode @lhs.deref else @lhs end end def name @lhs.name end def factor @lhs.factor end end def initialize string case string when String @string, @ptree = string, nil when Node @string, @ptree = nil, string else @string, @ptree = String(string), nil end @copy = @lexstat = nil end # # === LEXICAL ANALYZER === # def rewind @copy = @string.dup.strip @lexstat = nil end RE_SPACE = '([ \t])' RE_INTEGER = '([-+]?\d+)' RE_EXP = '([eE][-+]?[0-9]+)' RE_REAL = "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))" RE_YEAR = "([-+]?[0-9]{1,4})" RE_MONTH = "(0?[1-9]|1[0-2])" RE_DAY = "([12][0-9]|30|31|0?[1-9])" RE_HOUR = "(2[0-3]|[0-1]?[0-9])" RE_MINUTE = "([0-5]?[0-9])" RE_SECOND = "((#{RE_MINUTE}|60)(\\.[0-9]*)?)" RE_NAME = "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)" RE_DATE = "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}" RE_TIME = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?" RE_HandM = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?" def next_token # decomment @copy.sub!(/^#.*/, ''); if @copy.sub!(%r{^\s*(\))}, '') then @lexstat = nil return [$1, $1] end if @copy.sub!(%r{^\s*(\()\s*}, '') then return [$1, $1] end if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then @lexstat = :SHIFT_SEEN return [:SHIFT, $1] end if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then @lexstat = nil return [:DIVIDE, $1] end if @copy.sub!(%r{^(\^|\*\*)}, '') then @lexstat = nil return [:EXPONENT, $1] end if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then y, m, d = $1, $2, $3 @lexstat = :DATE_SEEN return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^now[ \t]*}, '') then @lexstat = nil return [:DATE, :now] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then h, m, s = $1, $3, $5 m = m.sub(/:/,'') if m s = 0 if s.nil? @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^(UTC|Z)[ \t]*}, '') then @lexstat = nil return [:ZONE, 0] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then sgn, h, m = $1, $2, $4 m = m.sub(/:/,'') if m @lexstat = nil h = h.to_i h = -h if sgn == "-" m = m.to_i m = -m if sgn == "-" return [:ZONE, ((h * 60) + m)] end if @copy.sub!(%r{^#{RE_NAME}}, '') then @lexstat = nil return [:NAME, $1] end if @copy.sub!(%r{^#{RE_REAL}}, '') then @lexstat = nil return [:REAL, $1.to_f] end if @copy.sub!(%r{^#{RE_INTEGER}}, '') then @lexstat = nil return [:INT, $1.to_i] end if @copy.sub!(%r{^(-)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if @copy.sub!(%r{^(.)}, '') then return [$1, $1] end return [false, false] end # # === USER LEVEL METHODS === # def tokens rewind x = [] while (t = next_token).first x.push t end x end def do_parse2 rewind return NumberNode.new(1) if @string.nil? or @string.empty? pa = do_parse pa ? pa : ErrorNode.new(@string) end def ptree @ptree = do_parse2 if not @ptree @ptree end def dup @string ? self.class.new(@string) : self.class.new(@ptree) end def parse dup.parse! end def parse! @ptree = do_parse2 if not @ptree self end def self::parse(string) new(string).parse! end =begin --- reduce0 just do nothing. =end def reduce0 self end =begin --- reduce1 removes unnecessary parentheses. =end def reduce1 @string = ptree.to_s self end =begin --- reduce2 removes shift operator within multiplication/division/exponent =end def reduce2 @ptree = ptree.reduce2 @string = nil self end =begin --- reduce3 flattens expression and collects all factors =end def reduce3 @ptree = ptree.reduce3 @string = nil self end =begin --- reduce4 collects terms with the same name =end def reduce4 @ptree = ptree.reduce4 @string = nil self end =begin --- reduce5 expands all terms recursively =end def reduce5 @ptree = ptree.reduce5 @string = nil self end attr_reader :string def to_s @string = @ptree.to_s if @string.nil? @string end def inspect if @ptree.nil? then "Units{#{@string}}" else "Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[') end end def self::[](string) new(string) end def self::parse(string) new(string).parse! end def eval(x = 0) r5 = ptree.reduce5 case r = r5.ref when TimeNode r.add(x, r5.name) else fac = NumberNode.new(x + r.value) self.class.new(MulNode.new(fac, r5.deref)) end end def convert(numeric, to_units) to_units = Units.new( to_units ) if to_units.is_a?(String) r5 = dup.ptree.reduce5 case r = r5.ref when TimeNode r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree) else shift1 = r.value numeric = shift1 + numeric if shift1 != 0 fact = r5.divide(tp = to_units.dup.ptree).reduce5.value numeric *= fact if fact != 1 shift2 = tp.reduce5.ref.value numeric = numeric - shift2 if shift2 != 0 numeric end end def factor_and_offset(to_units) # To convert a numeric from self to to_units: # scale_factor * numeric + add_offset to_units = Units.new( to_units ) if to_units.is_a?(String) add_offset = convert(0, to_units) scale_factor = convert(1, to_units) - add_offset [ scale_factor, add_offset ] end def convert2(val, to_units) # Like Units#convert, but applicable to any Numeric-like objects. # Returns the original value if the units are incompatible. to_units = Units.new( to_units ) if to_units.is_a?(String) if ( self == to_units ) val elsif ( self =~ to_units ) if Numeric===val convert( val, to_units ) else factor, offset = factor_and_offset( to_units ) val*factor + offset end else unless $VERBOSE.nil? $stderr.print( "*WARNING*: " + "incompatible units: #{self.to_s} and #{to_units.to_s}\n") caller(0).each{|c| $stderr.print "\t* ",c,"\n"} end val end end @@reduce = :reduce4 def self::reduce_level @@reduce.to_s[-1] end def self::reduce_level=(n) @@reduce = case n when 1 then :reduce1 when 2 then :reduce2 when 3 then :reduce3 when 4 then :reduce4 else :reduce5 end end def binop(op, other) case other when Numeric other = NumberNode.new(other) when Units other = other.ptree end q = self.ptree.send(op, other).send(@@reduce) Units.new(q) end def *(other) binop(:mul, other) end def **(other) binop(:pow, other) end def /(other) binop(:divide, other) end def ^(other) binop(:shift, other) end def ==(other) case other when self.class dup.reduce5.to_s == other.dup.reduce5.to_s else false end end #def === (other) # reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s #end alias === == #def === (other) # # returns true if other is within a factor and/or offset of difference. # case other # when self.class # (self/other).reduce5.ptree.children.each do |child| # return false if !( NumberNode === child ) # end # true # else # false # end #end def =~(other) case other when self.class (self/other).reduce5.ptree.children.each{ |node| return false unless NumberNode === node } true else false end end def self::pow_f(a, b) if Integer === b and b < 0 then a ** b.to_f else a ** b end end numru-units-1.9.0/src/Makefile0000644000175000017500000000144213025004163016105 0ustar uwabamiuwabamiall: units.rb units.rb: units.racc racc units.racc -o units.rb (( echo ; echo '####################' ; echo 'if $$0 == __FILE__' ; tail -n +2 test.rb | ruby -p -e 'print " "' ; echo 'end' ) >> units.rb) test: units.rb ruby test.rb backup: units.shar scp units.shar toyoda@www.gfd-dennou.org:tmp/ scp units.shar toyoda@pandora0.sytes.net:tmp/ RSRCS = rules.rb version.rb node.rb namenode.rb utab.rb numbernode.rb \ timenode.rb pownode.rb mulnode.rb shiftnode.rb lex.rb utab.rb: makeutab.rb dcunits.txt ruby makeutab.rb dcunits.txt > $@.tmp mv $@.tmp $@ units.racc: $(RSRCS) cat $(RSRCS) > $@.tmp mv $@.tmp $@ edit: $${EDITOR:-vi} $(RSRCS) SRCS = Makefile units.rb dcunits.txt makeutab.rb $(RSRCS) test.rb units.rd shar: units.shar units.shar: $(SRCS) shar $(SRCS) > units.shar numru-units-1.9.0/src/namenode.rb0000644000175000017500000000246013025004163016561 0ustar uwabamiuwabamiclass NameNode < TerminalNode def initialize(string) @a = string end def to_s; @a; end alias :name :to_s def power; NumberNode::UNITY; end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name PowNode.new(self, self.power.add_eval(another.power)) end def expand(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self if basic? return CACHE[@a] if CACHE.include?(@a) CACHE[@a] = expand2(stopper) end def expand2(stopper) newstopper = stopper.dup newstopper[@a] = true if UDEFS.include?(@a) then Units.new(UDEFS[@a]).ptree.expand(newstopper) else p, n = UALIASES[@a] u = Units.new(UDEFS[n] || n).ptree.expand(newstopper) MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p))) end end def unalias(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self unless UALIASES.include?(@a) p, n = UALIASES[@a] u = NameNode.new(n) q = PowNode.new(NumberNode.new(10), NumberNode.new(p)) MulNode.new(u, q) end def foldnumber(stopper) return self unless UPLURALS.include?(@a) n = UPLURALS[@a] NameNode.new(n) end def basic? not (UDEFS.include?(@a) or UALIASES.include?(@a)) end CACHE = {} def factor 1 end end numru-units-1.9.0/src/utab.rb0000644000175000017500000024631713025004163015741 0ustar uwabamiuwabamiclass NameNode UDEFS = { "%" => "1e-2", "Au" => "astronomical_unit", "Bq" => "s-1", "C" => "A.s", "Celsius" => "K @ 273.15", "F" => "C/V", "Fahrenheit" => "degree_F", "G" => "gauss", "Gal" => "cm s-2", "Gy" => "J.kg-1", "H" => "Wb.A-1", "Hg" => "mercury", "Hz" => "1/s", "J" => "N.m", "Julian_year" => "365.25 day", "L" => "litre", "N" => "kg.m.s-2", "P" => "poise", "Pa" => "N.m-2", "Pascal" => "Pa", "S" => "A/V", "St" => "stokes", "Sv" => "J.kg-1", "T" => "Wb.m-2", "V" => "J/C", "W" => "J/s", "Wb" => "V.s", "a" => "are", "ac" => "acre", "acre" => "10 chain2", "ampere" => "A", "angstrom" => "1.0e-10 m", "angular_degree" => "degree", "angular_minute" => "minute_angle", "angular_second" => "second_angle", "are" => "100 m2", "astronomical_unit" => "1.49597870e11 m", "astronomical_units" => "1.49597870e11 m", "atm" => "atmosphere", "atmosphere" => "101325 Pa", "bar" => "1e6 dyn.cm-2", "cal" => "calorie", "calorie" => "4.18605 J", "candela" => "cd", "celsius" => "K @ 273.15", "centigrade" => "K @ 273.15", "century" => "100 year", "chain" => "22 yard", "common_year" => "365 day", "conventional_mercury" => "gravity 13595.10 kg/m3", "coulomb" => "C", "d" => "24 hour", "day" => "24 hour", "degC" => "K @ 273.15", "degF" => "degree_F", "degK" => "K", "deg_C" => "K @ 273.15", "deg_F" => "degree_F", "deg_K" => "K", "degree" => "pi.rad/180", "degreeC" => "K @ 273.15", "degreeF" => "degree_F", "degreeK" => "K", "degree_C" => "K @ 273.15", "degree_E" => "degree", "degree_F" => "degree_R @ 459.67", "degree_N" => "degree", "degree_R" => "K / 1.8", "degree_S" => "degree", "degree_W" => "degree", "degree_c" => "K @ 273.15", "degree_east" => "degree_E", "degree_f" => "degree_R @ 459.67", "degree_north" => "degree_N", "degree_south" => "degree_S", "degree_west" => "degree_W", "degrees_east" => "degree_E", "degrees_north" => "degree_N", "degrees_south" => "degree_S", "degrees_west" => "degree_W", "dyn" => "g.cm.s-2", "dyne" => "g.cm.s-2", "erg" => "dyn cm", "fahrenheit" => "degree_F", "farad" => "coulomb/volt", "feet" => "foot", "fermi" => "1.0e-15 m", "foot" => "12 inch", "force" => "9.80665 m.s-2", "ft" => "foot", "g" => "kg/1000", "gal" => "cm s-2", "gauss" => "T / 10000", "gpm" => "m", "gram" => "kg/1000", "gravity" => "9.806650 meter/second2", "h" => "60 min", "hectare" => "100 are", "hertz" => "Hz", "hg" => "mercury", "horse_power" => "75 m kilogram-force / s", "hour" => "60 min", "hr" => "60 min", "in" => "inch", "inch" => "2.54 cm", "joule" => "J", "kelvin" => "K", "kgf" => "kilogram-force", "kilogram" => "kg", "knot" => "nautical_mile / hour", "kph" => "km / hour", "lb" => "pound", "light_speed" => "299792458 m/s", "light_year" => "9.46e15 m", "light_years" => "9.46e15 m", "litre" => "1.0e-3 m3", "lm" => "cd.sr", "lx" => "lm.m-2", "ly" => "light_year", "mb" => "bar / 1000", "mercury" => "conventional_mercury", "meter" => "metre", "metre" => "m", "mgal" => "cm s-2 / 1000", "micron" => "1.0e-6 m", "mile" => "1760 yard", "millibar" => "bar / 1000", "min" => "60 s", "minute" => "60 s", "minute_angle" => "pi.rad/180/60", "mole" => "mol", "mon" => "month", "month" => "6 pentad", "mph" => "mile / hour", "nautical_mile" => "1852 m", "nautical_miles" => "1852 m", "newton" => "N", "ohm" => "V/A", "ounce" => "pound / 16", "oz" => "ounce", "parsec" => "3.0857e16 m", "pascal" => "Pa", "pc" => "parsec", "percent" => "1e-2", "permil" => "1e-3", "pi" => "3.141592653589793238462", "poise" => "dyn s / cm2", "pound" => "453.6 g", "psi" => "pound-force / inch2", "radian" => "rad", "second" => "s", "second_angle" => "pi.rad/180/60/60", "steradian" => "sr", "stokes" => "cm2 / s", "t" => "ton", "tesla" => "Wb.m-2", "ton" => "1000 kg", "tonne" => "ton", "torr" => "133.322 Pa", "volt" => "V", "watt" => "W", "weber" => "Wb", "yard" => "6 feet", "yd" => "yard", "year" => "12 month", "yr" => "year", } UALIASES = { "Celsiuses" => [0, "Celsius"], "EA" => [18, "A"], "EAu" => [18, "Au"], "EBq" => [18, "Bq"], "EC" => [18, "C"], "EF" => [18, "F"], "EG" => [18, "G"], "EGal" => [18, "Gal"], "EGy" => [18, "Gy"], "EH" => [18, "H"], "EHg" => [18, "Hg"], "EHz" => [18, "Hz"], "EJ" => [18, "J"], "EK" => [18, "K"], "EL" => [18, "L"], "EN" => [18, "N"], "EP" => [18, "P"], "EPa" => [18, "Pa"], "ES" => [18, "S"], "ESt" => [18, "St"], "ESv" => [18, "Sv"], "ET" => [18, "T"], "EV" => [18, "V"], "EW" => [18, "W"], "EWb" => [18, "Wb"], "Ea" => [18, "a"], "Eac" => [18, "ac"], "Eatm" => [18, "atm"], "Ebar" => [18, "bar"], "Ecal" => [18, "cal"], "Ecd" => [18, "cd"], "Econventional_mercury" => [18, "conventional_mercury"], "EdegC" => [18, "degC"], "EdegF" => [18, "degF"], "Edeg_C" => [18, "deg_C"], "Edeg_F" => [18, "deg_F"], "EdegreeC" => [18, "degreeC"], "EdegreeF" => [18, "degreeF"], "Edegree_C" => [18, "degree_C"], "Edegree_E" => [18, "degree_E"], "Edegree_F" => [18, "degree_F"], "Edegree_N" => [18, "degree_N"], "Edegree_R" => [18, "degree_R"], "Edegree_S" => [18, "degree_S"], "Edegree_W" => [18, "degree_W"], "Edegree_c" => [18, "degree_c"], "Edegree_east" => [18, "degree_east"], "Edegree_f" => [18, "degree_f"], "Edegree_north" => [18, "degree_north"], "Edegree_south" => [18, "degree_south"], "Edegree_west" => [18, "degree_west"], "Edegrees_east" => [18, "degrees_east"], "Edegrees_north" => [18, "degrees_north"], "Edegrees_south" => [18, "degrees_south"], "Edegrees_west" => [18, "degrees_west"], "Edyn" => [18, "dyn"], "Eerg" => [18, "erg"], "Eforce" => [18, "force"], "Eg" => [18, "g"], "Egravity" => [18, "gravity"], "Eh" => [18, "h"], "Ehg" => [18, "hg"], "Ehr" => [18, "hr"], "Ein" => [18, "in"], "Ekgf" => [18, "kgf"], "Ekph" => [18, "kph"], "Elb" => [18, "lb"], "Elm" => [18, "lm"], "Elx" => [18, "lx"], "Ely" => [18, "ly"], "Em" => [18, "m"], "Emb" => [18, "mb"], "Emercury" => [18, "mercury"], "Emgal" => [18, "mgal"], "Emin" => [18, "min"], "Emol" => [18, "mol"], "Emon" => [18, "mon"], "Emph" => [18, "mph"], "Eohm" => [18, "ohm"], "Eoz" => [18, "oz"], "Epc" => [18, "pc"], "Epsi" => [18, "psi"], "Erad" => [18, "rad"], "Es" => [18, "s"], "Esr" => [18, "sr"], "Et" => [18, "t"], "Eyr" => [18, "yr"], "Fahrenheits" => [0, "Fahrenheit"], "GA" => [9, "A"], "GAu" => [9, "Au"], "GBq" => [9, "Bq"], "GC" => [9, "C"], "GF" => [9, "F"], "GG" => [9, "G"], "GGal" => [9, "Gal"], "GGy" => [9, "Gy"], "GH" => [9, "H"], "GHg" => [9, "Hg"], "GHz" => [9, "Hz"], "GJ" => [9, "J"], "GK" => [9, "K"], "GL" => [9, "L"], "GN" => [9, "N"], "GP" => [9, "P"], "GPa" => [9, "Pa"], "GS" => [9, "S"], "GSt" => [9, "St"], "GSv" => [9, "Sv"], "GT" => [9, "T"], "GV" => [9, "V"], "GW" => [9, "W"], "GWb" => [9, "Wb"], "Ga" => [9, "a"], "Gac" => [9, "ac"], "Gatm" => [9, "atm"], "Gbar" => [9, "bar"], "Gcal" => [9, "cal"], "Gcd" => [9, "cd"], "Gconventional_mercury" => [9, "conventional_mercury"], "GdegC" => [9, "degC"], "GdegF" => [9, "degF"], "Gdeg_C" => [9, "deg_C"], "Gdeg_F" => [9, "deg_F"], "GdegreeC" => [9, "degreeC"], "GdegreeF" => [9, "degreeF"], "Gdegree_C" => [9, "degree_C"], "Gdegree_E" => [9, "degree_E"], "Gdegree_F" => [9, "degree_F"], "Gdegree_N" => [9, "degree_N"], "Gdegree_R" => [9, "degree_R"], "Gdegree_S" => [9, "degree_S"], "Gdegree_W" => [9, "degree_W"], "Gdegree_c" => [9, "degree_c"], "Gdegree_east" => [9, "degree_east"], "Gdegree_f" => [9, "degree_f"], "Gdegree_north" => [9, "degree_north"], "Gdegree_south" => [9, "degree_south"], "Gdegree_west" => [9, "degree_west"], "Gdegrees_east" => [9, "degrees_east"], "Gdegrees_north" => [9, "degrees_north"], "Gdegrees_south" => [9, "degrees_south"], "Gdegrees_west" => [9, "degrees_west"], "Gdyn" => [9, "dyn"], "Gerg" => [9, "erg"], "Gforce" => [9, "force"], "Gg" => [9, "g"], "Ggravity" => [9, "gravity"], "Gh" => [9, "h"], "Ghg" => [9, "hg"], "Ghr" => [9, "hr"], "Gin" => [9, "in"], "Gkgf" => [9, "kgf"], "Gkph" => [9, "kph"], "Glb" => [9, "lb"], "Glm" => [9, "lm"], "Glx" => [9, "lx"], "Gly" => [9, "ly"], "Gm" => [9, "m"], "Gmb" => [9, "mb"], "Gmercury" => [9, "mercury"], "Gmgal" => [9, "mgal"], "Gmin" => [9, "min"], "Gmol" => [9, "mol"], "Gmon" => [9, "mon"], "Gmph" => [9, "mph"], "Gohm" => [9, "ohm"], "Goz" => [9, "oz"], "Gpc" => [9, "pc"], "Gpsi" => [9, "psi"], "Grad" => [9, "rad"], "Gs" => [9, "s"], "Gsr" => [9, "sr"], "Gt" => [9, "t"], "Gyr" => [9, "yr"], "Julians_year" => [0, "Julian_year"], "MA" => [6, "A"], "MAu" => [6, "Au"], "MBq" => [6, "Bq"], "MC" => [6, "C"], "MF" => [6, "F"], "MG" => [6, "G"], "MGal" => [6, "Gal"], "MGy" => [6, "Gy"], "MH" => [6, "H"], "MHg" => [6, "Hg"], "MHz" => [6, "Hz"], "MJ" => [6, "J"], "MK" => [6, "K"], "ML" => [6, "L"], "MN" => [6, "N"], "MP" => [6, "P"], "MPa" => [6, "Pa"], "MS" => [6, "S"], "MSt" => [6, "St"], "MSv" => [6, "Sv"], "MT" => [6, "T"], "MV" => [6, "V"], "MW" => [6, "W"], "MWb" => [6, "Wb"], "Ma" => [6, "a"], "Mac" => [6, "ac"], "Matm" => [6, "atm"], "Mbar" => [6, "bar"], "Mcal" => [6, "cal"], "Mcd" => [6, "cd"], "Mconventional_mercury" => [6, "conventional_mercury"], "MdegC" => [6, "degC"], "MdegF" => [6, "degF"], "Mdeg_C" => [6, "deg_C"], "Mdeg_F" => [6, "deg_F"], "MdegreeC" => [6, "degreeC"], "MdegreeF" => [6, "degreeF"], "Mdegree_C" => [6, "degree_C"], "Mdegree_E" => [6, "degree_E"], "Mdegree_F" => [6, "degree_F"], "Mdegree_N" => [6, "degree_N"], "Mdegree_R" => [6, "degree_R"], "Mdegree_S" => [6, "degree_S"], "Mdegree_W" => [6, "degree_W"], "Mdegree_c" => [6, "degree_c"], "Mdegree_east" => [6, "degree_east"], "Mdegree_f" => [6, "degree_f"], "Mdegree_north" => [6, "degree_north"], "Mdegree_south" => [6, "degree_south"], "Mdegree_west" => [6, "degree_west"], "Mdegrees_east" => [6, "degrees_east"], "Mdegrees_north" => [6, "degrees_north"], "Mdegrees_south" => [6, "degrees_south"], "Mdegrees_west" => [6, "degrees_west"], "Mdyn" => [6, "dyn"], "Merg" => [6, "erg"], "Mforce" => [6, "force"], "Mg" => [6, "g"], "Mgravity" => [6, "gravity"], "Mh" => [6, "h"], "Mhg" => [6, "hg"], "Mhr" => [6, "hr"], "Min" => [6, "in"], "Mkgf" => [6, "kgf"], "Mkph" => [6, "kph"], "Mlb" => [6, "lb"], "Mlm" => [6, "lm"], "Mlx" => [6, "lx"], "Mly" => [6, "ly"], "Mm" => [6, "m"], "Mmb" => [6, "mb"], "Mmercury" => [6, "mercury"], "Mmgal" => [6, "mgal"], "Mmin" => [6, "min"], "Mmol" => [6, "mol"], "Mmon" => [6, "mon"], "Mmph" => [6, "mph"], "Mohm" => [6, "ohm"], "Moz" => [6, "oz"], "Mpc" => [6, "pc"], "Mpsi" => [6, "psi"], "Mrad" => [6, "rad"], "Ms" => [6, "s"], "Msr" => [6, "sr"], "Mt" => [6, "t"], "Myr" => [6, "yr"], "PA" => [15, "A"], "PAu" => [15, "Au"], "PBq" => [15, "Bq"], "PC" => [15, "C"], "PF" => [15, "F"], "PG" => [15, "G"], "PGal" => [15, "Gal"], "PGy" => [15, "Gy"], "PH" => [15, "H"], "PHg" => [15, "Hg"], "PHz" => [15, "Hz"], "PJ" => [15, "J"], "PK" => [15, "K"], "PL" => [15, "L"], "PN" => [15, "N"], "PP" => [15, "P"], "PPa" => [15, "Pa"], "PS" => [15, "S"], "PSt" => [15, "St"], "PSv" => [15, "Sv"], "PT" => [15, "T"], "PV" => [15, "V"], "PW" => [15, "W"], "PWb" => [15, "Wb"], "Pa" => [15, "a"], "Pac" => [15, "ac"], "Pascals" => [0, "Pascal"], "Patm" => [15, "atm"], "Pbar" => [15, "bar"], "Pcal" => [15, "cal"], "Pcd" => [15, "cd"], "Pconventional_mercury" => [15, "conventional_mercury"], "PdegC" => [15, "degC"], "PdegF" => [15, "degF"], "Pdeg_C" => [15, "deg_C"], "Pdeg_F" => [15, "deg_F"], "PdegreeC" => [15, "degreeC"], "PdegreeF" => [15, "degreeF"], "Pdegree_C" => [15, "degree_C"], "Pdegree_E" => [15, "degree_E"], "Pdegree_F" => [15, "degree_F"], "Pdegree_N" => [15, "degree_N"], "Pdegree_R" => [15, "degree_R"], "Pdegree_S" => [15, "degree_S"], "Pdegree_W" => [15, "degree_W"], "Pdegree_c" => [15, "degree_c"], "Pdegree_east" => [15, "degree_east"], "Pdegree_f" => [15, "degree_f"], "Pdegree_north" => [15, "degree_north"], "Pdegree_south" => [15, "degree_south"], "Pdegree_west" => [15, "degree_west"], "Pdegrees_east" => [15, "degrees_east"], "Pdegrees_north" => [15, "degrees_north"], "Pdegrees_south" => [15, "degrees_south"], "Pdegrees_west" => [15, "degrees_west"], "Pdyn" => [15, "dyn"], "Perg" => [15, "erg"], "Pforce" => [15, "force"], "Pg" => [15, "g"], "Pgravity" => [15, "gravity"], "Ph" => [15, "h"], "Phg" => [15, "hg"], "Phr" => [15, "hr"], "Pin" => [15, "in"], "Pkgf" => [15, "kgf"], "Pkph" => [15, "kph"], "Plb" => [15, "lb"], "Plm" => [15, "lm"], "Plx" => [15, "lx"], "Ply" => [15, "ly"], "Pm" => [15, "m"], "Pmb" => [15, "mb"], "Pmercury" => [15, "mercury"], "Pmgal" => [15, "mgal"], "Pmin" => [15, "min"], "Pmol" => [15, "mol"], "Pmon" => [15, "mon"], "Pmph" => [15, "mph"], "Pohm" => [15, "ohm"], "Poz" => [15, "oz"], "Ppc" => [15, "pc"], "Ppsi" => [15, "psi"], "Prad" => [15, "rad"], "Ps" => [15, "s"], "Psr" => [15, "sr"], "Pt" => [15, "t"], "Pyr" => [15, "yr"], "TA" => [12, "A"], "TAu" => [12, "Au"], "TBq" => [12, "Bq"], "TC" => [12, "C"], "TF" => [12, "F"], "TG" => [12, "G"], "TGal" => [12, "Gal"], "TGy" => [12, "Gy"], "TH" => [12, "H"], "THg" => [12, "Hg"], "THz" => [12, "Hz"], "TJ" => [12, "J"], "TK" => [12, "K"], "TL" => [12, "L"], "TN" => [12, "N"], "TP" => [12, "P"], "TPa" => [12, "Pa"], "TS" => [12, "S"], "TSt" => [12, "St"], "TSv" => [12, "Sv"], "TT" => [12, "T"], "TV" => [12, "V"], "TW" => [12, "W"], "TWb" => [12, "Wb"], "Ta" => [12, "a"], "Tac" => [12, "ac"], "Tatm" => [12, "atm"], "Tbar" => [12, "bar"], "Tcal" => [12, "cal"], "Tcd" => [12, "cd"], "Tconventional_mercury" => [12, "conventional_mercury"], "TdegC" => [12, "degC"], "TdegF" => [12, "degF"], "Tdeg_C" => [12, "deg_C"], "Tdeg_F" => [12, "deg_F"], "TdegreeC" => [12, "degreeC"], "TdegreeF" => [12, "degreeF"], "Tdegree_C" => [12, "degree_C"], "Tdegree_E" => [12, "degree_E"], "Tdegree_F" => [12, "degree_F"], "Tdegree_N" => [12, "degree_N"], "Tdegree_R" => [12, "degree_R"], "Tdegree_S" => [12, "degree_S"], "Tdegree_W" => [12, "degree_W"], "Tdegree_c" => [12, "degree_c"], "Tdegree_east" => [12, "degree_east"], "Tdegree_f" => [12, "degree_f"], "Tdegree_north" => [12, "degree_north"], "Tdegree_south" => [12, "degree_south"], "Tdegree_west" => [12, "degree_west"], "Tdegrees_east" => [12, "degrees_east"], "Tdegrees_north" => [12, "degrees_north"], "Tdegrees_south" => [12, "degrees_south"], "Tdegrees_west" => [12, "degrees_west"], "Tdyn" => [12, "dyn"], "Terg" => [12, "erg"], "Tforce" => [12, "force"], "Tg" => [12, "g"], "Tgravity" => [12, "gravity"], "Th" => [12, "h"], "Thg" => [12, "hg"], "Thr" => [12, "hr"], "Tin" => [12, "in"], "Tkgf" => [12, "kgf"], "Tkph" => [12, "kph"], "Tlb" => [12, "lb"], "Tlm" => [12, "lm"], "Tlx" => [12, "lx"], "Tly" => [12, "ly"], "Tm" => [12, "m"], "Tmb" => [12, "mb"], "Tmercury" => [12, "mercury"], "Tmgal" => [12, "mgal"], "Tmin" => [12, "min"], "Tmol" => [12, "mol"], "Tmon" => [12, "mon"], "Tmph" => [12, "mph"], "Tohm" => [12, "ohm"], "Toz" => [12, "oz"], "Tpc" => [12, "pc"], "Tpsi" => [12, "psi"], "Trad" => [12, "rad"], "Ts" => [12, "s"], "Tsr" => [12, "sr"], "Tt" => [12, "t"], "Tyr" => [12, "yr"], "aA" => [-18, "A"], "aAu" => [-18, "Au"], "aBq" => [-18, "Bq"], "aC" => [-18, "C"], "aF" => [-18, "F"], "aG" => [-18, "G"], "aGal" => [-18, "Gal"], "aGy" => [-18, "Gy"], "aH" => [-18, "H"], "aHg" => [-18, "Hg"], "aHz" => [-18, "Hz"], "aJ" => [-18, "J"], "aK" => [-18, "K"], "aL" => [-18, "L"], "aN" => [-18, "N"], "aP" => [-18, "P"], "aPa" => [-18, "Pa"], "aS" => [-18, "S"], "aSt" => [-18, "St"], "aSv" => [-18, "Sv"], "aT" => [-18, "T"], "aV" => [-18, "V"], "aW" => [-18, "W"], "aWb" => [-18, "Wb"], "aa" => [-18, "a"], "aac" => [-18, "ac"], "aatm" => [-18, "atm"], "abar" => [-18, "bar"], "acal" => [-18, "cal"], "acd" => [-18, "cd"], "aconventional_mercury" => [-18, "conventional_mercury"], "acres" => [0, "acre"], "adegC" => [-18, "degC"], "adegF" => [-18, "degF"], "adeg_C" => [-18, "deg_C"], "adeg_F" => [-18, "deg_F"], "adegreeC" => [-18, "degreeC"], "adegreeF" => [-18, "degreeF"], "adegree_C" => [-18, "degree_C"], "adegree_E" => [-18, "degree_E"], "adegree_F" => [-18, "degree_F"], "adegree_N" => [-18, "degree_N"], "adegree_R" => [-18, "degree_R"], "adegree_S" => [-18, "degree_S"], "adegree_W" => [-18, "degree_W"], "adegree_c" => [-18, "degree_c"], "adegree_east" => [-18, "degree_east"], "adegree_f" => [-18, "degree_f"], "adegree_north" => [-18, "degree_north"], "adegree_south" => [-18, "degree_south"], "adegree_west" => [-18, "degree_west"], "adegrees_east" => [-18, "degrees_east"], "adegrees_north" => [-18, "degrees_north"], "adegrees_south" => [-18, "degrees_south"], "adegrees_west" => [-18, "degrees_west"], "adyn" => [-18, "dyn"], "aerg" => [-18, "erg"], "aforce" => [-18, "force"], "ag" => [-18, "g"], "agravity" => [-18, "gravity"], "ah" => [-18, "h"], "ahg" => [-18, "hg"], "ahr" => [-18, "hr"], "ain" => [-18, "in"], "akgf" => [-18, "kgf"], "akph" => [-18, "kph"], "alb" => [-18, "lb"], "alm" => [-18, "lm"], "alx" => [-18, "lx"], "aly" => [-18, "ly"], "am" => [-18, "m"], "amb" => [-18, "mb"], "amercury" => [-18, "mercury"], "amgal" => [-18, "mgal"], "amin" => [-18, "min"], "amol" => [-18, "mol"], "amon" => [-18, "mon"], "amperes" => [0, "ampere"], "amph" => [-18, "mph"], "angstroms" => [0, "angstrom"], "angulars_degree" => [0, "angular_degree"], "angulars_minute" => [0, "angular_minute"], "angulars_second" => [0, "angular_second"], "aohm" => [-18, "ohm"], "aoz" => [-18, "oz"], "apc" => [-18, "pc"], "apsi" => [-18, "psi"], "arad" => [-18, "rad"], "ares" => [0, "are"], "as" => [-18, "s"], "asr" => [-18, "sr"], "at" => [-18, "t"], "atmospheres" => [0, "atmosphere"], "attoCelsius" => [-18, "Celsius"], "attoFahrenheit" => [-18, "Fahrenheit"], "attoJulian_year" => [-18, "Julian_year"], "attoPascal" => [-18, "Pascal"], "attoacre" => [-18, "acre"], "attoampere" => [-18, "ampere"], "attoangstrom" => [-18, "angstrom"], "attoangular_degree" => [-18, "angular_degree"], "attoangular_minute" => [-18, "angular_minute"], "attoangular_second" => [-18, "angular_second"], "attoare" => [-18, "are"], "attoatmosphere" => [-18, "atmosphere"], "attocalorie" => [-18, "calorie"], "attocandela" => [-18, "candela"], "attocelsius" => [-18, "celsius"], "attocentigrade" => [-18, "centigrade"], "attocentury" => [-18, "century"], "attochain" => [-18, "chain"], "attocommon_year" => [-18, "common_year"], "attocoulomb" => [-18, "coulomb"], "attoday" => [-18, "day"], "attodegK" => [-18, "degK"], "attodeg_K" => [-18, "deg_K"], "attodegree" => [-18, "degree"], "attodegreeK" => [-18, "degreeK"], "attodyne" => [-18, "dyne"], "attoerg" => [-18, "erg"], "attofahrenheit" => [-18, "fahrenheit"], "attofarad" => [-18, "farad"], "attofermi" => [-18, "fermi"], "attogal" => [-18, "gal"], "attogauss" => [-18, "gauss"], "attogram" => [-18, "gram"], "attohectare" => [-18, "hectare"], "attohertz" => [-18, "hertz"], "attohour" => [-18, "hour"], "attoinch" => [-18, "inch"], "attojoule" => [-18, "joule"], "attokelvin" => [-18, "kelvin"], "attokilogram" => [-18, "kilogram"], "attoknot" => [-18, "knot"], "attolitre" => [-18, "litre"], "attometer" => [-18, "meter"], "attometre" => [-18, "metre"], "attomicron" => [-18, "micron"], "attomile" => [-18, "mile"], "attomillibar" => [-18, "millibar"], "attominute" => [-18, "minute"], "attominute_angle" => [-18, "minute_angle"], "attomole" => [-18, "mole"], "attomonth" => [-18, "month"], "attonewton" => [-18, "newton"], "attoounce" => [-18, "ounce"], "attoparsec" => [-18, "parsec"], "attopascal" => [-18, "pascal"], "attopentad" => [-18, "pentad"], "attopercent" => [-18, "percent"], "attopoise" => [-18, "poise"], "attopound" => [-18, "pound"], "attoradian" => [-18, "radian"], "attosecond" => [-18, "second"], "attosecond_angle" => [-18, "second_angle"], "attosteradian" => [-18, "steradian"], "attostokes" => [-18, "stokes"], "attotesla" => [-18, "tesla"], "attoton" => [-18, "ton"], "attotonne" => [-18, "tonne"], "attotorr" => [-18, "torr"], "attovolt" => [-18, "volt"], "attowatt" => [-18, "watt"], "attoweber" => [-18, "weber"], "attoyard" => [-18, "yard"], "attoyd" => [-18, "yd"], "attoyear" => [-18, "year"], "ayr" => [-18, "yr"], "cA" => [-2, "A"], "cAu" => [-2, "Au"], "cBq" => [-2, "Bq"], "cC" => [-2, "C"], "cF" => [-2, "F"], "cG" => [-2, "G"], "cGal" => [-2, "Gal"], "cGy" => [-2, "Gy"], "cH" => [-2, "H"], "cHg" => [-2, "Hg"], "cHz" => [-2, "Hz"], "cJ" => [-2, "J"], "cK" => [-2, "K"], "cL" => [-2, "L"], "cN" => [-2, "N"], "cP" => [-2, "P"], "cPa" => [-2, "Pa"], "cS" => [-2, "S"], "cSt" => [-2, "St"], "cSv" => [-2, "Sv"], "cT" => [-2, "T"], "cV" => [-2, "V"], "cW" => [-2, "W"], "cWb" => [-2, "Wb"], "ca" => [-2, "a"], "cac" => [-2, "ac"], "calories" => [0, "calorie"], "candelas" => [0, "candela"], "catm" => [-2, "atm"], "cbar" => [-2, "bar"], "ccal" => [-2, "cal"], "ccd" => [-2, "cd"], "cconventional_mercury" => [-2, "conventional_mercury"], "cdegC" => [-2, "degC"], "cdegF" => [-2, "degF"], "cdeg_C" => [-2, "deg_C"], "cdeg_F" => [-2, "deg_F"], "cdegreeC" => [-2, "degreeC"], "cdegreeF" => [-2, "degreeF"], "cdegree_C" => [-2, "degree_C"], "cdegree_E" => [-2, "degree_E"], "cdegree_F" => [-2, "degree_F"], "cdegree_N" => [-2, "degree_N"], "cdegree_R" => [-2, "degree_R"], "cdegree_S" => [-2, "degree_S"], "cdegree_W" => [-2, "degree_W"], "cdegree_c" => [-2, "degree_c"], "cdegree_east" => [-2, "degree_east"], "cdegree_f" => [-2, "degree_f"], "cdegree_north" => [-2, "degree_north"], "cdegree_south" => [-2, "degree_south"], "cdegree_west" => [-2, "degree_west"], "cdegrees_east" => [-2, "degrees_east"], "cdegrees_north" => [-2, "degrees_north"], "cdegrees_south" => [-2, "degrees_south"], "cdegrees_west" => [-2, "degrees_west"], "cdyn" => [-2, "dyn"], "celsiuses" => [0, "celsius"], "centiCelsius" => [-2, "Celsius"], "centiFahrenheit" => [-2, "Fahrenheit"], "centiJulian_year" => [-2, "Julian_year"], "centiPascal" => [-2, "Pascal"], "centiacre" => [-2, "acre"], "centiampere" => [-2, "ampere"], "centiangstrom" => [-2, "angstrom"], "centiangular_degree" => [-2, "angular_degree"], "centiangular_minute" => [-2, "angular_minute"], "centiangular_second" => [-2, "angular_second"], "centiare" => [-2, "are"], "centiatmosphere" => [-2, "atmosphere"], "centicalorie" => [-2, "calorie"], "centicandela" => [-2, "candela"], "centicelsius" => [-2, "celsius"], "centicentigrade" => [-2, "centigrade"], "centicentury" => [-2, "century"], "centichain" => [-2, "chain"], "centicommon_year" => [-2, "common_year"], "centicoulomb" => [-2, "coulomb"], "centiday" => [-2, "day"], "centidegK" => [-2, "degK"], "centideg_K" => [-2, "deg_K"], "centidegree" => [-2, "degree"], "centidegreeK" => [-2, "degreeK"], "centidyne" => [-2, "dyne"], "centierg" => [-2, "erg"], "centifahrenheit" => [-2, "fahrenheit"], "centifarad" => [-2, "farad"], "centifermi" => [-2, "fermi"], "centigal" => [-2, "gal"], "centigauss" => [-2, "gauss"], "centigrades" => [0, "centigrade"], "centigram" => [-2, "gram"], "centihectare" => [-2, "hectare"], "centihertz" => [-2, "hertz"], "centihour" => [-2, "hour"], "centiinch" => [-2, "inch"], "centijoule" => [-2, "joule"], "centikelvin" => [-2, "kelvin"], "centikilogram" => [-2, "kilogram"], "centiknot" => [-2, "knot"], "centilitre" => [-2, "litre"], "centimeter" => [-2, "meter"], "centimetre" => [-2, "metre"], "centimicron" => [-2, "micron"], "centimile" => [-2, "mile"], "centimillibar" => [-2, "millibar"], "centiminute" => [-2, "minute"], "centiminute_angle" => [-2, "minute_angle"], "centimole" => [-2, "mole"], "centimonth" => [-2, "month"], "centinewton" => [-2, "newton"], "centiounce" => [-2, "ounce"], "centiparsec" => [-2, "parsec"], "centipascal" => [-2, "pascal"], "centipentad" => [-2, "pentad"], "centipercent" => [-2, "percent"], "centipoise" => [-2, "poise"], "centipound" => [-2, "pound"], "centiradian" => [-2, "radian"], "centisecond" => [-2, "second"], "centisecond_angle" => [-2, "second_angle"], "centisteradian" => [-2, "steradian"], "centistokes" => [-2, "stokes"], "centitesla" => [-2, "tesla"], "centiton" => [-2, "ton"], "centitonne" => [-2, "tonne"], "centitorr" => [-2, "torr"], "centivolt" => [-2, "volt"], "centiwatt" => [-2, "watt"], "centiweber" => [-2, "weber"], "centiyard" => [-2, "yard"], "centiyd" => [-2, "yd"], "centiyear" => [-2, "year"], "centuries" => [0, "century"], "cerg" => [-2, "erg"], "cforce" => [-2, "force"], "cg" => [-2, "g"], "cgravity" => [-2, "gravity"], "ch" => [-2, "h"], "chains" => [0, "chain"], "chg" => [-2, "hg"], "chr" => [-2, "hr"], "cin" => [-2, "in"], "ckgf" => [-2, "kgf"], "ckph" => [-2, "kph"], "clb" => [-2, "lb"], "clm" => [-2, "lm"], "clx" => [-2, "lx"], "cly" => [-2, "ly"], "cm" => [-2, "m"], "cmb" => [-2, "mb"], "cmercury" => [-2, "mercury"], "cmgal" => [-2, "mgal"], "cmin" => [-2, "min"], "cmol" => [-2, "mol"], "cmon" => [-2, "mon"], "cmph" => [-2, "mph"], "cohm" => [-2, "ohm"], "commons_year" => [0, "common_year"], "coulombs" => [0, "coulomb"], "coz" => [-2, "oz"], "cpc" => [-2, "pc"], "cpsi" => [-2, "psi"], "crad" => [-2, "rad"], "cs" => [-2, "s"], "csr" => [-2, "sr"], "ct" => [-2, "t"], "cyr" => [-2, "yr"], "dA" => [-1, "A"], "dAu" => [-1, "Au"], "dBq" => [-1, "Bq"], "dC" => [-1, "C"], "dF" => [-1, "F"], "dG" => [-1, "G"], "dGal" => [-1, "Gal"], "dGy" => [-1, "Gy"], "dH" => [-1, "H"], "dHg" => [-1, "Hg"], "dHz" => [-1, "Hz"], "dJ" => [-1, "J"], "dK" => [-1, "K"], "dL" => [-1, "L"], "dN" => [-1, "N"], "dP" => [-1, "P"], "dPa" => [-1, "Pa"], "dS" => [-1, "S"], "dSt" => [-1, "St"], "dSv" => [-1, "Sv"], "dT" => [-1, "T"], "dV" => [-1, "V"], "dW" => [-1, "W"], "dWb" => [-1, "Wb"], "da" => [-1, "a"], "daA" => [1, "A"], "daAu" => [1, "Au"], "daBq" => [1, "Bq"], "daC" => [1, "C"], "daF" => [1, "F"], "daG" => [1, "G"], "daGal" => [1, "Gal"], "daGy" => [1, "Gy"], "daH" => [1, "H"], "daHg" => [1, "Hg"], "daHz" => [1, "Hz"], "daJ" => [1, "J"], "daK" => [1, "K"], "daL" => [1, "L"], "daN" => [1, "N"], "daP" => [1, "P"], "daPa" => [1, "Pa"], "daS" => [1, "S"], "daSt" => [1, "St"], "daSv" => [1, "Sv"], "daT" => [1, "T"], "daV" => [1, "V"], "daW" => [1, "W"], "daWb" => [1, "Wb"], "daa" => [1, "a"], "daac" => [1, "ac"], "daatm" => [1, "atm"], "dabar" => [1, "bar"], "dac" => [-1, "ac"], "dacal" => [1, "cal"], "dacd" => [1, "cd"], "daconventional_mercury" => [1, "conventional_mercury"], "dadegC" => [1, "degC"], "dadegF" => [1, "degF"], "dadeg_C" => [1, "deg_C"], "dadeg_F" => [1, "deg_F"], "dadegreeC" => [1, "degreeC"], "dadegreeF" => [1, "degreeF"], "dadegree_C" => [1, "degree_C"], "dadegree_E" => [1, "degree_E"], "dadegree_F" => [1, "degree_F"], "dadegree_N" => [1, "degree_N"], "dadegree_R" => [1, "degree_R"], "dadegree_S" => [1, "degree_S"], "dadegree_W" => [1, "degree_W"], "dadegree_c" => [1, "degree_c"], "dadegree_east" => [1, "degree_east"], "dadegree_f" => [1, "degree_f"], "dadegree_north" => [1, "degree_north"], "dadegree_south" => [1, "degree_south"], "dadegree_west" => [1, "degree_west"], "dadegrees_east" => [1, "degrees_east"], "dadegrees_north" => [1, "degrees_north"], "dadegrees_south" => [1, "degrees_south"], "dadegrees_west" => [1, "degrees_west"], "dadyn" => [1, "dyn"], "daerg" => [1, "erg"], "daforce" => [1, "force"], "dag" => [1, "g"], "dagravity" => [1, "gravity"], "dah" => [1, "h"], "dahg" => [1, "hg"], "dahr" => [1, "hr"], "dain" => [1, "in"], "dakgf" => [1, "kgf"], "dakph" => [1, "kph"], "dalb" => [1, "lb"], "dalm" => [1, "lm"], "dalx" => [1, "lx"], "daly" => [1, "ly"], "dam" => [1, "m"], "damb" => [1, "mb"], "damercury" => [1, "mercury"], "damgal" => [1, "mgal"], "damin" => [1, "min"], "damol" => [1, "mol"], "damon" => [1, "mon"], "damph" => [1, "mph"], "daohm" => [1, "ohm"], "daoz" => [1, "oz"], "dapc" => [1, "pc"], "dapsi" => [1, "psi"], "darad" => [1, "rad"], "das" => [1, "s"], "dasr" => [1, "sr"], "dat" => [1, "t"], "datm" => [-1, "atm"], "dayr" => [1, "yr"], "days" => [0, "day"], "dbar" => [-1, "bar"], "dcal" => [-1, "cal"], "dcd" => [-1, "cd"], "dconventional_mercury" => [-1, "conventional_mercury"], "ddegC" => [-1, "degC"], "ddegF" => [-1, "degF"], "ddeg_C" => [-1, "deg_C"], "ddeg_F" => [-1, "deg_F"], "ddegreeC" => [-1, "degreeC"], "ddegreeF" => [-1, "degreeF"], "ddegree_C" => [-1, "degree_C"], "ddegree_E" => [-1, "degree_E"], "ddegree_F" => [-1, "degree_F"], "ddegree_N" => [-1, "degree_N"], "ddegree_R" => [-1, "degree_R"], "ddegree_S" => [-1, "degree_S"], "ddegree_W" => [-1, "degree_W"], "ddegree_c" => [-1, "degree_c"], "ddegree_east" => [-1, "degree_east"], "ddegree_f" => [-1, "degree_f"], "ddegree_north" => [-1, "degree_north"], "ddegree_south" => [-1, "degree_south"], "ddegree_west" => [-1, "degree_west"], "ddegrees_east" => [-1, "degrees_east"], "ddegrees_north" => [-1, "degrees_north"], "ddegrees_south" => [-1, "degrees_south"], "ddegrees_west" => [-1, "degrees_west"], "ddyn" => [-1, "dyn"], "decaCelsius" => [1, "Celsius"], "decaFahrenheit" => [1, "Fahrenheit"], "decaJulian_year" => [1, "Julian_year"], "decaPascal" => [1, "Pascal"], "decaacre" => [1, "acre"], "decaampere" => [1, "ampere"], "decaangstrom" => [1, "angstrom"], "decaangular_degree" => [1, "angular_degree"], "decaangular_minute" => [1, "angular_minute"], "decaangular_second" => [1, "angular_second"], "decaare" => [1, "are"], "decaatmosphere" => [1, "atmosphere"], "decacalorie" => [1, "calorie"], "decacandela" => [1, "candela"], "decacelsius" => [1, "celsius"], "decacentigrade" => [1, "centigrade"], "decacentury" => [1, "century"], "decachain" => [1, "chain"], "decacommon_year" => [1, "common_year"], "decacoulomb" => [1, "coulomb"], "decaday" => [1, "day"], "decadegK" => [1, "degK"], "decadeg_K" => [1, "deg_K"], "decadegree" => [1, "degree"], "decadegreeK" => [1, "degreeK"], "decadyne" => [1, "dyne"], "decaerg" => [1, "erg"], "decafahrenheit" => [1, "fahrenheit"], "decafarad" => [1, "farad"], "decafermi" => [1, "fermi"], "decagal" => [1, "gal"], "decagauss" => [1, "gauss"], "decagram" => [1, "gram"], "decahectare" => [1, "hectare"], "decahertz" => [1, "hertz"], "decahour" => [1, "hour"], "decainch" => [1, "inch"], "decajoule" => [1, "joule"], "decakelvin" => [1, "kelvin"], "decakilogram" => [1, "kilogram"], "decaknot" => [1, "knot"], "decalitre" => [1, "litre"], "decameter" => [1, "meter"], "decametre" => [1, "metre"], "decamicron" => [1, "micron"], "decamile" => [1, "mile"], "decamillibar" => [1, "millibar"], "decaminute" => [1, "minute"], "decaminute_angle" => [1, "minute_angle"], "decamole" => [1, "mole"], "decamonth" => [1, "month"], "decanewton" => [1, "newton"], "decaounce" => [1, "ounce"], "decaparsec" => [1, "parsec"], "decapascal" => [1, "pascal"], "decapentad" => [1, "pentad"], "decapercent" => [1, "percent"], "decapoise" => [1, "poise"], "decapound" => [1, "pound"], "decaradian" => [1, "radian"], "decasecond" => [1, "second"], "decasecond_angle" => [1, "second_angle"], "decasteradian" => [1, "steradian"], "decastokes" => [1, "stokes"], "decatesla" => [1, "tesla"], "decaton" => [1, "ton"], "decatonne" => [1, "tonne"], "decatorr" => [1, "torr"], "decavolt" => [1, "volt"], "decawatt" => [1, "watt"], "decaweber" => [1, "weber"], "decayard" => [1, "yard"], "decayd" => [1, "yd"], "decayear" => [1, "year"], "deciCelsius" => [-1, "Celsius"], "deciFahrenheit" => [-1, "Fahrenheit"], "deciJulian_year" => [-1, "Julian_year"], "deciPascal" => [-1, "Pascal"], "deciacre" => [-1, "acre"], "deciampere" => [-1, "ampere"], "deciangstrom" => [-1, "angstrom"], "deciangular_degree" => [-1, "angular_degree"], "deciangular_minute" => [-1, "angular_minute"], "deciangular_second" => [-1, "angular_second"], "deciare" => [-1, "are"], "deciatmosphere" => [-1, "atmosphere"], "decicalorie" => [-1, "calorie"], "decicandela" => [-1, "candela"], "decicelsius" => [-1, "celsius"], "decicentigrade" => [-1, "centigrade"], "decicentury" => [-1, "century"], "decichain" => [-1, "chain"], "decicommon_year" => [-1, "common_year"], "decicoulomb" => [-1, "coulomb"], "deciday" => [-1, "day"], "decidegK" => [-1, "degK"], "decideg_K" => [-1, "deg_K"], "decidegree" => [-1, "degree"], "decidegreeK" => [-1, "degreeK"], "decidyne" => [-1, "dyne"], "decierg" => [-1, "erg"], "decifahrenheit" => [-1, "fahrenheit"], "decifarad" => [-1, "farad"], "decifermi" => [-1, "fermi"], "decigal" => [-1, "gal"], "decigauss" => [-1, "gauss"], "decigram" => [-1, "gram"], "decihectare" => [-1, "hectare"], "decihertz" => [-1, "hertz"], "decihour" => [-1, "hour"], "deciinch" => [-1, "inch"], "decijoule" => [-1, "joule"], "decikelvin" => [-1, "kelvin"], "decikilogram" => [-1, "kilogram"], "deciknot" => [-1, "knot"], "decilitre" => [-1, "litre"], "decimeter" => [-1, "meter"], "decimetre" => [-1, "metre"], "decimicron" => [-1, "micron"], "decimile" => [-1, "mile"], "decimillibar" => [-1, "millibar"], "deciminute" => [-1, "minute"], "deciminute_angle" => [-1, "minute_angle"], "decimole" => [-1, "mole"], "decimonth" => [-1, "month"], "decinewton" => [-1, "newton"], "deciounce" => [-1, "ounce"], "deciparsec" => [-1, "parsec"], "decipascal" => [-1, "pascal"], "decipentad" => [-1, "pentad"], "decipercent" => [-1, "percent"], "decipoise" => [-1, "poise"], "decipound" => [-1, "pound"], "deciradian" => [-1, "radian"], "decisecond" => [-1, "second"], "decisecond_angle" => [-1, "second_angle"], "decisteradian" => [-1, "steradian"], "decistokes" => [-1, "stokes"], "decitesla" => [-1, "tesla"], "deciton" => [-1, "ton"], "decitonne" => [-1, "tonne"], "decitorr" => [-1, "torr"], "decivolt" => [-1, "volt"], "deciwatt" => [-1, "watt"], "deciweber" => [-1, "weber"], "deciyard" => [-1, "yard"], "deciyd" => [-1, "yd"], "deciyear" => [-1, "year"], "degKs" => [0, "degK"], "degreeKs" => [0, "degreeK"], "degrees" => [0, "degree"], "degs_K" => [0, "deg_K"], "derg" => [-1, "erg"], "dforce" => [-1, "force"], "dg" => [-1, "g"], "dgravity" => [-1, "gravity"], "dh" => [-1, "h"], "dhg" => [-1, "hg"], "dhr" => [-1, "hr"], "din" => [-1, "in"], "dkgf" => [-1, "kgf"], "dkph" => [-1, "kph"], "dlb" => [-1, "lb"], "dlm" => [-1, "lm"], "dlx" => [-1, "lx"], "dly" => [-1, "ly"], "dm" => [-1, "m"], "dmb" => [-1, "mb"], "dmercury" => [-1, "mercury"], "dmgal" => [-1, "mgal"], "dmin" => [-1, "min"], "dmol" => [-1, "mol"], "dmon" => [-1, "mon"], "dmph" => [-1, "mph"], "dohm" => [-1, "ohm"], "doz" => [-1, "oz"], "dpc" => [-1, "pc"], "dpsi" => [-1, "psi"], "drad" => [-1, "rad"], "ds" => [-1, "s"], "dsr" => [-1, "sr"], "dt" => [-1, "t"], "dynes" => [0, "dyne"], "dyr" => [-1, "yr"], "ergs" => [0, "erg"], "exaCelsius" => [18, "Celsius"], "exaFahrenheit" => [18, "Fahrenheit"], "exaJulian_year" => [18, "Julian_year"], "exaPascal" => [18, "Pascal"], "exaacre" => [18, "acre"], "exaampere" => [18, "ampere"], "exaangstrom" => [18, "angstrom"], "exaangular_degree" => [18, "angular_degree"], "exaangular_minute" => [18, "angular_minute"], "exaangular_second" => [18, "angular_second"], "exaare" => [18, "are"], "exaatmosphere" => [18, "atmosphere"], "exacalorie" => [18, "calorie"], "exacandela" => [18, "candela"], "exacelsius" => [18, "celsius"], "exacentigrade" => [18, "centigrade"], "exacentury" => [18, "century"], "exachain" => [18, "chain"], "exacommon_year" => [18, "common_year"], "exacoulomb" => [18, "coulomb"], "exaday" => [18, "day"], "exadegK" => [18, "degK"], "exadeg_K" => [18, "deg_K"], "exadegree" => [18, "degree"], "exadegreeK" => [18, "degreeK"], "exadyne" => [18, "dyne"], "exaerg" => [18, "erg"], "exafahrenheit" => [18, "fahrenheit"], "exafarad" => [18, "farad"], "exafermi" => [18, "fermi"], "exagal" => [18, "gal"], "exagauss" => [18, "gauss"], "exagram" => [18, "gram"], "exahectare" => [18, "hectare"], "exahertz" => [18, "hertz"], "exahour" => [18, "hour"], "exainch" => [18, "inch"], "exajoule" => [18, "joule"], "exakelvin" => [18, "kelvin"], "exakilogram" => [18, "kilogram"], "exaknot" => [18, "knot"], "exalitre" => [18, "litre"], "exameter" => [18, "meter"], "exametre" => [18, "metre"], "examicron" => [18, "micron"], "examile" => [18, "mile"], "examillibar" => [18, "millibar"], "examinute" => [18, "minute"], "examinute_angle" => [18, "minute_angle"], "examole" => [18, "mole"], "examonth" => [18, "month"], "exanewton" => [18, "newton"], "exaounce" => [18, "ounce"], "exaparsec" => [18, "parsec"], "exapascal" => [18, "pascal"], "exapentad" => [18, "pentad"], "exapercent" => [18, "percent"], "exapoise" => [18, "poise"], "exapound" => [18, "pound"], "exaradian" => [18, "radian"], "exasecond" => [18, "second"], "exasecond_angle" => [18, "second_angle"], "exasteradian" => [18, "steradian"], "exastokes" => [18, "stokes"], "exatesla" => [18, "tesla"], "exaton" => [18, "ton"], "exatonne" => [18, "tonne"], "exatorr" => [18, "torr"], "exavolt" => [18, "volt"], "exawatt" => [18, "watt"], "exaweber" => [18, "weber"], "exayard" => [18, "yard"], "exayd" => [18, "yd"], "exayear" => [18, "year"], "fA" => [-15, "A"], "fAu" => [-15, "Au"], "fBq" => [-15, "Bq"], "fC" => [-15, "C"], "fF" => [-15, "F"], "fG" => [-15, "G"], "fGal" => [-15, "Gal"], "fGy" => [-15, "Gy"], "fH" => [-15, "H"], "fHg" => [-15, "Hg"], "fHz" => [-15, "Hz"], "fJ" => [-15, "J"], "fK" => [-15, "K"], "fL" => [-15, "L"], "fN" => [-15, "N"], "fP" => [-15, "P"], "fPa" => [-15, "Pa"], "fS" => [-15, "S"], "fSt" => [-15, "St"], "fSv" => [-15, "Sv"], "fT" => [-15, "T"], "fV" => [-15, "V"], "fW" => [-15, "W"], "fWb" => [-15, "Wb"], "fa" => [-15, "a"], "fac" => [-15, "ac"], "fahrenheits" => [0, "fahrenheit"], "farads" => [0, "farad"], "fatm" => [-15, "atm"], "fbar" => [-15, "bar"], "fcal" => [-15, "cal"], "fcd" => [-15, "cd"], "fconventional_mercury" => [-15, "conventional_mercury"], "fdegC" => [-15, "degC"], "fdegF" => [-15, "degF"], "fdeg_C" => [-15, "deg_C"], "fdeg_F" => [-15, "deg_F"], "fdegreeC" => [-15, "degreeC"], "fdegreeF" => [-15, "degreeF"], "fdegree_C" => [-15, "degree_C"], "fdegree_E" => [-15, "degree_E"], "fdegree_F" => [-15, "degree_F"], "fdegree_N" => [-15, "degree_N"], "fdegree_R" => [-15, "degree_R"], "fdegree_S" => [-15, "degree_S"], "fdegree_W" => [-15, "degree_W"], "fdegree_c" => [-15, "degree_c"], "fdegree_east" => [-15, "degree_east"], "fdegree_f" => [-15, "degree_f"], "fdegree_north" => [-15, "degree_north"], "fdegree_south" => [-15, "degree_south"], "fdegree_west" => [-15, "degree_west"], "fdegrees_east" => [-15, "degrees_east"], "fdegrees_north" => [-15, "degrees_north"], "fdegrees_south" => [-15, "degrees_south"], "fdegrees_west" => [-15, "degrees_west"], "fdyn" => [-15, "dyn"], "femtoCelsius" => [-15, "Celsius"], "femtoFahrenheit" => [-15, "Fahrenheit"], "femtoJulian_year" => [-15, "Julian_year"], "femtoPascal" => [-15, "Pascal"], "femtoacre" => [-15, "acre"], "femtoampere" => [-15, "ampere"], "femtoangstrom" => [-15, "angstrom"], "femtoangular_degree" => [-15, "angular_degree"], "femtoangular_minute" => [-15, "angular_minute"], "femtoangular_second" => [-15, "angular_second"], "femtoare" => [-15, "are"], "femtoatmosphere" => [-15, "atmosphere"], "femtocalorie" => [-15, "calorie"], "femtocandela" => [-15, "candela"], "femtocelsius" => [-15, "celsius"], "femtocentigrade" => [-15, "centigrade"], "femtocentury" => [-15, "century"], "femtochain" => [-15, "chain"], "femtocommon_year" => [-15, "common_year"], "femtocoulomb" => [-15, "coulomb"], "femtoday" => [-15, "day"], "femtodegK" => [-15, "degK"], "femtodeg_K" => [-15, "deg_K"], "femtodegree" => [-15, "degree"], "femtodegreeK" => [-15, "degreeK"], "femtodyne" => [-15, "dyne"], "femtoerg" => [-15, "erg"], "femtofahrenheit" => [-15, "fahrenheit"], "femtofarad" => [-15, "farad"], "femtofermi" => [-15, "fermi"], "femtogal" => [-15, "gal"], "femtogauss" => [-15, "gauss"], "femtogram" => [-15, "gram"], "femtohectare" => [-15, "hectare"], "femtohertz" => [-15, "hertz"], "femtohour" => [-15, "hour"], "femtoinch" => [-15, "inch"], "femtojoule" => [-15, "joule"], "femtokelvin" => [-15, "kelvin"], "femtokilogram" => [-15, "kilogram"], "femtoknot" => [-15, "knot"], "femtolitre" => [-15, "litre"], "femtometer" => [-15, "meter"], "femtometre" => [-15, "metre"], "femtomicron" => [-15, "micron"], "femtomile" => [-15, "mile"], "femtomillibar" => [-15, "millibar"], "femtominute" => [-15, "minute"], "femtominute_angle" => [-15, "minute_angle"], "femtomole" => [-15, "mole"], "femtomonth" => [-15, "month"], "femtonewton" => [-15, "newton"], "femtoounce" => [-15, "ounce"], "femtoparsec" => [-15, "parsec"], "femtopascal" => [-15, "pascal"], "femtopentad" => [-15, "pentad"], "femtopercent" => [-15, "percent"], "femtopoise" => [-15, "poise"], "femtopound" => [-15, "pound"], "femtoradian" => [-15, "radian"], "femtosecond" => [-15, "second"], "femtosecond_angle" => [-15, "second_angle"], "femtosteradian" => [-15, "steradian"], "femtostokes" => [-15, "stokes"], "femtotesla" => [-15, "tesla"], "femtoton" => [-15, "ton"], "femtotonne" => [-15, "tonne"], "femtotorr" => [-15, "torr"], "femtovolt" => [-15, "volt"], "femtowatt" => [-15, "watt"], "femtoweber" => [-15, "weber"], "femtoyard" => [-15, "yard"], "femtoyd" => [-15, "yd"], "femtoyear" => [-15, "year"], "ferg" => [-15, "erg"], "fermis" => [0, "fermi"], "fforce" => [-15, "force"], "fg" => [-15, "g"], "fgravity" => [-15, "gravity"], "fh" => [-15, "h"], "fhg" => [-15, "hg"], "fhr" => [-15, "hr"], "fin" => [-15, "in"], "fkgf" => [-15, "kgf"], "fkph" => [-15, "kph"], "flb" => [-15, "lb"], "flm" => [-15, "lm"], "flx" => [-15, "lx"], "fly" => [-15, "ly"], "fm" => [-15, "m"], "fmb" => [-15, "mb"], "fmercury" => [-15, "mercury"], "fmgal" => [-15, "mgal"], "fmin" => [-15, "min"], "fmol" => [-15, "mol"], "fmon" => [-15, "mon"], "fmph" => [-15, "mph"], "fohm" => [-15, "ohm"], "foz" => [-15, "oz"], "fpc" => [-15, "pc"], "fpsi" => [-15, "psi"], "frad" => [-15, "rad"], "fs" => [-15, "s"], "fsr" => [-15, "sr"], "ft" => [-15, "t"], "fyr" => [-15, "yr"], "gals" => [0, "gal"], "gausses" => [0, "gauss"], "gigaCelsius" => [9, "Celsius"], "gigaFahrenheit" => [9, "Fahrenheit"], "gigaJulian_year" => [9, "Julian_year"], "gigaPascal" => [9, "Pascal"], "gigaacre" => [9, "acre"], "gigaampere" => [9, "ampere"], "gigaangstrom" => [9, "angstrom"], "gigaangular_degree" => [9, "angular_degree"], "gigaangular_minute" => [9, "angular_minute"], "gigaangular_second" => [9, "angular_second"], "gigaare" => [9, "are"], "gigaatmosphere" => [9, "atmosphere"], "gigacalorie" => [9, "calorie"], "gigacandela" => [9, "candela"], "gigacelsius" => [9, "celsius"], "gigacentigrade" => [9, "centigrade"], "gigacentury" => [9, "century"], "gigachain" => [9, "chain"], "gigacommon_year" => [9, "common_year"], "gigacoulomb" => [9, "coulomb"], "gigaday" => [9, "day"], "gigadegK" => [9, "degK"], "gigadeg_K" => [9, "deg_K"], "gigadegree" => [9, "degree"], "gigadegreeK" => [9, "degreeK"], "gigadyne" => [9, "dyne"], "gigaerg" => [9, "erg"], "gigafahrenheit" => [9, "fahrenheit"], "gigafarad" => [9, "farad"], "gigafermi" => [9, "fermi"], "gigagal" => [9, "gal"], "gigagauss" => [9, "gauss"], "gigagram" => [9, "gram"], "gigahectare" => [9, "hectare"], "gigahertz" => [9, "hertz"], "gigahour" => [9, "hour"], "gigainch" => [9, "inch"], "gigajoule" => [9, "joule"], "gigakelvin" => [9, "kelvin"], "gigakilogram" => [9, "kilogram"], "gigaknot" => [9, "knot"], "gigalitre" => [9, "litre"], "gigameter" => [9, "meter"], "gigametre" => [9, "metre"], "gigamicron" => [9, "micron"], "gigamile" => [9, "mile"], "gigamillibar" => [9, "millibar"], "gigaminute" => [9, "minute"], "gigaminute_angle" => [9, "minute_angle"], "gigamole" => [9, "mole"], "gigamonth" => [9, "month"], "giganewton" => [9, "newton"], "gigaounce" => [9, "ounce"], "gigaparsec" => [9, "parsec"], "gigapascal" => [9, "pascal"], "gigapentad" => [9, "pentad"], "gigapercent" => [9, "percent"], "gigapoise" => [9, "poise"], "gigapound" => [9, "pound"], "gigaradian" => [9, "radian"], "gigasecond" => [9, "second"], "gigasecond_angle" => [9, "second_angle"], "gigasteradian" => [9, "steradian"], "gigastokes" => [9, "stokes"], "gigatesla" => [9, "tesla"], "gigaton" => [9, "ton"], "gigatonne" => [9, "tonne"], "gigatorr" => [9, "torr"], "gigavolt" => [9, "volt"], "gigawatt" => [9, "watt"], "gigaweber" => [9, "weber"], "gigayard" => [9, "yard"], "gigayd" => [9, "yd"], "gigayear" => [9, "year"], "grams" => [0, "gram"], "hA" => [2, "A"], "hAu" => [2, "Au"], "hBq" => [2, "Bq"], "hC" => [2, "C"], "hF" => [2, "F"], "hG" => [2, "G"], "hGal" => [2, "Gal"], "hGy" => [2, "Gy"], "hH" => [2, "H"], "hHg" => [2, "Hg"], "hHz" => [2, "Hz"], "hJ" => [2, "J"], "hK" => [2, "K"], "hL" => [2, "L"], "hN" => [2, "N"], "hP" => [2, "P"], "hPa" => [2, "Pa"], "hS" => [2, "S"], "hSt" => [2, "St"], "hSv" => [2, "Sv"], "hT" => [2, "T"], "hV" => [2, "V"], "hW" => [2, "W"], "hWb" => [2, "Wb"], "ha" => [2, "a"], "hac" => [2, "ac"], "hatm" => [2, "atm"], "hbar" => [2, "bar"], "hcal" => [2, "cal"], "hcd" => [2, "cd"], "hconventional_mercury" => [2, "conventional_mercury"], "hdegC" => [2, "degC"], "hdegF" => [2, "degF"], "hdeg_C" => [2, "deg_C"], "hdeg_F" => [2, "deg_F"], "hdegreeC" => [2, "degreeC"], "hdegreeF" => [2, "degreeF"], "hdegree_C" => [2, "degree_C"], "hdegree_E" => [2, "degree_E"], "hdegree_F" => [2, "degree_F"], "hdegree_N" => [2, "degree_N"], "hdegree_R" => [2, "degree_R"], "hdegree_S" => [2, "degree_S"], "hdegree_W" => [2, "degree_W"], "hdegree_c" => [2, "degree_c"], "hdegree_east" => [2, "degree_east"], "hdegree_f" => [2, "degree_f"], "hdegree_north" => [2, "degree_north"], "hdegree_south" => [2, "degree_south"], "hdegree_west" => [2, "degree_west"], "hdegrees_east" => [2, "degrees_east"], "hdegrees_north" => [2, "degrees_north"], "hdegrees_south" => [2, "degrees_south"], "hdegrees_west" => [2, "degrees_west"], "hdyn" => [2, "dyn"], "hectares" => [0, "hectare"], "hectoCelsius" => [2, "Celsius"], "hectoFahrenheit" => [2, "Fahrenheit"], "hectoJulian_year" => [2, "Julian_year"], "hectoPascal" => [2, "Pascal"], "hectoacre" => [2, "acre"], "hectoampere" => [2, "ampere"], "hectoangstrom" => [2, "angstrom"], "hectoangular_degree" => [2, "angular_degree"], "hectoangular_minute" => [2, "angular_minute"], "hectoangular_second" => [2, "angular_second"], "hectoare" => [2, "are"], "hectoatmosphere" => [2, "atmosphere"], "hectocalorie" => [2, "calorie"], "hectocandela" => [2, "candela"], "hectocelsius" => [2, "celsius"], "hectocentigrade" => [2, "centigrade"], "hectocentury" => [2, "century"], "hectochain" => [2, "chain"], "hectocommon_year" => [2, "common_year"], "hectocoulomb" => [2, "coulomb"], "hectoday" => [2, "day"], "hectodegK" => [2, "degK"], "hectodeg_K" => [2, "deg_K"], "hectodegree" => [2, "degree"], "hectodegreeK" => [2, "degreeK"], "hectodyne" => [2, "dyne"], "hectoerg" => [2, "erg"], "hectofahrenheit" => [2, "fahrenheit"], "hectofarad" => [2, "farad"], "hectofermi" => [2, "fermi"], "hectogal" => [2, "gal"], "hectogauss" => [2, "gauss"], "hectogram" => [2, "gram"], "hectohectare" => [2, "hectare"], "hectohertz" => [2, "hertz"], "hectohour" => [2, "hour"], "hectoinch" => [2, "inch"], "hectojoule" => [2, "joule"], "hectokelvin" => [2, "kelvin"], "hectokilogram" => [2, "kilogram"], "hectoknot" => [2, "knot"], "hectolitre" => [2, "litre"], "hectometer" => [2, "meter"], "hectometre" => [2, "metre"], "hectomicron" => [2, "micron"], "hectomile" => [2, "mile"], "hectomillibar" => [2, "millibar"], "hectominute" => [2, "minute"], "hectominute_angle" => [2, "minute_angle"], "hectomole" => [2, "mole"], "hectomonth" => [2, "month"], "hectonewton" => [2, "newton"], "hectoounce" => [2, "ounce"], "hectoparsec" => [2, "parsec"], "hectopascal" => [2, "pascal"], "hectopentad" => [2, "pentad"], "hectopercent" => [2, "percent"], "hectopoise" => [2, "poise"], "hectopound" => [2, "pound"], "hectoradian" => [2, "radian"], "hectosecond" => [2, "second"], "hectosecond_angle" => [2, "second_angle"], "hectosteradian" => [2, "steradian"], "hectostokes" => [2, "stokes"], "hectotesla" => [2, "tesla"], "hectoton" => [2, "ton"], "hectotonne" => [2, "tonne"], "hectotorr" => [2, "torr"], "hectovolt" => [2, "volt"], "hectowatt" => [2, "watt"], "hectoweber" => [2, "weber"], "hectoyard" => [2, "yard"], "hectoyd" => [2, "yd"], "hectoyear" => [2, "year"], "herg" => [2, "erg"], "hertzes" => [0, "hertz"], "hforce" => [2, "force"], "hg" => [2, "g"], "hgravity" => [2, "gravity"], "hh" => [2, "h"], "hhg" => [2, "hg"], "hhr" => [2, "hr"], "hin" => [2, "in"], "hkgf" => [2, "kgf"], "hkph" => [2, "kph"], "hlb" => [2, "lb"], "hlm" => [2, "lm"], "hlx" => [2, "lx"], "hly" => [2, "ly"], "hm" => [2, "m"], "hmb" => [2, "mb"], "hmercury" => [2, "mercury"], "hmgal" => [2, "mgal"], "hmin" => [2, "min"], "hmol" => [2, "mol"], "hmon" => [2, "mon"], "hmph" => [2, "mph"], "hohm" => [2, "ohm"], "hours" => [0, "hour"], "hoz" => [2, "oz"], "hpc" => [2, "pc"], "hpsi" => [2, "psi"], "hrad" => [2, "rad"], "hs" => [2, "s"], "hsr" => [2, "sr"], "ht" => [2, "t"], "hyr" => [2, "yr"], "inchs" => [0, "inch"], "joules" => [0, "joule"], "kA" => [3, "A"], "kAu" => [3, "Au"], "kBq" => [3, "Bq"], "kC" => [3, "C"], "kF" => [3, "F"], "kG" => [3, "G"], "kGal" => [3, "Gal"], "kGy" => [3, "Gy"], "kH" => [3, "H"], "kHg" => [3, "Hg"], "kHz" => [3, "Hz"], "kJ" => [3, "J"], "kK" => [3, "K"], "kL" => [3, "L"], "kN" => [3, "N"], "kP" => [3, "P"], "kPa" => [3, "Pa"], "kS" => [3, "S"], "kSt" => [3, "St"], "kSv" => [3, "Sv"], "kT" => [3, "T"], "kV" => [3, "V"], "kW" => [3, "W"], "kWb" => [3, "Wb"], "ka" => [3, "a"], "kac" => [3, "ac"], "katm" => [3, "atm"], "kbar" => [3, "bar"], "kcal" => [3, "cal"], "kcd" => [3, "cd"], "kconventional_mercury" => [3, "conventional_mercury"], "kdegC" => [3, "degC"], "kdegF" => [3, "degF"], "kdeg_C" => [3, "deg_C"], "kdeg_F" => [3, "deg_F"], "kdegreeC" => [3, "degreeC"], "kdegreeF" => [3, "degreeF"], "kdegree_C" => [3, "degree_C"], "kdegree_E" => [3, "degree_E"], "kdegree_F" => [3, "degree_F"], "kdegree_N" => [3, "degree_N"], "kdegree_R" => [3, "degree_R"], "kdegree_S" => [3, "degree_S"], "kdegree_W" => [3, "degree_W"], "kdegree_c" => [3, "degree_c"], "kdegree_east" => [3, "degree_east"], "kdegree_f" => [3, "degree_f"], "kdegree_north" => [3, "degree_north"], "kdegree_south" => [3, "degree_south"], "kdegree_west" => [3, "degree_west"], "kdegrees_east" => [3, "degrees_east"], "kdegrees_north" => [3, "degrees_north"], "kdegrees_south" => [3, "degrees_south"], "kdegrees_west" => [3, "degrees_west"], "kdyn" => [3, "dyn"], "kelvins" => [0, "kelvin"], "kerg" => [3, "erg"], "kforce" => [3, "force"], "kgravity" => [3, "gravity"], "kh" => [3, "h"], "khg" => [3, "hg"], "khr" => [3, "hr"], "kiloCelsius" => [3, "Celsius"], "kiloFahrenheit" => [3, "Fahrenheit"], "kiloJulian_year" => [3, "Julian_year"], "kiloPascal" => [3, "Pascal"], "kiloacre" => [3, "acre"], "kiloampere" => [3, "ampere"], "kiloangstrom" => [3, "angstrom"], "kiloangular_degree" => [3, "angular_degree"], "kiloangular_minute" => [3, "angular_minute"], "kiloangular_second" => [3, "angular_second"], "kiloare" => [3, "are"], "kiloatmosphere" => [3, "atmosphere"], "kilocalorie" => [3, "calorie"], "kilocandela" => [3, "candela"], "kilocelsius" => [3, "celsius"], "kilocentigrade" => [3, "centigrade"], "kilocentury" => [3, "century"], "kilochain" => [3, "chain"], "kilocommon_year" => [3, "common_year"], "kilocoulomb" => [3, "coulomb"], "kiloday" => [3, "day"], "kilodegK" => [3, "degK"], "kilodeg_K" => [3, "deg_K"], "kilodegree" => [3, "degree"], "kilodegreeK" => [3, "degreeK"], "kilodyne" => [3, "dyne"], "kiloerg" => [3, "erg"], "kilofahrenheit" => [3, "fahrenheit"], "kilofarad" => [3, "farad"], "kilofermi" => [3, "fermi"], "kilogal" => [3, "gal"], "kilogauss" => [3, "gauss"], "kilogram" => [3, "gram"], "kilograms" => [0, "kilogram"], "kilohectare" => [3, "hectare"], "kilohertz" => [3, "hertz"], "kilohour" => [3, "hour"], "kiloinch" => [3, "inch"], "kilojoule" => [3, "joule"], "kilokelvin" => [3, "kelvin"], "kilokilogram" => [3, "kilogram"], "kiloknot" => [3, "knot"], "kilolitre" => [3, "litre"], "kilometer" => [3, "meter"], "kilometre" => [3, "metre"], "kilomicron" => [3, "micron"], "kilomile" => [3, "mile"], "kilomillibar" => [3, "millibar"], "kilominute" => [3, "minute"], "kilominute_angle" => [3, "minute_angle"], "kilomole" => [3, "mole"], "kilomonth" => [3, "month"], "kilonewton" => [3, "newton"], "kiloounce" => [3, "ounce"], "kiloparsec" => [3, "parsec"], "kilopascal" => [3, "pascal"], "kilopentad" => [3, "pentad"], "kilopercent" => [3, "percent"], "kilopoise" => [3, "poise"], "kilopound" => [3, "pound"], "kiloradian" => [3, "radian"], "kilosecond" => [3, "second"], "kilosecond_angle" => [3, "second_angle"], "kilosteradian" => [3, "steradian"], "kilostokes" => [3, "stokes"], "kilotesla" => [3, "tesla"], "kiloton" => [3, "ton"], "kilotonne" => [3, "tonne"], "kilotorr" => [3, "torr"], "kilovolt" => [3, "volt"], "kilowatt" => [3, "watt"], "kiloweber" => [3, "weber"], "kiloyard" => [3, "yard"], "kiloyd" => [3, "yd"], "kiloyear" => [3, "year"], "kin" => [3, "in"], "kkgf" => [3, "kgf"], "kkph" => [3, "kph"], "klb" => [3, "lb"], "klm" => [3, "lm"], "klx" => [3, "lx"], "kly" => [3, "ly"], "km" => [3, "m"], "kmb" => [3, "mb"], "kmercury" => [3, "mercury"], "kmgal" => [3, "mgal"], "kmin" => [3, "min"], "kmol" => [3, "mol"], "kmon" => [3, "mon"], "kmph" => [3, "mph"], "knots" => [0, "knot"], "kohm" => [3, "ohm"], "koz" => [3, "oz"], "kpc" => [3, "pc"], "kpsi" => [3, "psi"], "krad" => [3, "rad"], "ks" => [3, "s"], "ksr" => [3, "sr"], "kt" => [3, "t"], "kyr" => [3, "yr"], "litres" => [0, "litre"], "mA" => [-3, "A"], "mAu" => [-3, "Au"], "mBq" => [-3, "Bq"], "mC" => [-3, "C"], "mF" => [-3, "F"], "mG" => [-3, "G"], "mGal" => [-3, "Gal"], "mGy" => [-3, "Gy"], "mH" => [-3, "H"], "mHg" => [-3, "Hg"], "mHz" => [-3, "Hz"], "mJ" => [-3, "J"], "mK" => [-3, "K"], "mL" => [-3, "L"], "mN" => [-3, "N"], "mP" => [-3, "P"], "mPa" => [-3, "Pa"], "mS" => [-3, "S"], "mSt" => [-3, "St"], "mSv" => [-3, "Sv"], "mT" => [-3, "T"], "mV" => [-3, "V"], "mW" => [-3, "W"], "mWb" => [-3, "Wb"], "ma" => [-3, "a"], "mac" => [-3, "ac"], "matm" => [-3, "atm"], "mbar" => [-3, "bar"], "mcal" => [-3, "cal"], "mcd" => [-3, "cd"], "mconventional_mercury" => [-3, "conventional_mercury"], "mdegC" => [-3, "degC"], "mdegF" => [-3, "degF"], "mdeg_C" => [-3, "deg_C"], "mdeg_F" => [-3, "deg_F"], "mdegreeC" => [-3, "degreeC"], "mdegreeF" => [-3, "degreeF"], "mdegree_C" => [-3, "degree_C"], "mdegree_E" => [-3, "degree_E"], "mdegree_F" => [-3, "degree_F"], "mdegree_N" => [-3, "degree_N"], "mdegree_R" => [-3, "degree_R"], "mdegree_S" => [-3, "degree_S"], "mdegree_W" => [-3, "degree_W"], "mdegree_c" => [-3, "degree_c"], "mdegree_east" => [-3, "degree_east"], "mdegree_f" => [-3, "degree_f"], "mdegree_north" => [-3, "degree_north"], "mdegree_south" => [-3, "degree_south"], "mdegree_west" => [-3, "degree_west"], "mdegrees_east" => [-3, "degrees_east"], "mdegrees_north" => [-3, "degrees_north"], "mdegrees_south" => [-3, "degrees_south"], "mdegrees_west" => [-3, "degrees_west"], "mdyn" => [-3, "dyn"], "megaCelsius" => [6, "Celsius"], "megaFahrenheit" => [6, "Fahrenheit"], "megaJulian_year" => [6, "Julian_year"], "megaPascal" => [6, "Pascal"], "megaacre" => [6, "acre"], "megaampere" => [6, "ampere"], "megaangstrom" => [6, "angstrom"], "megaangular_degree" => [6, "angular_degree"], "megaangular_minute" => [6, "angular_minute"], "megaangular_second" => [6, "angular_second"], "megaare" => [6, "are"], "megaatmosphere" => [6, "atmosphere"], "megacalorie" => [6, "calorie"], "megacandela" => [6, "candela"], "megacelsius" => [6, "celsius"], "megacentigrade" => [6, "centigrade"], "megacentury" => [6, "century"], "megachain" => [6, "chain"], "megacommon_year" => [6, "common_year"], "megacoulomb" => [6, "coulomb"], "megaday" => [6, "day"], "megadegK" => [6, "degK"], "megadeg_K" => [6, "deg_K"], "megadegree" => [6, "degree"], "megadegreeK" => [6, "degreeK"], "megadyne" => [6, "dyne"], "megaerg" => [6, "erg"], "megafahrenheit" => [6, "fahrenheit"], "megafarad" => [6, "farad"], "megafermi" => [6, "fermi"], "megagal" => [6, "gal"], "megagauss" => [6, "gauss"], "megagram" => [6, "gram"], "megahectare" => [6, "hectare"], "megahertz" => [6, "hertz"], "megahour" => [6, "hour"], "megainch" => [6, "inch"], "megajoule" => [6, "joule"], "megakelvin" => [6, "kelvin"], "megakilogram" => [6, "kilogram"], "megaknot" => [6, "knot"], "megalitre" => [6, "litre"], "megameter" => [6, "meter"], "megametre" => [6, "metre"], "megamicron" => [6, "micron"], "megamile" => [6, "mile"], "megamillibar" => [6, "millibar"], "megaminute" => [6, "minute"], "megaminute_angle" => [6, "minute_angle"], "megamole" => [6, "mole"], "megamonth" => [6, "month"], "meganewton" => [6, "newton"], "megaounce" => [6, "ounce"], "megaparsec" => [6, "parsec"], "megapascal" => [6, "pascal"], "megapentad" => [6, "pentad"], "megapercent" => [6, "percent"], "megapoise" => [6, "poise"], "megapound" => [6, "pound"], "megaradian" => [6, "radian"], "megasecond" => [6, "second"], "megasecond_angle" => [6, "second_angle"], "megasteradian" => [6, "steradian"], "megastokes" => [6, "stokes"], "megatesla" => [6, "tesla"], "megaton" => [6, "ton"], "megatonne" => [6, "tonne"], "megatorr" => [6, "torr"], "megavolt" => [6, "volt"], "megawatt" => [6, "watt"], "megaweber" => [6, "weber"], "megayard" => [6, "yard"], "megayd" => [6, "yd"], "megayear" => [6, "year"], "merg" => [-3, "erg"], "meters" => [0, "meter"], "metres" => [0, "metre"], "mforce" => [-3, "force"], "mg" => [-3, "g"], "mgravity" => [-3, "gravity"], "mh" => [-3, "h"], "mhg" => [-3, "hg"], "mhr" => [-3, "hr"], "microCelsius" => [-6, "Celsius"], "microFahrenheit" => [-6, "Fahrenheit"], "microJulian_year" => [-6, "Julian_year"], "microPascal" => [-6, "Pascal"], "microacre" => [-6, "acre"], "microampere" => [-6, "ampere"], "microangstrom" => [-6, "angstrom"], "microangular_degree" => [-6, "angular_degree"], "microangular_minute" => [-6, "angular_minute"], "microangular_second" => [-6, "angular_second"], "microare" => [-6, "are"], "microatmosphere" => [-6, "atmosphere"], "microcalorie" => [-6, "calorie"], "microcandela" => [-6, "candela"], "microcelsius" => [-6, "celsius"], "microcentigrade" => [-6, "centigrade"], "microcentury" => [-6, "century"], "microchain" => [-6, "chain"], "microcommon_year" => [-6, "common_year"], "microcoulomb" => [-6, "coulomb"], "microday" => [-6, "day"], "microdegK" => [-6, "degK"], "microdeg_K" => [-6, "deg_K"], "microdegree" => [-6, "degree"], "microdegreeK" => [-6, "degreeK"], "microdyne" => [-6, "dyne"], "microerg" => [-6, "erg"], "microfahrenheit" => [-6, "fahrenheit"], "microfarad" => [-6, "farad"], "microfermi" => [-6, "fermi"], "microgal" => [-6, "gal"], "microgauss" => [-6, "gauss"], "microgram" => [-6, "gram"], "microhectare" => [-6, "hectare"], "microhertz" => [-6, "hertz"], "microhour" => [-6, "hour"], "microinch" => [-6, "inch"], "microjoule" => [-6, "joule"], "microkelvin" => [-6, "kelvin"], "microkilogram" => [-6, "kilogram"], "microknot" => [-6, "knot"], "microlitre" => [-6, "litre"], "micrometer" => [-6, "meter"], "micrometre" => [-6, "metre"], "micromicron" => [-6, "micron"], "micromile" => [-6, "mile"], "micromillibar" => [-6, "millibar"], "microminute" => [-6, "minute"], "microminute_angle" => [-6, "minute_angle"], "micromole" => [-6, "mole"], "micromonth" => [-6, "month"], "micronewton" => [-6, "newton"], "microns" => [0, "micron"], "microounce" => [-6, "ounce"], "microparsec" => [-6, "parsec"], "micropascal" => [-6, "pascal"], "micropentad" => [-6, "pentad"], "micropercent" => [-6, "percent"], "micropoise" => [-6, "poise"], "micropound" => [-6, "pound"], "microradian" => [-6, "radian"], "microsecond" => [-6, "second"], "microsecond_angle" => [-6, "second_angle"], "microsteradian" => [-6, "steradian"], "microstokes" => [-6, "stokes"], "microtesla" => [-6, "tesla"], "microton" => [-6, "ton"], "microtonne" => [-6, "tonne"], "microtorr" => [-6, "torr"], "microvolt" => [-6, "volt"], "microwatt" => [-6, "watt"], "microweber" => [-6, "weber"], "microyard" => [-6, "yard"], "microyd" => [-6, "yd"], "microyear" => [-6, "year"], "miles" => [0, "mile"], "milliCelsius" => [-3, "Celsius"], "milliFahrenheit" => [-3, "Fahrenheit"], "milliJulian_year" => [-3, "Julian_year"], "milliPascal" => [-3, "Pascal"], "milliacre" => [-3, "acre"], "milliampere" => [-3, "ampere"], "milliangstrom" => [-3, "angstrom"], "milliangular_degree" => [-3, "angular_degree"], "milliangular_minute" => [-3, "angular_minute"], "milliangular_second" => [-3, "angular_second"], "milliare" => [-3, "are"], "milliatmosphere" => [-3, "atmosphere"], "millibars" => [0, "millibar"], "millicalorie" => [-3, "calorie"], "millicandela" => [-3, "candela"], "millicelsius" => [-3, "celsius"], "millicentigrade" => [-3, "centigrade"], "millicentury" => [-3, "century"], "millichain" => [-3, "chain"], "millicommon_year" => [-3, "common_year"], "millicoulomb" => [-3, "coulomb"], "milliday" => [-3, "day"], "millidegK" => [-3, "degK"], "millideg_K" => [-3, "deg_K"], "millidegree" => [-3, "degree"], "millidegreeK" => [-3, "degreeK"], "millidyne" => [-3, "dyne"], "millierg" => [-3, "erg"], "millifahrenheit" => [-3, "fahrenheit"], "millifarad" => [-3, "farad"], "millifermi" => [-3, "fermi"], "milligal" => [-3, "gal"], "milligauss" => [-3, "gauss"], "milligram" => [-3, "gram"], "millihectare" => [-3, "hectare"], "millihertz" => [-3, "hertz"], "millihour" => [-3, "hour"], "milliinch" => [-3, "inch"], "millijoule" => [-3, "joule"], "millikelvin" => [-3, "kelvin"], "millikilogram" => [-3, "kilogram"], "milliknot" => [-3, "knot"], "millilitre" => [-3, "litre"], "millimeter" => [-3, "meter"], "millimetre" => [-3, "metre"], "millimicron" => [-3, "micron"], "millimile" => [-3, "mile"], "millimillibar" => [-3, "millibar"], "milliminute" => [-3, "minute"], "milliminute_angle" => [-3, "minute_angle"], "millimole" => [-3, "mole"], "millimonth" => [-3, "month"], "millinewton" => [-3, "newton"], "milliounce" => [-3, "ounce"], "milliparsec" => [-3, "parsec"], "millipascal" => [-3, "pascal"], "millipentad" => [-3, "pentad"], "millipercent" => [-3, "percent"], "millipoise" => [-3, "poise"], "millipound" => [-3, "pound"], "milliradian" => [-3, "radian"], "millisecond" => [-3, "second"], "millisecond_angle" => [-3, "second_angle"], "millisteradian" => [-3, "steradian"], "millistokes" => [-3, "stokes"], "millitesla" => [-3, "tesla"], "milliton" => [-3, "ton"], "millitonne" => [-3, "tonne"], "millitorr" => [-3, "torr"], "millivolt" => [-3, "volt"], "milliwatt" => [-3, "watt"], "milliweber" => [-3, "weber"], "milliyard" => [-3, "yard"], "milliyd" => [-3, "yd"], "milliyear" => [-3, "year"], "min" => [-3, "in"], "minutes" => [0, "minute"], "minutes_angle" => [0, "minute_angle"], "mkgf" => [-3, "kgf"], "mkph" => [-3, "kph"], "mlb" => [-3, "lb"], "mlm" => [-3, "lm"], "mlx" => [-3, "lx"], "mly" => [-3, "ly"], "mm" => [-3, "m"], "mmb" => [-3, "mb"], "mmercury" => [-3, "mercury"], "mmgal" => [-3, "mgal"], "mmin" => [-3, "min"], "mmol" => [-3, "mol"], "mmon" => [-3, "mon"], "mmph" => [-3, "mph"], "mohm" => [-3, "ohm"], "moles" => [0, "mole"], "months" => [0, "month"], "moz" => [-3, "oz"], "mpc" => [-3, "pc"], "mpsi" => [-3, "psi"], "mrad" => [-3, "rad"], "ms" => [-3, "s"], "msr" => [-3, "sr"], "mt" => [-3, "t"], "myr" => [-3, "yr"], "nA" => [-9, "A"], "nAu" => [-9, "Au"], "nBq" => [-9, "Bq"], "nC" => [-9, "C"], "nF" => [-9, "F"], "nG" => [-9, "G"], "nGal" => [-9, "Gal"], "nGy" => [-9, "Gy"], "nH" => [-9, "H"], "nHg" => [-9, "Hg"], "nHz" => [-9, "Hz"], "nJ" => [-9, "J"], "nK" => [-9, "K"], "nL" => [-9, "L"], "nN" => [-9, "N"], "nP" => [-9, "P"], "nPa" => [-9, "Pa"], "nS" => [-9, "S"], "nSt" => [-9, "St"], "nSv" => [-9, "Sv"], "nT" => [-9, "T"], "nV" => [-9, "V"], "nW" => [-9, "W"], "nWb" => [-9, "Wb"], "na" => [-9, "a"], "nac" => [-9, "ac"], "nanoCelsius" => [-9, "Celsius"], "nanoFahrenheit" => [-9, "Fahrenheit"], "nanoJulian_year" => [-9, "Julian_year"], "nanoPascal" => [-9, "Pascal"], "nanoacre" => [-9, "acre"], "nanoampere" => [-9, "ampere"], "nanoangstrom" => [-9, "angstrom"], "nanoangular_degree" => [-9, "angular_degree"], "nanoangular_minute" => [-9, "angular_minute"], "nanoangular_second" => [-9, "angular_second"], "nanoare" => [-9, "are"], "nanoatmosphere" => [-9, "atmosphere"], "nanocalorie" => [-9, "calorie"], "nanocandela" => [-9, "candela"], "nanocelsius" => [-9, "celsius"], "nanocentigrade" => [-9, "centigrade"], "nanocentury" => [-9, "century"], "nanochain" => [-9, "chain"], "nanocommon_year" => [-9, "common_year"], "nanocoulomb" => [-9, "coulomb"], "nanoday" => [-9, "day"], "nanodegK" => [-9, "degK"], "nanodeg_K" => [-9, "deg_K"], "nanodegree" => [-9, "degree"], "nanodegreeK" => [-9, "degreeK"], "nanodyne" => [-9, "dyne"], "nanoerg" => [-9, "erg"], "nanofahrenheit" => [-9, "fahrenheit"], "nanofarad" => [-9, "farad"], "nanofermi" => [-9, "fermi"], "nanogal" => [-9, "gal"], "nanogauss" => [-9, "gauss"], "nanogram" => [-9, "gram"], "nanohectare" => [-9, "hectare"], "nanohertz" => [-9, "hertz"], "nanohour" => [-9, "hour"], "nanoinch" => [-9, "inch"], "nanojoule" => [-9, "joule"], "nanokelvin" => [-9, "kelvin"], "nanokilogram" => [-9, "kilogram"], "nanoknot" => [-9, "knot"], "nanolitre" => [-9, "litre"], "nanometer" => [-9, "meter"], "nanometre" => [-9, "metre"], "nanomicron" => [-9, "micron"], "nanomile" => [-9, "mile"], "nanomillibar" => [-9, "millibar"], "nanominute" => [-9, "minute"], "nanominute_angle" => [-9, "minute_angle"], "nanomole" => [-9, "mole"], "nanomonth" => [-9, "month"], "nanonewton" => [-9, "newton"], "nanoounce" => [-9, "ounce"], "nanoparsec" => [-9, "parsec"], "nanopascal" => [-9, "pascal"], "nanopentad" => [-9, "pentad"], "nanopercent" => [-9, "percent"], "nanopoise" => [-9, "poise"], "nanopound" => [-9, "pound"], "nanoradian" => [-9, "radian"], "nanosecond" => [-9, "second"], "nanosecond_angle" => [-9, "second_angle"], "nanosteradian" => [-9, "steradian"], "nanostokes" => [-9, "stokes"], "nanotesla" => [-9, "tesla"], "nanoton" => [-9, "ton"], "nanotonne" => [-9, "tonne"], "nanotorr" => [-9, "torr"], "nanovolt" => [-9, "volt"], "nanowatt" => [-9, "watt"], "nanoweber" => [-9, "weber"], "nanoyard" => [-9, "yard"], "nanoyd" => [-9, "yd"], "nanoyear" => [-9, "year"], "natm" => [-9, "atm"], "nbar" => [-9, "bar"], "ncal" => [-9, "cal"], "ncd" => [-9, "cd"], "nconventional_mercury" => [-9, "conventional_mercury"], "ndegC" => [-9, "degC"], "ndegF" => [-9, "degF"], "ndeg_C" => [-9, "deg_C"], "ndeg_F" => [-9, "deg_F"], "ndegreeC" => [-9, "degreeC"], "ndegreeF" => [-9, "degreeF"], "ndegree_C" => [-9, "degree_C"], "ndegree_E" => [-9, "degree_E"], "ndegree_F" => [-9, "degree_F"], "ndegree_N" => [-9, "degree_N"], "ndegree_R" => [-9, "degree_R"], "ndegree_S" => [-9, "degree_S"], "ndegree_W" => [-9, "degree_W"], "ndegree_c" => [-9, "degree_c"], "ndegree_east" => [-9, "degree_east"], "ndegree_f" => [-9, "degree_f"], "ndegree_north" => [-9, "degree_north"], "ndegree_south" => [-9, "degree_south"], "ndegree_west" => [-9, "degree_west"], "ndegrees_east" => [-9, "degrees_east"], "ndegrees_north" => [-9, "degrees_north"], "ndegrees_south" => [-9, "degrees_south"], "ndegrees_west" => [-9, "degrees_west"], "ndyn" => [-9, "dyn"], "nerg" => [-9, "erg"], "newtons" => [0, "newton"], "nforce" => [-9, "force"], "ng" => [-9, "g"], "ngravity" => [-9, "gravity"], "nh" => [-9, "h"], "nhg" => [-9, "hg"], "nhr" => [-9, "hr"], "nin" => [-9, "in"], "nkgf" => [-9, "kgf"], "nkph" => [-9, "kph"], "nlb" => [-9, "lb"], "nlm" => [-9, "lm"], "nlx" => [-9, "lx"], "nly" => [-9, "ly"], "nm" => [-9, "m"], "nmb" => [-9, "mb"], "nmercury" => [-9, "mercury"], "nmgal" => [-9, "mgal"], "nmin" => [-9, "min"], "nmol" => [-9, "mol"], "nmon" => [-9, "mon"], "nmph" => [-9, "mph"], "nohm" => [-9, "ohm"], "noz" => [-9, "oz"], "npc" => [-9, "pc"], "npsi" => [-9, "psi"], "nrad" => [-9, "rad"], "ns" => [-9, "s"], "nsr" => [-9, "sr"], "nt" => [-9, "t"], "nyr" => [-9, "yr"], "ounces" => [0, "ounce"], "pA" => [-12, "A"], "pAu" => [-12, "Au"], "pBq" => [-12, "Bq"], "pC" => [-12, "C"], "pF" => [-12, "F"], "pG" => [-12, "G"], "pGal" => [-12, "Gal"], "pGy" => [-12, "Gy"], "pH" => [-12, "H"], "pHg" => [-12, "Hg"], "pHz" => [-12, "Hz"], "pJ" => [-12, "J"], "pK" => [-12, "K"], "pL" => [-12, "L"], "pN" => [-12, "N"], "pP" => [-12, "P"], "pPa" => [-12, "Pa"], "pS" => [-12, "S"], "pSt" => [-12, "St"], "pSv" => [-12, "Sv"], "pT" => [-12, "T"], "pV" => [-12, "V"], "pW" => [-12, "W"], "pWb" => [-12, "Wb"], "pa" => [-12, "a"], "pac" => [-12, "ac"], "parsecs" => [0, "parsec"], "pascals" => [0, "pascal"], "patm" => [-12, "atm"], "pbar" => [-12, "bar"], "pcal" => [-12, "cal"], "pcd" => [-12, "cd"], "pconventional_mercury" => [-12, "conventional_mercury"], "pdegC" => [-12, "degC"], "pdegF" => [-12, "degF"], "pdeg_C" => [-12, "deg_C"], "pdeg_F" => [-12, "deg_F"], "pdegreeC" => [-12, "degreeC"], "pdegreeF" => [-12, "degreeF"], "pdegree_C" => [-12, "degree_C"], "pdegree_E" => [-12, "degree_E"], "pdegree_F" => [-12, "degree_F"], "pdegree_N" => [-12, "degree_N"], "pdegree_R" => [-12, "degree_R"], "pdegree_S" => [-12, "degree_S"], "pdegree_W" => [-12, "degree_W"], "pdegree_c" => [-12, "degree_c"], "pdegree_east" => [-12, "degree_east"], "pdegree_f" => [-12, "degree_f"], "pdegree_north" => [-12, "degree_north"], "pdegree_south" => [-12, "degree_south"], "pdegree_west" => [-12, "degree_west"], "pdegrees_east" => [-12, "degrees_east"], "pdegrees_north" => [-12, "degrees_north"], "pdegrees_south" => [-12, "degrees_south"], "pdegrees_west" => [-12, "degrees_west"], "pdyn" => [-12, "dyn"], "pentads" => [0, "pentad"], "percents" => [0, "percent"], "perg" => [-12, "erg"], "petaCelsius" => [15, "Celsius"], "petaFahrenheit" => [15, "Fahrenheit"], "petaJulian_year" => [15, "Julian_year"], "petaPascal" => [15, "Pascal"], "petaacre" => [15, "acre"], "petaampere" => [15, "ampere"], "petaangstrom" => [15, "angstrom"], "petaangular_degree" => [15, "angular_degree"], "petaangular_minute" => [15, "angular_minute"], "petaangular_second" => [15, "angular_second"], "petaare" => [15, "are"], "petaatmosphere" => [15, "atmosphere"], "petacalorie" => [15, "calorie"], "petacandela" => [15, "candela"], "petacelsius" => [15, "celsius"], "petacentigrade" => [15, "centigrade"], "petacentury" => [15, "century"], "petachain" => [15, "chain"], "petacommon_year" => [15, "common_year"], "petacoulomb" => [15, "coulomb"], "petaday" => [15, "day"], "petadegK" => [15, "degK"], "petadeg_K" => [15, "deg_K"], "petadegree" => [15, "degree"], "petadegreeK" => [15, "degreeK"], "petadyne" => [15, "dyne"], "petaerg" => [15, "erg"], "petafahrenheit" => [15, "fahrenheit"], "petafarad" => [15, "farad"], "petafermi" => [15, "fermi"], "petagal" => [15, "gal"], "petagauss" => [15, "gauss"], "petagram" => [15, "gram"], "petahectare" => [15, "hectare"], "petahertz" => [15, "hertz"], "petahour" => [15, "hour"], "petainch" => [15, "inch"], "petajoule" => [15, "joule"], "petakelvin" => [15, "kelvin"], "petakilogram" => [15, "kilogram"], "petaknot" => [15, "knot"], "petalitre" => [15, "litre"], "petameter" => [15, "meter"], "petametre" => [15, "metre"], "petamicron" => [15, "micron"], "petamile" => [15, "mile"], "petamillibar" => [15, "millibar"], "petaminute" => [15, "minute"], "petaminute_angle" => [15, "minute_angle"], "petamole" => [15, "mole"], "petamonth" => [15, "month"], "petanewton" => [15, "newton"], "petaounce" => [15, "ounce"], "petaparsec" => [15, "parsec"], "petapascal" => [15, "pascal"], "petapentad" => [15, "pentad"], "petapercent" => [15, "percent"], "petapoise" => [15, "poise"], "petapound" => [15, "pound"], "petaradian" => [15, "radian"], "petasecond" => [15, "second"], "petasecond_angle" => [15, "second_angle"], "petasteradian" => [15, "steradian"], "petastokes" => [15, "stokes"], "petatesla" => [15, "tesla"], "petaton" => [15, "ton"], "petatonne" => [15, "tonne"], "petatorr" => [15, "torr"], "petavolt" => [15, "volt"], "petawatt" => [15, "watt"], "petaweber" => [15, "weber"], "petayard" => [15, "yard"], "petayd" => [15, "yd"], "petayear" => [15, "year"], "pforce" => [-12, "force"], "pg" => [-12, "g"], "pgravity" => [-12, "gravity"], "ph" => [-12, "h"], "phg" => [-12, "hg"], "phr" => [-12, "hr"], "picoCelsius" => [-12, "Celsius"], "picoFahrenheit" => [-12, "Fahrenheit"], "picoJulian_year" => [-12, "Julian_year"], "picoPascal" => [-12, "Pascal"], "picoacre" => [-12, "acre"], "picoampere" => [-12, "ampere"], "picoangstrom" => [-12, "angstrom"], "picoangular_degree" => [-12, "angular_degree"], "picoangular_minute" => [-12, "angular_minute"], "picoangular_second" => [-12, "angular_second"], "picoare" => [-12, "are"], "picoatmosphere" => [-12, "atmosphere"], "picocalorie" => [-12, "calorie"], "picocandela" => [-12, "candela"], "picocelsius" => [-12, "celsius"], "picocentigrade" => [-12, "centigrade"], "picocentury" => [-12, "century"], "picochain" => [-12, "chain"], "picocommon_year" => [-12, "common_year"], "picocoulomb" => [-12, "coulomb"], "picoday" => [-12, "day"], "picodegK" => [-12, "degK"], "picodeg_K" => [-12, "deg_K"], "picodegree" => [-12, "degree"], "picodegreeK" => [-12, "degreeK"], "picodyne" => [-12, "dyne"], "picoerg" => [-12, "erg"], "picofahrenheit" => [-12, "fahrenheit"], "picofarad" => [-12, "farad"], "picofermi" => [-12, "fermi"], "picogal" => [-12, "gal"], "picogauss" => [-12, "gauss"], "picogram" => [-12, "gram"], "picohectare" => [-12, "hectare"], "picohertz" => [-12, "hertz"], "picohour" => [-12, "hour"], "picoinch" => [-12, "inch"], "picojoule" => [-12, "joule"], "picokelvin" => [-12, "kelvin"], "picokilogram" => [-12, "kilogram"], "picoknot" => [-12, "knot"], "picolitre" => [-12, "litre"], "picometer" => [-12, "meter"], "picometre" => [-12, "metre"], "picomicron" => [-12, "micron"], "picomile" => [-12, "mile"], "picomillibar" => [-12, "millibar"], "picominute" => [-12, "minute"], "picominute_angle" => [-12, "minute_angle"], "picomole" => [-12, "mole"], "picomonth" => [-12, "month"], "piconewton" => [-12, "newton"], "picoounce" => [-12, "ounce"], "picoparsec" => [-12, "parsec"], "picopascal" => [-12, "pascal"], "picopentad" => [-12, "pentad"], "picopercent" => [-12, "percent"], "picopoise" => [-12, "poise"], "picopound" => [-12, "pound"], "picoradian" => [-12, "radian"], "picosecond" => [-12, "second"], "picosecond_angle" => [-12, "second_angle"], "picosteradian" => [-12, "steradian"], "picostokes" => [-12, "stokes"], "picotesla" => [-12, "tesla"], "picoton" => [-12, "ton"], "picotonne" => [-12, "tonne"], "picotorr" => [-12, "torr"], "picovolt" => [-12, "volt"], "picowatt" => [-12, "watt"], "picoweber" => [-12, "weber"], "picoyard" => [-12, "yard"], "picoyd" => [-12, "yd"], "picoyear" => [-12, "year"], "pin" => [-12, "in"], "pkgf" => [-12, "kgf"], "pkph" => [-12, "kph"], "plb" => [-12, "lb"], "plm" => [-12, "lm"], "plx" => [-12, "lx"], "ply" => [-12, "ly"], "pm" => [-12, "m"], "pmb" => [-12, "mb"], "pmercury" => [-12, "mercury"], "pmgal" => [-12, "mgal"], "pmin" => [-12, "min"], "pmol" => [-12, "mol"], "pmon" => [-12, "mon"], "pmph" => [-12, "mph"], "pohm" => [-12, "ohm"], "poises" => [0, "poise"], "pounds" => [0, "pound"], "poz" => [-12, "oz"], "ppc" => [-12, "pc"], "ppsi" => [-12, "psi"], "prad" => [-12, "rad"], "ps" => [-12, "s"], "psr" => [-12, "sr"], "pt" => [-12, "t"], "pyr" => [-12, "yr"], "radians" => [0, "radian"], "seconds" => [0, "second"], "seconds_angle" => [0, "second_angle"], "steradians" => [0, "steradian"], "stokeses" => [0, "stokes"], "telaCelsius" => [12, "Celsius"], "telaFahrenheit" => [12, "Fahrenheit"], "telaJulian_year" => [12, "Julian_year"], "telaPascal" => [12, "Pascal"], "telaacre" => [12, "acre"], "telaampere" => [12, "ampere"], "telaangstrom" => [12, "angstrom"], "telaangular_degree" => [12, "angular_degree"], "telaangular_minute" => [12, "angular_minute"], "telaangular_second" => [12, "angular_second"], "telaare" => [12, "are"], "telaatmosphere" => [12, "atmosphere"], "telacalorie" => [12, "calorie"], "telacandela" => [12, "candela"], "telacelsius" => [12, "celsius"], "telacentigrade" => [12, "centigrade"], "telacentury" => [12, "century"], "telachain" => [12, "chain"], "telacommon_year" => [12, "common_year"], "telacoulomb" => [12, "coulomb"], "teladay" => [12, "day"], "teladegK" => [12, "degK"], "teladeg_K" => [12, "deg_K"], "teladegree" => [12, "degree"], "teladegreeK" => [12, "degreeK"], "teladyne" => [12, "dyne"], "telaerg" => [12, "erg"], "telafahrenheit" => [12, "fahrenheit"], "telafarad" => [12, "farad"], "telafermi" => [12, "fermi"], "telagal" => [12, "gal"], "telagauss" => [12, "gauss"], "telagram" => [12, "gram"], "telahectare" => [12, "hectare"], "telahertz" => [12, "hertz"], "telahour" => [12, "hour"], "telainch" => [12, "inch"], "telajoule" => [12, "joule"], "telakelvin" => [12, "kelvin"], "telakilogram" => [12, "kilogram"], "telaknot" => [12, "knot"], "telalitre" => [12, "litre"], "telameter" => [12, "meter"], "telametre" => [12, "metre"], "telamicron" => [12, "micron"], "telamile" => [12, "mile"], "telamillibar" => [12, "millibar"], "telaminute" => [12, "minute"], "telaminute_angle" => [12, "minute_angle"], "telamole" => [12, "mole"], "telamonth" => [12, "month"], "telanewton" => [12, "newton"], "telaounce" => [12, "ounce"], "telaparsec" => [12, "parsec"], "telapascal" => [12, "pascal"], "telapentad" => [12, "pentad"], "telapercent" => [12, "percent"], "telapoise" => [12, "poise"], "telapound" => [12, "pound"], "telaradian" => [12, "radian"], "telasecond" => [12, "second"], "telasecond_angle" => [12, "second_angle"], "telasteradian" => [12, "steradian"], "telastokes" => [12, "stokes"], "telatesla" => [12, "tesla"], "telaton" => [12, "ton"], "telatonne" => [12, "tonne"], "telatorr" => [12, "torr"], "telavolt" => [12, "volt"], "telawatt" => [12, "watt"], "telaweber" => [12, "weber"], "telayard" => [12, "yard"], "telayd" => [12, "yd"], "telayear" => [12, "year"], "teslas" => [0, "tesla"], "tonnes" => [0, "tonne"], "tons" => [0, "ton"], "torrs" => [0, "torr"], "uA" => [-6, "A"], "uAu" => [-6, "Au"], "uBq" => [-6, "Bq"], "uC" => [-6, "C"], "uF" => [-6, "F"], "uG" => [-6, "G"], "uGal" => [-6, "Gal"], "uGy" => [-6, "Gy"], "uH" => [-6, "H"], "uHg" => [-6, "Hg"], "uHz" => [-6, "Hz"], "uJ" => [-6, "J"], "uK" => [-6, "K"], "uL" => [-6, "L"], "uN" => [-6, "N"], "uP" => [-6, "P"], "uPa" => [-6, "Pa"], "uS" => [-6, "S"], "uSt" => [-6, "St"], "uSv" => [-6, "Sv"], "uT" => [-6, "T"], "uV" => [-6, "V"], "uW" => [-6, "W"], "uWb" => [-6, "Wb"], "ua" => [-6, "a"], "uac" => [-6, "ac"], "uatm" => [-6, "atm"], "ubar" => [-6, "bar"], "ucal" => [-6, "cal"], "ucd" => [-6, "cd"], "uconventional_mercury" => [-6, "conventional_mercury"], "udegC" => [-6, "degC"], "udegF" => [-6, "degF"], "udeg_C" => [-6, "deg_C"], "udeg_F" => [-6, "deg_F"], "udegreeC" => [-6, "degreeC"], "udegreeF" => [-6, "degreeF"], "udegree_C" => [-6, "degree_C"], "udegree_E" => [-6, "degree_E"], "udegree_F" => [-6, "degree_F"], "udegree_N" => [-6, "degree_N"], "udegree_R" => [-6, "degree_R"], "udegree_S" => [-6, "degree_S"], "udegree_W" => [-6, "degree_W"], "udegree_c" => [-6, "degree_c"], "udegree_east" => [-6, "degree_east"], "udegree_f" => [-6, "degree_f"], "udegree_north" => [-6, "degree_north"], "udegree_south" => [-6, "degree_south"], "udegree_west" => [-6, "degree_west"], "udegrees_east" => [-6, "degrees_east"], "udegrees_north" => [-6, "degrees_north"], "udegrees_south" => [-6, "degrees_south"], "udegrees_west" => [-6, "degrees_west"], "udyn" => [-6, "dyn"], "uerg" => [-6, "erg"], "uforce" => [-6, "force"], "ug" => [-6, "g"], "ugravity" => [-6, "gravity"], "uh" => [-6, "h"], "uhg" => [-6, "hg"], "uhr" => [-6, "hr"], "uin" => [-6, "in"], "ukgf" => [-6, "kgf"], "ukph" => [-6, "kph"], "ulb" => [-6, "lb"], "ulm" => [-6, "lm"], "ulx" => [-6, "lx"], "uly" => [-6, "ly"], "um" => [-6, "m"], "umb" => [-6, "mb"], "umercury" => [-6, "mercury"], "umgal" => [-6, "mgal"], "umin" => [-6, "min"], "umol" => [-6, "mol"], "umon" => [-6, "mon"], "umph" => [-6, "mph"], "uohm" => [-6, "ohm"], "uoz" => [-6, "oz"], "upc" => [-6, "pc"], "upsi" => [-6, "psi"], "urad" => [-6, "rad"], "us" => [-6, "s"], "usr" => [-6, "sr"], "ut" => [-6, "t"], "uyr" => [-6, "yr"], "volts" => [0, "volt"], "watts" => [0, "watt"], "webers" => [0, "weber"], "yards" => [0, "yard"], "yds" => [0, "yd"], "years" => [0, "year"], } UPLURALS = { "Celsiuses" => "Celsius", "Fahrenheits" => "Fahrenheit", "Julians_year" => "Julian_year", "Pascals" => "Pascal", "acres" => "acre", "amperes" => "ampere", "angstroms" => "angstrom", "angulars_degree" => "angular_degree", "angulars_minute" => "angular_minute", "angulars_second" => "angular_second", "ares" => "are", "atmospheres" => "atmosphere", "calories" => "calorie", "candelas" => "candela", "celsiuses" => "celsius", "centigrades" => "centigrade", "centuries" => "century", "chains" => "chain", "commons_year" => "common_year", "coulombs" => "coulomb", "days" => "day", "degKs" => "degK", "degreeKs" => "degreeK", "degrees" => "degree", "degs_K" => "deg_K", "dynes" => "dyne", "ergs" => "erg", "fahrenheits" => "fahrenheit", "farads" => "farad", "fermis" => "fermi", "gals" => "gal", "gausses" => "gauss", "grams" => "gram", "hectares" => "hectare", "hertzes" => "hertz", "hours" => "hour", "inchs" => "inch", "joules" => "joule", "kelvins" => "kelvin", "kilograms" => "kilogram", "knots" => "knot", "litres" => "litre", "meters" => "meter", "metres" => "metre", "microns" => "micron", "miles" => "mile", "millibars" => "millibar", "minutes" => "minute", "minutes_angle" => "minute_angle", "moles" => "mole", "months" => "month", "newtons" => "newton", "ounces" => "ounce", "parsecs" => "parsec", "pascals" => "pascal", "pentads" => "pentad", "percents" => "percent", "poises" => "poise", "pounds" => "pound", "radians" => "radian", "seconds" => "second", "seconds_angle" => "second_angle", "steradians" => "steradian", "stokeses" => "stokes", "teslas" => "tesla", "tonnes" => "tonne", "tons" => "ton", "torrs" => "torr", "volts" => "volt", "watts" => "watt", "webers" => "weber", "yards" => "yard", "yds" => "yd", "years" => "year", } end numru-units-1.9.0/src/mulnode.rb0000644000175000017500000000463013025004163016437 0ustar uwabamiuwabami module Kakezan def flatten2 r = MultiNode.new() each do |child| case child when MultiNode r.append child when MulNode r.append child.flatten2 when ContainerNode r.append child.flatten2 else r.append child end end r end def name n = nil for c in @children next if NumberNode === c na = c.name if n.nil? n = na else raise "multiple names found" if na != n end end n = "1" if n.nil? n end def factor f = 1 for c in @children f *= c.factor end f end end class MulNode < ContainerNode include BinaryNode include Kakezan def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end def to_s lhs = @lhs.to_s rhs = @rhs.to_s if (/\d$/ =~ lhs && /^\w/ =~ rhs) then "#{lhs} #{rhs}" else "#{lhs}.#{rhs}" end end end class MultiNode < ContainerNode include Kakezan def initialize(*children) @children = children for c in @children raise "# MultiNode.new(#{children.inspect})" unless Node === c end end def to_s s = @children.join(';') s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.') end def each @children.each {|child| yield child } end attr_reader :children def append(other) case other when MultiNode @children += other.children else @children.push other end end def sort table = {} for child in self name = child.name if (table.include?(name)) then table[name] = table[name].mul_eval(child) else table[name] = child end end list = [] for name in table.keys.sort candi = table[name] if PowNode === candi and NumberNode === candi.lhs then v = candi.value list.push NumberNode.new(v) unless v == 1 next end next if candi.power.value == 0 list.push candi end if list.length > 1 list.delete(NumberNode::UNITY) end self.class.new(*list) end def collect_hash(stopper, op) list = [] for child in self list.push(child.send(op, stopper)) end self.class.new(*list).flatten2 end def expand(stopper) collect_hash(stopper, :expand) end def unalias(stopper) collect_hash(stopper, :unalias) end def foldnumber(stopper) collect_hash(stopper, :foldnumber) end def value raise "this is dimensional units" if (@children.size > 1) @children.first ? @children.first.value : NumberNode::UNITY.value end end numru-units-1.9.0/src/units.rb0000644000175000017500000034606213025004163016146 0ustar uwabamiuwabami# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.4.8 # from Racc grammer file "". # require 'racc/parser.rb' require 'date' module NumRu class Units < Racc::Parser module_eval(<<'...end units.racc/module_eval...', 'units.racc', 65) VERSION = "1.9" =begin = class Node Node is a parent class for classes of parse tree node. This is not expected to be instanciated directly. =end class Node def initialize(*args) raise "#{self.class} is virtual." end def to_s(*args) raise "#{self.class}#to_s is virtual." end =begin --- pow other simply constructs a PowNode object. No reduction is performed. =end def pow(other) PowNode.new(self, other) end =begin --- mul other simply constructs a MulNode object. No reduction is performed. =end def mul(other) other = NumberNode.new(other) if Numeric === other MulNode.new(self, other) end =begin --- divide other simply constructs a MulNode object. No reduction is performed. =end def divide(other) MulNode.new(self, PowNode.new(other, NumberNode.new(-1))) end =begin --- shift other simply constructs a ShiftNode object. No reduction is performed. =end def shift(other) ShiftNode.new(self, other) end =begin --- pow_eval other similar to (()), but reduces PowNode[PowNode[...]] into single PowNode[...], so overriden at PowNode class. =end def pow_eval(other) pow(other) end =begin --- inspect =end def inspect2; "#{self.class}[#{to_s}]"; end def inspect; inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '['); end =begin --- trim in most subclasses, "trim" is redirected into "trim2". =end def trim trim2 end =begin --- flatten in most subclasses, "flatten" is redirected into "flatten2". =end def flatten flatten2 end =begin --- sort =end def sort raise "#{self.class}#sort is virtual: call after flatten" end =begin --- reduce1 --- reduce2 --- reduce3 --- reduce4 --- reduce5 =end def reduce1 self end def reduce2 trim end def reduce3 trim.flatten end def reduce4 # unalias(Hash.new).trim.flatten.sort foldnumber(nil).trim.flatten.sort end def reduce5 expand(Hash.new).trim.flatten.sort end =begin --- ref to be overriden at ShiftNode --- deref to be overriden at ShiftNode =end def ref NumberNode::ZERO end def deref self end end class ErrorNode < Node def initialize(string) @a = string end def to_s; @a; end end class ContainerNode < Node def trim2 x = [] for child in self x.push child.trim2 end self.class.new(*x) end def inspect2 a = [] for child in self a.push child.inspect2 end "#{self.class}[#{a.join(', ')}]" end end module BinaryNode def each yield @lhs yield @rhs end def expand(stopper) self.class.new(@lhs.expand(stopper), @rhs.expand(stopper)) end def unalias(stopper) self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper)) end def foldnumber(stopper) self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper)) end end class TerminalNode < Node def trim2; self; end def flatten2; self; end def expand(stopper); self; end alias :unalias :expand alias :foldnumber :expand def sort; self; end end class NameNode < TerminalNode def initialize(string) @a = string end def to_s; @a; end alias :name :to_s def power; NumberNode::UNITY; end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name PowNode.new(self, self.power.add_eval(another.power)) end def expand(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self if basic? return CACHE[@a] if CACHE.include?(@a) CACHE[@a] = expand2(stopper) end def expand2(stopper) newstopper = stopper.dup newstopper[@a] = true if UDEFS.include?(@a) then Units.new(UDEFS[@a]).ptree.expand(newstopper) else p, n = UALIASES[@a] u = Units.new(UDEFS[n] || n).ptree.expand(newstopper) MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p))) end end def unalias(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self unless UALIASES.include?(@a) p, n = UALIASES[@a] u = NameNode.new(n) q = PowNode.new(NumberNode.new(10), NumberNode.new(p)) MulNode.new(u, q) end def foldnumber(stopper) return self unless UPLURALS.include?(@a) n = UPLURALS[@a] NameNode.new(n) end def basic? not (UDEFS.include?(@a) or UALIASES.include?(@a)) end CACHE = {} def factor 1 end end class NameNode UDEFS = { "%" => "1e-2", "Au" => "astronomical_unit", "Bq" => "s-1", "C" => "A.s", "Celsius" => "K @ 273.15", "F" => "C/V", "Fahrenheit" => "degree_F", "G" => "gauss", "Gal" => "cm s-2", "Gy" => "J.kg-1", "H" => "Wb.A-1", "Hg" => "mercury", "Hz" => "1/s", "J" => "N.m", "Julian_year" => "365.25 day", "L" => "litre", "N" => "kg.m.s-2", "P" => "poise", "Pa" => "N.m-2", "Pascal" => "Pa", "S" => "A/V", "St" => "stokes", "Sv" => "J.kg-1", "T" => "Wb.m-2", "V" => "J/C", "W" => "J/s", "Wb" => "V.s", "a" => "are", "ac" => "acre", "acre" => "10 chain2", "ampere" => "A", "angstrom" => "1.0e-10 m", "angular_degree" => "degree", "angular_minute" => "minute_angle", "angular_second" => "second_angle", "are" => "100 m2", "astronomical_unit" => "1.49597870e11 m", "astronomical_units" => "1.49597870e11 m", "atm" => "atmosphere", "atmosphere" => "101325 Pa", "bar" => "1e6 dyn.cm-2", "cal" => "calorie", "calorie" => "4.18605 J", "candela" => "cd", "celsius" => "K @ 273.15", "centigrade" => "K @ 273.15", "century" => "100 year", "chain" => "22 yard", "common_year" => "365 day", "conventional_mercury" => "gravity 13595.10 kg/m3", "coulomb" => "C", "d" => "24 hour", "day" => "24 hour", "degC" => "K @ 273.15", "degF" => "degree_F", "degK" => "K", "deg_C" => "K @ 273.15", "deg_F" => "degree_F", "deg_K" => "K", "degree" => "pi.rad/180", "degreeC" => "K @ 273.15", "degreeF" => "degree_F", "degreeK" => "K", "degree_C" => "K @ 273.15", "degree_E" => "degree", "degree_F" => "degree_R @ 459.67", "degree_N" => "degree", "degree_R" => "K / 1.8", "degree_S" => "degree", "degree_W" => "degree", "degree_c" => "K @ 273.15", "degree_east" => "degree_E", "degree_f" => "degree_R @ 459.67", "degree_north" => "degree_N", "degree_south" => "degree_S", "degree_west" => "degree_W", "degrees_east" => "degree_E", "degrees_north" => "degree_N", "degrees_south" => "degree_S", "degrees_west" => "degree_W", "dyn" => "g.cm.s-2", "dyne" => "g.cm.s-2", "erg" => "dyn cm", "fahrenheit" => "degree_F", "farad" => "coulomb/volt", "feet" => "foot", "fermi" => "1.0e-15 m", "foot" => "12 inch", "force" => "9.80665 m.s-2", "ft" => "foot", "g" => "kg/1000", "gal" => "cm s-2", "gauss" => "T / 10000", "gpm" => "m", "gram" => "kg/1000", "gravity" => "9.806650 meter/second2", "h" => "60 min", "hectare" => "100 are", "hertz" => "Hz", "hg" => "mercury", "horse_power" => "75 m kilogram-force / s", "hour" => "60 min", "hr" => "60 min", "in" => "inch", "inch" => "2.54 cm", "joule" => "J", "kelvin" => "K", "kgf" => "kilogram-force", "kilogram" => "kg", "knot" => "nautical_mile / hour", "kph" => "km / hour", "lb" => "pound", "light_speed" => "299792458 m/s", "light_year" => "9.46e15 m", "light_years" => "9.46e15 m", "litre" => "1.0e-3 m3", "lm" => "cd.sr", "lx" => "lm.m-2", "ly" => "light_year", "mb" => "bar / 1000", "mercury" => "conventional_mercury", "meter" => "metre", "metre" => "m", "mgal" => "cm s-2 / 1000", "micron" => "1.0e-6 m", "mile" => "1760 yard", "millibar" => "bar / 1000", "min" => "60 s", "minute" => "60 s", "minute_angle" => "pi.rad/180/60", "mole" => "mol", "mon" => "month", "month" => "6 pentad", "mph" => "mile / hour", "nautical_mile" => "1852 m", "nautical_miles" => "1852 m", "newton" => "N", "ohm" => "V/A", "ounce" => "pound / 16", "oz" => "ounce", "parsec" => "3.0857e16 m", "pascal" => "Pa", "pc" => "parsec", "percent" => "1e-2", "permil" => "1e-3", "pi" => "3.141592653589793238462", "poise" => "dyn s / cm2", "pound" => "453.6 g", "psi" => "pound-force / inch2", "radian" => "rad", "second" => "s", "second_angle" => "pi.rad/180/60/60", "steradian" => "sr", "stokes" => "cm2 / s", "t" => "ton", "tesla" => "Wb.m-2", "ton" => "1000 kg", "tonne" => "ton", "torr" => "133.322 Pa", "volt" => "V", "watt" => "W", "weber" => "Wb", "yard" => "6 feet", "yd" => "yard", "year" => "12 month", "yr" => "year", } UALIASES = { "Celsiuses" => [0, "Celsius"], "EA" => [18, "A"], "EAu" => [18, "Au"], "EBq" => [18, "Bq"], "EC" => [18, "C"], "EF" => [18, "F"], "EG" => [18, "G"], "EGal" => [18, "Gal"], "EGy" => [18, "Gy"], "EH" => [18, "H"], "EHg" => [18, "Hg"], "EHz" => [18, "Hz"], "EJ" => [18, "J"], "EK" => [18, "K"], "EL" => [18, "L"], "EN" => [18, "N"], "EP" => [18, "P"], "EPa" => [18, "Pa"], "ES" => [18, "S"], "ESt" => [18, "St"], "ESv" => [18, "Sv"], "ET" => [18, "T"], "EV" => [18, "V"], "EW" => [18, "W"], "EWb" => [18, "Wb"], "Ea" => [18, "a"], "Eac" => [18, "ac"], "Eatm" => [18, "atm"], "Ebar" => [18, "bar"], "Ecal" => [18, "cal"], "Ecd" => [18, "cd"], "Econventional_mercury" => [18, "conventional_mercury"], "EdegC" => [18, "degC"], "EdegF" => [18, "degF"], "Edeg_C" => [18, "deg_C"], "Edeg_F" => [18, "deg_F"], "EdegreeC" => [18, "degreeC"], "EdegreeF" => [18, "degreeF"], "Edegree_C" => [18, "degree_C"], "Edegree_E" => [18, "degree_E"], "Edegree_F" => [18, "degree_F"], "Edegree_N" => [18, "degree_N"], "Edegree_R" => [18, "degree_R"], "Edegree_S" => [18, "degree_S"], "Edegree_W" => [18, "degree_W"], "Edegree_c" => [18, "degree_c"], "Edegree_east" => [18, "degree_east"], "Edegree_f" => [18, "degree_f"], "Edegree_north" => [18, "degree_north"], "Edegree_south" => [18, "degree_south"], "Edegree_west" => [18, "degree_west"], "Edegrees_east" => [18, "degrees_east"], "Edegrees_north" => [18, "degrees_north"], "Edegrees_south" => [18, "degrees_south"], "Edegrees_west" => [18, "degrees_west"], "Edyn" => [18, "dyn"], "Eerg" => [18, "erg"], "Eforce" => [18, "force"], "Eg" => [18, "g"], "Egravity" => [18, "gravity"], "Eh" => [18, "h"], "Ehg" => [18, "hg"], "Ehr" => [18, "hr"], "Ein" => [18, "in"], "Ekgf" => [18, "kgf"], "Ekph" => [18, "kph"], "Elb" => [18, "lb"], "Elm" => [18, "lm"], "Elx" => [18, "lx"], "Ely" => [18, "ly"], "Em" => [18, "m"], "Emb" => [18, "mb"], "Emercury" => [18, "mercury"], "Emgal" => [18, "mgal"], "Emin" => [18, "min"], "Emol" => [18, "mol"], "Emon" => [18, "mon"], "Emph" => [18, "mph"], "Eohm" => [18, "ohm"], "Eoz" => [18, "oz"], "Epc" => [18, "pc"], "Epsi" => [18, "psi"], "Erad" => [18, "rad"], "Es" => [18, "s"], "Esr" => [18, "sr"], "Et" => [18, "t"], "Eyr" => [18, "yr"], "Fahrenheits" => [0, "Fahrenheit"], "GA" => [9, "A"], "GAu" => [9, "Au"], "GBq" => [9, "Bq"], "GC" => [9, "C"], "GF" => [9, "F"], "GG" => [9, "G"], "GGal" => [9, "Gal"], "GGy" => [9, "Gy"], "GH" => [9, "H"], "GHg" => [9, "Hg"], "GHz" => [9, "Hz"], "GJ" => [9, "J"], "GK" => [9, "K"], "GL" => [9, "L"], "GN" => [9, "N"], "GP" => [9, "P"], "GPa" => [9, "Pa"], "GS" => [9, "S"], "GSt" => [9, "St"], "GSv" => [9, "Sv"], "GT" => [9, "T"], "GV" => [9, "V"], "GW" => [9, "W"], "GWb" => [9, "Wb"], "Ga" => [9, "a"], "Gac" => [9, "ac"], "Gatm" => [9, "atm"], "Gbar" => [9, "bar"], "Gcal" => [9, "cal"], "Gcd" => [9, "cd"], "Gconventional_mercury" => [9, "conventional_mercury"], "GdegC" => [9, "degC"], "GdegF" => [9, "degF"], "Gdeg_C" => [9, "deg_C"], "Gdeg_F" => [9, "deg_F"], "GdegreeC" => [9, "degreeC"], "GdegreeF" => [9, "degreeF"], "Gdegree_C" => [9, "degree_C"], "Gdegree_E" => [9, "degree_E"], "Gdegree_F" => [9, "degree_F"], "Gdegree_N" => [9, "degree_N"], "Gdegree_R" => [9, "degree_R"], "Gdegree_S" => [9, "degree_S"], "Gdegree_W" => [9, "degree_W"], "Gdegree_c" => [9, "degree_c"], "Gdegree_east" => [9, "degree_east"], "Gdegree_f" => [9, "degree_f"], "Gdegree_north" => [9, "degree_north"], "Gdegree_south" => [9, "degree_south"], "Gdegree_west" => [9, "degree_west"], "Gdegrees_east" => [9, "degrees_east"], "Gdegrees_north" => [9, "degrees_north"], "Gdegrees_south" => [9, "degrees_south"], "Gdegrees_west" => [9, "degrees_west"], "Gdyn" => [9, "dyn"], "Gerg" => [9, "erg"], "Gforce" => [9, "force"], "Gg" => [9, "g"], "Ggravity" => [9, "gravity"], "Gh" => [9, "h"], "Ghg" => [9, "hg"], "Ghr" => [9, "hr"], "Gin" => [9, "in"], "Gkgf" => [9, "kgf"], "Gkph" => [9, "kph"], "Glb" => [9, "lb"], "Glm" => [9, "lm"], "Glx" => [9, "lx"], "Gly" => [9, "ly"], "Gm" => [9, "m"], "Gmb" => [9, "mb"], "Gmercury" => [9, "mercury"], "Gmgal" => [9, "mgal"], "Gmin" => [9, "min"], "Gmol" => [9, "mol"], "Gmon" => [9, "mon"], "Gmph" => [9, "mph"], "Gohm" => [9, "ohm"], "Goz" => [9, "oz"], "Gpc" => [9, "pc"], "Gpsi" => [9, "psi"], "Grad" => [9, "rad"], "Gs" => [9, "s"], "Gsr" => [9, "sr"], "Gt" => [9, "t"], "Gyr" => [9, "yr"], "Julians_year" => [0, "Julian_year"], "MA" => [6, "A"], "MAu" => [6, "Au"], "MBq" => [6, "Bq"], "MC" => [6, "C"], "MF" => [6, "F"], "MG" => [6, "G"], "MGal" => [6, "Gal"], "MGy" => [6, "Gy"], "MH" => [6, "H"], "MHg" => [6, "Hg"], "MHz" => [6, "Hz"], "MJ" => [6, "J"], "MK" => [6, "K"], "ML" => [6, "L"], "MN" => [6, "N"], "MP" => [6, "P"], "MPa" => [6, "Pa"], "MS" => [6, "S"], "MSt" => [6, "St"], "MSv" => [6, "Sv"], "MT" => [6, "T"], "MV" => [6, "V"], "MW" => [6, "W"], "MWb" => [6, "Wb"], "Ma" => [6, "a"], "Mac" => [6, "ac"], "Matm" => [6, "atm"], "Mbar" => [6, "bar"], "Mcal" => [6, "cal"], "Mcd" => [6, "cd"], "Mconventional_mercury" => [6, "conventional_mercury"], "MdegC" => [6, "degC"], "MdegF" => [6, "degF"], "Mdeg_C" => [6, "deg_C"], "Mdeg_F" => [6, "deg_F"], "MdegreeC" => [6, "degreeC"], "MdegreeF" => [6, "degreeF"], "Mdegree_C" => [6, "degree_C"], "Mdegree_E" => [6, "degree_E"], "Mdegree_F" => [6, "degree_F"], "Mdegree_N" => [6, "degree_N"], "Mdegree_R" => [6, "degree_R"], "Mdegree_S" => [6, "degree_S"], "Mdegree_W" => [6, "degree_W"], "Mdegree_c" => [6, "degree_c"], "Mdegree_east" => [6, "degree_east"], "Mdegree_f" => [6, "degree_f"], "Mdegree_north" => [6, "degree_north"], "Mdegree_south" => [6, "degree_south"], "Mdegree_west" => [6, "degree_west"], "Mdegrees_east" => [6, "degrees_east"], "Mdegrees_north" => [6, "degrees_north"], "Mdegrees_south" => [6, "degrees_south"], "Mdegrees_west" => [6, "degrees_west"], "Mdyn" => [6, "dyn"], "Merg" => [6, "erg"], "Mforce" => [6, "force"], "Mg" => [6, "g"], "Mgravity" => [6, "gravity"], "Mh" => [6, "h"], "Mhg" => [6, "hg"], "Mhr" => [6, "hr"], "Min" => [6, "in"], "Mkgf" => [6, "kgf"], "Mkph" => [6, "kph"], "Mlb" => [6, "lb"], "Mlm" => [6, "lm"], "Mlx" => [6, "lx"], "Mly" => [6, "ly"], "Mm" => [6, "m"], "Mmb" => [6, "mb"], "Mmercury" => [6, "mercury"], "Mmgal" => [6, "mgal"], "Mmin" => [6, "min"], "Mmol" => [6, "mol"], "Mmon" => [6, "mon"], "Mmph" => [6, "mph"], "Mohm" => [6, "ohm"], "Moz" => [6, "oz"], "Mpc" => [6, "pc"], "Mpsi" => [6, "psi"], "Mrad" => [6, "rad"], "Ms" => [6, "s"], "Msr" => [6, "sr"], "Mt" => [6, "t"], "Myr" => [6, "yr"], "PA" => [15, "A"], "PAu" => [15, "Au"], "PBq" => [15, "Bq"], "PC" => [15, "C"], "PF" => [15, "F"], "PG" => [15, "G"], "PGal" => [15, "Gal"], "PGy" => [15, "Gy"], "PH" => [15, "H"], "PHg" => [15, "Hg"], "PHz" => [15, "Hz"], "PJ" => [15, "J"], "PK" => [15, "K"], "PL" => [15, "L"], "PN" => [15, "N"], "PP" => [15, "P"], "PPa" => [15, "Pa"], "PS" => [15, "S"], "PSt" => [15, "St"], "PSv" => [15, "Sv"], "PT" => [15, "T"], "PV" => [15, "V"], "PW" => [15, "W"], "PWb" => [15, "Wb"], "Pa" => [15, "a"], "Pac" => [15, "ac"], "Pascals" => [0, "Pascal"], "Patm" => [15, "atm"], "Pbar" => [15, "bar"], "Pcal" => [15, "cal"], "Pcd" => [15, "cd"], "Pconventional_mercury" => [15, "conventional_mercury"], "PdegC" => [15, "degC"], "PdegF" => [15, "degF"], "Pdeg_C" => [15, "deg_C"], "Pdeg_F" => [15, "deg_F"], "PdegreeC" => [15, "degreeC"], "PdegreeF" => [15, "degreeF"], "Pdegree_C" => [15, "degree_C"], "Pdegree_E" => [15, "degree_E"], "Pdegree_F" => [15, "degree_F"], "Pdegree_N" => [15, "degree_N"], "Pdegree_R" => [15, "degree_R"], "Pdegree_S" => [15, "degree_S"], "Pdegree_W" => [15, "degree_W"], "Pdegree_c" => [15, "degree_c"], "Pdegree_east" => [15, "degree_east"], "Pdegree_f" => [15, "degree_f"], "Pdegree_north" => [15, "degree_north"], "Pdegree_south" => [15, "degree_south"], "Pdegree_west" => [15, "degree_west"], "Pdegrees_east" => [15, "degrees_east"], "Pdegrees_north" => [15, "degrees_north"], "Pdegrees_south" => [15, "degrees_south"], "Pdegrees_west" => [15, "degrees_west"], "Pdyn" => [15, "dyn"], "Perg" => [15, "erg"], "Pforce" => [15, "force"], "Pg" => [15, "g"], "Pgravity" => [15, "gravity"], "Ph" => [15, "h"], "Phg" => [15, "hg"], "Phr" => [15, "hr"], "Pin" => [15, "in"], "Pkgf" => [15, "kgf"], "Pkph" => [15, "kph"], "Plb" => [15, "lb"], "Plm" => [15, "lm"], "Plx" => [15, "lx"], "Ply" => [15, "ly"], "Pm" => [15, "m"], "Pmb" => [15, "mb"], "Pmercury" => [15, "mercury"], "Pmgal" => [15, "mgal"], "Pmin" => [15, "min"], "Pmol" => [15, "mol"], "Pmon" => [15, "mon"], "Pmph" => [15, "mph"], "Pohm" => [15, "ohm"], "Poz" => [15, "oz"], "Ppc" => [15, "pc"], "Ppsi" => [15, "psi"], "Prad" => [15, "rad"], "Ps" => [15, "s"], "Psr" => [15, "sr"], "Pt" => [15, "t"], "Pyr" => [15, "yr"], "TA" => [12, "A"], "TAu" => [12, "Au"], "TBq" => [12, "Bq"], "TC" => [12, "C"], "TF" => [12, "F"], "TG" => [12, "G"], "TGal" => [12, "Gal"], "TGy" => [12, "Gy"], "TH" => [12, "H"], "THg" => [12, "Hg"], "THz" => [12, "Hz"], "TJ" => [12, "J"], "TK" => [12, "K"], "TL" => [12, "L"], "TN" => [12, "N"], "TP" => [12, "P"], "TPa" => [12, "Pa"], "TS" => [12, "S"], "TSt" => [12, "St"], "TSv" => [12, "Sv"], "TT" => [12, "T"], "TV" => [12, "V"], "TW" => [12, "W"], "TWb" => [12, "Wb"], "Ta" => [12, "a"], "Tac" => [12, "ac"], "Tatm" => [12, "atm"], "Tbar" => [12, "bar"], "Tcal" => [12, "cal"], "Tcd" => [12, "cd"], "Tconventional_mercury" => [12, "conventional_mercury"], "TdegC" => [12, "degC"], "TdegF" => [12, "degF"], "Tdeg_C" => [12, "deg_C"], "Tdeg_F" => [12, "deg_F"], "TdegreeC" => [12, "degreeC"], "TdegreeF" => [12, "degreeF"], "Tdegree_C" => [12, "degree_C"], "Tdegree_E" => [12, "degree_E"], "Tdegree_F" => [12, "degree_F"], "Tdegree_N" => [12, "degree_N"], "Tdegree_R" => [12, "degree_R"], "Tdegree_S" => [12, "degree_S"], "Tdegree_W" => [12, "degree_W"], "Tdegree_c" => [12, "degree_c"], "Tdegree_east" => [12, "degree_east"], "Tdegree_f" => [12, "degree_f"], "Tdegree_north" => [12, "degree_north"], "Tdegree_south" => [12, "degree_south"], "Tdegree_west" => [12, "degree_west"], "Tdegrees_east" => [12, "degrees_east"], "Tdegrees_north" => [12, "degrees_north"], "Tdegrees_south" => [12, "degrees_south"], "Tdegrees_west" => [12, "degrees_west"], "Tdyn" => [12, "dyn"], "Terg" => [12, "erg"], "Tforce" => [12, "force"], "Tg" => [12, "g"], "Tgravity" => [12, "gravity"], "Th" => [12, "h"], "Thg" => [12, "hg"], "Thr" => [12, "hr"], "Tin" => [12, "in"], "Tkgf" => [12, "kgf"], "Tkph" => [12, "kph"], "Tlb" => [12, "lb"], "Tlm" => [12, "lm"], "Tlx" => [12, "lx"], "Tly" => [12, "ly"], "Tm" => [12, "m"], "Tmb" => [12, "mb"], "Tmercury" => [12, "mercury"], "Tmgal" => [12, "mgal"], "Tmin" => [12, "min"], "Tmol" => [12, "mol"], "Tmon" => [12, "mon"], "Tmph" => [12, "mph"], "Tohm" => [12, "ohm"], "Toz" => [12, "oz"], "Tpc" => [12, "pc"], "Tpsi" => [12, "psi"], "Trad" => [12, "rad"], "Ts" => [12, "s"], "Tsr" => [12, "sr"], "Tt" => [12, "t"], "Tyr" => [12, "yr"], "aA" => [-18, "A"], "aAu" => [-18, "Au"], "aBq" => [-18, "Bq"], "aC" => [-18, "C"], "aF" => [-18, "F"], "aG" => [-18, "G"], "aGal" => [-18, "Gal"], "aGy" => [-18, "Gy"], "aH" => [-18, "H"], "aHg" => [-18, "Hg"], "aHz" => [-18, "Hz"], "aJ" => [-18, "J"], "aK" => [-18, "K"], "aL" => [-18, "L"], "aN" => [-18, "N"], "aP" => [-18, "P"], "aPa" => [-18, "Pa"], "aS" => [-18, "S"], "aSt" => [-18, "St"], "aSv" => [-18, "Sv"], "aT" => [-18, "T"], "aV" => [-18, "V"], "aW" => [-18, "W"], "aWb" => [-18, "Wb"], "aa" => [-18, "a"], "aac" => [-18, "ac"], "aatm" => [-18, "atm"], "abar" => [-18, "bar"], "acal" => [-18, "cal"], "acd" => [-18, "cd"], "aconventional_mercury" => [-18, "conventional_mercury"], "acres" => [0, "acre"], "adegC" => [-18, "degC"], "adegF" => [-18, "degF"], "adeg_C" => [-18, "deg_C"], "adeg_F" => [-18, "deg_F"], "adegreeC" => [-18, "degreeC"], "adegreeF" => [-18, "degreeF"], "adegree_C" => [-18, "degree_C"], "adegree_E" => [-18, "degree_E"], "adegree_F" => [-18, "degree_F"], "adegree_N" => [-18, "degree_N"], "adegree_R" => [-18, "degree_R"], "adegree_S" => [-18, "degree_S"], "adegree_W" => [-18, "degree_W"], "adegree_c" => [-18, "degree_c"], "adegree_east" => [-18, "degree_east"], "adegree_f" => [-18, "degree_f"], "adegree_north" => [-18, "degree_north"], "adegree_south" => [-18, "degree_south"], "adegree_west" => [-18, "degree_west"], "adegrees_east" => [-18, "degrees_east"], "adegrees_north" => [-18, "degrees_north"], "adegrees_south" => [-18, "degrees_south"], "adegrees_west" => [-18, "degrees_west"], "adyn" => [-18, "dyn"], "aerg" => [-18, "erg"], "aforce" => [-18, "force"], "ag" => [-18, "g"], "agravity" => [-18, "gravity"], "ah" => [-18, "h"], "ahg" => [-18, "hg"], "ahr" => [-18, "hr"], "ain" => [-18, "in"], "akgf" => [-18, "kgf"], "akph" => [-18, "kph"], "alb" => [-18, "lb"], "alm" => [-18, "lm"], "alx" => [-18, "lx"], "aly" => [-18, "ly"], "am" => [-18, "m"], "amb" => [-18, "mb"], "amercury" => [-18, "mercury"], "amgal" => [-18, "mgal"], "amin" => [-18, "min"], "amol" => [-18, "mol"], "amon" => [-18, "mon"], "amperes" => [0, "ampere"], "amph" => [-18, "mph"], "angstroms" => [0, "angstrom"], "angulars_degree" => [0, "angular_degree"], "angulars_minute" => [0, "angular_minute"], "angulars_second" => [0, "angular_second"], "aohm" => [-18, "ohm"], "aoz" => [-18, "oz"], "apc" => [-18, "pc"], "apsi" => [-18, "psi"], "arad" => [-18, "rad"], "ares" => [0, "are"], "as" => [-18, "s"], "asr" => [-18, "sr"], "at" => [-18, "t"], "atmospheres" => [0, "atmosphere"], "attoCelsius" => [-18, "Celsius"], "attoFahrenheit" => [-18, "Fahrenheit"], "attoJulian_year" => [-18, "Julian_year"], "attoPascal" => [-18, "Pascal"], "attoacre" => [-18, "acre"], "attoampere" => [-18, "ampere"], "attoangstrom" => [-18, "angstrom"], "attoangular_degree" => [-18, "angular_degree"], "attoangular_minute" => [-18, "angular_minute"], "attoangular_second" => [-18, "angular_second"], "attoare" => [-18, "are"], "attoatmosphere" => [-18, "atmosphere"], "attocalorie" => [-18, "calorie"], "attocandela" => [-18, "candela"], "attocelsius" => [-18, "celsius"], "attocentigrade" => [-18, "centigrade"], "attocentury" => [-18, "century"], "attochain" => [-18, "chain"], "attocommon_year" => [-18, "common_year"], "attocoulomb" => [-18, "coulomb"], "attoday" => [-18, "day"], "attodegK" => [-18, "degK"], "attodeg_K" => [-18, "deg_K"], "attodegree" => [-18, "degree"], "attodegreeK" => [-18, "degreeK"], "attodyne" => [-18, "dyne"], "attoerg" => [-18, "erg"], "attofahrenheit" => [-18, "fahrenheit"], "attofarad" => [-18, "farad"], "attofermi" => [-18, "fermi"], "attogal" => [-18, "gal"], "attogauss" => [-18, "gauss"], "attogram" => [-18, "gram"], "attohectare" => [-18, "hectare"], "attohertz" => [-18, "hertz"], "attohour" => [-18, "hour"], "attoinch" => [-18, "inch"], "attojoule" => [-18, "joule"], "attokelvin" => [-18, "kelvin"], "attokilogram" => [-18, "kilogram"], "attoknot" => [-18, "knot"], "attolitre" => [-18, "litre"], "attometer" => [-18, "meter"], "attometre" => [-18, "metre"], "attomicron" => [-18, "micron"], "attomile" => [-18, "mile"], "attomillibar" => [-18, "millibar"], "attominute" => [-18, "minute"], "attominute_angle" => [-18, "minute_angle"], "attomole" => [-18, "mole"], "attomonth" => [-18, "month"], "attonewton" => [-18, "newton"], "attoounce" => [-18, "ounce"], "attoparsec" => [-18, "parsec"], "attopascal" => [-18, "pascal"], "attopentad" => [-18, "pentad"], "attopercent" => [-18, "percent"], "attopoise" => [-18, "poise"], "attopound" => [-18, "pound"], "attoradian" => [-18, "radian"], "attosecond" => [-18, "second"], "attosecond_angle" => [-18, "second_angle"], "attosteradian" => [-18, "steradian"], "attostokes" => [-18, "stokes"], "attotesla" => [-18, "tesla"], "attoton" => [-18, "ton"], "attotonne" => [-18, "tonne"], "attotorr" => [-18, "torr"], "attovolt" => [-18, "volt"], "attowatt" => [-18, "watt"], "attoweber" => [-18, "weber"], "attoyard" => [-18, "yard"], "attoyd" => [-18, "yd"], "attoyear" => [-18, "year"], "ayr" => [-18, "yr"], "cA" => [-2, "A"], "cAu" => [-2, "Au"], "cBq" => [-2, "Bq"], "cC" => [-2, "C"], "cF" => [-2, "F"], "cG" => [-2, "G"], "cGal" => [-2, "Gal"], "cGy" => [-2, "Gy"], "cH" => [-2, "H"], "cHg" => [-2, "Hg"], "cHz" => [-2, "Hz"], "cJ" => [-2, "J"], "cK" => [-2, "K"], "cL" => [-2, "L"], "cN" => [-2, "N"], "cP" => [-2, "P"], "cPa" => [-2, "Pa"], "cS" => [-2, "S"], "cSt" => [-2, "St"], "cSv" => [-2, "Sv"], "cT" => [-2, "T"], "cV" => [-2, "V"], "cW" => [-2, "W"], "cWb" => [-2, "Wb"], "ca" => [-2, "a"], "cac" => [-2, "ac"], "calories" => [0, "calorie"], "candelas" => [0, "candela"], "catm" => [-2, "atm"], "cbar" => [-2, "bar"], "ccal" => [-2, "cal"], "ccd" => [-2, "cd"], "cconventional_mercury" => [-2, "conventional_mercury"], "cdegC" => [-2, "degC"], "cdegF" => [-2, "degF"], "cdeg_C" => [-2, "deg_C"], "cdeg_F" => [-2, "deg_F"], "cdegreeC" => [-2, "degreeC"], "cdegreeF" => [-2, "degreeF"], "cdegree_C" => [-2, "degree_C"], "cdegree_E" => [-2, "degree_E"], "cdegree_F" => [-2, "degree_F"], "cdegree_N" => [-2, "degree_N"], "cdegree_R" => [-2, "degree_R"], "cdegree_S" => [-2, "degree_S"], "cdegree_W" => [-2, "degree_W"], "cdegree_c" => [-2, "degree_c"], "cdegree_east" => [-2, "degree_east"], "cdegree_f" => [-2, "degree_f"], "cdegree_north" => [-2, "degree_north"], "cdegree_south" => [-2, "degree_south"], "cdegree_west" => [-2, "degree_west"], "cdegrees_east" => [-2, "degrees_east"], "cdegrees_north" => [-2, "degrees_north"], "cdegrees_south" => [-2, "degrees_south"], "cdegrees_west" => [-2, "degrees_west"], "cdyn" => [-2, "dyn"], "celsiuses" => [0, "celsius"], "centiCelsius" => [-2, "Celsius"], "centiFahrenheit" => [-2, "Fahrenheit"], "centiJulian_year" => [-2, "Julian_year"], "centiPascal" => [-2, "Pascal"], "centiacre" => [-2, "acre"], "centiampere" => [-2, "ampere"], "centiangstrom" => [-2, "angstrom"], "centiangular_degree" => [-2, "angular_degree"], "centiangular_minute" => [-2, "angular_minute"], "centiangular_second" => [-2, "angular_second"], "centiare" => [-2, "are"], "centiatmosphere" => [-2, "atmosphere"], "centicalorie" => [-2, "calorie"], "centicandela" => [-2, "candela"], "centicelsius" => [-2, "celsius"], "centicentigrade" => [-2, "centigrade"], "centicentury" => [-2, "century"], "centichain" => [-2, "chain"], "centicommon_year" => [-2, "common_year"], "centicoulomb" => [-2, "coulomb"], "centiday" => [-2, "day"], "centidegK" => [-2, "degK"], "centideg_K" => [-2, "deg_K"], "centidegree" => [-2, "degree"], "centidegreeK" => [-2, "degreeK"], "centidyne" => [-2, "dyne"], "centierg" => [-2, "erg"], "centifahrenheit" => [-2, "fahrenheit"], "centifarad" => [-2, "farad"], "centifermi" => [-2, "fermi"], "centigal" => [-2, "gal"], "centigauss" => [-2, "gauss"], "centigrades" => [0, "centigrade"], "centigram" => [-2, "gram"], "centihectare" => [-2, "hectare"], "centihertz" => [-2, "hertz"], "centihour" => [-2, "hour"], "centiinch" => [-2, "inch"], "centijoule" => [-2, "joule"], "centikelvin" => [-2, "kelvin"], "centikilogram" => [-2, "kilogram"], "centiknot" => [-2, "knot"], "centilitre" => [-2, "litre"], "centimeter" => [-2, "meter"], "centimetre" => [-2, "metre"], "centimicron" => [-2, "micron"], "centimile" => [-2, "mile"], "centimillibar" => [-2, "millibar"], "centiminute" => [-2, "minute"], "centiminute_angle" => [-2, "minute_angle"], "centimole" => [-2, "mole"], "centimonth" => [-2, "month"], "centinewton" => [-2, "newton"], "centiounce" => [-2, "ounce"], "centiparsec" => [-2, "parsec"], "centipascal" => [-2, "pascal"], "centipentad" => [-2, "pentad"], "centipercent" => [-2, "percent"], "centipoise" => [-2, "poise"], "centipound" => [-2, "pound"], "centiradian" => [-2, "radian"], "centisecond" => [-2, "second"], "centisecond_angle" => [-2, "second_angle"], "centisteradian" => [-2, "steradian"], "centistokes" => [-2, "stokes"], "centitesla" => [-2, "tesla"], "centiton" => [-2, "ton"], "centitonne" => [-2, "tonne"], "centitorr" => [-2, "torr"], "centivolt" => [-2, "volt"], "centiwatt" => [-2, "watt"], "centiweber" => [-2, "weber"], "centiyard" => [-2, "yard"], "centiyd" => [-2, "yd"], "centiyear" => [-2, "year"], "centuries" => [0, "century"], "cerg" => [-2, "erg"], "cforce" => [-2, "force"], "cg" => [-2, "g"], "cgravity" => [-2, "gravity"], "ch" => [-2, "h"], "chains" => [0, "chain"], "chg" => [-2, "hg"], "chr" => [-2, "hr"], "cin" => [-2, "in"], "ckgf" => [-2, "kgf"], "ckph" => [-2, "kph"], "clb" => [-2, "lb"], "clm" => [-2, "lm"], "clx" => [-2, "lx"], "cly" => [-2, "ly"], "cm" => [-2, "m"], "cmb" => [-2, "mb"], "cmercury" => [-2, "mercury"], "cmgal" => [-2, "mgal"], "cmin" => [-2, "min"], "cmol" => [-2, "mol"], "cmon" => [-2, "mon"], "cmph" => [-2, "mph"], "cohm" => [-2, "ohm"], "commons_year" => [0, "common_year"], "coulombs" => [0, "coulomb"], "coz" => [-2, "oz"], "cpc" => [-2, "pc"], "cpsi" => [-2, "psi"], "crad" => [-2, "rad"], "cs" => [-2, "s"], "csr" => [-2, "sr"], "ct" => [-2, "t"], "cyr" => [-2, "yr"], "dA" => [-1, "A"], "dAu" => [-1, "Au"], "dBq" => [-1, "Bq"], "dC" => [-1, "C"], "dF" => [-1, "F"], "dG" => [-1, "G"], "dGal" => [-1, "Gal"], "dGy" => [-1, "Gy"], "dH" => [-1, "H"], "dHg" => [-1, "Hg"], "dHz" => [-1, "Hz"], "dJ" => [-1, "J"], "dK" => [-1, "K"], "dL" => [-1, "L"], "dN" => [-1, "N"], "dP" => [-1, "P"], "dPa" => [-1, "Pa"], "dS" => [-1, "S"], "dSt" => [-1, "St"], "dSv" => [-1, "Sv"], "dT" => [-1, "T"], "dV" => [-1, "V"], "dW" => [-1, "W"], "dWb" => [-1, "Wb"], "da" => [-1, "a"], "daA" => [1, "A"], "daAu" => [1, "Au"], "daBq" => [1, "Bq"], "daC" => [1, "C"], "daF" => [1, "F"], "daG" => [1, "G"], "daGal" => [1, "Gal"], "daGy" => [1, "Gy"], "daH" => [1, "H"], "daHg" => [1, "Hg"], "daHz" => [1, "Hz"], "daJ" => [1, "J"], "daK" => [1, "K"], "daL" => [1, "L"], "daN" => [1, "N"], "daP" => [1, "P"], "daPa" => [1, "Pa"], "daS" => [1, "S"], "daSt" => [1, "St"], "daSv" => [1, "Sv"], "daT" => [1, "T"], "daV" => [1, "V"], "daW" => [1, "W"], "daWb" => [1, "Wb"], "daa" => [1, "a"], "daac" => [1, "ac"], "daatm" => [1, "atm"], "dabar" => [1, "bar"], "dac" => [-1, "ac"], "dacal" => [1, "cal"], "dacd" => [1, "cd"], "daconventional_mercury" => [1, "conventional_mercury"], "dadegC" => [1, "degC"], "dadegF" => [1, "degF"], "dadeg_C" => [1, "deg_C"], "dadeg_F" => [1, "deg_F"], "dadegreeC" => [1, "degreeC"], "dadegreeF" => [1, "degreeF"], "dadegree_C" => [1, "degree_C"], "dadegree_E" => [1, "degree_E"], "dadegree_F" => [1, "degree_F"], "dadegree_N" => [1, "degree_N"], "dadegree_R" => [1, "degree_R"], "dadegree_S" => [1, "degree_S"], "dadegree_W" => [1, "degree_W"], "dadegree_c" => [1, "degree_c"], "dadegree_east" => [1, "degree_east"], "dadegree_f" => [1, "degree_f"], "dadegree_north" => [1, "degree_north"], "dadegree_south" => [1, "degree_south"], "dadegree_west" => [1, "degree_west"], "dadegrees_east" => [1, "degrees_east"], "dadegrees_north" => [1, "degrees_north"], "dadegrees_south" => [1, "degrees_south"], "dadegrees_west" => [1, "degrees_west"], "dadyn" => [1, "dyn"], "daerg" => [1, "erg"], "daforce" => [1, "force"], "dag" => [1, "g"], "dagravity" => [1, "gravity"], "dah" => [1, "h"], "dahg" => [1, "hg"], "dahr" => [1, "hr"], "dain" => [1, "in"], "dakgf" => [1, "kgf"], "dakph" => [1, "kph"], "dalb" => [1, "lb"], "dalm" => [1, "lm"], "dalx" => [1, "lx"], "daly" => [1, "ly"], "dam" => [1, "m"], "damb" => [1, "mb"], "damercury" => [1, "mercury"], "damgal" => [1, "mgal"], "damin" => [1, "min"], "damol" => [1, "mol"], "damon" => [1, "mon"], "damph" => [1, "mph"], "daohm" => [1, "ohm"], "daoz" => [1, "oz"], "dapc" => [1, "pc"], "dapsi" => [1, "psi"], "darad" => [1, "rad"], "das" => [1, "s"], "dasr" => [1, "sr"], "dat" => [1, "t"], "datm" => [-1, "atm"], "dayr" => [1, "yr"], "days" => [0, "day"], "dbar" => [-1, "bar"], "dcal" => [-1, "cal"], "dcd" => [-1, "cd"], "dconventional_mercury" => [-1, "conventional_mercury"], "ddegC" => [-1, "degC"], "ddegF" => [-1, "degF"], "ddeg_C" => [-1, "deg_C"], "ddeg_F" => [-1, "deg_F"], "ddegreeC" => [-1, "degreeC"], "ddegreeF" => [-1, "degreeF"], "ddegree_C" => [-1, "degree_C"], "ddegree_E" => [-1, "degree_E"], "ddegree_F" => [-1, "degree_F"], "ddegree_N" => [-1, "degree_N"], "ddegree_R" => [-1, "degree_R"], "ddegree_S" => [-1, "degree_S"], "ddegree_W" => [-1, "degree_W"], "ddegree_c" => [-1, "degree_c"], "ddegree_east" => [-1, "degree_east"], "ddegree_f" => [-1, "degree_f"], "ddegree_north" => [-1, "degree_north"], "ddegree_south" => [-1, "degree_south"], "ddegree_west" => [-1, "degree_west"], "ddegrees_east" => [-1, "degrees_east"], "ddegrees_north" => [-1, "degrees_north"], "ddegrees_south" => [-1, "degrees_south"], "ddegrees_west" => [-1, "degrees_west"], "ddyn" => [-1, "dyn"], "decaCelsius" => [1, "Celsius"], "decaFahrenheit" => [1, "Fahrenheit"], "decaJulian_year" => [1, "Julian_year"], "decaPascal" => [1, "Pascal"], "decaacre" => [1, "acre"], "decaampere" => [1, "ampere"], "decaangstrom" => [1, "angstrom"], "decaangular_degree" => [1, "angular_degree"], "decaangular_minute" => [1, "angular_minute"], "decaangular_second" => [1, "angular_second"], "decaare" => [1, "are"], "decaatmosphere" => [1, "atmosphere"], "decacalorie" => [1, "calorie"], "decacandela" => [1, "candela"], "decacelsius" => [1, "celsius"], "decacentigrade" => [1, "centigrade"], "decacentury" => [1, "century"], "decachain" => [1, "chain"], "decacommon_year" => [1, "common_year"], "decacoulomb" => [1, "coulomb"], "decaday" => [1, "day"], "decadegK" => [1, "degK"], "decadeg_K" => [1, "deg_K"], "decadegree" => [1, "degree"], "decadegreeK" => [1, "degreeK"], "decadyne" => [1, "dyne"], "decaerg" => [1, "erg"], "decafahrenheit" => [1, "fahrenheit"], "decafarad" => [1, "farad"], "decafermi" => [1, "fermi"], "decagal" => [1, "gal"], "decagauss" => [1, "gauss"], "decagram" => [1, "gram"], "decahectare" => [1, "hectare"], "decahertz" => [1, "hertz"], "decahour" => [1, "hour"], "decainch" => [1, "inch"], "decajoule" => [1, "joule"], "decakelvin" => [1, "kelvin"], "decakilogram" => [1, "kilogram"], "decaknot" => [1, "knot"], "decalitre" => [1, "litre"], "decameter" => [1, "meter"], "decametre" => [1, "metre"], "decamicron" => [1, "micron"], "decamile" => [1, "mile"], "decamillibar" => [1, "millibar"], "decaminute" => [1, "minute"], "decaminute_angle" => [1, "minute_angle"], "decamole" => [1, "mole"], "decamonth" => [1, "month"], "decanewton" => [1, "newton"], "decaounce" => [1, "ounce"], "decaparsec" => [1, "parsec"], "decapascal" => [1, "pascal"], "decapentad" => [1, "pentad"], "decapercent" => [1, "percent"], "decapoise" => [1, "poise"], "decapound" => [1, "pound"], "decaradian" => [1, "radian"], "decasecond" => [1, "second"], "decasecond_angle" => [1, "second_angle"], "decasteradian" => [1, "steradian"], "decastokes" => [1, "stokes"], "decatesla" => [1, "tesla"], "decaton" => [1, "ton"], "decatonne" => [1, "tonne"], "decatorr" => [1, "torr"], "decavolt" => [1, "volt"], "decawatt" => [1, "watt"], "decaweber" => [1, "weber"], "decayard" => [1, "yard"], "decayd" => [1, "yd"], "decayear" => [1, "year"], "deciCelsius" => [-1, "Celsius"], "deciFahrenheit" => [-1, "Fahrenheit"], "deciJulian_year" => [-1, "Julian_year"], "deciPascal" => [-1, "Pascal"], "deciacre" => [-1, "acre"], "deciampere" => [-1, "ampere"], "deciangstrom" => [-1, "angstrom"], "deciangular_degree" => [-1, "angular_degree"], "deciangular_minute" => [-1, "angular_minute"], "deciangular_second" => [-1, "angular_second"], "deciare" => [-1, "are"], "deciatmosphere" => [-1, "atmosphere"], "decicalorie" => [-1, "calorie"], "decicandela" => [-1, "candela"], "decicelsius" => [-1, "celsius"], "decicentigrade" => [-1, "centigrade"], "decicentury" => [-1, "century"], "decichain" => [-1, "chain"], "decicommon_year" => [-1, "common_year"], "decicoulomb" => [-1, "coulomb"], "deciday" => [-1, "day"], "decidegK" => [-1, "degK"], "decideg_K" => [-1, "deg_K"], "decidegree" => [-1, "degree"], "decidegreeK" => [-1, "degreeK"], "decidyne" => [-1, "dyne"], "decierg" => [-1, "erg"], "decifahrenheit" => [-1, "fahrenheit"], "decifarad" => [-1, "farad"], "decifermi" => [-1, "fermi"], "decigal" => [-1, "gal"], "decigauss" => [-1, "gauss"], "decigram" => [-1, "gram"], "decihectare" => [-1, "hectare"], "decihertz" => [-1, "hertz"], "decihour" => [-1, "hour"], "deciinch" => [-1, "inch"], "decijoule" => [-1, "joule"], "decikelvin" => [-1, "kelvin"], "decikilogram" => [-1, "kilogram"], "deciknot" => [-1, "knot"], "decilitre" => [-1, "litre"], "decimeter" => [-1, "meter"], "decimetre" => [-1, "metre"], "decimicron" => [-1, "micron"], "decimile" => [-1, "mile"], "decimillibar" => [-1, "millibar"], "deciminute" => [-1, "minute"], "deciminute_angle" => [-1, "minute_angle"], "decimole" => [-1, "mole"], "decimonth" => [-1, "month"], "decinewton" => [-1, "newton"], "deciounce" => [-1, "ounce"], "deciparsec" => [-1, "parsec"], "decipascal" => [-1, "pascal"], "decipentad" => [-1, "pentad"], "decipercent" => [-1, "percent"], "decipoise" => [-1, "poise"], "decipound" => [-1, "pound"], "deciradian" => [-1, "radian"], "decisecond" => [-1, "second"], "decisecond_angle" => [-1, "second_angle"], "decisteradian" => [-1, "steradian"], "decistokes" => [-1, "stokes"], "decitesla" => [-1, "tesla"], "deciton" => [-1, "ton"], "decitonne" => [-1, "tonne"], "decitorr" => [-1, "torr"], "decivolt" => [-1, "volt"], "deciwatt" => [-1, "watt"], "deciweber" => [-1, "weber"], "deciyard" => [-1, "yard"], "deciyd" => [-1, "yd"], "deciyear" => [-1, "year"], "degKs" => [0, "degK"], "degreeKs" => [0, "degreeK"], "degrees" => [0, "degree"], "degs_K" => [0, "deg_K"], "derg" => [-1, "erg"], "dforce" => [-1, "force"], "dg" => [-1, "g"], "dgravity" => [-1, "gravity"], "dh" => [-1, "h"], "dhg" => [-1, "hg"], "dhr" => [-1, "hr"], "din" => [-1, "in"], "dkgf" => [-1, "kgf"], "dkph" => [-1, "kph"], "dlb" => [-1, "lb"], "dlm" => [-1, "lm"], "dlx" => [-1, "lx"], "dly" => [-1, "ly"], "dm" => [-1, "m"], "dmb" => [-1, "mb"], "dmercury" => [-1, "mercury"], "dmgal" => [-1, "mgal"], "dmin" => [-1, "min"], "dmol" => [-1, "mol"], "dmon" => [-1, "mon"], "dmph" => [-1, "mph"], "dohm" => [-1, "ohm"], "doz" => [-1, "oz"], "dpc" => [-1, "pc"], "dpsi" => [-1, "psi"], "drad" => [-1, "rad"], "ds" => [-1, "s"], "dsr" => [-1, "sr"], "dt" => [-1, "t"], "dynes" => [0, "dyne"], "dyr" => [-1, "yr"], "ergs" => [0, "erg"], "exaCelsius" => [18, "Celsius"], "exaFahrenheit" => [18, "Fahrenheit"], "exaJulian_year" => [18, "Julian_year"], "exaPascal" => [18, "Pascal"], "exaacre" => [18, "acre"], "exaampere" => [18, "ampere"], "exaangstrom" => [18, "angstrom"], "exaangular_degree" => [18, "angular_degree"], "exaangular_minute" => [18, "angular_minute"], "exaangular_second" => [18, "angular_second"], "exaare" => [18, "are"], "exaatmosphere" => [18, "atmosphere"], "exacalorie" => [18, "calorie"], "exacandela" => [18, "candela"], "exacelsius" => [18, "celsius"], "exacentigrade" => [18, "centigrade"], "exacentury" => [18, "century"], "exachain" => [18, "chain"], "exacommon_year" => [18, "common_year"], "exacoulomb" => [18, "coulomb"], "exaday" => [18, "day"], "exadegK" => [18, "degK"], "exadeg_K" => [18, "deg_K"], "exadegree" => [18, "degree"], "exadegreeK" => [18, "degreeK"], "exadyne" => [18, "dyne"], "exaerg" => [18, "erg"], "exafahrenheit" => [18, "fahrenheit"], "exafarad" => [18, "farad"], "exafermi" => [18, "fermi"], "exagal" => [18, "gal"], "exagauss" => [18, "gauss"], "exagram" => [18, "gram"], "exahectare" => [18, "hectare"], "exahertz" => [18, "hertz"], "exahour" => [18, "hour"], "exainch" => [18, "inch"], "exajoule" => [18, "joule"], "exakelvin" => [18, "kelvin"], "exakilogram" => [18, "kilogram"], "exaknot" => [18, "knot"], "exalitre" => [18, "litre"], "exameter" => [18, "meter"], "exametre" => [18, "metre"], "examicron" => [18, "micron"], "examile" => [18, "mile"], "examillibar" => [18, "millibar"], "examinute" => [18, "minute"], "examinute_angle" => [18, "minute_angle"], "examole" => [18, "mole"], "examonth" => [18, "month"], "exanewton" => [18, "newton"], "exaounce" => [18, "ounce"], "exaparsec" => [18, "parsec"], "exapascal" => [18, "pascal"], "exapentad" => [18, "pentad"], "exapercent" => [18, "percent"], "exapoise" => [18, "poise"], "exapound" => [18, "pound"], "exaradian" => [18, "radian"], "exasecond" => [18, "second"], "exasecond_angle" => [18, "second_angle"], "exasteradian" => [18, "steradian"], "exastokes" => [18, "stokes"], "exatesla" => [18, "tesla"], "exaton" => [18, "ton"], "exatonne" => [18, "tonne"], "exatorr" => [18, "torr"], "exavolt" => [18, "volt"], "exawatt" => [18, "watt"], "exaweber" => [18, "weber"], "exayard" => [18, "yard"], "exayd" => [18, "yd"], "exayear" => [18, "year"], "fA" => [-15, "A"], "fAu" => [-15, "Au"], "fBq" => [-15, "Bq"], "fC" => [-15, "C"], "fF" => [-15, "F"], "fG" => [-15, "G"], "fGal" => [-15, "Gal"], "fGy" => [-15, "Gy"], "fH" => [-15, "H"], "fHg" => [-15, "Hg"], "fHz" => [-15, "Hz"], "fJ" => [-15, "J"], "fK" => [-15, "K"], "fL" => [-15, "L"], "fN" => [-15, "N"], "fP" => [-15, "P"], "fPa" => [-15, "Pa"], "fS" => [-15, "S"], "fSt" => [-15, "St"], "fSv" => [-15, "Sv"], "fT" => [-15, "T"], "fV" => [-15, "V"], "fW" => [-15, "W"], "fWb" => [-15, "Wb"], "fa" => [-15, "a"], "fac" => [-15, "ac"], "fahrenheits" => [0, "fahrenheit"], "farads" => [0, "farad"], "fatm" => [-15, "atm"], "fbar" => [-15, "bar"], "fcal" => [-15, "cal"], "fcd" => [-15, "cd"], "fconventional_mercury" => [-15, "conventional_mercury"], "fdegC" => [-15, "degC"], "fdegF" => [-15, "degF"], "fdeg_C" => [-15, "deg_C"], "fdeg_F" => [-15, "deg_F"], "fdegreeC" => [-15, "degreeC"], "fdegreeF" => [-15, "degreeF"], "fdegree_C" => [-15, "degree_C"], "fdegree_E" => [-15, "degree_E"], "fdegree_F" => [-15, "degree_F"], "fdegree_N" => [-15, "degree_N"], "fdegree_R" => [-15, "degree_R"], "fdegree_S" => [-15, "degree_S"], "fdegree_W" => [-15, "degree_W"], "fdegree_c" => [-15, "degree_c"], "fdegree_east" => [-15, "degree_east"], "fdegree_f" => [-15, "degree_f"], "fdegree_north" => [-15, "degree_north"], "fdegree_south" => [-15, "degree_south"], "fdegree_west" => [-15, "degree_west"], "fdegrees_east" => [-15, "degrees_east"], "fdegrees_north" => [-15, "degrees_north"], "fdegrees_south" => [-15, "degrees_south"], "fdegrees_west" => [-15, "degrees_west"], "fdyn" => [-15, "dyn"], "femtoCelsius" => [-15, "Celsius"], "femtoFahrenheit" => [-15, "Fahrenheit"], "femtoJulian_year" => [-15, "Julian_year"], "femtoPascal" => [-15, "Pascal"], "femtoacre" => [-15, "acre"], "femtoampere" => [-15, "ampere"], "femtoangstrom" => [-15, "angstrom"], "femtoangular_degree" => [-15, "angular_degree"], "femtoangular_minute" => [-15, "angular_minute"], "femtoangular_second" => [-15, "angular_second"], "femtoare" => [-15, "are"], "femtoatmosphere" => [-15, "atmosphere"], "femtocalorie" => [-15, "calorie"], "femtocandela" => [-15, "candela"], "femtocelsius" => [-15, "celsius"], "femtocentigrade" => [-15, "centigrade"], "femtocentury" => [-15, "century"], "femtochain" => [-15, "chain"], "femtocommon_year" => [-15, "common_year"], "femtocoulomb" => [-15, "coulomb"], "femtoday" => [-15, "day"], "femtodegK" => [-15, "degK"], "femtodeg_K" => [-15, "deg_K"], "femtodegree" => [-15, "degree"], "femtodegreeK" => [-15, "degreeK"], "femtodyne" => [-15, "dyne"], "femtoerg" => [-15, "erg"], "femtofahrenheit" => [-15, "fahrenheit"], "femtofarad" => [-15, "farad"], "femtofermi" => [-15, "fermi"], "femtogal" => [-15, "gal"], "femtogauss" => [-15, "gauss"], "femtogram" => [-15, "gram"], "femtohectare" => [-15, "hectare"], "femtohertz" => [-15, "hertz"], "femtohour" => [-15, "hour"], "femtoinch" => [-15, "inch"], "femtojoule" => [-15, "joule"], "femtokelvin" => [-15, "kelvin"], "femtokilogram" => [-15, "kilogram"], "femtoknot" => [-15, "knot"], "femtolitre" => [-15, "litre"], "femtometer" => [-15, "meter"], "femtometre" => [-15, "metre"], "femtomicron" => [-15, "micron"], "femtomile" => [-15, "mile"], "femtomillibar" => [-15, "millibar"], "femtominute" => [-15, "minute"], "femtominute_angle" => [-15, "minute_angle"], "femtomole" => [-15, "mole"], "femtomonth" => [-15, "month"], "femtonewton" => [-15, "newton"], "femtoounce" => [-15, "ounce"], "femtoparsec" => [-15, "parsec"], "femtopascal" => [-15, "pascal"], "femtopentad" => [-15, "pentad"], "femtopercent" => [-15, "percent"], "femtopoise" => [-15, "poise"], "femtopound" => [-15, "pound"], "femtoradian" => [-15, "radian"], "femtosecond" => [-15, "second"], "femtosecond_angle" => [-15, "second_angle"], "femtosteradian" => [-15, "steradian"], "femtostokes" => [-15, "stokes"], "femtotesla" => [-15, "tesla"], "femtoton" => [-15, "ton"], "femtotonne" => [-15, "tonne"], "femtotorr" => [-15, "torr"], "femtovolt" => [-15, "volt"], "femtowatt" => [-15, "watt"], "femtoweber" => [-15, "weber"], "femtoyard" => [-15, "yard"], "femtoyd" => [-15, "yd"], "femtoyear" => [-15, "year"], "ferg" => [-15, "erg"], "fermis" => [0, "fermi"], "fforce" => [-15, "force"], "fg" => [-15, "g"], "fgravity" => [-15, "gravity"], "fh" => [-15, "h"], "fhg" => [-15, "hg"], "fhr" => [-15, "hr"], "fin" => [-15, "in"], "fkgf" => [-15, "kgf"], "fkph" => [-15, "kph"], "flb" => [-15, "lb"], "flm" => [-15, "lm"], "flx" => [-15, "lx"], "fly" => [-15, "ly"], "fm" => [-15, "m"], "fmb" => [-15, "mb"], "fmercury" => [-15, "mercury"], "fmgal" => [-15, "mgal"], "fmin" => [-15, "min"], "fmol" => [-15, "mol"], "fmon" => [-15, "mon"], "fmph" => [-15, "mph"], "fohm" => [-15, "ohm"], "foz" => [-15, "oz"], "fpc" => [-15, "pc"], "fpsi" => [-15, "psi"], "frad" => [-15, "rad"], "fs" => [-15, "s"], "fsr" => [-15, "sr"], "ft" => [-15, "t"], "fyr" => [-15, "yr"], "gals" => [0, "gal"], "gausses" => [0, "gauss"], "gigaCelsius" => [9, "Celsius"], "gigaFahrenheit" => [9, "Fahrenheit"], "gigaJulian_year" => [9, "Julian_year"], "gigaPascal" => [9, "Pascal"], "gigaacre" => [9, "acre"], "gigaampere" => [9, "ampere"], "gigaangstrom" => [9, "angstrom"], "gigaangular_degree" => [9, "angular_degree"], "gigaangular_minute" => [9, "angular_minute"], "gigaangular_second" => [9, "angular_second"], "gigaare" => [9, "are"], "gigaatmosphere" => [9, "atmosphere"], "gigacalorie" => [9, "calorie"], "gigacandela" => [9, "candela"], "gigacelsius" => [9, "celsius"], "gigacentigrade" => [9, "centigrade"], "gigacentury" => [9, "century"], "gigachain" => [9, "chain"], "gigacommon_year" => [9, "common_year"], "gigacoulomb" => [9, "coulomb"], "gigaday" => [9, "day"], "gigadegK" => [9, "degK"], "gigadeg_K" => [9, "deg_K"], "gigadegree" => [9, "degree"], "gigadegreeK" => [9, "degreeK"], "gigadyne" => [9, "dyne"], "gigaerg" => [9, "erg"], "gigafahrenheit" => [9, "fahrenheit"], "gigafarad" => [9, "farad"], "gigafermi" => [9, "fermi"], "gigagal" => [9, "gal"], "gigagauss" => [9, "gauss"], "gigagram" => [9, "gram"], "gigahectare" => [9, "hectare"], "gigahertz" => [9, "hertz"], "gigahour" => [9, "hour"], "gigainch" => [9, "inch"], "gigajoule" => [9, "joule"], "gigakelvin" => [9, "kelvin"], "gigakilogram" => [9, "kilogram"], "gigaknot" => [9, "knot"], "gigalitre" => [9, "litre"], "gigameter" => [9, "meter"], "gigametre" => [9, "metre"], "gigamicron" => [9, "micron"], "gigamile" => [9, "mile"], "gigamillibar" => [9, "millibar"], "gigaminute" => [9, "minute"], "gigaminute_angle" => [9, "minute_angle"], "gigamole" => [9, "mole"], "gigamonth" => [9, "month"], "giganewton" => [9, "newton"], "gigaounce" => [9, "ounce"], "gigaparsec" => [9, "parsec"], "gigapascal" => [9, "pascal"], "gigapentad" => [9, "pentad"], "gigapercent" => [9, "percent"], "gigapoise" => [9, "poise"], "gigapound" => [9, "pound"], "gigaradian" => [9, "radian"], "gigasecond" => [9, "second"], "gigasecond_angle" => [9, "second_angle"], "gigasteradian" => [9, "steradian"], "gigastokes" => [9, "stokes"], "gigatesla" => [9, "tesla"], "gigaton" => [9, "ton"], "gigatonne" => [9, "tonne"], "gigatorr" => [9, "torr"], "gigavolt" => [9, "volt"], "gigawatt" => [9, "watt"], "gigaweber" => [9, "weber"], "gigayard" => [9, "yard"], "gigayd" => [9, "yd"], "gigayear" => [9, "year"], "grams" => [0, "gram"], "hA" => [2, "A"], "hAu" => [2, "Au"], "hBq" => [2, "Bq"], "hC" => [2, "C"], "hF" => [2, "F"], "hG" => [2, "G"], "hGal" => [2, "Gal"], "hGy" => [2, "Gy"], "hH" => [2, "H"], "hHg" => [2, "Hg"], "hHz" => [2, "Hz"], "hJ" => [2, "J"], "hK" => [2, "K"], "hL" => [2, "L"], "hN" => [2, "N"], "hP" => [2, "P"], "hPa" => [2, "Pa"], "hS" => [2, "S"], "hSt" => [2, "St"], "hSv" => [2, "Sv"], "hT" => [2, "T"], "hV" => [2, "V"], "hW" => [2, "W"], "hWb" => [2, "Wb"], "ha" => [2, "a"], "hac" => [2, "ac"], "hatm" => [2, "atm"], "hbar" => [2, "bar"], "hcal" => [2, "cal"], "hcd" => [2, "cd"], "hconventional_mercury" => [2, "conventional_mercury"], "hdegC" => [2, "degC"], "hdegF" => [2, "degF"], "hdeg_C" => [2, "deg_C"], "hdeg_F" => [2, "deg_F"], "hdegreeC" => [2, "degreeC"], "hdegreeF" => [2, "degreeF"], "hdegree_C" => [2, "degree_C"], "hdegree_E" => [2, "degree_E"], "hdegree_F" => [2, "degree_F"], "hdegree_N" => [2, "degree_N"], "hdegree_R" => [2, "degree_R"], "hdegree_S" => [2, "degree_S"], "hdegree_W" => [2, "degree_W"], "hdegree_c" => [2, "degree_c"], "hdegree_east" => [2, "degree_east"], "hdegree_f" => [2, "degree_f"], "hdegree_north" => [2, "degree_north"], "hdegree_south" => [2, "degree_south"], "hdegree_west" => [2, "degree_west"], "hdegrees_east" => [2, "degrees_east"], "hdegrees_north" => [2, "degrees_north"], "hdegrees_south" => [2, "degrees_south"], "hdegrees_west" => [2, "degrees_west"], "hdyn" => [2, "dyn"], "hectares" => [0, "hectare"], "hectoCelsius" => [2, "Celsius"], "hectoFahrenheit" => [2, "Fahrenheit"], "hectoJulian_year" => [2, "Julian_year"], "hectoPascal" => [2, "Pascal"], "hectoacre" => [2, "acre"], "hectoampere" => [2, "ampere"], "hectoangstrom" => [2, "angstrom"], "hectoangular_degree" => [2, "angular_degree"], "hectoangular_minute" => [2, "angular_minute"], "hectoangular_second" => [2, "angular_second"], "hectoare" => [2, "are"], "hectoatmosphere" => [2, "atmosphere"], "hectocalorie" => [2, "calorie"], "hectocandela" => [2, "candela"], "hectocelsius" => [2, "celsius"], "hectocentigrade" => [2, "centigrade"], "hectocentury" => [2, "century"], "hectochain" => [2, "chain"], "hectocommon_year" => [2, "common_year"], "hectocoulomb" => [2, "coulomb"], "hectoday" => [2, "day"], "hectodegK" => [2, "degK"], "hectodeg_K" => [2, "deg_K"], "hectodegree" => [2, "degree"], "hectodegreeK" => [2, "degreeK"], "hectodyne" => [2, "dyne"], "hectoerg" => [2, "erg"], "hectofahrenheit" => [2, "fahrenheit"], "hectofarad" => [2, "farad"], "hectofermi" => [2, "fermi"], "hectogal" => [2, "gal"], "hectogauss" => [2, "gauss"], "hectogram" => [2, "gram"], "hectohectare" => [2, "hectare"], "hectohertz" => [2, "hertz"], "hectohour" => [2, "hour"], "hectoinch" => [2, "inch"], "hectojoule" => [2, "joule"], "hectokelvin" => [2, "kelvin"], "hectokilogram" => [2, "kilogram"], "hectoknot" => [2, "knot"], "hectolitre" => [2, "litre"], "hectometer" => [2, "meter"], "hectometre" => [2, "metre"], "hectomicron" => [2, "micron"], "hectomile" => [2, "mile"], "hectomillibar" => [2, "millibar"], "hectominute" => [2, "minute"], "hectominute_angle" => [2, "minute_angle"], "hectomole" => [2, "mole"], "hectomonth" => [2, "month"], "hectonewton" => [2, "newton"], "hectoounce" => [2, "ounce"], "hectoparsec" => [2, "parsec"], "hectopascal" => [2, "pascal"], "hectopentad" => [2, "pentad"], "hectopercent" => [2, "percent"], "hectopoise" => [2, "poise"], "hectopound" => [2, "pound"], "hectoradian" => [2, "radian"], "hectosecond" => [2, "second"], "hectosecond_angle" => [2, "second_angle"], "hectosteradian" => [2, "steradian"], "hectostokes" => [2, "stokes"], "hectotesla" => [2, "tesla"], "hectoton" => [2, "ton"], "hectotonne" => [2, "tonne"], "hectotorr" => [2, "torr"], "hectovolt" => [2, "volt"], "hectowatt" => [2, "watt"], "hectoweber" => [2, "weber"], "hectoyard" => [2, "yard"], "hectoyd" => [2, "yd"], "hectoyear" => [2, "year"], "herg" => [2, "erg"], "hertzes" => [0, "hertz"], "hforce" => [2, "force"], "hg" => [2, "g"], "hgravity" => [2, "gravity"], "hh" => [2, "h"], "hhg" => [2, "hg"], "hhr" => [2, "hr"], "hin" => [2, "in"], "hkgf" => [2, "kgf"], "hkph" => [2, "kph"], "hlb" => [2, "lb"], "hlm" => [2, "lm"], "hlx" => [2, "lx"], "hly" => [2, "ly"], "hm" => [2, "m"], "hmb" => [2, "mb"], "hmercury" => [2, "mercury"], "hmgal" => [2, "mgal"], "hmin" => [2, "min"], "hmol" => [2, "mol"], "hmon" => [2, "mon"], "hmph" => [2, "mph"], "hohm" => [2, "ohm"], "hours" => [0, "hour"], "hoz" => [2, "oz"], "hpc" => [2, "pc"], "hpsi" => [2, "psi"], "hrad" => [2, "rad"], "hs" => [2, "s"], "hsr" => [2, "sr"], "ht" => [2, "t"], "hyr" => [2, "yr"], "inchs" => [0, "inch"], "joules" => [0, "joule"], "kA" => [3, "A"], "kAu" => [3, "Au"], "kBq" => [3, "Bq"], "kC" => [3, "C"], "kF" => [3, "F"], "kG" => [3, "G"], "kGal" => [3, "Gal"], "kGy" => [3, "Gy"], "kH" => [3, "H"], "kHg" => [3, "Hg"], "kHz" => [3, "Hz"], "kJ" => [3, "J"], "kK" => [3, "K"], "kL" => [3, "L"], "kN" => [3, "N"], "kP" => [3, "P"], "kPa" => [3, "Pa"], "kS" => [3, "S"], "kSt" => [3, "St"], "kSv" => [3, "Sv"], "kT" => [3, "T"], "kV" => [3, "V"], "kW" => [3, "W"], "kWb" => [3, "Wb"], "ka" => [3, "a"], "kac" => [3, "ac"], "katm" => [3, "atm"], "kbar" => [3, "bar"], "kcal" => [3, "cal"], "kcd" => [3, "cd"], "kconventional_mercury" => [3, "conventional_mercury"], "kdegC" => [3, "degC"], "kdegF" => [3, "degF"], "kdeg_C" => [3, "deg_C"], "kdeg_F" => [3, "deg_F"], "kdegreeC" => [3, "degreeC"], "kdegreeF" => [3, "degreeF"], "kdegree_C" => [3, "degree_C"], "kdegree_E" => [3, "degree_E"], "kdegree_F" => [3, "degree_F"], "kdegree_N" => [3, "degree_N"], "kdegree_R" => [3, "degree_R"], "kdegree_S" => [3, "degree_S"], "kdegree_W" => [3, "degree_W"], "kdegree_c" => [3, "degree_c"], "kdegree_east" => [3, "degree_east"], "kdegree_f" => [3, "degree_f"], "kdegree_north" => [3, "degree_north"], "kdegree_south" => [3, "degree_south"], "kdegree_west" => [3, "degree_west"], "kdegrees_east" => [3, "degrees_east"], "kdegrees_north" => [3, "degrees_north"], "kdegrees_south" => [3, "degrees_south"], "kdegrees_west" => [3, "degrees_west"], "kdyn" => [3, "dyn"], "kelvins" => [0, "kelvin"], "kerg" => [3, "erg"], "kforce" => [3, "force"], "kgravity" => [3, "gravity"], "kh" => [3, "h"], "khg" => [3, "hg"], "khr" => [3, "hr"], "kiloCelsius" => [3, "Celsius"], "kiloFahrenheit" => [3, "Fahrenheit"], "kiloJulian_year" => [3, "Julian_year"], "kiloPascal" => [3, "Pascal"], "kiloacre" => [3, "acre"], "kiloampere" => [3, "ampere"], "kiloangstrom" => [3, "angstrom"], "kiloangular_degree" => [3, "angular_degree"], "kiloangular_minute" => [3, "angular_minute"], "kiloangular_second" => [3, "angular_second"], "kiloare" => [3, "are"], "kiloatmosphere" => [3, "atmosphere"], "kilocalorie" => [3, "calorie"], "kilocandela" => [3, "candela"], "kilocelsius" => [3, "celsius"], "kilocentigrade" => [3, "centigrade"], "kilocentury" => [3, "century"], "kilochain" => [3, "chain"], "kilocommon_year" => [3, "common_year"], "kilocoulomb" => [3, "coulomb"], "kiloday" => [3, "day"], "kilodegK" => [3, "degK"], "kilodeg_K" => [3, "deg_K"], "kilodegree" => [3, "degree"], "kilodegreeK" => [3, "degreeK"], "kilodyne" => [3, "dyne"], "kiloerg" => [3, "erg"], "kilofahrenheit" => [3, "fahrenheit"], "kilofarad" => [3, "farad"], "kilofermi" => [3, "fermi"], "kilogal" => [3, "gal"], "kilogauss" => [3, "gauss"], "kilogram" => [3, "gram"], "kilograms" => [0, "kilogram"], "kilohectare" => [3, "hectare"], "kilohertz" => [3, "hertz"], "kilohour" => [3, "hour"], "kiloinch" => [3, "inch"], "kilojoule" => [3, "joule"], "kilokelvin" => [3, "kelvin"], "kilokilogram" => [3, "kilogram"], "kiloknot" => [3, "knot"], "kilolitre" => [3, "litre"], "kilometer" => [3, "meter"], "kilometre" => [3, "metre"], "kilomicron" => [3, "micron"], "kilomile" => [3, "mile"], "kilomillibar" => [3, "millibar"], "kilominute" => [3, "minute"], "kilominute_angle" => [3, "minute_angle"], "kilomole" => [3, "mole"], "kilomonth" => [3, "month"], "kilonewton" => [3, "newton"], "kiloounce" => [3, "ounce"], "kiloparsec" => [3, "parsec"], "kilopascal" => [3, "pascal"], "kilopentad" => [3, "pentad"], "kilopercent" => [3, "percent"], "kilopoise" => [3, "poise"], "kilopound" => [3, "pound"], "kiloradian" => [3, "radian"], "kilosecond" => [3, "second"], "kilosecond_angle" => [3, "second_angle"], "kilosteradian" => [3, "steradian"], "kilostokes" => [3, "stokes"], "kilotesla" => [3, "tesla"], "kiloton" => [3, "ton"], "kilotonne" => [3, "tonne"], "kilotorr" => [3, "torr"], "kilovolt" => [3, "volt"], "kilowatt" => [3, "watt"], "kiloweber" => [3, "weber"], "kiloyard" => [3, "yard"], "kiloyd" => [3, "yd"], "kiloyear" => [3, "year"], "kin" => [3, "in"], "kkgf" => [3, "kgf"], "kkph" => [3, "kph"], "klb" => [3, "lb"], "klm" => [3, "lm"], "klx" => [3, "lx"], "kly" => [3, "ly"], "km" => [3, "m"], "kmb" => [3, "mb"], "kmercury" => [3, "mercury"], "kmgal" => [3, "mgal"], "kmin" => [3, "min"], "kmol" => [3, "mol"], "kmon" => [3, "mon"], "kmph" => [3, "mph"], "knots" => [0, "knot"], "kohm" => [3, "ohm"], "koz" => [3, "oz"], "kpc" => [3, "pc"], "kpsi" => [3, "psi"], "krad" => [3, "rad"], "ks" => [3, "s"], "ksr" => [3, "sr"], "kt" => [3, "t"], "kyr" => [3, "yr"], "litres" => [0, "litre"], "mA" => [-3, "A"], "mAu" => [-3, "Au"], "mBq" => [-3, "Bq"], "mC" => [-3, "C"], "mF" => [-3, "F"], "mG" => [-3, "G"], "mGal" => [-3, "Gal"], "mGy" => [-3, "Gy"], "mH" => [-3, "H"], "mHg" => [-3, "Hg"], "mHz" => [-3, "Hz"], "mJ" => [-3, "J"], "mK" => [-3, "K"], "mL" => [-3, "L"], "mN" => [-3, "N"], "mP" => [-3, "P"], "mPa" => [-3, "Pa"], "mS" => [-3, "S"], "mSt" => [-3, "St"], "mSv" => [-3, "Sv"], "mT" => [-3, "T"], "mV" => [-3, "V"], "mW" => [-3, "W"], "mWb" => [-3, "Wb"], "ma" => [-3, "a"], "mac" => [-3, "ac"], "matm" => [-3, "atm"], "mbar" => [-3, "bar"], "mcal" => [-3, "cal"], "mcd" => [-3, "cd"], "mconventional_mercury" => [-3, "conventional_mercury"], "mdegC" => [-3, "degC"], "mdegF" => [-3, "degF"], "mdeg_C" => [-3, "deg_C"], "mdeg_F" => [-3, "deg_F"], "mdegreeC" => [-3, "degreeC"], "mdegreeF" => [-3, "degreeF"], "mdegree_C" => [-3, "degree_C"], "mdegree_E" => [-3, "degree_E"], "mdegree_F" => [-3, "degree_F"], "mdegree_N" => [-3, "degree_N"], "mdegree_R" => [-3, "degree_R"], "mdegree_S" => [-3, "degree_S"], "mdegree_W" => [-3, "degree_W"], "mdegree_c" => [-3, "degree_c"], "mdegree_east" => [-3, "degree_east"], "mdegree_f" => [-3, "degree_f"], "mdegree_north" => [-3, "degree_north"], "mdegree_south" => [-3, "degree_south"], "mdegree_west" => [-3, "degree_west"], "mdegrees_east" => [-3, "degrees_east"], "mdegrees_north" => [-3, "degrees_north"], "mdegrees_south" => [-3, "degrees_south"], "mdegrees_west" => [-3, "degrees_west"], "mdyn" => [-3, "dyn"], "megaCelsius" => [6, "Celsius"], "megaFahrenheit" => [6, "Fahrenheit"], "megaJulian_year" => [6, "Julian_year"], "megaPascal" => [6, "Pascal"], "megaacre" => [6, "acre"], "megaampere" => [6, "ampere"], "megaangstrom" => [6, "angstrom"], "megaangular_degree" => [6, "angular_degree"], "megaangular_minute" => [6, "angular_minute"], "megaangular_second" => [6, "angular_second"], "megaare" => [6, "are"], "megaatmosphere" => [6, "atmosphere"], "megacalorie" => [6, "calorie"], "megacandela" => [6, "candela"], "megacelsius" => [6, "celsius"], "megacentigrade" => [6, "centigrade"], "megacentury" => [6, "century"], "megachain" => [6, "chain"], "megacommon_year" => [6, "common_year"], "megacoulomb" => [6, "coulomb"], "megaday" => [6, "day"], "megadegK" => [6, "degK"], "megadeg_K" => [6, "deg_K"], "megadegree" => [6, "degree"], "megadegreeK" => [6, "degreeK"], "megadyne" => [6, "dyne"], "megaerg" => [6, "erg"], "megafahrenheit" => [6, "fahrenheit"], "megafarad" => [6, "farad"], "megafermi" => [6, "fermi"], "megagal" => [6, "gal"], "megagauss" => [6, "gauss"], "megagram" => [6, "gram"], "megahectare" => [6, "hectare"], "megahertz" => [6, "hertz"], "megahour" => [6, "hour"], "megainch" => [6, "inch"], "megajoule" => [6, "joule"], "megakelvin" => [6, "kelvin"], "megakilogram" => [6, "kilogram"], "megaknot" => [6, "knot"], "megalitre" => [6, "litre"], "megameter" => [6, "meter"], "megametre" => [6, "metre"], "megamicron" => [6, "micron"], "megamile" => [6, "mile"], "megamillibar" => [6, "millibar"], "megaminute" => [6, "minute"], "megaminute_angle" => [6, "minute_angle"], "megamole" => [6, "mole"], "megamonth" => [6, "month"], "meganewton" => [6, "newton"], "megaounce" => [6, "ounce"], "megaparsec" => [6, "parsec"], "megapascal" => [6, "pascal"], "megapentad" => [6, "pentad"], "megapercent" => [6, "percent"], "megapoise" => [6, "poise"], "megapound" => [6, "pound"], "megaradian" => [6, "radian"], "megasecond" => [6, "second"], "megasecond_angle" => [6, "second_angle"], "megasteradian" => [6, "steradian"], "megastokes" => [6, "stokes"], "megatesla" => [6, "tesla"], "megaton" => [6, "ton"], "megatonne" => [6, "tonne"], "megatorr" => [6, "torr"], "megavolt" => [6, "volt"], "megawatt" => [6, "watt"], "megaweber" => [6, "weber"], "megayard" => [6, "yard"], "megayd" => [6, "yd"], "megayear" => [6, "year"], "merg" => [-3, "erg"], "meters" => [0, "meter"], "metres" => [0, "metre"], "mforce" => [-3, "force"], "mg" => [-3, "g"], "mgravity" => [-3, "gravity"], "mh" => [-3, "h"], "mhg" => [-3, "hg"], "mhr" => [-3, "hr"], "microCelsius" => [-6, "Celsius"], "microFahrenheit" => [-6, "Fahrenheit"], "microJulian_year" => [-6, "Julian_year"], "microPascal" => [-6, "Pascal"], "microacre" => [-6, "acre"], "microampere" => [-6, "ampere"], "microangstrom" => [-6, "angstrom"], "microangular_degree" => [-6, "angular_degree"], "microangular_minute" => [-6, "angular_minute"], "microangular_second" => [-6, "angular_second"], "microare" => [-6, "are"], "microatmosphere" => [-6, "atmosphere"], "microcalorie" => [-6, "calorie"], "microcandela" => [-6, "candela"], "microcelsius" => [-6, "celsius"], "microcentigrade" => [-6, "centigrade"], "microcentury" => [-6, "century"], "microchain" => [-6, "chain"], "microcommon_year" => [-6, "common_year"], "microcoulomb" => [-6, "coulomb"], "microday" => [-6, "day"], "microdegK" => [-6, "degK"], "microdeg_K" => [-6, "deg_K"], "microdegree" => [-6, "degree"], "microdegreeK" => [-6, "degreeK"], "microdyne" => [-6, "dyne"], "microerg" => [-6, "erg"], "microfahrenheit" => [-6, "fahrenheit"], "microfarad" => [-6, "farad"], "microfermi" => [-6, "fermi"], "microgal" => [-6, "gal"], "microgauss" => [-6, "gauss"], "microgram" => [-6, "gram"], "microhectare" => [-6, "hectare"], "microhertz" => [-6, "hertz"], "microhour" => [-6, "hour"], "microinch" => [-6, "inch"], "microjoule" => [-6, "joule"], "microkelvin" => [-6, "kelvin"], "microkilogram" => [-6, "kilogram"], "microknot" => [-6, "knot"], "microlitre" => [-6, "litre"], "micrometer" => [-6, "meter"], "micrometre" => [-6, "metre"], "micromicron" => [-6, "micron"], "micromile" => [-6, "mile"], "micromillibar" => [-6, "millibar"], "microminute" => [-6, "minute"], "microminute_angle" => [-6, "minute_angle"], "micromole" => [-6, "mole"], "micromonth" => [-6, "month"], "micronewton" => [-6, "newton"], "microns" => [0, "micron"], "microounce" => [-6, "ounce"], "microparsec" => [-6, "parsec"], "micropascal" => [-6, "pascal"], "micropentad" => [-6, "pentad"], "micropercent" => [-6, "percent"], "micropoise" => [-6, "poise"], "micropound" => [-6, "pound"], "microradian" => [-6, "radian"], "microsecond" => [-6, "second"], "microsecond_angle" => [-6, "second_angle"], "microsteradian" => [-6, "steradian"], "microstokes" => [-6, "stokes"], "microtesla" => [-6, "tesla"], "microton" => [-6, "ton"], "microtonne" => [-6, "tonne"], "microtorr" => [-6, "torr"], "microvolt" => [-6, "volt"], "microwatt" => [-6, "watt"], "microweber" => [-6, "weber"], "microyard" => [-6, "yard"], "microyd" => [-6, "yd"], "microyear" => [-6, "year"], "miles" => [0, "mile"], "milliCelsius" => [-3, "Celsius"], "milliFahrenheit" => [-3, "Fahrenheit"], "milliJulian_year" => [-3, "Julian_year"], "milliPascal" => [-3, "Pascal"], "milliacre" => [-3, "acre"], "milliampere" => [-3, "ampere"], "milliangstrom" => [-3, "angstrom"], "milliangular_degree" => [-3, "angular_degree"], "milliangular_minute" => [-3, "angular_minute"], "milliangular_second" => [-3, "angular_second"], "milliare" => [-3, "are"], "milliatmosphere" => [-3, "atmosphere"], "millibars" => [0, "millibar"], "millicalorie" => [-3, "calorie"], "millicandela" => [-3, "candela"], "millicelsius" => [-3, "celsius"], "millicentigrade" => [-3, "centigrade"], "millicentury" => [-3, "century"], "millichain" => [-3, "chain"], "millicommon_year" => [-3, "common_year"], "millicoulomb" => [-3, "coulomb"], "milliday" => [-3, "day"], "millidegK" => [-3, "degK"], "millideg_K" => [-3, "deg_K"], "millidegree" => [-3, "degree"], "millidegreeK" => [-3, "degreeK"], "millidyne" => [-3, "dyne"], "millierg" => [-3, "erg"], "millifahrenheit" => [-3, "fahrenheit"], "millifarad" => [-3, "farad"], "millifermi" => [-3, "fermi"], "milligal" => [-3, "gal"], "milligauss" => [-3, "gauss"], "milligram" => [-3, "gram"], "millihectare" => [-3, "hectare"], "millihertz" => [-3, "hertz"], "millihour" => [-3, "hour"], "milliinch" => [-3, "inch"], "millijoule" => [-3, "joule"], "millikelvin" => [-3, "kelvin"], "millikilogram" => [-3, "kilogram"], "milliknot" => [-3, "knot"], "millilitre" => [-3, "litre"], "millimeter" => [-3, "meter"], "millimetre" => [-3, "metre"], "millimicron" => [-3, "micron"], "millimile" => [-3, "mile"], "millimillibar" => [-3, "millibar"], "milliminute" => [-3, "minute"], "milliminute_angle" => [-3, "minute_angle"], "millimole" => [-3, "mole"], "millimonth" => [-3, "month"], "millinewton" => [-3, "newton"], "milliounce" => [-3, "ounce"], "milliparsec" => [-3, "parsec"], "millipascal" => [-3, "pascal"], "millipentad" => [-3, "pentad"], "millipercent" => [-3, "percent"], "millipoise" => [-3, "poise"], "millipound" => [-3, "pound"], "milliradian" => [-3, "radian"], "millisecond" => [-3, "second"], "millisecond_angle" => [-3, "second_angle"], "millisteradian" => [-3, "steradian"], "millistokes" => [-3, "stokes"], "millitesla" => [-3, "tesla"], "milliton" => [-3, "ton"], "millitonne" => [-3, "tonne"], "millitorr" => [-3, "torr"], "millivolt" => [-3, "volt"], "milliwatt" => [-3, "watt"], "milliweber" => [-3, "weber"], "milliyard" => [-3, "yard"], "milliyd" => [-3, "yd"], "milliyear" => [-3, "year"], "min" => [-3, "in"], "minutes" => [0, "minute"], "minutes_angle" => [0, "minute_angle"], "mkgf" => [-3, "kgf"], "mkph" => [-3, "kph"], "mlb" => [-3, "lb"], "mlm" => [-3, "lm"], "mlx" => [-3, "lx"], "mly" => [-3, "ly"], "mm" => [-3, "m"], "mmb" => [-3, "mb"], "mmercury" => [-3, "mercury"], "mmgal" => [-3, "mgal"], "mmin" => [-3, "min"], "mmol" => [-3, "mol"], "mmon" => [-3, "mon"], "mmph" => [-3, "mph"], "mohm" => [-3, "ohm"], "moles" => [0, "mole"], "months" => [0, "month"], "moz" => [-3, "oz"], "mpc" => [-3, "pc"], "mpsi" => [-3, "psi"], "mrad" => [-3, "rad"], "ms" => [-3, "s"], "msr" => [-3, "sr"], "mt" => [-3, "t"], "myr" => [-3, "yr"], "nA" => [-9, "A"], "nAu" => [-9, "Au"], "nBq" => [-9, "Bq"], "nC" => [-9, "C"], "nF" => [-9, "F"], "nG" => [-9, "G"], "nGal" => [-9, "Gal"], "nGy" => [-9, "Gy"], "nH" => [-9, "H"], "nHg" => [-9, "Hg"], "nHz" => [-9, "Hz"], "nJ" => [-9, "J"], "nK" => [-9, "K"], "nL" => [-9, "L"], "nN" => [-9, "N"], "nP" => [-9, "P"], "nPa" => [-9, "Pa"], "nS" => [-9, "S"], "nSt" => [-9, "St"], "nSv" => [-9, "Sv"], "nT" => [-9, "T"], "nV" => [-9, "V"], "nW" => [-9, "W"], "nWb" => [-9, "Wb"], "na" => [-9, "a"], "nac" => [-9, "ac"], "nanoCelsius" => [-9, "Celsius"], "nanoFahrenheit" => [-9, "Fahrenheit"], "nanoJulian_year" => [-9, "Julian_year"], "nanoPascal" => [-9, "Pascal"], "nanoacre" => [-9, "acre"], "nanoampere" => [-9, "ampere"], "nanoangstrom" => [-9, "angstrom"], "nanoangular_degree" => [-9, "angular_degree"], "nanoangular_minute" => [-9, "angular_minute"], "nanoangular_second" => [-9, "angular_second"], "nanoare" => [-9, "are"], "nanoatmosphere" => [-9, "atmosphere"], "nanocalorie" => [-9, "calorie"], "nanocandela" => [-9, "candela"], "nanocelsius" => [-9, "celsius"], "nanocentigrade" => [-9, "centigrade"], "nanocentury" => [-9, "century"], "nanochain" => [-9, "chain"], "nanocommon_year" => [-9, "common_year"], "nanocoulomb" => [-9, "coulomb"], "nanoday" => [-9, "day"], "nanodegK" => [-9, "degK"], "nanodeg_K" => [-9, "deg_K"], "nanodegree" => [-9, "degree"], "nanodegreeK" => [-9, "degreeK"], "nanodyne" => [-9, "dyne"], "nanoerg" => [-9, "erg"], "nanofahrenheit" => [-9, "fahrenheit"], "nanofarad" => [-9, "farad"], "nanofermi" => [-9, "fermi"], "nanogal" => [-9, "gal"], "nanogauss" => [-9, "gauss"], "nanogram" => [-9, "gram"], "nanohectare" => [-9, "hectare"], "nanohertz" => [-9, "hertz"], "nanohour" => [-9, "hour"], "nanoinch" => [-9, "inch"], "nanojoule" => [-9, "joule"], "nanokelvin" => [-9, "kelvin"], "nanokilogram" => [-9, "kilogram"], "nanoknot" => [-9, "knot"], "nanolitre" => [-9, "litre"], "nanometer" => [-9, "meter"], "nanometre" => [-9, "metre"], "nanomicron" => [-9, "micron"], "nanomile" => [-9, "mile"], "nanomillibar" => [-9, "millibar"], "nanominute" => [-9, "minute"], "nanominute_angle" => [-9, "minute_angle"], "nanomole" => [-9, "mole"], "nanomonth" => [-9, "month"], "nanonewton" => [-9, "newton"], "nanoounce" => [-9, "ounce"], "nanoparsec" => [-9, "parsec"], "nanopascal" => [-9, "pascal"], "nanopentad" => [-9, "pentad"], "nanopercent" => [-9, "percent"], "nanopoise" => [-9, "poise"], "nanopound" => [-9, "pound"], "nanoradian" => [-9, "radian"], "nanosecond" => [-9, "second"], "nanosecond_angle" => [-9, "second_angle"], "nanosteradian" => [-9, "steradian"], "nanostokes" => [-9, "stokes"], "nanotesla" => [-9, "tesla"], "nanoton" => [-9, "ton"], "nanotonne" => [-9, "tonne"], "nanotorr" => [-9, "torr"], "nanovolt" => [-9, "volt"], "nanowatt" => [-9, "watt"], "nanoweber" => [-9, "weber"], "nanoyard" => [-9, "yard"], "nanoyd" => [-9, "yd"], "nanoyear" => [-9, "year"], "natm" => [-9, "atm"], "nbar" => [-9, "bar"], "ncal" => [-9, "cal"], "ncd" => [-9, "cd"], "nconventional_mercury" => [-9, "conventional_mercury"], "ndegC" => [-9, "degC"], "ndegF" => [-9, "degF"], "ndeg_C" => [-9, "deg_C"], "ndeg_F" => [-9, "deg_F"], "ndegreeC" => [-9, "degreeC"], "ndegreeF" => [-9, "degreeF"], "ndegree_C" => [-9, "degree_C"], "ndegree_E" => [-9, "degree_E"], "ndegree_F" => [-9, "degree_F"], "ndegree_N" => [-9, "degree_N"], "ndegree_R" => [-9, "degree_R"], "ndegree_S" => [-9, "degree_S"], "ndegree_W" => [-9, "degree_W"], "ndegree_c" => [-9, "degree_c"], "ndegree_east" => [-9, "degree_east"], "ndegree_f" => [-9, "degree_f"], "ndegree_north" => [-9, "degree_north"], "ndegree_south" => [-9, "degree_south"], "ndegree_west" => [-9, "degree_west"], "ndegrees_east" => [-9, "degrees_east"], "ndegrees_north" => [-9, "degrees_north"], "ndegrees_south" => [-9, "degrees_south"], "ndegrees_west" => [-9, "degrees_west"], "ndyn" => [-9, "dyn"], "nerg" => [-9, "erg"], "newtons" => [0, "newton"], "nforce" => [-9, "force"], "ng" => [-9, "g"], "ngravity" => [-9, "gravity"], "nh" => [-9, "h"], "nhg" => [-9, "hg"], "nhr" => [-9, "hr"], "nin" => [-9, "in"], "nkgf" => [-9, "kgf"], "nkph" => [-9, "kph"], "nlb" => [-9, "lb"], "nlm" => [-9, "lm"], "nlx" => [-9, "lx"], "nly" => [-9, "ly"], "nm" => [-9, "m"], "nmb" => [-9, "mb"], "nmercury" => [-9, "mercury"], "nmgal" => [-9, "mgal"], "nmin" => [-9, "min"], "nmol" => [-9, "mol"], "nmon" => [-9, "mon"], "nmph" => [-9, "mph"], "nohm" => [-9, "ohm"], "noz" => [-9, "oz"], "npc" => [-9, "pc"], "npsi" => [-9, "psi"], "nrad" => [-9, "rad"], "ns" => [-9, "s"], "nsr" => [-9, "sr"], "nt" => [-9, "t"], "nyr" => [-9, "yr"], "ounces" => [0, "ounce"], "pA" => [-12, "A"], "pAu" => [-12, "Au"], "pBq" => [-12, "Bq"], "pC" => [-12, "C"], "pF" => [-12, "F"], "pG" => [-12, "G"], "pGal" => [-12, "Gal"], "pGy" => [-12, "Gy"], "pH" => [-12, "H"], "pHg" => [-12, "Hg"], "pHz" => [-12, "Hz"], "pJ" => [-12, "J"], "pK" => [-12, "K"], "pL" => [-12, "L"], "pN" => [-12, "N"], "pP" => [-12, "P"], "pPa" => [-12, "Pa"], "pS" => [-12, "S"], "pSt" => [-12, "St"], "pSv" => [-12, "Sv"], "pT" => [-12, "T"], "pV" => [-12, "V"], "pW" => [-12, "W"], "pWb" => [-12, "Wb"], "pa" => [-12, "a"], "pac" => [-12, "ac"], "parsecs" => [0, "parsec"], "pascals" => [0, "pascal"], "patm" => [-12, "atm"], "pbar" => [-12, "bar"], "pcal" => [-12, "cal"], "pcd" => [-12, "cd"], "pconventional_mercury" => [-12, "conventional_mercury"], "pdegC" => [-12, "degC"], "pdegF" => [-12, "degF"], "pdeg_C" => [-12, "deg_C"], "pdeg_F" => [-12, "deg_F"], "pdegreeC" => [-12, "degreeC"], "pdegreeF" => [-12, "degreeF"], "pdegree_C" => [-12, "degree_C"], "pdegree_E" => [-12, "degree_E"], "pdegree_F" => [-12, "degree_F"], "pdegree_N" => [-12, "degree_N"], "pdegree_R" => [-12, "degree_R"], "pdegree_S" => [-12, "degree_S"], "pdegree_W" => [-12, "degree_W"], "pdegree_c" => [-12, "degree_c"], "pdegree_east" => [-12, "degree_east"], "pdegree_f" => [-12, "degree_f"], "pdegree_north" => [-12, "degree_north"], "pdegree_south" => [-12, "degree_south"], "pdegree_west" => [-12, "degree_west"], "pdegrees_east" => [-12, "degrees_east"], "pdegrees_north" => [-12, "degrees_north"], "pdegrees_south" => [-12, "degrees_south"], "pdegrees_west" => [-12, "degrees_west"], "pdyn" => [-12, "dyn"], "pentads" => [0, "pentad"], "percents" => [0, "percent"], "perg" => [-12, "erg"], "petaCelsius" => [15, "Celsius"], "petaFahrenheit" => [15, "Fahrenheit"], "petaJulian_year" => [15, "Julian_year"], "petaPascal" => [15, "Pascal"], "petaacre" => [15, "acre"], "petaampere" => [15, "ampere"], "petaangstrom" => [15, "angstrom"], "petaangular_degree" => [15, "angular_degree"], "petaangular_minute" => [15, "angular_minute"], "petaangular_second" => [15, "angular_second"], "petaare" => [15, "are"], "petaatmosphere" => [15, "atmosphere"], "petacalorie" => [15, "calorie"], "petacandela" => [15, "candela"], "petacelsius" => [15, "celsius"], "petacentigrade" => [15, "centigrade"], "petacentury" => [15, "century"], "petachain" => [15, "chain"], "petacommon_year" => [15, "common_year"], "petacoulomb" => [15, "coulomb"], "petaday" => [15, "day"], "petadegK" => [15, "degK"], "petadeg_K" => [15, "deg_K"], "petadegree" => [15, "degree"], "petadegreeK" => [15, "degreeK"], "petadyne" => [15, "dyne"], "petaerg" => [15, "erg"], "petafahrenheit" => [15, "fahrenheit"], "petafarad" => [15, "farad"], "petafermi" => [15, "fermi"], "petagal" => [15, "gal"], "petagauss" => [15, "gauss"], "petagram" => [15, "gram"], "petahectare" => [15, "hectare"], "petahertz" => [15, "hertz"], "petahour" => [15, "hour"], "petainch" => [15, "inch"], "petajoule" => [15, "joule"], "petakelvin" => [15, "kelvin"], "petakilogram" => [15, "kilogram"], "petaknot" => [15, "knot"], "petalitre" => [15, "litre"], "petameter" => [15, "meter"], "petametre" => [15, "metre"], "petamicron" => [15, "micron"], "petamile" => [15, "mile"], "petamillibar" => [15, "millibar"], "petaminute" => [15, "minute"], "petaminute_angle" => [15, "minute_angle"], "petamole" => [15, "mole"], "petamonth" => [15, "month"], "petanewton" => [15, "newton"], "petaounce" => [15, "ounce"], "petaparsec" => [15, "parsec"], "petapascal" => [15, "pascal"], "petapentad" => [15, "pentad"], "petapercent" => [15, "percent"], "petapoise" => [15, "poise"], "petapound" => [15, "pound"], "petaradian" => [15, "radian"], "petasecond" => [15, "second"], "petasecond_angle" => [15, "second_angle"], "petasteradian" => [15, "steradian"], "petastokes" => [15, "stokes"], "petatesla" => [15, "tesla"], "petaton" => [15, "ton"], "petatonne" => [15, "tonne"], "petatorr" => [15, "torr"], "petavolt" => [15, "volt"], "petawatt" => [15, "watt"], "petaweber" => [15, "weber"], "petayard" => [15, "yard"], "petayd" => [15, "yd"], "petayear" => [15, "year"], "pforce" => [-12, "force"], "pg" => [-12, "g"], "pgravity" => [-12, "gravity"], "ph" => [-12, "h"], "phg" => [-12, "hg"], "phr" => [-12, "hr"], "picoCelsius" => [-12, "Celsius"], "picoFahrenheit" => [-12, "Fahrenheit"], "picoJulian_year" => [-12, "Julian_year"], "picoPascal" => [-12, "Pascal"], "picoacre" => [-12, "acre"], "picoampere" => [-12, "ampere"], "picoangstrom" => [-12, "angstrom"], "picoangular_degree" => [-12, "angular_degree"], "picoangular_minute" => [-12, "angular_minute"], "picoangular_second" => [-12, "angular_second"], "picoare" => [-12, "are"], "picoatmosphere" => [-12, "atmosphere"], "picocalorie" => [-12, "calorie"], "picocandela" => [-12, "candela"], "picocelsius" => [-12, "celsius"], "picocentigrade" => [-12, "centigrade"], "picocentury" => [-12, "century"], "picochain" => [-12, "chain"], "picocommon_year" => [-12, "common_year"], "picocoulomb" => [-12, "coulomb"], "picoday" => [-12, "day"], "picodegK" => [-12, "degK"], "picodeg_K" => [-12, "deg_K"], "picodegree" => [-12, "degree"], "picodegreeK" => [-12, "degreeK"], "picodyne" => [-12, "dyne"], "picoerg" => [-12, "erg"], "picofahrenheit" => [-12, "fahrenheit"], "picofarad" => [-12, "farad"], "picofermi" => [-12, "fermi"], "picogal" => [-12, "gal"], "picogauss" => [-12, "gauss"], "picogram" => [-12, "gram"], "picohectare" => [-12, "hectare"], "picohertz" => [-12, "hertz"], "picohour" => [-12, "hour"], "picoinch" => [-12, "inch"], "picojoule" => [-12, "joule"], "picokelvin" => [-12, "kelvin"], "picokilogram" => [-12, "kilogram"], "picoknot" => [-12, "knot"], "picolitre" => [-12, "litre"], "picometer" => [-12, "meter"], "picometre" => [-12, "metre"], "picomicron" => [-12, "micron"], "picomile" => [-12, "mile"], "picomillibar" => [-12, "millibar"], "picominute" => [-12, "minute"], "picominute_angle" => [-12, "minute_angle"], "picomole" => [-12, "mole"], "picomonth" => [-12, "month"], "piconewton" => [-12, "newton"], "picoounce" => [-12, "ounce"], "picoparsec" => [-12, "parsec"], "picopascal" => [-12, "pascal"], "picopentad" => [-12, "pentad"], "picopercent" => [-12, "percent"], "picopoise" => [-12, "poise"], "picopound" => [-12, "pound"], "picoradian" => [-12, "radian"], "picosecond" => [-12, "second"], "picosecond_angle" => [-12, "second_angle"], "picosteradian" => [-12, "steradian"], "picostokes" => [-12, "stokes"], "picotesla" => [-12, "tesla"], "picoton" => [-12, "ton"], "picotonne" => [-12, "tonne"], "picotorr" => [-12, "torr"], "picovolt" => [-12, "volt"], "picowatt" => [-12, "watt"], "picoweber" => [-12, "weber"], "picoyard" => [-12, "yard"], "picoyd" => [-12, "yd"], "picoyear" => [-12, "year"], "pin" => [-12, "in"], "pkgf" => [-12, "kgf"], "pkph" => [-12, "kph"], "plb" => [-12, "lb"], "plm" => [-12, "lm"], "plx" => [-12, "lx"], "ply" => [-12, "ly"], "pm" => [-12, "m"], "pmb" => [-12, "mb"], "pmercury" => [-12, "mercury"], "pmgal" => [-12, "mgal"], "pmin" => [-12, "min"], "pmol" => [-12, "mol"], "pmon" => [-12, "mon"], "pmph" => [-12, "mph"], "pohm" => [-12, "ohm"], "poises" => [0, "poise"], "pounds" => [0, "pound"], "poz" => [-12, "oz"], "ppc" => [-12, "pc"], "ppsi" => [-12, "psi"], "prad" => [-12, "rad"], "ps" => [-12, "s"], "psr" => [-12, "sr"], "pt" => [-12, "t"], "pyr" => [-12, "yr"], "radians" => [0, "radian"], "seconds" => [0, "second"], "seconds_angle" => [0, "second_angle"], "steradians" => [0, "steradian"], "stokeses" => [0, "stokes"], "telaCelsius" => [12, "Celsius"], "telaFahrenheit" => [12, "Fahrenheit"], "telaJulian_year" => [12, "Julian_year"], "telaPascal" => [12, "Pascal"], "telaacre" => [12, "acre"], "telaampere" => [12, "ampere"], "telaangstrom" => [12, "angstrom"], "telaangular_degree" => [12, "angular_degree"], "telaangular_minute" => [12, "angular_minute"], "telaangular_second" => [12, "angular_second"], "telaare" => [12, "are"], "telaatmosphere" => [12, "atmosphere"], "telacalorie" => [12, "calorie"], "telacandela" => [12, "candela"], "telacelsius" => [12, "celsius"], "telacentigrade" => [12, "centigrade"], "telacentury" => [12, "century"], "telachain" => [12, "chain"], "telacommon_year" => [12, "common_year"], "telacoulomb" => [12, "coulomb"], "teladay" => [12, "day"], "teladegK" => [12, "degK"], "teladeg_K" => [12, "deg_K"], "teladegree" => [12, "degree"], "teladegreeK" => [12, "degreeK"], "teladyne" => [12, "dyne"], "telaerg" => [12, "erg"], "telafahrenheit" => [12, "fahrenheit"], "telafarad" => [12, "farad"], "telafermi" => [12, "fermi"], "telagal" => [12, "gal"], "telagauss" => [12, "gauss"], "telagram" => [12, "gram"], "telahectare" => [12, "hectare"], "telahertz" => [12, "hertz"], "telahour" => [12, "hour"], "telainch" => [12, "inch"], "telajoule" => [12, "joule"], "telakelvin" => [12, "kelvin"], "telakilogram" => [12, "kilogram"], "telaknot" => [12, "knot"], "telalitre" => [12, "litre"], "telameter" => [12, "meter"], "telametre" => [12, "metre"], "telamicron" => [12, "micron"], "telamile" => [12, "mile"], "telamillibar" => [12, "millibar"], "telaminute" => [12, "minute"], "telaminute_angle" => [12, "minute_angle"], "telamole" => [12, "mole"], "telamonth" => [12, "month"], "telanewton" => [12, "newton"], "telaounce" => [12, "ounce"], "telaparsec" => [12, "parsec"], "telapascal" => [12, "pascal"], "telapentad" => [12, "pentad"], "telapercent" => [12, "percent"], "telapoise" => [12, "poise"], "telapound" => [12, "pound"], "telaradian" => [12, "radian"], "telasecond" => [12, "second"], "telasecond_angle" => [12, "second_angle"], "telasteradian" => [12, "steradian"], "telastokes" => [12, "stokes"], "telatesla" => [12, "tesla"], "telaton" => [12, "ton"], "telatonne" => [12, "tonne"], "telatorr" => [12, "torr"], "telavolt" => [12, "volt"], "telawatt" => [12, "watt"], "telaweber" => [12, "weber"], "telayard" => [12, "yard"], "telayd" => [12, "yd"], "telayear" => [12, "year"], "teslas" => [0, "tesla"], "tonnes" => [0, "tonne"], "tons" => [0, "ton"], "torrs" => [0, "torr"], "uA" => [-6, "A"], "uAu" => [-6, "Au"], "uBq" => [-6, "Bq"], "uC" => [-6, "C"], "uF" => [-6, "F"], "uG" => [-6, "G"], "uGal" => [-6, "Gal"], "uGy" => [-6, "Gy"], "uH" => [-6, "H"], "uHg" => [-6, "Hg"], "uHz" => [-6, "Hz"], "uJ" => [-6, "J"], "uK" => [-6, "K"], "uL" => [-6, "L"], "uN" => [-6, "N"], "uP" => [-6, "P"], "uPa" => [-6, "Pa"], "uS" => [-6, "S"], "uSt" => [-6, "St"], "uSv" => [-6, "Sv"], "uT" => [-6, "T"], "uV" => [-6, "V"], "uW" => [-6, "W"], "uWb" => [-6, "Wb"], "ua" => [-6, "a"], "uac" => [-6, "ac"], "uatm" => [-6, "atm"], "ubar" => [-6, "bar"], "ucal" => [-6, "cal"], "ucd" => [-6, "cd"], "uconventional_mercury" => [-6, "conventional_mercury"], "udegC" => [-6, "degC"], "udegF" => [-6, "degF"], "udeg_C" => [-6, "deg_C"], "udeg_F" => [-6, "deg_F"], "udegreeC" => [-6, "degreeC"], "udegreeF" => [-6, "degreeF"], "udegree_C" => [-6, "degree_C"], "udegree_E" => [-6, "degree_E"], "udegree_F" => [-6, "degree_F"], "udegree_N" => [-6, "degree_N"], "udegree_R" => [-6, "degree_R"], "udegree_S" => [-6, "degree_S"], "udegree_W" => [-6, "degree_W"], "udegree_c" => [-6, "degree_c"], "udegree_east" => [-6, "degree_east"], "udegree_f" => [-6, "degree_f"], "udegree_north" => [-6, "degree_north"], "udegree_south" => [-6, "degree_south"], "udegree_west" => [-6, "degree_west"], "udegrees_east" => [-6, "degrees_east"], "udegrees_north" => [-6, "degrees_north"], "udegrees_south" => [-6, "degrees_south"], "udegrees_west" => [-6, "degrees_west"], "udyn" => [-6, "dyn"], "uerg" => [-6, "erg"], "uforce" => [-6, "force"], "ug" => [-6, "g"], "ugravity" => [-6, "gravity"], "uh" => [-6, "h"], "uhg" => [-6, "hg"], "uhr" => [-6, "hr"], "uin" => [-6, "in"], "ukgf" => [-6, "kgf"], "ukph" => [-6, "kph"], "ulb" => [-6, "lb"], "ulm" => [-6, "lm"], "ulx" => [-6, "lx"], "uly" => [-6, "ly"], "um" => [-6, "m"], "umb" => [-6, "mb"], "umercury" => [-6, "mercury"], "umgal" => [-6, "mgal"], "umin" => [-6, "min"], "umol" => [-6, "mol"], "umon" => [-6, "mon"], "umph" => [-6, "mph"], "uohm" => [-6, "ohm"], "uoz" => [-6, "oz"], "upc" => [-6, "pc"], "upsi" => [-6, "psi"], "urad" => [-6, "rad"], "us" => [-6, "s"], "usr" => [-6, "sr"], "ut" => [-6, "t"], "uyr" => [-6, "yr"], "volts" => [0, "volt"], "watts" => [0, "watt"], "webers" => [0, "weber"], "yards" => [0, "yard"], "yds" => [0, "yd"], "years" => [0, "year"], } UPLURALS = { "Celsiuses" => "Celsius", "Fahrenheits" => "Fahrenheit", "Julians_year" => "Julian_year", "Pascals" => "Pascal", "acres" => "acre", "amperes" => "ampere", "angstroms" => "angstrom", "angulars_degree" => "angular_degree", "angulars_minute" => "angular_minute", "angulars_second" => "angular_second", "ares" => "are", "atmospheres" => "atmosphere", "calories" => "calorie", "candelas" => "candela", "celsiuses" => "celsius", "centigrades" => "centigrade", "centuries" => "century", "chains" => "chain", "commons_year" => "common_year", "coulombs" => "coulomb", "days" => "day", "degKs" => "degK", "degreeKs" => "degreeK", "degrees" => "degree", "degs_K" => "deg_K", "dynes" => "dyne", "ergs" => "erg", "fahrenheits" => "fahrenheit", "farads" => "farad", "fermis" => "fermi", "gals" => "gal", "gausses" => "gauss", "grams" => "gram", "hectares" => "hectare", "hertzes" => "hertz", "hours" => "hour", "inchs" => "inch", "joules" => "joule", "kelvins" => "kelvin", "kilograms" => "kilogram", "knots" => "knot", "litres" => "litre", "meters" => "meter", "metres" => "metre", "microns" => "micron", "miles" => "mile", "millibars" => "millibar", "minutes" => "minute", "minutes_angle" => "minute_angle", "moles" => "mole", "months" => "month", "newtons" => "newton", "ounces" => "ounce", "parsecs" => "parsec", "pascals" => "pascal", "pentads" => "pentad", "percents" => "percent", "poises" => "poise", "pounds" => "pound", "radians" => "radian", "seconds" => "second", "seconds_angle" => "second_angle", "steradians" => "steradian", "stokeses" => "stokes", "teslas" => "tesla", "tonnes" => "tonne", "tons" => "ton", "torrs" => "torr", "volts" => "volt", "watts" => "watt", "webers" => "weber", "yards" => "yard", "yds" => "yd", "years" => "year", } end class NumberNode < TerminalNode def initialize(arg) raise TypeError unless Numeric === arg @a = arg end UNITY = NumberNode.new(1) ZERO = NumberNode.new(0) def to_s if @a == @a.to_i sprintf("%d",@a) else String(@a) end end attr_reader :a alias :value :a alias :factor :a def == (other) case other when NumberNode @a == other.a else false end end def add_eval(another) raise TypeError unless NumberNode === another NumberNode.new(@a + another.value) end def mul_eval(another) case another when NumberNode then NumberNode.new(@a * another.a) when PowNode raise TypeError unless NumberNode === another.lhs raise TypeError unless NumberNode === another.rhs NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value)) else raise TypeError end end def name; "1"; end def power; UNITY; end end class XDate def initialize(year, month, day) @year, @month, @day = year.to_i, month.to_i, day.to_i end attr_reader :year, :month, :day def to_s format('%04d-%02d-%02d', @year, @month, @day) end alias :inspect :to_s def to_time Time.gm(@year, @month, @day) end def to_date Date.new(@year, @month, @day) end def -(other) case other when XDate (to_date - other.to_date) when Time to_time - other when Date (to_date - other.to_date) else to_date - other end end def +(other) t = to_date + other self.class.new(t.year, t.month, t.mday) end end class TimeNode < TerminalNode def initialize(date, time, zone) @date, @time, @zone = date, time, zone if :now === @date then now = Time.now.utc @date = XDate.new(now.year, now.month, now.day) @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec)) else qdays = (@time / 86400).floor if not qdays.zero? @date += qdays @time -= (qdays * 86400) end end raise TypeError unless XDate === @date @time = 0.0 unless @time raise TypeError unless Float === @time @zone = 0 unless @zone raise TypeError unless Integer === @zone end attr_reader :date, :time, :zone def to_s hr = @time.floor / 3600 mi = (@time.floor / 60) % 60 sc = @time % 60 tzm = @zone.abs tzh = tzm / 60 tzm %= 60 tzh = -tzh if @zone < 0 format("%sT%02d:%02d:%05.2f %+03d:%02d", \ @date.to_s, hr, mi, sc, tzh, tzm) end def self::pentad(d) (d > 25) ? 5 : ((d - 1) / 5) end def add_time(increment) inc = increment.reduce5 case inc.name when 's' t2 = @time + inc.factor d2 = @date + (t2 / 86400) t2 = t2 % 86400 self.class.new(d2, t2, @zone) when 'pentad' ifac = Integer(inc.factor) ipen = ifac % 6 imon = ifac / 6 spen = self.class.pentad(@date.day) smon = @date.month + imon + spen / 6 spen = spen % 6 sday = spen * 5 + (@date.day - 1) % 5 + 1 syear = @date.year + (smon - 1) / 12 smon = (smon - 1) % 12 + 1 sdate = XDate.new(syear, smon, sday) self.class.new(sdate, @time, @zone) else raise "bad time unit '#{inc.name}'" end end def utcsod @time - @zone * 60 end def div_time(units) base = units.ref inc = units.deref.reduce5 begin incname = inc.name rescue Exception incname = "(undefined)" end case incname when 's' dif = (@date - base.date) * 86400 + (utcsod - base.utcsod) dif / inc.factor when 'pentad' dif = (@date.year - base.date.year) * 72 dif += (@date.month - base.date.month) * 6 dif += self.class.pentad(@date.day) dif -= self.class.pentad(base.date.day) dif = Float(dif) if dif % inc.factor != 0 dif / inc.factor else raise "bad time unit '#{incname}'" end end end class PowNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs raise TypeError unless NumberNode === @rhs end def to_s lhs = @lhs.to_s case lhs when /\d$/, /[\d\.]/ lhs = "(#{lhs})" end rhs = @rhs.to_s if rhs == '1' lhs else rhs = "^(#{rhs})" if (/\./ =~ rhs) lhs + rhs end end attr_reader :lhs, :rhs alias :power :rhs def pow_eval(other) case other when NumberNode PowNode.new(@lhs, @rhs.mul_eval(other)) else super(other) end end def flatten2 x = @lhs.flatten2 case x when NumberNode a = @lhs.pow_eval(@rhs) when TerminalNode a = self when PowNode a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs)) when MulNode, MultiNode a = MultiNode.new() for gc in x a.append(gc.pow_eval(@rhs)) end else raise "internal error" end return a end def name case @lhs when NumberNode, NameNode @lhs.name else raise "internal error" end end def value case @lhs when NumberNode Units::pow_f(@lhs.value, @rhs.value) else raise(format('%s#value: internal error', self.class.to_s)) end end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value) else self.class.new(@lhs, @rhs.add_eval(another.power)) end end def sort case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value)) else self end end def factor Units::pow_f(@lhs.factor, @rhs.value) end end module Kakezan def flatten2 r = MultiNode.new() each do |child| case child when MultiNode r.append child when MulNode r.append child.flatten2 when ContainerNode r.append child.flatten2 else r.append child end end r end def name n = nil for c in @children next if NumberNode === c na = c.name if n.nil? n = na else raise "multiple names found" if na != n end end n = "1" if n.nil? n end def factor f = 1 for c in @children f *= c.factor end f end end class MulNode < ContainerNode include BinaryNode include Kakezan def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end def to_s lhs = @lhs.to_s rhs = @rhs.to_s if (/\d$/ =~ lhs && /^\w/ =~ rhs) then "#{lhs} #{rhs}" else "#{lhs}.#{rhs}" end end end class MultiNode < ContainerNode include Kakezan def initialize(*children) @children = children for c in @children raise "# MultiNode.new(#{children.inspect})" unless Node === c end end def to_s s = @children.join(';') s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.') end def each @children.each {|child| yield child } end attr_reader :children def append(other) case other when MultiNode @children += other.children else @children.push other end end def sort table = {} for child in self name = child.name if (table.include?(name)) then table[name] = table[name].mul_eval(child) else table[name] = child end end list = [] for name in table.keys.sort candi = table[name] if PowNode === candi and NumberNode === candi.lhs then v = candi.value list.push NumberNode.new(v) unless v == 1 next end next if candi.power.value == 0 list.push candi end if list.length > 1 list.delete(NumberNode::UNITY) end self.class.new(*list) end def collect_hash(stopper, op) list = [] for child in self list.push(child.send(op, stopper)) end self.class.new(*list).flatten2 end def expand(stopper) collect_hash(stopper, :expand) end def unalias(stopper) collect_hash(stopper, :unalias) end def foldnumber(stopper) collect_hash(stopper, :foldnumber) end def value raise "this is dimensional units" if (@children.size > 1) @children.first ? @children.first.value : NumberNode::UNITY.value end end class ShiftNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end attr_reader :lhs, :rhs alias :ref :rhs def to_s "(#{@lhs.to_s} @ #{@rhs.to_s})" end def trim2; @lhs; end def trim self.class.new(@lhs.trim, @rhs.trim2) end def flatten2; @lhs; end def flatten lf = @lhs.flatten case lf when ShiftNode rf = lf.rhs.add_eval(@rhs) self.class.new(lf.lhs, rf) else self.class.new(lf, @rhs.flatten) end end def sort self.class.new(@lhs.sort, @rhs.sort) end def ref case @lhs when ShiftNode @lhs.ref.add_eval(@rhs) else @rhs end end def deref case @lhs when ShiftNode @lhs.deref else @lhs end end def name @lhs.name end def factor @lhs.factor end end def initialize string case string when String @string, @ptree = string, nil when Node @string, @ptree = nil, string else @string, @ptree = String(string), nil end @copy = @lexstat = nil end # # === LEXICAL ANALYZER === # def rewind @copy = @string.dup.strip @lexstat = nil end RE_SPACE = '([ \t])' RE_INTEGER = '([-+]?\d+)' RE_EXP = '([eE][-+]?[0-9]+)' RE_REAL = "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))" RE_YEAR = "([-+]?[0-9]{1,4})" RE_MONTH = "(0?[1-9]|1[0-2])" RE_DAY = "([12][0-9]|30|31|0?[1-9])" RE_HOUR = "(2[0-3]|[0-1]?[0-9])" RE_MINUTE = "([0-5]?[0-9])" RE_SECOND = "((#{RE_MINUTE}|60)(\\.[0-9]*)?)" RE_NAME = "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)" RE_DATE = "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}" RE_TIME = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?" RE_HandM = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?" def next_token # decomment @copy.sub!(/^#.*/, ''); if @copy.sub!(%r{^\s*(\))}, '') then @lexstat = nil return [$1, $1] end if @copy.sub!(%r{^\s*(\()\s*}, '') then return [$1, $1] end if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then @lexstat = :SHIFT_SEEN return [:SHIFT, $1] end if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then @lexstat = nil return [:DIVIDE, $1] end if @copy.sub!(%r{^(\^|\*\*)}, '') then @lexstat = nil return [:EXPONENT, $1] end if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then y, m, d = $1, $2, $3 @lexstat = :DATE_SEEN return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^now[ \t]*}, '') then @lexstat = nil return [:DATE, :now] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then h, m, s = $1, $3, $5 m = m.sub(/:/,'') if m s = 0 if s.nil? @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^(UTC|Z)[ \t]*}, '') then @lexstat = nil return [:ZONE, 0] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then sgn, h, m = $1, $2, $4 m = m.sub(/:/,'') if m @lexstat = nil h = h.to_i h = -h if sgn == "-" m = m.to_i m = -m if sgn == "-" return [:ZONE, ((h * 60) + m)] end if @copy.sub!(%r{^#{RE_NAME}}, '') then @lexstat = nil return [:NAME, $1] end if @copy.sub!(%r{^#{RE_REAL}}, '') then @lexstat = nil return [:REAL, $1.to_f] end if @copy.sub!(%r{^#{RE_INTEGER}}, '') then @lexstat = nil return [:INT, $1.to_i] end if @copy.sub!(%r{^(-)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if @copy.sub!(%r{^(.)}, '') then return [$1, $1] end return [false, false] end # # === USER LEVEL METHODS === # def tokens rewind x = [] while (t = next_token).first x.push t end x end def do_parse2 rewind return NumberNode.new(1) if @string.nil? or @string.empty? pa = do_parse pa ? pa : ErrorNode.new(@string) end def ptree @ptree = do_parse2 if not @ptree @ptree end def dup @string ? self.class.new(@string) : self.class.new(@ptree) end def parse dup.parse! end def parse! @ptree = do_parse2 if not @ptree self end def self::parse(string) new(string).parse! end =begin --- reduce0 just do nothing. =end def reduce0 self end =begin --- reduce1 removes unnecessary parentheses. =end def reduce1 @string = ptree.to_s self end =begin --- reduce2 removes shift operator within multiplication/division/exponent =end def reduce2 @ptree = ptree.reduce2 @string = nil self end =begin --- reduce3 flattens expression and collects all factors =end def reduce3 @ptree = ptree.reduce3 @string = nil self end =begin --- reduce4 collects terms with the same name =end def reduce4 @ptree = ptree.reduce4 @string = nil self end =begin --- reduce5 expands all terms recursively =end def reduce5 @ptree = ptree.reduce5 @string = nil self end attr_reader :string def to_s @string = @ptree.to_s if @string.nil? @string end def inspect if @ptree.nil? then "Units{#{@string}}" else "Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[') end end def self::[](string) new(string) end def self::parse(string) new(string).parse! end def eval(x = 0) r5 = ptree.reduce5 case r = r5.ref when TimeNode r.add(x, r5.name) else fac = NumberNode.new(x + r.value) self.class.new(MulNode.new(fac, r5.deref)) end end def convert(numeric, to_units) to_units = Units.new( to_units ) if to_units.is_a?(String) r5 = dup.ptree.reduce5 case r = r5.ref when TimeNode r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree) else shift1 = r.value numeric = shift1 + numeric if shift1 != 0 fact = r5.divide(tp = to_units.dup.ptree).reduce5.value numeric *= fact if fact != 1 shift2 = tp.reduce5.ref.value numeric = numeric - shift2 if shift2 != 0 numeric end end def factor_and_offset(to_units) # To convert a numeric from self to to_units: # scale_factor * numeric + add_offset to_units = Units.new( to_units ) if to_units.is_a?(String) add_offset = convert(0, to_units) scale_factor = convert(1, to_units) - add_offset [ scale_factor, add_offset ] end def convert2(val, to_units) # Like Units#convert, but applicable to any Numeric-like objects. # Returns the original value if the units are incompatible. to_units = Units.new( to_units ) if to_units.is_a?(String) if ( self == to_units ) val elsif ( self =~ to_units ) if Numeric===val convert( val, to_units ) else factor, offset = factor_and_offset( to_units ) val*factor + offset end else unless $VERBOSE.nil? $stderr.print( "*WARNING*: " + "incompatible units: #{self.to_s} and #{to_units.to_s}\n") caller(0).each{|c| $stderr.print "\t* ",c,"\n"} end val end end @@reduce = :reduce4 def self::reduce_level @@reduce.to_s[-1] end def self::reduce_level=(n) @@reduce = case n when 1 then :reduce1 when 2 then :reduce2 when 3 then :reduce3 when 4 then :reduce4 else :reduce5 end end def binop(op, other) case other when Numeric other = NumberNode.new(other) when Units other = other.ptree end q = self.ptree.send(op, other).send(@@reduce) Units.new(q) end def *(other) binop(:mul, other) end def **(other) binop(:pow, other) end def /(other) binop(:divide, other) end def ^(other) binop(:shift, other) end def ==(other) case other when self.class dup.reduce5.to_s == other.dup.reduce5.to_s else false end end #def === (other) # reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s #end alias === == #def === (other) # # returns true if other is within a factor and/or offset of difference. # case other # when self.class # (self/other).reduce5.ptree.children.each do |child| # return false if !( NumberNode === child ) # end # true # else # false # end #end def =~(other) case other when self.class (self/other).reduce5.ptree.children.each{ |node| return false unless NumberNode === node } true else false end end def self::pow_f(a, b) if Integer === b and b < 0 then a ** b.to_f else a ** b end end ...end units.racc/module_eval... ##### State transition tables begin ### racc_action_table = [ 3, 9, 35, 9, 32, 9, 19, 11, 10, 7, 10, 9, 10, 8, 25, 31, 36, 23, 10, 7, 9, 37, 9, 8, 9, 38, nil, 10, 7, 10, 7, 10, 8, 25, 8, 9, 23, nil, 12, 9, 14, 15, 10, 9, 7, 17, 10, 31, 8, 17, 10, 9, nil, 9, nil, nil, nil, 17, 10, 17, 10 ] racc_action_check = [ 0, 0, 25, 31, 18, 23, 11, 1, 0, 0, 31, 14, 23, 0, 23, 31, 33, 23, 14, 14, 8, 34, 15, 14, 12, 35, nil, 8, 8, 15, 15, 12, 8, 12, 15, 17, 12, nil, 4, 5, 4, 4, 17, 28, 4, 5, 5, 17, 4, 28, 28, 13, nil, 26, nil, nil, nil, 13, 13, 26, 26 ] racc_action_pointer = [ -1, 7, nil, nil, 34, 37, nil, nil, 18, nil, nil, 6, 22, 49, 9, 20, nil, 33, -11, nil, nil, nil, nil, 3, nil, -10, 51, nil, 41, nil, nil, 1, nil, 1, 6, 12, nil, nil, nil ] racc_action_default = [ -1, -27, -2, -3, -4, -7, -8, -14, -27, -20, -21, -27, -27, -9, -27, -27, -15, -27, -27, 39, -5, -6, -18, -27, -22, -24, -10, -12, -11, -13, -16, -27, -17, -27, -27, -25, -19, -23, -26 ] racc_goto_table = [ 6, 20, 21, 2, 1, nil, 30, nil, 6, 13, nil, 18, 22, 34, 27, 29, nil, 22, nil, 26, 28, nil, nil, 22, nil, nil, nil, nil, nil, nil, nil, 22 ] racc_goto_check = [ 7, 4, 5, 2, 1, nil, 4, nil, 7, 6, nil, 2, 7, 5, 7, 7, nil, 7, nil, 6, 6, nil, nil, 7, nil, nil, nil, nil, nil, nil, nil, 7 ] racc_goto_pointer = [ nil, 4, 3, nil, -11, -10, 5, 0, nil ] racc_goto_default = [ nil, nil, nil, 4, 33, nil, 5, 16, 24 ] racc_reduce_table = [ 0, 0, :racc_error, 0, 17, :_reduce_none, 1, 17, :_reduce_2, 1, 17, :_reduce_3, 1, 18, :_reduce_none, 3, 18, :_reduce_5, 3, 18, :_reduce_6, 1, 19, :_reduce_none, 1, 19, :_reduce_none, 2, 19, :_reduce_9, 3, 19, :_reduce_10, 3, 19, :_reduce_11, 3, 19, :_reduce_12, 3, 19, :_reduce_13, 1, 22, :_reduce_14, 2, 22, :_reduce_15, 3, 22, :_reduce_16, 3, 22, :_reduce_17, 1, 20, :_reduce_none, 3, 20, :_reduce_19, 1, 23, :_reduce_20, 1, 23, :_reduce_21, 1, 21, :_reduce_none, 3, 21, :_reduce_23, 1, 24, :_reduce_24, 2, 24, :_reduce_25, 3, 24, :_reduce_26 ] racc_reduce_n = 27 racc_shift_n = 39 racc_token_table = { false => 0, :error => 1, :INT => 2, :ERR => 3, :SHIFT => 4, :SPACE => 5, :MULTIPLY => 6, :DIVIDE => 7, :EXPONENT => 8, :REAL => 9, :NAME => 10, :DATE => 11, :TIME => 12, :ZONE => 13, "(" => 14, ")" => 15 } racc_nt_base = 16 racc_use_result_var = false Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ "$end", "error", "INT", "ERR", "SHIFT", "SPACE", "MULTIPLY", "DIVIDE", "EXPONENT", "REAL", "NAME", "DATE", "TIME", "ZONE", "\"(\"", "\")\"", "$start", "unit_spec", "origin_exp", "unit_exp", "value_exp", "timestamp", "power_exp", "number_exp", "time_exp" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted # reduce 1 omitted module_eval(<<'.,.,', 'units.racc', 9) def _reduce_2(val, _values) val[0] end .,., module_eval(<<'.,.,', 'units.racc', 10) def _reduce_3(val, _values) yyerrok end .,., # reduce 4 omitted module_eval(<<'.,.,', 'units.racc', 15) def _reduce_5(val, _values) val[0].shift(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 16) def _reduce_6(val, _values) val[0].shift(val[2]) end .,., # reduce 7 omitted # reduce 8 omitted module_eval(<<'.,.,', 'units.racc', 22) def _reduce_9(val, _values) val[0].mul(val[1]) end .,., module_eval(<<'.,.,', 'units.racc', 23) def _reduce_10(val, _values) val[0].mul(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 24) def _reduce_11(val, _values) val[0].divide(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 25) def _reduce_12(val, _values) val[0].mul(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 26) def _reduce_13(val, _values) val[0].divide(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 30) def _reduce_14(val, _values) NameNode.new(val[0]) end .,., module_eval(<<'.,.,', 'units.racc', 31) def _reduce_15(val, _values) val[0].pow(val[1]) end .,., module_eval(<<'.,.,', 'units.racc', 32) def _reduce_16(val, _values) val[0].pow(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 33) def _reduce_17(val, _values) val[1] end .,., # reduce 18 omitted module_eval(<<'.,.,', 'units.racc', 38) def _reduce_19(val, _values) val[1] end .,., module_eval(<<'.,.,', 'units.racc', 42) def _reduce_20(val, _values) NumberNode.new(val[0]) end .,., module_eval(<<'.,.,', 'units.racc', 43) def _reduce_21(val, _values) NumberNode.new(val[0]) end .,., # reduce 22 omitted module_eval(<<'.,.,', 'units.racc', 48) def _reduce_23(val, _values) val[1] end .,., module_eval(<<'.,.,', 'units.racc', 52) def _reduce_24(val, _values) TimeNode.new(val[0], 0.0, 0) end .,., module_eval(<<'.,.,', 'units.racc', 53) def _reduce_25(val, _values) TimeNode.new(val[0], val[1], 0) end .,., module_eval(<<'.,.,', 'units.racc', 54) def _reduce_26(val, _values) TimeNode.new(val[0], val[1], val[2]) end .,., def _reduce_none(val, _values) val[0] end end # class Units end # module NumRu #################### if $0 == __FILE__ include NumRu def assert(test, seikai) raise "#{test.inspect} != #{seikai.inspect}" if test != seikai puts "ok #{seikai.inspect}" end puts "=== reduce1 ===" assert Units.new('').reduce1.to_s, "1" assert Units.new('m').reduce1.to_s, "m" assert Units.new('3').reduce1.to_s, "3" assert Units.new('3.14').reduce1.to_s, "3.14" assert Units.new('m2').reduce1.to_s, "m2" assert Units.new('m.s').reduce1.to_s, "m.s" assert Units.new('m/s').reduce1.to_s, "m.s-1" assert Units.new('kg.m/s2').reduce1.to_s, "kg.m.(s2)-1" assert Units.new('s @ 2003-11-29').reduce1.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('s @ 2003-11-29T11:24').reduce1.to_s, "(s @ 2003-11-29T11:24:00.00 +00:00)" assert Units.new('s @ 2003-11-29T11:24:11 -09:00').reduce1.to_s, "(s @ 2003-11-29T11:24:11.00 -09:00)" assert Units.new('100').reduce1.to_s, "100" assert Units.new('(10)^2').reduce1.to_s, "(10)2" assert Units.new('(10)^2/100').reduce1.to_s, "(10)2.(100)-1" puts "=== reduce2 ===" assert Units.new('s @ 2003-11-29').reduce2.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('m/(s @ 2003-11-29)').reduce2.to_s, "m.s-1" assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce2.to_s, "m.(K.s)-1" assert Units.new('(10)^2/100').reduce2.to_s, "(10)2.(100)-1" puts "=== reduce3 ===" assert Units::MultiNode.new(Units::NameNode.new('a'), \ Units::NumberNode.new(1), \ Units::NameNode.new('b')).to_s, 'a.1 b' assert Units.new('kg').reduce3.inspect, "Units[Name[kg]]" assert Units.new('kg.m').reduce3.inspect, "Units[Multi[Name[kg], Name[m]]]" assert Units.new('kg.m.s').reduce3.inspect, "Units[Multi[Name[kg], Name[m], Name[s]]]" assert Units.new('(m.s)^2').reduce3.inspect, "Units[Multi[Pow[Name[m], Number[2]], Pow[Name[s], Number[2]]]]" assert Units.new('K @ 273.15').reduce3.inspect, "Units[Shift[Name[K], Number[273.15]]]" assert Units.new('((a.b)^2)^2').reduce3.inspect, "Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]]]]" assert Units.new('((a.b)^2 c4 d)^2').reduce3.inspect, "Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]], Pow[Name[c], Number[8]], Pow[Name[d], Number[2]]]]" assert Units.new('((a.b)^2 c4 d)^2').reduce3.to_s, "a4 b4 c8 d2" assert Units.new('((a.b)^2 a4 b)^2').reduce3.to_s, "a4 b4 a8 b2" assert Units.new('s @ 2003-11-29').reduce3.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('m/(s @ 2003-11-29)').reduce3.to_s, "m.s-1" assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce3.to_s, "m.K-1 s-1" assert Units.new('(10)^2/100').reduce3.to_s, "(10)2.(100)-1" puts "=== reduce4 ===" assert Units.new('((a.b)^2 a4 b @ now)^2 @ 273.15').reduce4.to_s, "(a12 b6 @ 273.15)" assert Units.new('km2').reduce4.to_s, "km2" assert Units.new('hours.hour').reduce4.to_s, "hour2" assert Units.new('(10)^2').reduce4.to_s, "100" assert Units.new('100/10').reduce4.to_s, "10" assert Units.new('(10)^2/100').reduce4.to_s, "1" puts "=== reduce5 ===" assert Units.new('km2').reduce5.to_s, "1000000 m2" assert Units.new('(10)^2/100').reduce5.to_s, "1" assert Units.new('hPa').reduce5.to_s, "100 kg.m-1 s-2" assert Units.new('mb').reduce5.to_s, "100 kg.m-1 s-2" assert Units.new('hPa/mb').reduce5.to_s, "1" assert Units.new('(K @ 273.15)@ 10').reduce5.to_s, "(K @ 283.15)" puts "=== APPLICATIONS ===" assert Units.new('km @ 2').convert(3, Units.new('m @ 100')), 4900 assert Units.new('degree_F').convert(32, Units.new('K')).to_s, ((32+459.67)*(1.8**-1)).to_s u1 = Units.new('m/s') u2 = Units.new('mm/s') assert((u1/u2).to_s, "m.mm-1") assert((u1*u2).to_s, "m.mm.s-2") u1 = Units.new('years since 1999-01-01 00:00').reduce4 u2 = Units.new('hours since 2001-01-01 00:00').reduce4 assert u1.convert(3, u2), 24 * 365 u3 = Units.new('months since 2001-01-01 00:00').reduce4 assert u1.convert(3, u3), 12.0 Units.reduce_level = 3 assert((Units.new('hours') ** 2).to_s, "hours2") Units.reduce_level = 4 assert((Units.new('hours') ** 2).to_s, "hour2") Units.reduce_level = 5 assert((Units.new('hours') ** 2).to_s, "12960000 s2") assert(Units.new('day') =~ Units.new('s since 2002-01-01'), true) assert(Units.new('m') =~ Units.new('1'), false) un1 = Units['day since 2000-01-01'] un2 = Units['s since 2000-01-01'] assert(un1.convert(0, un2), 0.0) assert(un1.convert(1, un2), 86400.0) end numru-units-1.9.0/src/node.rb0000644000175000017500000000610413025004163015717 0ustar uwabamiuwabami=begin = class Node Node is a parent class for classes of parse tree node. This is not expected to be instanciated directly. =end class Node def initialize(*args) raise "#{self.class} is virtual." end def to_s(*args) raise "#{self.class}#to_s is virtual." end =begin --- pow other simply constructs a PowNode object. No reduction is performed. =end def pow(other) PowNode.new(self, other) end =begin --- mul other simply constructs a MulNode object. No reduction is performed. =end def mul(other) other = NumberNode.new(other) if Numeric === other MulNode.new(self, other) end =begin --- divide other simply constructs a MulNode object. No reduction is performed. =end def divide(other) MulNode.new(self, PowNode.new(other, NumberNode.new(-1))) end =begin --- shift other simply constructs a ShiftNode object. No reduction is performed. =end def shift(other) ShiftNode.new(self, other) end =begin --- pow_eval other similar to (()), but reduces PowNode[PowNode[...]] into single PowNode[...], so overriden at PowNode class. =end def pow_eval(other) pow(other) end =begin --- inspect =end def inspect2; "#{self.class}[#{to_s}]"; end def inspect; inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '['); end =begin --- trim in most subclasses, "trim" is redirected into "trim2". =end def trim trim2 end =begin --- flatten in most subclasses, "flatten" is redirected into "flatten2". =end def flatten flatten2 end =begin --- sort =end def sort raise "#{self.class}#sort is virtual: call after flatten" end =begin --- reduce1 --- reduce2 --- reduce3 --- reduce4 --- reduce5 =end def reduce1 self end def reduce2 trim end def reduce3 trim.flatten end def reduce4 # unalias(Hash.new).trim.flatten.sort foldnumber(nil).trim.flatten.sort end def reduce5 expand(Hash.new).trim.flatten.sort end =begin --- ref to be overriden at ShiftNode --- deref to be overriden at ShiftNode =end def ref NumberNode::ZERO end def deref self end end class ErrorNode < Node def initialize(string) @a = string end def to_s; @a; end end class ContainerNode < Node def trim2 x = [] for child in self x.push child.trim2 end self.class.new(*x) end def inspect2 a = [] for child in self a.push child.inspect2 end "#{self.class}[#{a.join(', ')}]" end end module BinaryNode def each yield @lhs yield @rhs end def expand(stopper) self.class.new(@lhs.expand(stopper), @rhs.expand(stopper)) end def unalias(stopper) self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper)) end def foldnumber(stopper) self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper)) end end class TerminalNode < Node def trim2; self; end def flatten2; self; end def expand(stopper); self; end alias :unalias :expand alias :foldnumber :expand def sort; self; end end numru-units-1.9.0/LICENSE.txt0000644000175000017500000000321413025004162015477 0ustar uwabamiuwabamiNumRu::Units is copyrighted free software by GFD Dennou Club (http://www.gfd-dennou.org/). Copyright 2004-2015 (C) GFD Dennou Club (http://www.gfd-dennou.org/) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY GFD DENNOU CLUB AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GFD DENNOU CLUB OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Takeshi Horinouchi and GFD Dennou Club. numru-units-1.9.0/README.rdoc0000644000175000017500000001407513025004162015471 0ustar uwabamiuwabami=begin =class NumRu::Units * (()) * (()) * (()) * (()) * (()) * (()) (Plural form allowed if the second field is "P") ==Overview A class of units of physical quantities. This class covers most functionality of UNIDATA's (()), however, with a more sophisticated handling of string expressions. UDUNITS always decomposes units into the four base units and discards the original string expressions. Therefore, 'hPa' always becomes '100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the other hand, this library tries to keep the original expressions as much as possible by default, while allowing partial to complete decompositions if needed. ==Installation Move to the top directly of this library (where you find the file install.rb). Then, type in the following: % ruby install.rb ==Usage Examples Here is an example using the "irb" interactive shell ("(('%'))" is the command prompt, and "(('>>'))" is the irb prompt -- Type in those after it to test. "(('=>'))" shows the result.): % irb --simple-prompt >> require "numru/units" => true >> un1 = NumRu::Units.new('kg.m2/s') => Units{kg.m2/s} >> un2 = NumRu::Units.new('g.m') => Units{g.m} >> un3 = un1 / un2 => Units[Multi[Pow[Name[g], Number[-1]], Name[kg], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]] >> un1.to_s => "kg.m2/s" >> un2.to_s => "g.m" >> un3.to_s => "g-1 kg.m1 s-1" >> un3.reduce5 => Units[Multi[Number[1000], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]] >> un3.to_s => "1000 m1 s-1" Note the difference between the results of (('un3.to_s')) before and after (('un3.reduce5')), where the former retains the literal expression of each atomic unit, while the latter does the maximum reduction. You can change the default behavior by using the class method (('reduce_level=')): >> NumRu::Units.reduce_level = 5 => :reduce5 >> un3.to_s => "1000 m1 s-1" Note that you can eliminate the prefix (('NumRu::')) by "including" it: >> require "numru/units" => true >> include NumRu => Object >> un1 = Units.new('kg.m2/s') => Units{kg.m2/s} >> Units.reduce_level = 5 => :reduce5 ==Class Methods In what follows, the prefix (('NumRu::')) is omitted for conciseness. See (()) on this issue. ---Units.new(string) Constructor. ARGUMENTS * string (String): string expression of the units. [factor] units; [factor] time units [since ...] (see EXAMPLES below) RETURN VALUE * a Units EXAMPLE units = Units.new('kg.m2/s') units = Units.new('100 m') units = Units.new('g/kg') units = Units.new('hour since 2003-10-01 00:00:0 +0:00') units = Units.new('hour since 2003-10-01') # same as above units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00') ---Units[string] Same as (()) ---Units.reduce_level=(n) Set the reduction level before (()) is applied. ARGUMENTS * n (Integer): the reduction level. The default value is 4. Use 5 if you want a full reduction. Levels lower than 4 will not be needed. ==Instance Methods ---to_s Returns a string expression of the units. ---*(other) Multiplies self with another units. Applies (()) to format the string expression of the result. ARGUMENTS * other [Units]: the other units RETURN VALUE * a Units ---/(other) Divides self with another units. Applies (()) to format the string expression of the result. ARGUMENTS * other [Units]: the other units RETURN VALUE * a Units ---**(pow) Power. Applies (()) to format the string expression of the result. ARGUMENTS * pow [Numeric -- Integer, Rational, or Float] RETURN VALUE * a Units ---==(other) Whether the two units are the same. ('m/s' and 'm.s-1' are the same, for instance.) ---===(other) Same as ((<==>)). ---=~(other) Whether the two units are compatible (i.e., with the same dimensionality). ('m/s' and '10 m.s-1' are compatible, for instance.) ---reduce4 Moderately reduces the string expression of the units (destructive method). This method preserves string expression of atomic units. See also (()). RETURN VALUE * self EXAMPLE Untis.new('hour/hour').reduce4.to_s # => "1" Units.new('mm/m').reduce4.to_s # => "mm.m-1" ---reduce5 Aggressively reduces the string expression of the units (destructive method). See also (()). RETURN VALUE * self EXAMPLE Units.new('hour/hour').reduce4.to_s # => "1" Units.new('mm/m').reduce5.to_s # => "0.001" ---convert(numeric, to_units) Converts a numeric of the current units (=self) to ((|to_units|)). ARGUMENTS * numeric [Numeric]: the numeric to convert * to_units [Units]: the units converted into RETURN VALUE * a Numeric EXCEPTIONS * ((|self|)) and ((|to_units|)) are incompatible. ---convert2(val, to_units) Like (()), but (1) accpets any Numeric-like objects, and (2) does not raise an exception even if the two units are incompatible -- in this case, simply returns ((|val|)) (warned). ARGUMENTS * val [a Numeric-like class, for which (('*')) and (('+')) are defined]: the value to convert * to_units [Units]: the units converted into RETURN VALUE * an object with the same class as ((|val|)). ---factor_and_offset(to_units) Returns the factor and offset to convert from ((|self|)) to ((|to_units|)). The conversion is done as (('scale_factor * operand + add_offset')). ARGUMENTS * to_units [Units]: the units to be converted into RETURN VALUE * [ scale_factor, add_offset ] (a 2-element Array, where both are Numeric) EXAMPLE scale_factor, add_offset = from_units.factor_and_offset(to_units) to = scale_factor * from + add_offset =end numru-units-1.9.0/lib/0000755000175000017500000000000013025004162014422 5ustar uwabamiuwabaminumru-units-1.9.0/lib/numru/0000755000175000017500000000000013025004162015570 5ustar uwabamiuwabaminumru-units-1.9.0/lib/numru/units.rb0000644000175000017500000000007513025004162017261 0ustar uwabamiuwabamirequire "numru/units/version" require "numru/units/units.rb" numru-units-1.9.0/lib/numru/units/0000755000175000017500000000000013025004162016732 5ustar uwabamiuwabaminumru-units-1.9.0/lib/numru/units/version.rb0000644000175000017500000000007413025004162020745 0ustar uwabamiuwabamimodule Numru module Units VERSION = "1.9.0" end end numru-units-1.9.0/lib/numru/units/units.rb0000644000175000017500000034662413025004162020440 0ustar uwabamiuwabami# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.4.8 # from Racc grammer file "". # require 'racc/parser.rb' require 'date' module NumRu class Units < Racc::Parser module_eval(<<'...end units.racc/module_eval...', 'units.racc', 65) VERSION = "1.9" =begin = class Node Node is a parent class for classes of parse tree node. This is not expected to be instanciated directly. =end class Node def initialize(*args) raise "#{self.class} is virtual." end def to_s(*args) raise "#{self.class}#to_s is virtual." end =begin --- pow other simply constructs a PowNode object. No reduction is performed. =end def pow(other) PowNode.new(self, other) end =begin --- mul other simply constructs a MulNode object. No reduction is performed. =end def mul(other) other = NumberNode.new(other) if Numeric === other MulNode.new(self, other) end =begin --- divide other simply constructs a MulNode object. No reduction is performed. =end def divide(other) MulNode.new(self, PowNode.new(other, NumberNode.new(-1))) end =begin --- shift other simply constructs a ShiftNode object. No reduction is performed. =end def shift(other) ShiftNode.new(self, other) end =begin --- pow_eval other similar to (()), but reduces PowNode[PowNode[...]] into single PowNode[...], so overriden at PowNode class. =end def pow_eval(other) pow(other) end =begin --- inspect =end def inspect2; "#{self.class}[#{to_s}]"; end def inspect; inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '['); end =begin --- trim in most subclasses, "trim" is redirected into "trim2". =end def trim trim2 end =begin --- flatten in most subclasses, "flatten" is redirected into "flatten2". =end def flatten flatten2 end =begin --- sort =end def sort raise "#{self.class}#sort is virtual: call after flatten" end =begin --- reduce1 --- reduce2 --- reduce3 --- reduce4 --- reduce5 =end def reduce1 self end def reduce2 trim end def reduce3 trim.flatten end def reduce4 # unalias(Hash.new).trim.flatten.sort foldnumber(nil).trim.flatten.sort end def reduce5 expand(Hash.new).trim.flatten.sort end =begin --- ref to be overriden at ShiftNode --- deref to be overriden at ShiftNode =end def ref NumberNode::ZERO end def deref self end end class ErrorNode < Node def initialize(string) @a = string end def to_s; @a; end end class ContainerNode < Node def trim2 x = [] for child in self x.push child.trim2 end self.class.new(*x) end def inspect2 a = [] for child in self a.push child.inspect2 end "#{self.class}[#{a.join(', ')}]" end end module BinaryNode def each yield @lhs yield @rhs end def expand(stopper) self.class.new(@lhs.expand(stopper), @rhs.expand(stopper)) end def unalias(stopper) self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper)) end def foldnumber(stopper) self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper)) end end class TerminalNode < Node def trim2; self; end def flatten2; self; end def expand(stopper); self; end alias :unalias :expand alias :foldnumber :expand def sort; self; end end class NameNode < TerminalNode def initialize(string) @a = string end def to_s; @a; end alias :name :to_s def power; NumberNode::UNITY; end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name PowNode.new(self, self.power.add_eval(another.power)) end def expand(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self if basic? return CACHE[@a] if CACHE.include?(@a) CACHE[@a] = expand2(stopper) end def expand2(stopper) newstopper = stopper.dup newstopper[@a] = true if UDEFS.include?(@a) then Units.new(UDEFS[@a]).ptree.expand(newstopper) else p, n = UALIASES[@a] u = Units.new(UDEFS[n] || n).ptree.expand(newstopper) MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p))) end end def unalias(stopper) raise "circular dependency for #{@a}" if stopper[@a] return self unless UALIASES.include?(@a) p, n = UALIASES[@a] u = NameNode.new(n) q = PowNode.new(NumberNode.new(10), NumberNode.new(p)) MulNode.new(u, q) end def foldnumber(stopper) return self unless UPLURALS.include?(@a) n = UPLURALS[@a] NameNode.new(n) end def basic? not (UDEFS.include?(@a) or UALIASES.include?(@a)) end CACHE = {} def factor 1 end end class NameNode UDEFS = { "%" => "1e-2", "Au" => "astronomical_unit", "Bq" => "s-1", "C" => "A.s", "Celsius" => "K @ 273.15", "F" => "C/V", "Fahrenheit" => "degree_F", "G" => "gauss", "Gal" => "cm s-2", "Gy" => "J.kg-1", "H" => "Wb.A-1", "Hg" => "mercury", "Hz" => "1/s", "J" => "N.m", "Julian_year" => "365.25 day", "L" => "litre", "N" => "kg.m.s-2", "P" => "poise", "Pa" => "N.m-2", "Pascal" => "Pa", "S" => "A/V", "St" => "stokes", "Sv" => "J.kg-1", "T" => "Wb.m-2", "V" => "J/C", "W" => "J/s", "Wb" => "V.s", "a" => "are", "ac" => "acre", "acre" => "10 chain2", "ampere" => "A", "angstrom" => "1.0e-10 m", "angular_degree" => "degree", "angular_minute" => "minute_angle", "angular_second" => "second_angle", "are" => "100 m2", "astronomical_unit" => "1.49597870e11 m", "astronomical_units" => "1.49597870e11 m", "atm" => "atmosphere", "atmosphere" => "101325 Pa", "bar" => "1e6 dyn.cm-2", "cal" => "calorie", "calorie" => "4.18605 J", "celsius" => "K @ 273.15", "centigrade" => "K @ 273.15", "century" => "100 year", "chain" => "22 yard", "common_year" => "365 day", "conventional_mercury" => "gravity 13595.10 kg/m3", "coulomb" => "C", "d" => "24 hour", "day" => "24 hour", "degC" => "K @ 273.15", "degF" => "degree_F", "degK" => "K", "deg_C" => "K @ 273.15", "deg_F" => "degree_F", "deg_K" => "K", "degree" => "pi.rad/180", "degreeC" => "K @ 273.15", "degreeF" => "degree_F", "degreeK" => "K", "degree_C" => "K @ 273.15", "degree_E" => "degree", "degree_F" => "degree_R @ 459.67", "degree_N" => "degree", "degree_R" => "K / 1.8", "degree_S" => "degree", "degree_W" => "degree", "degree_c" => "K @ 273.15", "degree_east" => "degree_E", "degree_f" => "degree_R @ 459.67", "degree_north" => "degree_N", "degree_south" => "degree_S", "degree_west" => "degree_W", "degrees_east" => "degree_E", "degrees_north" => "degree_N", "degrees_south" => "degree_S", "degrees_west" => "degree_W", "dyn" => "g.cm.s-2", "dyne" => "g.cm.s-2", "erg" => "dyn cm", "fahrenheit" => "degree_F", "farad" => "coulomb/volt", "feet" => "foot", "fermi" => "1.0e-15 m", "foot" => "12 inch", "force" => "9.80665 m.s-2", "ft" => "foot", "g" => "kg/1000", "gal" => "cm s-2", "gauss" => "T / 10000", "gram" => "kg/1000", "gravity" => "9.806650 meter/second2", "h" => "60 min", "hectare" => "100 are", "hertz" => "Hz", "hg" => "mercury", "horse_power" => "75 m kilogram-force / s", "hour" => "60 min", "hr" => "60 min", "in" => "inch", "inch" => "2.54 cm", "joule" => "J", "kelvin" => "K", "kgf" => "kilogram-force", "kilogram" => "kg", "knot" => "nautical_mile / hour", "kph" => "km / hour", "lb" => "pound", "light_speed" => "299792458 m/s", "light_year" => "9.46e15 m", "light_years" => "9.46e15 m", "litre" => "1.0e-3 m3", "lm" => "cd.sr", "lx" => "lm.m-2", "ly" => "light_year", "mb" => "bar / 1000", "mercury" => "conventional_mercury", "meter" => "metre", "metre" => "m", "mgal" => "cm s-2 / 1000", "micron" => "1.0e-6 m", "mile" => "1760 yard", "millibar" => "bar / 1000", "min" => "60 s", "minute" => "60 s", "minute_angle" => "pi.rad/180/60", "mole" => "mol", "mon" => "month", "month" => "6 pentad", "mph" => "mile / hour", "nautical_mile" => "1852 m", "nautical_miles" => "1852 m", "newton" => "N", "ohm" => "V/A", "ounce" => "pound / 16", "oz" => "ounce", "parsec" => "3.0857e16 m", "pascal" => "Pa", "pc" => "parsec", "percent" => "1e-2", "permil" => "1e-3", "pi" => "3.141592653589793238462", "poise" => "dyn s / cm2", "pound" => "453.6 g", "psi" => "pound-force / inch2", "radian" => "rad", "second" => "s", "second_angle" => "pi.rad/180/60/60", "steradian" => "sr", "stokes" => "cm2 / s", "t" => "ton", "tesla" => "Wb.m-2", "ton" => "1000 kg", "tonne" => "ton", "torr" => "133.322 Pa", "volt" => "V", "watt" => "W", "weber" => "Wb", "yard" => "6 feet", "yd" => "yard", "year" => "12 month", "yr" => "year", } UALIASES = { "Celsiuses" => [0, "Celsius"], "E%" => [18, "%"], "EA" => [18, "A"], "EAu" => [18, "Au"], "EBq" => [18, "Bq"], "EC" => [18, "C"], "EF" => [18, "F"], "EG" => [18, "G"], "EGal" => [18, "Gal"], "EGy" => [18, "Gy"], "EH" => [18, "H"], "EHg" => [18, "Hg"], "EHz" => [18, "Hz"], "EJ" => [18, "J"], "EK" => [18, "K"], "EL" => [18, "L"], "EN" => [18, "N"], "EP" => [18, "P"], "EPa" => [18, "Pa"], "ES" => [18, "S"], "ESt" => [18, "St"], "ESv" => [18, "Sv"], "ET" => [18, "T"], "EV" => [18, "V"], "EW" => [18, "W"], "EWb" => [18, "Wb"], "Ea" => [18, "a"], "Eac" => [18, "ac"], "Eatm" => [18, "atm"], "Ebar" => [18, "bar"], "Ecal" => [18, "cal"], "Econventional_mercury" => [18, "conventional_mercury"], "Ed" => [18, "d"], "EdegC" => [18, "degC"], "EdegF" => [18, "degF"], "Edeg_C" => [18, "deg_C"], "Edeg_F" => [18, "deg_F"], "EdegreeC" => [18, "degreeC"], "EdegreeF" => [18, "degreeF"], "Edegree_C" => [18, "degree_C"], "Edegree_E" => [18, "degree_E"], "Edegree_F" => [18, "degree_F"], "Edegree_N" => [18, "degree_N"], "Edegree_R" => [18, "degree_R"], "Edegree_S" => [18, "degree_S"], "Edegree_W" => [18, "degree_W"], "Edegree_c" => [18, "degree_c"], "Edegree_east" => [18, "degree_east"], "Edegree_f" => [18, "degree_f"], "Edegree_north" => [18, "degree_north"], "Edegree_south" => [18, "degree_south"], "Edegree_west" => [18, "degree_west"], "Edegrees_east" => [18, "degrees_east"], "Edegrees_north" => [18, "degrees_north"], "Edegrees_south" => [18, "degrees_south"], "Edegrees_west" => [18, "degrees_west"], "Edyn" => [18, "dyn"], "Eerg" => [18, "erg"], "Eforce" => [18, "force"], "Eg" => [18, "g"], "Egravity" => [18, "gravity"], "Eh" => [18, "h"], "Ehg" => [18, "hg"], "Ehr" => [18, "hr"], "Ein" => [18, "in"], "Ekg" => [18, "kg"], "Ekgf" => [18, "kgf"], "Ekph" => [18, "kph"], "Elb" => [18, "lb"], "Elm" => [18, "lm"], "Elx" => [18, "lx"], "Ely" => [18, "ly"], "Em" => [18, "m"], "Emb" => [18, "mb"], "Emercury" => [18, "mercury"], "Emgal" => [18, "mgal"], "Emin" => [18, "min"], "Emol" => [18, "mol"], "Emon" => [18, "mon"], "Emph" => [18, "mph"], "Eohm" => [18, "ohm"], "Eoz" => [18, "oz"], "Epc" => [18, "pc"], "Epercent" => [18, "percent"], "Epermil" => [18, "permil"], "Epsi" => [18, "psi"], "Erad" => [18, "rad"], "Es" => [18, "s"], "Esr" => [18, "sr"], "Et" => [18, "t"], "Eyr" => [18, "yr"], "Fahrenheits" => [0, "Fahrenheit"], "G%" => [9, "%"], "GA" => [9, "A"], "GAu" => [9, "Au"], "GBq" => [9, "Bq"], "GC" => [9, "C"], "GF" => [9, "F"], "GG" => [9, "G"], "GGal" => [9, "Gal"], "GGy" => [9, "Gy"], "GH" => [9, "H"], "GHg" => [9, "Hg"], "GHz" => [9, "Hz"], "GJ" => [9, "J"], "GK" => [9, "K"], "GL" => [9, "L"], "GN" => [9, "N"], "GP" => [9, "P"], "GPa" => [9, "Pa"], "GS" => [9, "S"], "GSt" => [9, "St"], "GSv" => [9, "Sv"], "GT" => [9, "T"], "GV" => [9, "V"], "GW" => [9, "W"], "GWb" => [9, "Wb"], "Ga" => [9, "a"], "Gac" => [9, "ac"], "Gatm" => [9, "atm"], "Gbar" => [9, "bar"], "Gcal" => [9, "cal"], "Gconventional_mercury" => [9, "conventional_mercury"], "Gd" => [9, "d"], "GdegC" => [9, "degC"], "GdegF" => [9, "degF"], "Gdeg_C" => [9, "deg_C"], "Gdeg_F" => [9, "deg_F"], "GdegreeC" => [9, "degreeC"], "GdegreeF" => [9, "degreeF"], "Gdegree_C" => [9, "degree_C"], "Gdegree_E" => [9, "degree_E"], "Gdegree_F" => [9, "degree_F"], "Gdegree_N" => [9, "degree_N"], "Gdegree_R" => [9, "degree_R"], "Gdegree_S" => [9, "degree_S"], "Gdegree_W" => [9, "degree_W"], "Gdegree_c" => [9, "degree_c"], "Gdegree_east" => [9, "degree_east"], "Gdegree_f" => [9, "degree_f"], "Gdegree_north" => [9, "degree_north"], "Gdegree_south" => [9, "degree_south"], "Gdegree_west" => [9, "degree_west"], "Gdegrees_east" => [9, "degrees_east"], "Gdegrees_north" => [9, "degrees_north"], "Gdegrees_south" => [9, "degrees_south"], "Gdegrees_west" => [9, "degrees_west"], "Gdyn" => [9, "dyn"], "Gerg" => [9, "erg"], "Gforce" => [9, "force"], "Gg" => [9, "g"], "Ggravity" => [9, "gravity"], "Gh" => [9, "h"], "Ghg" => [9, "hg"], "Ghr" => [9, "hr"], "Gin" => [9, "in"], "Gkg" => [9, "kg"], "Gkgf" => [9, "kgf"], "Gkph" => [9, "kph"], "Glb" => [9, "lb"], "Glm" => [9, "lm"], "Glx" => [9, "lx"], "Gly" => [9, "ly"], "Gm" => [9, "m"], "Gmb" => [9, "mb"], "Gmercury" => [9, "mercury"], "Gmgal" => [9, "mgal"], "Gmin" => [9, "min"], "Gmol" => [9, "mol"], "Gmon" => [9, "mon"], "Gmph" => [9, "mph"], "Gohm" => [9, "ohm"], "Goz" => [9, "oz"], "Gpc" => [9, "pc"], "Gpercent" => [9, "percent"], "Gpermil" => [9, "permil"], "Gpsi" => [9, "psi"], "Grad" => [9, "rad"], "Gs" => [9, "s"], "Gsr" => [9, "sr"], "Gt" => [9, "t"], "Gyr" => [9, "yr"], "Julians_year" => [0, "Julian_year"], "M%" => [6, "%"], "MA" => [6, "A"], "MAu" => [6, "Au"], "MBq" => [6, "Bq"], "MC" => [6, "C"], "MF" => [6, "F"], "MG" => [6, "G"], "MGal" => [6, "Gal"], "MGy" => [6, "Gy"], "MH" => [6, "H"], "MHg" => [6, "Hg"], "MHz" => [6, "Hz"], "MJ" => [6, "J"], "MK" => [6, "K"], "ML" => [6, "L"], "MN" => [6, "N"], "MP" => [6, "P"], "MPa" => [6, "Pa"], "MS" => [6, "S"], "MSt" => [6, "St"], "MSv" => [6, "Sv"], "MT" => [6, "T"], "MV" => [6, "V"], "MW" => [6, "W"], "MWb" => [6, "Wb"], "Ma" => [6, "a"], "Mac" => [6, "ac"], "Matm" => [6, "atm"], "Mbar" => [6, "bar"], "Mcal" => [6, "cal"], "Mconventional_mercury" => [6, "conventional_mercury"], "Md" => [6, "d"], "MdegC" => [6, "degC"], "MdegF" => [6, "degF"], "Mdeg_C" => [6, "deg_C"], "Mdeg_F" => [6, "deg_F"], "MdegreeC" => [6, "degreeC"], "MdegreeF" => [6, "degreeF"], "Mdegree_C" => [6, "degree_C"], "Mdegree_E" => [6, "degree_E"], "Mdegree_F" => [6, "degree_F"], "Mdegree_N" => [6, "degree_N"], "Mdegree_R" => [6, "degree_R"], "Mdegree_S" => [6, "degree_S"], "Mdegree_W" => [6, "degree_W"], "Mdegree_c" => [6, "degree_c"], "Mdegree_east" => [6, "degree_east"], "Mdegree_f" => [6, "degree_f"], "Mdegree_north" => [6, "degree_north"], "Mdegree_south" => [6, "degree_south"], "Mdegree_west" => [6, "degree_west"], "Mdegrees_east" => [6, "degrees_east"], "Mdegrees_north" => [6, "degrees_north"], "Mdegrees_south" => [6, "degrees_south"], "Mdegrees_west" => [6, "degrees_west"], "Mdyn" => [6, "dyn"], "Merg" => [6, "erg"], "Mforce" => [6, "force"], "Mg" => [6, "g"], "Mgravity" => [6, "gravity"], "Mh" => [6, "h"], "Mhg" => [6, "hg"], "Mhr" => [6, "hr"], "Min" => [6, "in"], "Mkg" => [6, "kg"], "Mkgf" => [6, "kgf"], "Mkph" => [6, "kph"], "Mlb" => [6, "lb"], "Mlm" => [6, "lm"], "Mlx" => [6, "lx"], "Mly" => [6, "ly"], "Mm" => [6, "m"], "Mmb" => [6, "mb"], "Mmercury" => [6, "mercury"], "Mmgal" => [6, "mgal"], "Mmin" => [6, "min"], "Mmol" => [6, "mol"], "Mmon" => [6, "mon"], "Mmph" => [6, "mph"], "Mohm" => [6, "ohm"], "Moz" => [6, "oz"], "Mpc" => [6, "pc"], "Mpercent" => [6, "percent"], "Mpermil" => [6, "permil"], "Mpsi" => [6, "psi"], "Mrad" => [6, "rad"], "Ms" => [6, "s"], "Msr" => [6, "sr"], "Mt" => [6, "t"], "Myr" => [6, "yr"], "P%" => [15, "%"], "PA" => [15, "A"], "PAu" => [15, "Au"], "PBq" => [15, "Bq"], "PC" => [15, "C"], "PF" => [15, "F"], "PG" => [15, "G"], "PGal" => [15, "Gal"], "PGy" => [15, "Gy"], "PH" => [15, "H"], "PHg" => [15, "Hg"], "PHz" => [15, "Hz"], "PJ" => [15, "J"], "PK" => [15, "K"], "PL" => [15, "L"], "PN" => [15, "N"], "PP" => [15, "P"], "PPa" => [15, "Pa"], "PS" => [15, "S"], "PSt" => [15, "St"], "PSv" => [15, "Sv"], "PT" => [15, "T"], "PV" => [15, "V"], "PW" => [15, "W"], "PWb" => [15, "Wb"], "Pa" => [15, "a"], "Pac" => [15, "ac"], "Pascals" => [0, "Pascal"], "Patm" => [15, "atm"], "Pbar" => [15, "bar"], "Pcal" => [15, "cal"], "Pconventional_mercury" => [15, "conventional_mercury"], "Pd" => [15, "d"], "PdegC" => [15, "degC"], "PdegF" => [15, "degF"], "Pdeg_C" => [15, "deg_C"], "Pdeg_F" => [15, "deg_F"], "PdegreeC" => [15, "degreeC"], "PdegreeF" => [15, "degreeF"], "Pdegree_C" => [15, "degree_C"], "Pdegree_E" => [15, "degree_E"], "Pdegree_F" => [15, "degree_F"], "Pdegree_N" => [15, "degree_N"], "Pdegree_R" => [15, "degree_R"], "Pdegree_S" => [15, "degree_S"], "Pdegree_W" => [15, "degree_W"], "Pdegree_c" => [15, "degree_c"], "Pdegree_east" => [15, "degree_east"], "Pdegree_f" => [15, "degree_f"], "Pdegree_north" => [15, "degree_north"], "Pdegree_south" => [15, "degree_south"], "Pdegree_west" => [15, "degree_west"], "Pdegrees_east" => [15, "degrees_east"], "Pdegrees_north" => [15, "degrees_north"], "Pdegrees_south" => [15, "degrees_south"], "Pdegrees_west" => [15, "degrees_west"], "Pdyn" => [15, "dyn"], "Perg" => [15, "erg"], "Pforce" => [15, "force"], "Pg" => [15, "g"], "Pgravity" => [15, "gravity"], "Ph" => [15, "h"], "Phg" => [15, "hg"], "Phr" => [15, "hr"], "Pin" => [15, "in"], "Pkg" => [15, "kg"], "Pkgf" => [15, "kgf"], "Pkph" => [15, "kph"], "Plb" => [15, "lb"], "Plm" => [15, "lm"], "Plx" => [15, "lx"], "Ply" => [15, "ly"], "Pm" => [15, "m"], "Pmb" => [15, "mb"], "Pmercury" => [15, "mercury"], "Pmgal" => [15, "mgal"], "Pmin" => [15, "min"], "Pmol" => [15, "mol"], "Pmon" => [15, "mon"], "Pmph" => [15, "mph"], "Pohm" => [15, "ohm"], "Poz" => [15, "oz"], "Ppc" => [15, "pc"], "Ppercent" => [15, "percent"], "Ppermil" => [15, "permil"], "Ppsi" => [15, "psi"], "Prad" => [15, "rad"], "Ps" => [15, "s"], "Psr" => [15, "sr"], "Pt" => [15, "t"], "Pyr" => [15, "yr"], "T%" => [12, "%"], "TA" => [12, "A"], "TAu" => [12, "Au"], "TBq" => [12, "Bq"], "TC" => [12, "C"], "TF" => [12, "F"], "TG" => [12, "G"], "TGal" => [12, "Gal"], "TGy" => [12, "Gy"], "TH" => [12, "H"], "THg" => [12, "Hg"], "THz" => [12, "Hz"], "TJ" => [12, "J"], "TK" => [12, "K"], "TL" => [12, "L"], "TN" => [12, "N"], "TP" => [12, "P"], "TPa" => [12, "Pa"], "TS" => [12, "S"], "TSt" => [12, "St"], "TSv" => [12, "Sv"], "TT" => [12, "T"], "TV" => [12, "V"], "TW" => [12, "W"], "TWb" => [12, "Wb"], "Ta" => [12, "a"], "Tac" => [12, "ac"], "Tatm" => [12, "atm"], "Tbar" => [12, "bar"], "Tcal" => [12, "cal"], "Tconventional_mercury" => [12, "conventional_mercury"], "Td" => [12, "d"], "TdegC" => [12, "degC"], "TdegF" => [12, "degF"], "Tdeg_C" => [12, "deg_C"], "Tdeg_F" => [12, "deg_F"], "TdegreeC" => [12, "degreeC"], "TdegreeF" => [12, "degreeF"], "Tdegree_C" => [12, "degree_C"], "Tdegree_E" => [12, "degree_E"], "Tdegree_F" => [12, "degree_F"], "Tdegree_N" => [12, "degree_N"], "Tdegree_R" => [12, "degree_R"], "Tdegree_S" => [12, "degree_S"], "Tdegree_W" => [12, "degree_W"], "Tdegree_c" => [12, "degree_c"], "Tdegree_east" => [12, "degree_east"], "Tdegree_f" => [12, "degree_f"], "Tdegree_north" => [12, "degree_north"], "Tdegree_south" => [12, "degree_south"], "Tdegree_west" => [12, "degree_west"], "Tdegrees_east" => [12, "degrees_east"], "Tdegrees_north" => [12, "degrees_north"], "Tdegrees_south" => [12, "degrees_south"], "Tdegrees_west" => [12, "degrees_west"], "Tdyn" => [12, "dyn"], "Terg" => [12, "erg"], "Tforce" => [12, "force"], "Tg" => [12, "g"], "Tgravity" => [12, "gravity"], "Th" => [12, "h"], "Thg" => [12, "hg"], "Thr" => [12, "hr"], "Tin" => [12, "in"], "Tkg" => [12, "kg"], "Tkgf" => [12, "kgf"], "Tkph" => [12, "kph"], "Tlb" => [12, "lb"], "Tlm" => [12, "lm"], "Tlx" => [12, "lx"], "Tly" => [12, "ly"], "Tm" => [12, "m"], "Tmb" => [12, "mb"], "Tmercury" => [12, "mercury"], "Tmgal" => [12, "mgal"], "Tmin" => [12, "min"], "Tmol" => [12, "mol"], "Tmon" => [12, "mon"], "Tmph" => [12, "mph"], "Tohm" => [12, "ohm"], "Toz" => [12, "oz"], "Tpc" => [12, "pc"], "Tpercent" => [12, "percent"], "Tpermil" => [12, "permil"], "Tpsi" => [12, "psi"], "Trad" => [12, "rad"], "Ts" => [12, "s"], "Tsr" => [12, "sr"], "Tt" => [12, "t"], "Tyr" => [12, "yr"], "a%" => [-18, "%"], "aA" => [-18, "A"], "aAu" => [-18, "Au"], "aBq" => [-18, "Bq"], "aC" => [-18, "C"], "aF" => [-18, "F"], "aG" => [-18, "G"], "aGal" => [-18, "Gal"], "aGy" => [-18, "Gy"], "aH" => [-18, "H"], "aHg" => [-18, "Hg"], "aHz" => [-18, "Hz"], "aJ" => [-18, "J"], "aK" => [-18, "K"], "aL" => [-18, "L"], "aN" => [-18, "N"], "aP" => [-18, "P"], "aPa" => [-18, "Pa"], "aS" => [-18, "S"], "aSt" => [-18, "St"], "aSv" => [-18, "Sv"], "aT" => [-18, "T"], "aV" => [-18, "V"], "aW" => [-18, "W"], "aWb" => [-18, "Wb"], "aa" => [-18, "a"], "aac" => [-18, "ac"], "aatm" => [-18, "atm"], "abar" => [-18, "bar"], "acal" => [-18, "cal"], "aconventional_mercury" => [-18, "conventional_mercury"], "acres" => [0, "acre"], "ad" => [-18, "d"], "adegC" => [-18, "degC"], "adegF" => [-18, "degF"], "adeg_C" => [-18, "deg_C"], "adeg_F" => [-18, "deg_F"], "adegreeC" => [-18, "degreeC"], "adegreeF" => [-18, "degreeF"], "adegree_C" => [-18, "degree_C"], "adegree_E" => [-18, "degree_E"], "adegree_F" => [-18, "degree_F"], "adegree_N" => [-18, "degree_N"], "adegree_R" => [-18, "degree_R"], "adegree_S" => [-18, "degree_S"], "adegree_W" => [-18, "degree_W"], "adegree_c" => [-18, "degree_c"], "adegree_east" => [-18, "degree_east"], "adegree_f" => [-18, "degree_f"], "adegree_north" => [-18, "degree_north"], "adegree_south" => [-18, "degree_south"], "adegree_west" => [-18, "degree_west"], "adegrees_east" => [-18, "degrees_east"], "adegrees_north" => [-18, "degrees_north"], "adegrees_south" => [-18, "degrees_south"], "adegrees_west" => [-18, "degrees_west"], "adyn" => [-18, "dyn"], "aerg" => [-18, "erg"], "aforce" => [-18, "force"], "ag" => [-18, "g"], "agravity" => [-18, "gravity"], "ah" => [-18, "h"], "ahg" => [-18, "hg"], "ahr" => [-18, "hr"], "ain" => [-18, "in"], "akg" => [-18, "kg"], "akgf" => [-18, "kgf"], "akph" => [-18, "kph"], "alb" => [-18, "lb"], "alm" => [-18, "lm"], "alx" => [-18, "lx"], "aly" => [-18, "ly"], "am" => [-18, "m"], "amb" => [-18, "mb"], "amercury" => [-18, "mercury"], "amgal" => [-18, "mgal"], "amin" => [-18, "min"], "amol" => [-18, "mol"], "amon" => [-18, "mon"], "amperes" => [0, "ampere"], "amph" => [-18, "mph"], "angstroms" => [0, "angstrom"], "angulars_degree" => [0, "angular_degree"], "angulars_minute" => [0, "angular_minute"], "angulars_second" => [0, "angular_second"], "aohm" => [-18, "ohm"], "aoz" => [-18, "oz"], "apc" => [-18, "pc"], "apercent" => [-18, "percent"], "apermil" => [-18, "permil"], "apsi" => [-18, "psi"], "arad" => [-18, "rad"], "ares" => [0, "are"], "as" => [-18, "s"], "asr" => [-18, "sr"], "at" => [-18, "t"], "atmospheres" => [0, "atmosphere"], "attoCelsius" => [-18, "Celsius"], "attoFahrenheit" => [-18, "Fahrenheit"], "attoJulian_year" => [-18, "Julian_year"], "attoPascal" => [-18, "Pascal"], "attoacre" => [-18, "acre"], "attoampere" => [-18, "ampere"], "attoangstrom" => [-18, "angstrom"], "attoangular_degree" => [-18, "angular_degree"], "attoangular_minute" => [-18, "angular_minute"], "attoangular_second" => [-18, "angular_second"], "attoare" => [-18, "are"], "attoatmosphere" => [-18, "atmosphere"], "attocalorie" => [-18, "calorie"], "attocelsius" => [-18, "celsius"], "attocentigrade" => [-18, "centigrade"], "attocentury" => [-18, "century"], "attochain" => [-18, "chain"], "attocommon_year" => [-18, "common_year"], "attocoulomb" => [-18, "coulomb"], "attoday" => [-18, "day"], "attodegK" => [-18, "degK"], "attodeg_K" => [-18, "deg_K"], "attodegree" => [-18, "degree"], "attodegreeK" => [-18, "degreeK"], "attodyne" => [-18, "dyne"], "attoerg" => [-18, "erg"], "attofahrenheit" => [-18, "fahrenheit"], "attofarad" => [-18, "farad"], "attofermi" => [-18, "fermi"], "attogal" => [-18, "gal"], "attogauss" => [-18, "gauss"], "attogram" => [-18, "gram"], "attohectare" => [-18, "hectare"], "attohertz" => [-18, "hertz"], "attohour" => [-18, "hour"], "attoinch" => [-18, "inch"], "attojoule" => [-18, "joule"], "attokelvin" => [-18, "kelvin"], "attokilogram" => [-18, "kilogram"], "attoknot" => [-18, "knot"], "attolitre" => [-18, "litre"], "attometer" => [-18, "meter"], "attometre" => [-18, "metre"], "attomicron" => [-18, "micron"], "attomile" => [-18, "mile"], "attomillibar" => [-18, "millibar"], "attominute" => [-18, "minute"], "attominute_angle" => [-18, "minute_angle"], "attomole" => [-18, "mole"], "attomonth" => [-18, "month"], "attonewton" => [-18, "newton"], "attoounce" => [-18, "ounce"], "attoparsec" => [-18, "parsec"], "attopascal" => [-18, "pascal"], "attopentad" => [-18, "pentad"], "attopoise" => [-18, "poise"], "attopound" => [-18, "pound"], "attoradian" => [-18, "radian"], "attosecond" => [-18, "second"], "attosecond_angle" => [-18, "second_angle"], "attosteradian" => [-18, "steradian"], "attostokes" => [-18, "stokes"], "attotesla" => [-18, "tesla"], "attoton" => [-18, "ton"], "attotonne" => [-18, "tonne"], "attotorr" => [-18, "torr"], "attovolt" => [-18, "volt"], "attowatt" => [-18, "watt"], "attoweber" => [-18, "weber"], "attoyard" => [-18, "yard"], "attoyd" => [-18, "yd"], "attoyear" => [-18, "year"], "ayr" => [-18, "yr"], "c%" => [-2, "%"], "cA" => [-2, "A"], "cAu" => [-2, "Au"], "cBq" => [-2, "Bq"], "cC" => [-2, "C"], "cF" => [-2, "F"], "cG" => [-2, "G"], "cGal" => [-2, "Gal"], "cGy" => [-2, "Gy"], "cH" => [-2, "H"], "cHg" => [-2, "Hg"], "cHz" => [-2, "Hz"], "cJ" => [-2, "J"], "cK" => [-2, "K"], "cL" => [-2, "L"], "cN" => [-2, "N"], "cP" => [-2, "P"], "cPa" => [-2, "Pa"], "cS" => [-2, "S"], "cSt" => [-2, "St"], "cSv" => [-2, "Sv"], "cT" => [-2, "T"], "cV" => [-2, "V"], "cW" => [-2, "W"], "cWb" => [-2, "Wb"], "ca" => [-2, "a"], "cac" => [-2, "ac"], "calories" => [0, "calorie"], "catm" => [-2, "atm"], "cbar" => [-2, "bar"], "ccal" => [-2, "cal"], "cconventional_mercury" => [-2, "conventional_mercury"], "cd" => [-2, "d"], "cdegC" => [-2, "degC"], "cdegF" => [-2, "degF"], "cdeg_C" => [-2, "deg_C"], "cdeg_F" => [-2, "deg_F"], "cdegreeC" => [-2, "degreeC"], "cdegreeF" => [-2, "degreeF"], "cdegree_C" => [-2, "degree_C"], "cdegree_E" => [-2, "degree_E"], "cdegree_F" => [-2, "degree_F"], "cdegree_N" => [-2, "degree_N"], "cdegree_R" => [-2, "degree_R"], "cdegree_S" => [-2, "degree_S"], "cdegree_W" => [-2, "degree_W"], "cdegree_c" => [-2, "degree_c"], "cdegree_east" => [-2, "degree_east"], "cdegree_f" => [-2, "degree_f"], "cdegree_north" => [-2, "degree_north"], "cdegree_south" => [-2, "degree_south"], "cdegree_west" => [-2, "degree_west"], "cdegrees_east" => [-2, "degrees_east"], "cdegrees_north" => [-2, "degrees_north"], "cdegrees_south" => [-2, "degrees_south"], "cdegrees_west" => [-2, "degrees_west"], "cdyn" => [-2, "dyn"], "celsiuses" => [0, "celsius"], "centiCelsius" => [-2, "Celsius"], "centiFahrenheit" => [-2, "Fahrenheit"], "centiJulian_year" => [-2, "Julian_year"], "centiPascal" => [-2, "Pascal"], "centiacre" => [-2, "acre"], "centiampere" => [-2, "ampere"], "centiangstrom" => [-2, "angstrom"], "centiangular_degree" => [-2, "angular_degree"], "centiangular_minute" => [-2, "angular_minute"], "centiangular_second" => [-2, "angular_second"], "centiare" => [-2, "are"], "centiatmosphere" => [-2, "atmosphere"], "centicalorie" => [-2, "calorie"], "centicelsius" => [-2, "celsius"], "centicentigrade" => [-2, "centigrade"], "centicentury" => [-2, "century"], "centichain" => [-2, "chain"], "centicommon_year" => [-2, "common_year"], "centicoulomb" => [-2, "coulomb"], "centiday" => [-2, "day"], "centidegK" => [-2, "degK"], "centideg_K" => [-2, "deg_K"], "centidegree" => [-2, "degree"], "centidegreeK" => [-2, "degreeK"], "centidyne" => [-2, "dyne"], "centierg" => [-2, "erg"], "centifahrenheit" => [-2, "fahrenheit"], "centifarad" => [-2, "farad"], "centifermi" => [-2, "fermi"], "centigal" => [-2, "gal"], "centigauss" => [-2, "gauss"], "centigrades" => [0, "centigrade"], "centigram" => [-2, "gram"], "centihectare" => [-2, "hectare"], "centihertz" => [-2, "hertz"], "centihour" => [-2, "hour"], "centiinch" => [-2, "inch"], "centijoule" => [-2, "joule"], "centikelvin" => [-2, "kelvin"], "centikilogram" => [-2, "kilogram"], "centiknot" => [-2, "knot"], "centilitre" => [-2, "litre"], "centimeter" => [-2, "meter"], "centimetre" => [-2, "metre"], "centimicron" => [-2, "micron"], "centimile" => [-2, "mile"], "centimillibar" => [-2, "millibar"], "centiminute" => [-2, "minute"], "centiminute_angle" => [-2, "minute_angle"], "centimole" => [-2, "mole"], "centimonth" => [-2, "month"], "centinewton" => [-2, "newton"], "centiounce" => [-2, "ounce"], "centiparsec" => [-2, "parsec"], "centipascal" => [-2, "pascal"], "centipentad" => [-2, "pentad"], "centipoise" => [-2, "poise"], "centipound" => [-2, "pound"], "centiradian" => [-2, "radian"], "centisecond" => [-2, "second"], "centisecond_angle" => [-2, "second_angle"], "centisteradian" => [-2, "steradian"], "centistokes" => [-2, "stokes"], "centitesla" => [-2, "tesla"], "centiton" => [-2, "ton"], "centitonne" => [-2, "tonne"], "centitorr" => [-2, "torr"], "centivolt" => [-2, "volt"], "centiwatt" => [-2, "watt"], "centiweber" => [-2, "weber"], "centiyard" => [-2, "yard"], "centiyd" => [-2, "yd"], "centiyear" => [-2, "year"], "centuries" => [0, "century"], "cerg" => [-2, "erg"], "cforce" => [-2, "force"], "cg" => [-2, "g"], "cgravity" => [-2, "gravity"], "ch" => [-2, "h"], "chains" => [0, "chain"], "chg" => [-2, "hg"], "chr" => [-2, "hr"], "cin" => [-2, "in"], "ckg" => [-2, "kg"], "ckgf" => [-2, "kgf"], "ckph" => [-2, "kph"], "clb" => [-2, "lb"], "clm" => [-2, "lm"], "clx" => [-2, "lx"], "cly" => [-2, "ly"], "cm" => [-2, "m"], "cmb" => [-2, "mb"], "cmercury" => [-2, "mercury"], "cmgal" => [-2, "mgal"], "cmin" => [-2, "min"], "cmol" => [-2, "mol"], "cmon" => [-2, "mon"], "cmph" => [-2, "mph"], "cohm" => [-2, "ohm"], "commons_year" => [0, "common_year"], "coulombs" => [0, "coulomb"], "coz" => [-2, "oz"], "cpc" => [-2, "pc"], "cpercent" => [-2, "percent"], "cpermil" => [-2, "permil"], "cpsi" => [-2, "psi"], "crad" => [-2, "rad"], "cs" => [-2, "s"], "csr" => [-2, "sr"], "ct" => [-2, "t"], "cyr" => [-2, "yr"], "d%" => [-1, "%"], "dA" => [-1, "A"], "dAu" => [-1, "Au"], "dBq" => [-1, "Bq"], "dC" => [-1, "C"], "dF" => [-1, "F"], "dG" => [-1, "G"], "dGal" => [-1, "Gal"], "dGy" => [-1, "Gy"], "dH" => [-1, "H"], "dHg" => [-1, "Hg"], "dHz" => [-1, "Hz"], "dJ" => [-1, "J"], "dK" => [-1, "K"], "dL" => [-1, "L"], "dN" => [-1, "N"], "dP" => [-1, "P"], "dPa" => [-1, "Pa"], "dS" => [-1, "S"], "dSt" => [-1, "St"], "dSv" => [-1, "Sv"], "dT" => [-1, "T"], "dV" => [-1, "V"], "dW" => [-1, "W"], "dWb" => [-1, "Wb"], "da" => [-1, "a"], "da%" => [1, "%"], "daA" => [1, "A"], "daAu" => [1, "Au"], "daBq" => [1, "Bq"], "daC" => [1, "C"], "daF" => [1, "F"], "daG" => [1, "G"], "daGal" => [1, "Gal"], "daGy" => [1, "Gy"], "daH" => [1, "H"], "daHg" => [1, "Hg"], "daHz" => [1, "Hz"], "daJ" => [1, "J"], "daK" => [1, "K"], "daL" => [1, "L"], "daN" => [1, "N"], "daP" => [1, "P"], "daPa" => [1, "Pa"], "daS" => [1, "S"], "daSt" => [1, "St"], "daSv" => [1, "Sv"], "daT" => [1, "T"], "daV" => [1, "V"], "daW" => [1, "W"], "daWb" => [1, "Wb"], "daa" => [1, "a"], "daac" => [1, "ac"], "daatm" => [1, "atm"], "dabar" => [1, "bar"], "dac" => [-1, "ac"], "dacal" => [1, "cal"], "daconventional_mercury" => [1, "conventional_mercury"], "dad" => [1, "d"], "dadegC" => [1, "degC"], "dadegF" => [1, "degF"], "dadeg_C" => [1, "deg_C"], "dadeg_F" => [1, "deg_F"], "dadegreeC" => [1, "degreeC"], "dadegreeF" => [1, "degreeF"], "dadegree_C" => [1, "degree_C"], "dadegree_E" => [1, "degree_E"], "dadegree_F" => [1, "degree_F"], "dadegree_N" => [1, "degree_N"], "dadegree_R" => [1, "degree_R"], "dadegree_S" => [1, "degree_S"], "dadegree_W" => [1, "degree_W"], "dadegree_c" => [1, "degree_c"], "dadegree_east" => [1, "degree_east"], "dadegree_f" => [1, "degree_f"], "dadegree_north" => [1, "degree_north"], "dadegree_south" => [1, "degree_south"], "dadegree_west" => [1, "degree_west"], "dadegrees_east" => [1, "degrees_east"], "dadegrees_north" => [1, "degrees_north"], "dadegrees_south" => [1, "degrees_south"], "dadegrees_west" => [1, "degrees_west"], "dadyn" => [1, "dyn"], "daerg" => [1, "erg"], "daforce" => [1, "force"], "dag" => [1, "g"], "dagravity" => [1, "gravity"], "dah" => [1, "h"], "dahg" => [1, "hg"], "dahr" => [1, "hr"], "dain" => [1, "in"], "dakg" => [1, "kg"], "dakgf" => [1, "kgf"], "dakph" => [1, "kph"], "dalb" => [1, "lb"], "dalm" => [1, "lm"], "dalx" => [1, "lx"], "daly" => [1, "ly"], "dam" => [1, "m"], "damb" => [1, "mb"], "damercury" => [1, "mercury"], "damgal" => [1, "mgal"], "damin" => [1, "min"], "damol" => [1, "mol"], "damon" => [1, "mon"], "damph" => [1, "mph"], "daohm" => [1, "ohm"], "daoz" => [1, "oz"], "dapc" => [1, "pc"], "dapercent" => [1, "percent"], "dapermil" => [1, "permil"], "dapsi" => [1, "psi"], "darad" => [1, "rad"], "das" => [1, "s"], "dasr" => [1, "sr"], "dat" => [1, "t"], "datm" => [-1, "atm"], "dayr" => [1, "yr"], "days" => [0, "day"], "dbar" => [-1, "bar"], "dcal" => [-1, "cal"], "dconventional_mercury" => [-1, "conventional_mercury"], "dd" => [-1, "d"], "ddegC" => [-1, "degC"], "ddegF" => [-1, "degF"], "ddeg_C" => [-1, "deg_C"], "ddeg_F" => [-1, "deg_F"], "ddegreeC" => [-1, "degreeC"], "ddegreeF" => [-1, "degreeF"], "ddegree_C" => [-1, "degree_C"], "ddegree_E" => [-1, "degree_E"], "ddegree_F" => [-1, "degree_F"], "ddegree_N" => [-1, "degree_N"], "ddegree_R" => [-1, "degree_R"], "ddegree_S" => [-1, "degree_S"], "ddegree_W" => [-1, "degree_W"], "ddegree_c" => [-1, "degree_c"], "ddegree_east" => [-1, "degree_east"], "ddegree_f" => [-1, "degree_f"], "ddegree_north" => [-1, "degree_north"], "ddegree_south" => [-1, "degree_south"], "ddegree_west" => [-1, "degree_west"], "ddegrees_east" => [-1, "degrees_east"], "ddegrees_north" => [-1, "degrees_north"], "ddegrees_south" => [-1, "degrees_south"], "ddegrees_west" => [-1, "degrees_west"], "ddyn" => [-1, "dyn"], "decaCelsius" => [1, "Celsius"], "decaFahrenheit" => [1, "Fahrenheit"], "decaJulian_year" => [1, "Julian_year"], "decaPascal" => [1, "Pascal"], "decaacre" => [1, "acre"], "decaampere" => [1, "ampere"], "decaangstrom" => [1, "angstrom"], "decaangular_degree" => [1, "angular_degree"], "decaangular_minute" => [1, "angular_minute"], "decaangular_second" => [1, "angular_second"], "decaare" => [1, "are"], "decaatmosphere" => [1, "atmosphere"], "decacalorie" => [1, "calorie"], "decacelsius" => [1, "celsius"], "decacentigrade" => [1, "centigrade"], "decacentury" => [1, "century"], "decachain" => [1, "chain"], "decacommon_year" => [1, "common_year"], "decacoulomb" => [1, "coulomb"], "decaday" => [1, "day"], "decadegK" => [1, "degK"], "decadeg_K" => [1, "deg_K"], "decadegree" => [1, "degree"], "decadegreeK" => [1, "degreeK"], "decadyne" => [1, "dyne"], "decaerg" => [1, "erg"], "decafahrenheit" => [1, "fahrenheit"], "decafarad" => [1, "farad"], "decafermi" => [1, "fermi"], "decagal" => [1, "gal"], "decagauss" => [1, "gauss"], "decagram" => [1, "gram"], "decahectare" => [1, "hectare"], "decahertz" => [1, "hertz"], "decahour" => [1, "hour"], "decainch" => [1, "inch"], "decajoule" => [1, "joule"], "decakelvin" => [1, "kelvin"], "decakilogram" => [1, "kilogram"], "decaknot" => [1, "knot"], "decalitre" => [1, "litre"], "decameter" => [1, "meter"], "decametre" => [1, "metre"], "decamicron" => [1, "micron"], "decamile" => [1, "mile"], "decamillibar" => [1, "millibar"], "decaminute" => [1, "minute"], "decaminute_angle" => [1, "minute_angle"], "decamole" => [1, "mole"], "decamonth" => [1, "month"], "decanewton" => [1, "newton"], "decaounce" => [1, "ounce"], "decaparsec" => [1, "parsec"], "decapascal" => [1, "pascal"], "decapentad" => [1, "pentad"], "decapoise" => [1, "poise"], "decapound" => [1, "pound"], "decaradian" => [1, "radian"], "decasecond" => [1, "second"], "decasecond_angle" => [1, "second_angle"], "decasteradian" => [1, "steradian"], "decastokes" => [1, "stokes"], "decatesla" => [1, "tesla"], "decaton" => [1, "ton"], "decatonne" => [1, "tonne"], "decatorr" => [1, "torr"], "decavolt" => [1, "volt"], "decawatt" => [1, "watt"], "decaweber" => [1, "weber"], "decayard" => [1, "yard"], "decayd" => [1, "yd"], "decayear" => [1, "year"], "deciCelsius" => [-1, "Celsius"], "deciFahrenheit" => [-1, "Fahrenheit"], "deciJulian_year" => [-1, "Julian_year"], "deciPascal" => [-1, "Pascal"], "deciacre" => [-1, "acre"], "deciampere" => [-1, "ampere"], "deciangstrom" => [-1, "angstrom"], "deciangular_degree" => [-1, "angular_degree"], "deciangular_minute" => [-1, "angular_minute"], "deciangular_second" => [-1, "angular_second"], "deciare" => [-1, "are"], "deciatmosphere" => [-1, "atmosphere"], "decicalorie" => [-1, "calorie"], "decicelsius" => [-1, "celsius"], "decicentigrade" => [-1, "centigrade"], "decicentury" => [-1, "century"], "decichain" => [-1, "chain"], "decicommon_year" => [-1, "common_year"], "decicoulomb" => [-1, "coulomb"], "deciday" => [-1, "day"], "decidegK" => [-1, "degK"], "decideg_K" => [-1, "deg_K"], "decidegree" => [-1, "degree"], "decidegreeK" => [-1, "degreeK"], "decidyne" => [-1, "dyne"], "decierg" => [-1, "erg"], "decifahrenheit" => [-1, "fahrenheit"], "decifarad" => [-1, "farad"], "decifermi" => [-1, "fermi"], "decigal" => [-1, "gal"], "decigauss" => [-1, "gauss"], "decigram" => [-1, "gram"], "decihectare" => [-1, "hectare"], "decihertz" => [-1, "hertz"], "decihour" => [-1, "hour"], "deciinch" => [-1, "inch"], "decijoule" => [-1, "joule"], "decikelvin" => [-1, "kelvin"], "decikilogram" => [-1, "kilogram"], "deciknot" => [-1, "knot"], "decilitre" => [-1, "litre"], "decimeter" => [-1, "meter"], "decimetre" => [-1, "metre"], "decimicron" => [-1, "micron"], "decimile" => [-1, "mile"], "decimillibar" => [-1, "millibar"], "deciminute" => [-1, "minute"], "deciminute_angle" => [-1, "minute_angle"], "decimole" => [-1, "mole"], "decimonth" => [-1, "month"], "decinewton" => [-1, "newton"], "deciounce" => [-1, "ounce"], "deciparsec" => [-1, "parsec"], "decipascal" => [-1, "pascal"], "decipentad" => [-1, "pentad"], "decipoise" => [-1, "poise"], "decipound" => [-1, "pound"], "deciradian" => [-1, "radian"], "decisecond" => [-1, "second"], "decisecond_angle" => [-1, "second_angle"], "decisteradian" => [-1, "steradian"], "decistokes" => [-1, "stokes"], "decitesla" => [-1, "tesla"], "deciton" => [-1, "ton"], "decitonne" => [-1, "tonne"], "decitorr" => [-1, "torr"], "decivolt" => [-1, "volt"], "deciwatt" => [-1, "watt"], "deciweber" => [-1, "weber"], "deciyard" => [-1, "yard"], "deciyd" => [-1, "yd"], "deciyear" => [-1, "year"], "degKs" => [0, "degK"], "degreeKs" => [0, "degreeK"], "degrees" => [0, "degree"], "degs_K" => [0, "deg_K"], "derg" => [-1, "erg"], "dforce" => [-1, "force"], "dg" => [-1, "g"], "dgravity" => [-1, "gravity"], "dh" => [-1, "h"], "dhg" => [-1, "hg"], "dhr" => [-1, "hr"], "din" => [-1, "in"], "dkg" => [-1, "kg"], "dkgf" => [-1, "kgf"], "dkph" => [-1, "kph"], "dlb" => [-1, "lb"], "dlm" => [-1, "lm"], "dlx" => [-1, "lx"], "dly" => [-1, "ly"], "dm" => [-1, "m"], "dmb" => [-1, "mb"], "dmercury" => [-1, "mercury"], "dmgal" => [-1, "mgal"], "dmin" => [-1, "min"], "dmol" => [-1, "mol"], "dmon" => [-1, "mon"], "dmph" => [-1, "mph"], "dohm" => [-1, "ohm"], "doz" => [-1, "oz"], "dpc" => [-1, "pc"], "dpercent" => [-1, "percent"], "dpermil" => [-1, "permil"], "dpsi" => [-1, "psi"], "drad" => [-1, "rad"], "ds" => [-1, "s"], "dsr" => [-1, "sr"], "dt" => [-1, "t"], "dynes" => [0, "dyne"], "dyr" => [-1, "yr"], "ergs" => [0, "erg"], "exaCelsius" => [18, "Celsius"], "exaFahrenheit" => [18, "Fahrenheit"], "exaJulian_year" => [18, "Julian_year"], "exaPascal" => [18, "Pascal"], "exaacre" => [18, "acre"], "exaampere" => [18, "ampere"], "exaangstrom" => [18, "angstrom"], "exaangular_degree" => [18, "angular_degree"], "exaangular_minute" => [18, "angular_minute"], "exaangular_second" => [18, "angular_second"], "exaare" => [18, "are"], "exaatmosphere" => [18, "atmosphere"], "exacalorie" => [18, "calorie"], "exacelsius" => [18, "celsius"], "exacentigrade" => [18, "centigrade"], "exacentury" => [18, "century"], "exachain" => [18, "chain"], "exacommon_year" => [18, "common_year"], "exacoulomb" => [18, "coulomb"], "exaday" => [18, "day"], "exadegK" => [18, "degK"], "exadeg_K" => [18, "deg_K"], "exadegree" => [18, "degree"], "exadegreeK" => [18, "degreeK"], "exadyne" => [18, "dyne"], "exaerg" => [18, "erg"], "exafahrenheit" => [18, "fahrenheit"], "exafarad" => [18, "farad"], "exafermi" => [18, "fermi"], "exagal" => [18, "gal"], "exagauss" => [18, "gauss"], "exagram" => [18, "gram"], "exahectare" => [18, "hectare"], "exahertz" => [18, "hertz"], "exahour" => [18, "hour"], "exainch" => [18, "inch"], "exajoule" => [18, "joule"], "exakelvin" => [18, "kelvin"], "exakilogram" => [18, "kilogram"], "exaknot" => [18, "knot"], "exalitre" => [18, "litre"], "exameter" => [18, "meter"], "exametre" => [18, "metre"], "examicron" => [18, "micron"], "examile" => [18, "mile"], "examillibar" => [18, "millibar"], "examinute" => [18, "minute"], "examinute_angle" => [18, "minute_angle"], "examole" => [18, "mole"], "examonth" => [18, "month"], "exanewton" => [18, "newton"], "exaounce" => [18, "ounce"], "exaparsec" => [18, "parsec"], "exapascal" => [18, "pascal"], "exapentad" => [18, "pentad"], "exapoise" => [18, "poise"], "exapound" => [18, "pound"], "exaradian" => [18, "radian"], "exasecond" => [18, "second"], "exasecond_angle" => [18, "second_angle"], "exasteradian" => [18, "steradian"], "exastokes" => [18, "stokes"], "exatesla" => [18, "tesla"], "exaton" => [18, "ton"], "exatonne" => [18, "tonne"], "exatorr" => [18, "torr"], "exavolt" => [18, "volt"], "exawatt" => [18, "watt"], "exaweber" => [18, "weber"], "exayard" => [18, "yard"], "exayd" => [18, "yd"], "exayear" => [18, "year"], "f%" => [-15, "%"], "fA" => [-15, "A"], "fAu" => [-15, "Au"], "fBq" => [-15, "Bq"], "fC" => [-15, "C"], "fF" => [-15, "F"], "fG" => [-15, "G"], "fGal" => [-15, "Gal"], "fGy" => [-15, "Gy"], "fH" => [-15, "H"], "fHg" => [-15, "Hg"], "fHz" => [-15, "Hz"], "fJ" => [-15, "J"], "fK" => [-15, "K"], "fL" => [-15, "L"], "fN" => [-15, "N"], "fP" => [-15, "P"], "fPa" => [-15, "Pa"], "fS" => [-15, "S"], "fSt" => [-15, "St"], "fSv" => [-15, "Sv"], "fT" => [-15, "T"], "fV" => [-15, "V"], "fW" => [-15, "W"], "fWb" => [-15, "Wb"], "fa" => [-15, "a"], "fac" => [-15, "ac"], "fahrenheits" => [0, "fahrenheit"], "farads" => [0, "farad"], "fatm" => [-15, "atm"], "fbar" => [-15, "bar"], "fcal" => [-15, "cal"], "fconventional_mercury" => [-15, "conventional_mercury"], "fd" => [-15, "d"], "fdegC" => [-15, "degC"], "fdegF" => [-15, "degF"], "fdeg_C" => [-15, "deg_C"], "fdeg_F" => [-15, "deg_F"], "fdegreeC" => [-15, "degreeC"], "fdegreeF" => [-15, "degreeF"], "fdegree_C" => [-15, "degree_C"], "fdegree_E" => [-15, "degree_E"], "fdegree_F" => [-15, "degree_F"], "fdegree_N" => [-15, "degree_N"], "fdegree_R" => [-15, "degree_R"], "fdegree_S" => [-15, "degree_S"], "fdegree_W" => [-15, "degree_W"], "fdegree_c" => [-15, "degree_c"], "fdegree_east" => [-15, "degree_east"], "fdegree_f" => [-15, "degree_f"], "fdegree_north" => [-15, "degree_north"], "fdegree_south" => [-15, "degree_south"], "fdegree_west" => [-15, "degree_west"], "fdegrees_east" => [-15, "degrees_east"], "fdegrees_north" => [-15, "degrees_north"], "fdegrees_south" => [-15, "degrees_south"], "fdegrees_west" => [-15, "degrees_west"], "fdyn" => [-15, "dyn"], "femtoCelsius" => [-15, "Celsius"], "femtoFahrenheit" => [-15, "Fahrenheit"], "femtoJulian_year" => [-15, "Julian_year"], "femtoPascal" => [-15, "Pascal"], "femtoacre" => [-15, "acre"], "femtoampere" => [-15, "ampere"], "femtoangstrom" => [-15, "angstrom"], "femtoangular_degree" => [-15, "angular_degree"], "femtoangular_minute" => [-15, "angular_minute"], "femtoangular_second" => [-15, "angular_second"], "femtoare" => [-15, "are"], "femtoatmosphere" => [-15, "atmosphere"], "femtocalorie" => [-15, "calorie"], "femtocelsius" => [-15, "celsius"], "femtocentigrade" => [-15, "centigrade"], "femtocentury" => [-15, "century"], "femtochain" => [-15, "chain"], "femtocommon_year" => [-15, "common_year"], "femtocoulomb" => [-15, "coulomb"], "femtoday" => [-15, "day"], "femtodegK" => [-15, "degK"], "femtodeg_K" => [-15, "deg_K"], "femtodegree" => [-15, "degree"], "femtodegreeK" => [-15, "degreeK"], "femtodyne" => [-15, "dyne"], "femtoerg" => [-15, "erg"], "femtofahrenheit" => [-15, "fahrenheit"], "femtofarad" => [-15, "farad"], "femtofermi" => [-15, "fermi"], "femtogal" => [-15, "gal"], "femtogauss" => [-15, "gauss"], "femtogram" => [-15, "gram"], "femtohectare" => [-15, "hectare"], "femtohertz" => [-15, "hertz"], "femtohour" => [-15, "hour"], "femtoinch" => [-15, "inch"], "femtojoule" => [-15, "joule"], "femtokelvin" => [-15, "kelvin"], "femtokilogram" => [-15, "kilogram"], "femtoknot" => [-15, "knot"], "femtolitre" => [-15, "litre"], "femtometer" => [-15, "meter"], "femtometre" => [-15, "metre"], "femtomicron" => [-15, "micron"], "femtomile" => [-15, "mile"], "femtomillibar" => [-15, "millibar"], "femtominute" => [-15, "minute"], "femtominute_angle" => [-15, "minute_angle"], "femtomole" => [-15, "mole"], "femtomonth" => [-15, "month"], "femtonewton" => [-15, "newton"], "femtoounce" => [-15, "ounce"], "femtoparsec" => [-15, "parsec"], "femtopascal" => [-15, "pascal"], "femtopentad" => [-15, "pentad"], "femtopoise" => [-15, "poise"], "femtopound" => [-15, "pound"], "femtoradian" => [-15, "radian"], "femtosecond" => [-15, "second"], "femtosecond_angle" => [-15, "second_angle"], "femtosteradian" => [-15, "steradian"], "femtostokes" => [-15, "stokes"], "femtotesla" => [-15, "tesla"], "femtoton" => [-15, "ton"], "femtotonne" => [-15, "tonne"], "femtotorr" => [-15, "torr"], "femtovolt" => [-15, "volt"], "femtowatt" => [-15, "watt"], "femtoweber" => [-15, "weber"], "femtoyard" => [-15, "yard"], "femtoyd" => [-15, "yd"], "femtoyear" => [-15, "year"], "ferg" => [-15, "erg"], "fermis" => [0, "fermi"], "fforce" => [-15, "force"], "fg" => [-15, "g"], "fgravity" => [-15, "gravity"], "fh" => [-15, "h"], "fhg" => [-15, "hg"], "fhr" => [-15, "hr"], "fin" => [-15, "in"], "fkg" => [-15, "kg"], "fkgf" => [-15, "kgf"], "fkph" => [-15, "kph"], "flb" => [-15, "lb"], "flm" => [-15, "lm"], "flx" => [-15, "lx"], "fly" => [-15, "ly"], "fm" => [-15, "m"], "fmb" => [-15, "mb"], "fmercury" => [-15, "mercury"], "fmgal" => [-15, "mgal"], "fmin" => [-15, "min"], "fmol" => [-15, "mol"], "fmon" => [-15, "mon"], "fmph" => [-15, "mph"], "fohm" => [-15, "ohm"], "foz" => [-15, "oz"], "fpc" => [-15, "pc"], "fpercent" => [-15, "percent"], "fpermil" => [-15, "permil"], "fpsi" => [-15, "psi"], "frad" => [-15, "rad"], "fs" => [-15, "s"], "fsr" => [-15, "sr"], "ft" => [-15, "t"], "fyr" => [-15, "yr"], "gals" => [0, "gal"], "gausses" => [0, "gauss"], "gigaCelsius" => [9, "Celsius"], "gigaFahrenheit" => [9, "Fahrenheit"], "gigaJulian_year" => [9, "Julian_year"], "gigaPascal" => [9, "Pascal"], "gigaacre" => [9, "acre"], "gigaampere" => [9, "ampere"], "gigaangstrom" => [9, "angstrom"], "gigaangular_degree" => [9, "angular_degree"], "gigaangular_minute" => [9, "angular_minute"], "gigaangular_second" => [9, "angular_second"], "gigaare" => [9, "are"], "gigaatmosphere" => [9, "atmosphere"], "gigacalorie" => [9, "calorie"], "gigacelsius" => [9, "celsius"], "gigacentigrade" => [9, "centigrade"], "gigacentury" => [9, "century"], "gigachain" => [9, "chain"], "gigacommon_year" => [9, "common_year"], "gigacoulomb" => [9, "coulomb"], "gigaday" => [9, "day"], "gigadegK" => [9, "degK"], "gigadeg_K" => [9, "deg_K"], "gigadegree" => [9, "degree"], "gigadegreeK" => [9, "degreeK"], "gigadyne" => [9, "dyne"], "gigaerg" => [9, "erg"], "gigafahrenheit" => [9, "fahrenheit"], "gigafarad" => [9, "farad"], "gigafermi" => [9, "fermi"], "gigagal" => [9, "gal"], "gigagauss" => [9, "gauss"], "gigagram" => [9, "gram"], "gigahectare" => [9, "hectare"], "gigahertz" => [9, "hertz"], "gigahour" => [9, "hour"], "gigainch" => [9, "inch"], "gigajoule" => [9, "joule"], "gigakelvin" => [9, "kelvin"], "gigakilogram" => [9, "kilogram"], "gigaknot" => [9, "knot"], "gigalitre" => [9, "litre"], "gigameter" => [9, "meter"], "gigametre" => [9, "metre"], "gigamicron" => [9, "micron"], "gigamile" => [9, "mile"], "gigamillibar" => [9, "millibar"], "gigaminute" => [9, "minute"], "gigaminute_angle" => [9, "minute_angle"], "gigamole" => [9, "mole"], "gigamonth" => [9, "month"], "giganewton" => [9, "newton"], "gigaounce" => [9, "ounce"], "gigaparsec" => [9, "parsec"], "gigapascal" => [9, "pascal"], "gigapentad" => [9, "pentad"], "gigapoise" => [9, "poise"], "gigapound" => [9, "pound"], "gigaradian" => [9, "radian"], "gigasecond" => [9, "second"], "gigasecond_angle" => [9, "second_angle"], "gigasteradian" => [9, "steradian"], "gigastokes" => [9, "stokes"], "gigatesla" => [9, "tesla"], "gigaton" => [9, "ton"], "gigatonne" => [9, "tonne"], "gigatorr" => [9, "torr"], "gigavolt" => [9, "volt"], "gigawatt" => [9, "watt"], "gigaweber" => [9, "weber"], "gigayard" => [9, "yard"], "gigayd" => [9, "yd"], "gigayear" => [9, "year"], "grams" => [0, "gram"], "h%" => [2, "%"], "hA" => [2, "A"], "hAu" => [2, "Au"], "hBq" => [2, "Bq"], "hC" => [2, "C"], "hF" => [2, "F"], "hG" => [2, "G"], "hGal" => [2, "Gal"], "hGy" => [2, "Gy"], "hH" => [2, "H"], "hHg" => [2, "Hg"], "hHz" => [2, "Hz"], "hJ" => [2, "J"], "hK" => [2, "K"], "hL" => [2, "L"], "hN" => [2, "N"], "hP" => [2, "P"], "hPa" => [2, "Pa"], "hS" => [2, "S"], "hSt" => [2, "St"], "hSv" => [2, "Sv"], "hT" => [2, "T"], "hV" => [2, "V"], "hW" => [2, "W"], "hWb" => [2, "Wb"], "ha" => [2, "a"], "hac" => [2, "ac"], "hatm" => [2, "atm"], "hbar" => [2, "bar"], "hcal" => [2, "cal"], "hconventional_mercury" => [2, "conventional_mercury"], "hd" => [2, "d"], "hdegC" => [2, "degC"], "hdegF" => [2, "degF"], "hdeg_C" => [2, "deg_C"], "hdeg_F" => [2, "deg_F"], "hdegreeC" => [2, "degreeC"], "hdegreeF" => [2, "degreeF"], "hdegree_C" => [2, "degree_C"], "hdegree_E" => [2, "degree_E"], "hdegree_F" => [2, "degree_F"], "hdegree_N" => [2, "degree_N"], "hdegree_R" => [2, "degree_R"], "hdegree_S" => [2, "degree_S"], "hdegree_W" => [2, "degree_W"], "hdegree_c" => [2, "degree_c"], "hdegree_east" => [2, "degree_east"], "hdegree_f" => [2, "degree_f"], "hdegree_north" => [2, "degree_north"], "hdegree_south" => [2, "degree_south"], "hdegree_west" => [2, "degree_west"], "hdegrees_east" => [2, "degrees_east"], "hdegrees_north" => [2, "degrees_north"], "hdegrees_south" => [2, "degrees_south"], "hdegrees_west" => [2, "degrees_west"], "hdyn" => [2, "dyn"], "hectares" => [0, "hectare"], "hectoCelsius" => [2, "Celsius"], "hectoFahrenheit" => [2, "Fahrenheit"], "hectoJulian_year" => [2, "Julian_year"], "hectoPascal" => [2, "Pascal"], "hectoacre" => [2, "acre"], "hectoampere" => [2, "ampere"], "hectoangstrom" => [2, "angstrom"], "hectoangular_degree" => [2, "angular_degree"], "hectoangular_minute" => [2, "angular_minute"], "hectoangular_second" => [2, "angular_second"], "hectoare" => [2, "are"], "hectoatmosphere" => [2, "atmosphere"], "hectocalorie" => [2, "calorie"], "hectocelsius" => [2, "celsius"], "hectocentigrade" => [2, "centigrade"], "hectocentury" => [2, "century"], "hectochain" => [2, "chain"], "hectocommon_year" => [2, "common_year"], "hectocoulomb" => [2, "coulomb"], "hectoday" => [2, "day"], "hectodegK" => [2, "degK"], "hectodeg_K" => [2, "deg_K"], "hectodegree" => [2, "degree"], "hectodegreeK" => [2, "degreeK"], "hectodyne" => [2, "dyne"], "hectoerg" => [2, "erg"], "hectofahrenheit" => [2, "fahrenheit"], "hectofarad" => [2, "farad"], "hectofermi" => [2, "fermi"], "hectogal" => [2, "gal"], "hectogauss" => [2, "gauss"], "hectogram" => [2, "gram"], "hectohectare" => [2, "hectare"], "hectohertz" => [2, "hertz"], "hectohour" => [2, "hour"], "hectoinch" => [2, "inch"], "hectojoule" => [2, "joule"], "hectokelvin" => [2, "kelvin"], "hectokilogram" => [2, "kilogram"], "hectoknot" => [2, "knot"], "hectolitre" => [2, "litre"], "hectometer" => [2, "meter"], "hectometre" => [2, "metre"], "hectomicron" => [2, "micron"], "hectomile" => [2, "mile"], "hectomillibar" => [2, "millibar"], "hectominute" => [2, "minute"], "hectominute_angle" => [2, "minute_angle"], "hectomole" => [2, "mole"], "hectomonth" => [2, "month"], "hectonewton" => [2, "newton"], "hectoounce" => [2, "ounce"], "hectoparsec" => [2, "parsec"], "hectopascal" => [2, "pascal"], "hectopentad" => [2, "pentad"], "hectopoise" => [2, "poise"], "hectopound" => [2, "pound"], "hectoradian" => [2, "radian"], "hectosecond" => [2, "second"], "hectosecond_angle" => [2, "second_angle"], "hectosteradian" => [2, "steradian"], "hectostokes" => [2, "stokes"], "hectotesla" => [2, "tesla"], "hectoton" => [2, "ton"], "hectotonne" => [2, "tonne"], "hectotorr" => [2, "torr"], "hectovolt" => [2, "volt"], "hectowatt" => [2, "watt"], "hectoweber" => [2, "weber"], "hectoyard" => [2, "yard"], "hectoyd" => [2, "yd"], "hectoyear" => [2, "year"], "herg" => [2, "erg"], "hertzes" => [0, "hertz"], "hforce" => [2, "force"], "hg" => [2, "g"], "hgravity" => [2, "gravity"], "hh" => [2, "h"], "hhg" => [2, "hg"], "hhr" => [2, "hr"], "hin" => [2, "in"], "hkg" => [2, "kg"], "hkgf" => [2, "kgf"], "hkph" => [2, "kph"], "hlb" => [2, "lb"], "hlm" => [2, "lm"], "hlx" => [2, "lx"], "hly" => [2, "ly"], "hm" => [2, "m"], "hmb" => [2, "mb"], "hmercury" => [2, "mercury"], "hmgal" => [2, "mgal"], "hmin" => [2, "min"], "hmol" => [2, "mol"], "hmon" => [2, "mon"], "hmph" => [2, "mph"], "hohm" => [2, "ohm"], "hours" => [0, "hour"], "hoz" => [2, "oz"], "hpc" => [2, "pc"], "hpercent" => [2, "percent"], "hpermil" => [2, "permil"], "hpsi" => [2, "psi"], "hrad" => [2, "rad"], "hs" => [2, "s"], "hsr" => [2, "sr"], "ht" => [2, "t"], "hyr" => [2, "yr"], "inchs" => [0, "inch"], "joules" => [0, "joule"], "k%" => [3, "%"], "kA" => [3, "A"], "kAu" => [3, "Au"], "kBq" => [3, "Bq"], "kC" => [3, "C"], "kF" => [3, "F"], "kG" => [3, "G"], "kGal" => [3, "Gal"], "kGy" => [3, "Gy"], "kH" => [3, "H"], "kHg" => [3, "Hg"], "kHz" => [3, "Hz"], "kJ" => [3, "J"], "kK" => [3, "K"], "kL" => [3, "L"], "kN" => [3, "N"], "kP" => [3, "P"], "kPa" => [3, "Pa"], "kS" => [3, "S"], "kSt" => [3, "St"], "kSv" => [3, "Sv"], "kT" => [3, "T"], "kV" => [3, "V"], "kW" => [3, "W"], "kWb" => [3, "Wb"], "ka" => [3, "a"], "kac" => [3, "ac"], "katm" => [3, "atm"], "kbar" => [3, "bar"], "kcal" => [3, "cal"], "kconventional_mercury" => [3, "conventional_mercury"], "kd" => [3, "d"], "kdegC" => [3, "degC"], "kdegF" => [3, "degF"], "kdeg_C" => [3, "deg_C"], "kdeg_F" => [3, "deg_F"], "kdegreeC" => [3, "degreeC"], "kdegreeF" => [3, "degreeF"], "kdegree_C" => [3, "degree_C"], "kdegree_E" => [3, "degree_E"], "kdegree_F" => [3, "degree_F"], "kdegree_N" => [3, "degree_N"], "kdegree_R" => [3, "degree_R"], "kdegree_S" => [3, "degree_S"], "kdegree_W" => [3, "degree_W"], "kdegree_c" => [3, "degree_c"], "kdegree_east" => [3, "degree_east"], "kdegree_f" => [3, "degree_f"], "kdegree_north" => [3, "degree_north"], "kdegree_south" => [3, "degree_south"], "kdegree_west" => [3, "degree_west"], "kdegrees_east" => [3, "degrees_east"], "kdegrees_north" => [3, "degrees_north"], "kdegrees_south" => [3, "degrees_south"], "kdegrees_west" => [3, "degrees_west"], "kdyn" => [3, "dyn"], "kelvins" => [0, "kelvin"], "kerg" => [3, "erg"], "kforce" => [3, "force"], "kgravity" => [3, "gravity"], "kh" => [3, "h"], "khg" => [3, "hg"], "khr" => [3, "hr"], "kiloCelsius" => [3, "Celsius"], "kiloFahrenheit" => [3, "Fahrenheit"], "kiloJulian_year" => [3, "Julian_year"], "kiloPascal" => [3, "Pascal"], "kiloacre" => [3, "acre"], "kiloampere" => [3, "ampere"], "kiloangstrom" => [3, "angstrom"], "kiloangular_degree" => [3, "angular_degree"], "kiloangular_minute" => [3, "angular_minute"], "kiloangular_second" => [3, "angular_second"], "kiloare" => [3, "are"], "kiloatmosphere" => [3, "atmosphere"], "kilocalorie" => [3, "calorie"], "kilocelsius" => [3, "celsius"], "kilocentigrade" => [3, "centigrade"], "kilocentury" => [3, "century"], "kilochain" => [3, "chain"], "kilocommon_year" => [3, "common_year"], "kilocoulomb" => [3, "coulomb"], "kiloday" => [3, "day"], "kilodegK" => [3, "degK"], "kilodeg_K" => [3, "deg_K"], "kilodegree" => [3, "degree"], "kilodegreeK" => [3, "degreeK"], "kilodyne" => [3, "dyne"], "kiloerg" => [3, "erg"], "kilofahrenheit" => [3, "fahrenheit"], "kilofarad" => [3, "farad"], "kilofermi" => [3, "fermi"], "kilogal" => [3, "gal"], "kilogauss" => [3, "gauss"], "kilogram" => [3, "gram"], "kilograms" => [0, "kilogram"], "kilohectare" => [3, "hectare"], "kilohertz" => [3, "hertz"], "kilohour" => [3, "hour"], "kiloinch" => [3, "inch"], "kilojoule" => [3, "joule"], "kilokelvin" => [3, "kelvin"], "kilokilogram" => [3, "kilogram"], "kiloknot" => [3, "knot"], "kilolitre" => [3, "litre"], "kilometer" => [3, "meter"], "kilometre" => [3, "metre"], "kilomicron" => [3, "micron"], "kilomile" => [3, "mile"], "kilomillibar" => [3, "millibar"], "kilominute" => [3, "minute"], "kilominute_angle" => [3, "minute_angle"], "kilomole" => [3, "mole"], "kilomonth" => [3, "month"], "kilonewton" => [3, "newton"], "kiloounce" => [3, "ounce"], "kiloparsec" => [3, "parsec"], "kilopascal" => [3, "pascal"], "kilopentad" => [3, "pentad"], "kilopoise" => [3, "poise"], "kilopound" => [3, "pound"], "kiloradian" => [3, "radian"], "kilosecond" => [3, "second"], "kilosecond_angle" => [3, "second_angle"], "kilosteradian" => [3, "steradian"], "kilostokes" => [3, "stokes"], "kilotesla" => [3, "tesla"], "kiloton" => [3, "ton"], "kilotonne" => [3, "tonne"], "kilotorr" => [3, "torr"], "kilovolt" => [3, "volt"], "kilowatt" => [3, "watt"], "kiloweber" => [3, "weber"], "kiloyard" => [3, "yard"], "kiloyd" => [3, "yd"], "kiloyear" => [3, "year"], "kin" => [3, "in"], "kkg" => [3, "kg"], "kkgf" => [3, "kgf"], "kkph" => [3, "kph"], "klb" => [3, "lb"], "klm" => [3, "lm"], "klx" => [3, "lx"], "kly" => [3, "ly"], "km" => [3, "m"], "kmb" => [3, "mb"], "kmercury" => [3, "mercury"], "kmgal" => [3, "mgal"], "kmin" => [3, "min"], "kmol" => [3, "mol"], "kmon" => [3, "mon"], "kmph" => [3, "mph"], "knots" => [0, "knot"], "kohm" => [3, "ohm"], "koz" => [3, "oz"], "kpc" => [3, "pc"], "kpercent" => [3, "percent"], "kpermil" => [3, "permil"], "kpsi" => [3, "psi"], "krad" => [3, "rad"], "ks" => [3, "s"], "ksr" => [3, "sr"], "kt" => [3, "t"], "kyr" => [3, "yr"], "litres" => [0, "litre"], "m%" => [-3, "%"], "mA" => [-3, "A"], "mAu" => [-3, "Au"], "mBq" => [-3, "Bq"], "mC" => [-3, "C"], "mF" => [-3, "F"], "mG" => [-3, "G"], "mGal" => [-3, "Gal"], "mGy" => [-3, "Gy"], "mH" => [-3, "H"], "mHg" => [-3, "Hg"], "mHz" => [-3, "Hz"], "mJ" => [-3, "J"], "mK" => [-3, "K"], "mL" => [-3, "L"], "mN" => [-3, "N"], "mP" => [-3, "P"], "mPa" => [-3, "Pa"], "mS" => [-3, "S"], "mSt" => [-3, "St"], "mSv" => [-3, "Sv"], "mT" => [-3, "T"], "mV" => [-3, "V"], "mW" => [-3, "W"], "mWb" => [-3, "Wb"], "ma" => [-3, "a"], "mac" => [-3, "ac"], "matm" => [-3, "atm"], "mbar" => [-3, "bar"], "mcal" => [-3, "cal"], "mconventional_mercury" => [-3, "conventional_mercury"], "md" => [-3, "d"], "mdegC" => [-3, "degC"], "mdegF" => [-3, "degF"], "mdeg_C" => [-3, "deg_C"], "mdeg_F" => [-3, "deg_F"], "mdegreeC" => [-3, "degreeC"], "mdegreeF" => [-3, "degreeF"], "mdegree_C" => [-3, "degree_C"], "mdegree_E" => [-3, "degree_E"], "mdegree_F" => [-3, "degree_F"], "mdegree_N" => [-3, "degree_N"], "mdegree_R" => [-3, "degree_R"], "mdegree_S" => [-3, "degree_S"], "mdegree_W" => [-3, "degree_W"], "mdegree_c" => [-3, "degree_c"], "mdegree_east" => [-3, "degree_east"], "mdegree_f" => [-3, "degree_f"], "mdegree_north" => [-3, "degree_north"], "mdegree_south" => [-3, "degree_south"], "mdegree_west" => [-3, "degree_west"], "mdegrees_east" => [-3, "degrees_east"], "mdegrees_north" => [-3, "degrees_north"], "mdegrees_south" => [-3, "degrees_south"], "mdegrees_west" => [-3, "degrees_west"], "mdyn" => [-3, "dyn"], "megaCelsius" => [6, "Celsius"], "megaFahrenheit" => [6, "Fahrenheit"], "megaJulian_year" => [6, "Julian_year"], "megaPascal" => [6, "Pascal"], "megaacre" => [6, "acre"], "megaampere" => [6, "ampere"], "megaangstrom" => [6, "angstrom"], "megaangular_degree" => [6, "angular_degree"], "megaangular_minute" => [6, "angular_minute"], "megaangular_second" => [6, "angular_second"], "megaare" => [6, "are"], "megaatmosphere" => [6, "atmosphere"], "megacalorie" => [6, "calorie"], "megacelsius" => [6, "celsius"], "megacentigrade" => [6, "centigrade"], "megacentury" => [6, "century"], "megachain" => [6, "chain"], "megacommon_year" => [6, "common_year"], "megacoulomb" => [6, "coulomb"], "megaday" => [6, "day"], "megadegK" => [6, "degK"], "megadeg_K" => [6, "deg_K"], "megadegree" => [6, "degree"], "megadegreeK" => [6, "degreeK"], "megadyne" => [6, "dyne"], "megaerg" => [6, "erg"], "megafahrenheit" => [6, "fahrenheit"], "megafarad" => [6, "farad"], "megafermi" => [6, "fermi"], "megagal" => [6, "gal"], "megagauss" => [6, "gauss"], "megagram" => [6, "gram"], "megahectare" => [6, "hectare"], "megahertz" => [6, "hertz"], "megahour" => [6, "hour"], "megainch" => [6, "inch"], "megajoule" => [6, "joule"], "megakelvin" => [6, "kelvin"], "megakilogram" => [6, "kilogram"], "megaknot" => [6, "knot"], "megalitre" => [6, "litre"], "megameter" => [6, "meter"], "megametre" => [6, "metre"], "megamicron" => [6, "micron"], "megamile" => [6, "mile"], "megamillibar" => [6, "millibar"], "megaminute" => [6, "minute"], "megaminute_angle" => [6, "minute_angle"], "megamole" => [6, "mole"], "megamonth" => [6, "month"], "meganewton" => [6, "newton"], "megaounce" => [6, "ounce"], "megaparsec" => [6, "parsec"], "megapascal" => [6, "pascal"], "megapentad" => [6, "pentad"], "megapoise" => [6, "poise"], "megapound" => [6, "pound"], "megaradian" => [6, "radian"], "megasecond" => [6, "second"], "megasecond_angle" => [6, "second_angle"], "megasteradian" => [6, "steradian"], "megastokes" => [6, "stokes"], "megatesla" => [6, "tesla"], "megaton" => [6, "ton"], "megatonne" => [6, "tonne"], "megatorr" => [6, "torr"], "megavolt" => [6, "volt"], "megawatt" => [6, "watt"], "megaweber" => [6, "weber"], "megayard" => [6, "yard"], "megayd" => [6, "yd"], "megayear" => [6, "year"], "merg" => [-3, "erg"], "meters" => [0, "meter"], "metres" => [0, "metre"], "mforce" => [-3, "force"], "mg" => [-3, "g"], "mgravity" => [-3, "gravity"], "mh" => [-3, "h"], "mhg" => [-3, "hg"], "mhr" => [-3, "hr"], "microCelsius" => [-6, "Celsius"], "microFahrenheit" => [-6, "Fahrenheit"], "microJulian_year" => [-6, "Julian_year"], "microPascal" => [-6, "Pascal"], "microacre" => [-6, "acre"], "microampere" => [-6, "ampere"], "microangstrom" => [-6, "angstrom"], "microangular_degree" => [-6, "angular_degree"], "microangular_minute" => [-6, "angular_minute"], "microangular_second" => [-6, "angular_second"], "microare" => [-6, "are"], "microatmosphere" => [-6, "atmosphere"], "microcalorie" => [-6, "calorie"], "microcelsius" => [-6, "celsius"], "microcentigrade" => [-6, "centigrade"], "microcentury" => [-6, "century"], "microchain" => [-6, "chain"], "microcommon_year" => [-6, "common_year"], "microcoulomb" => [-6, "coulomb"], "microday" => [-6, "day"], "microdegK" => [-6, "degK"], "microdeg_K" => [-6, "deg_K"], "microdegree" => [-6, "degree"], "microdegreeK" => [-6, "degreeK"], "microdyne" => [-6, "dyne"], "microerg" => [-6, "erg"], "microfahrenheit" => [-6, "fahrenheit"], "microfarad" => [-6, "farad"], "microfermi" => [-6, "fermi"], "microgal" => [-6, "gal"], "microgauss" => [-6, "gauss"], "microgram" => [-6, "gram"], "microhectare" => [-6, "hectare"], "microhertz" => [-6, "hertz"], "microhour" => [-6, "hour"], "microinch" => [-6, "inch"], "microjoule" => [-6, "joule"], "microkelvin" => [-6, "kelvin"], "microkilogram" => [-6, "kilogram"], "microknot" => [-6, "knot"], "microlitre" => [-6, "litre"], "micrometer" => [-6, "meter"], "micrometre" => [-6, "metre"], "micromicron" => [-6, "micron"], "micromile" => [-6, "mile"], "micromillibar" => [-6, "millibar"], "microminute" => [-6, "minute"], "microminute_angle" => [-6, "minute_angle"], "micromole" => [-6, "mole"], "micromonth" => [-6, "month"], "micronewton" => [-6, "newton"], "microns" => [0, "micron"], "microounce" => [-6, "ounce"], "microparsec" => [-6, "parsec"], "micropascal" => [-6, "pascal"], "micropentad" => [-6, "pentad"], "micropoise" => [-6, "poise"], "micropound" => [-6, "pound"], "microradian" => [-6, "radian"], "microsecond" => [-6, "second"], "microsecond_angle" => [-6, "second_angle"], "microsteradian" => [-6, "steradian"], "microstokes" => [-6, "stokes"], "microtesla" => [-6, "tesla"], "microton" => [-6, "ton"], "microtonne" => [-6, "tonne"], "microtorr" => [-6, "torr"], "microvolt" => [-6, "volt"], "microwatt" => [-6, "watt"], "microweber" => [-6, "weber"], "microyard" => [-6, "yard"], "microyd" => [-6, "yd"], "microyear" => [-6, "year"], "miles" => [0, "mile"], "milliCelsius" => [-3, "Celsius"], "milliFahrenheit" => [-3, "Fahrenheit"], "milliJulian_year" => [-3, "Julian_year"], "milliPascal" => [-3, "Pascal"], "milliacre" => [-3, "acre"], "milliampere" => [-3, "ampere"], "milliangstrom" => [-3, "angstrom"], "milliangular_degree" => [-3, "angular_degree"], "milliangular_minute" => [-3, "angular_minute"], "milliangular_second" => [-3, "angular_second"], "milliare" => [-3, "are"], "milliatmosphere" => [-3, "atmosphere"], "millibars" => [0, "millibar"], "millicalorie" => [-3, "calorie"], "millicelsius" => [-3, "celsius"], "millicentigrade" => [-3, "centigrade"], "millicentury" => [-3, "century"], "millichain" => [-3, "chain"], "millicommon_year" => [-3, "common_year"], "millicoulomb" => [-3, "coulomb"], "milliday" => [-3, "day"], "millidegK" => [-3, "degK"], "millideg_K" => [-3, "deg_K"], "millidegree" => [-3, "degree"], "millidegreeK" => [-3, "degreeK"], "millidyne" => [-3, "dyne"], "millierg" => [-3, "erg"], "millifahrenheit" => [-3, "fahrenheit"], "millifarad" => [-3, "farad"], "millifermi" => [-3, "fermi"], "milligal" => [-3, "gal"], "milligauss" => [-3, "gauss"], "milligram" => [-3, "gram"], "millihectare" => [-3, "hectare"], "millihertz" => [-3, "hertz"], "millihour" => [-3, "hour"], "milliinch" => [-3, "inch"], "millijoule" => [-3, "joule"], "millikelvin" => [-3, "kelvin"], "millikilogram" => [-3, "kilogram"], "milliknot" => [-3, "knot"], "millilitre" => [-3, "litre"], "millimeter" => [-3, "meter"], "millimetre" => [-3, "metre"], "millimicron" => [-3, "micron"], "millimile" => [-3, "mile"], "millimillibar" => [-3, "millibar"], "milliminute" => [-3, "minute"], "milliminute_angle" => [-3, "minute_angle"], "millimole" => [-3, "mole"], "millimonth" => [-3, "month"], "millinewton" => [-3, "newton"], "milliounce" => [-3, "ounce"], "milliparsec" => [-3, "parsec"], "millipascal" => [-3, "pascal"], "millipentad" => [-3, "pentad"], "millipoise" => [-3, "poise"], "millipound" => [-3, "pound"], "milliradian" => [-3, "radian"], "millisecond" => [-3, "second"], "millisecond_angle" => [-3, "second_angle"], "millisteradian" => [-3, "steradian"], "millistokes" => [-3, "stokes"], "millitesla" => [-3, "tesla"], "milliton" => [-3, "ton"], "millitonne" => [-3, "tonne"], "millitorr" => [-3, "torr"], "millivolt" => [-3, "volt"], "milliwatt" => [-3, "watt"], "milliweber" => [-3, "weber"], "milliyard" => [-3, "yard"], "milliyd" => [-3, "yd"], "milliyear" => [-3, "year"], "min" => [-3, "in"], "minutes" => [0, "minute"], "minutes_angle" => [0, "minute_angle"], "mkg" => [-3, "kg"], "mkgf" => [-3, "kgf"], "mkph" => [-3, "kph"], "mlb" => [-3, "lb"], "mlm" => [-3, "lm"], "mlx" => [-3, "lx"], "mly" => [-3, "ly"], "mm" => [-3, "m"], "mmb" => [-3, "mb"], "mmercury" => [-3, "mercury"], "mmgal" => [-3, "mgal"], "mmin" => [-3, "min"], "mmol" => [-3, "mol"], "mmon" => [-3, "mon"], "mmph" => [-3, "mph"], "mohm" => [-3, "ohm"], "moles" => [0, "mole"], "months" => [0, "month"], "moz" => [-3, "oz"], "mpc" => [-3, "pc"], "mpercent" => [-3, "percent"], "mpermil" => [-3, "permil"], "mpsi" => [-3, "psi"], "mrad" => [-3, "rad"], "ms" => [-3, "s"], "msr" => [-3, "sr"], "mt" => [-3, "t"], "myr" => [-3, "yr"], "n%" => [-9, "%"], "nA" => [-9, "A"], "nAu" => [-9, "Au"], "nBq" => [-9, "Bq"], "nC" => [-9, "C"], "nF" => [-9, "F"], "nG" => [-9, "G"], "nGal" => [-9, "Gal"], "nGy" => [-9, "Gy"], "nH" => [-9, "H"], "nHg" => [-9, "Hg"], "nHz" => [-9, "Hz"], "nJ" => [-9, "J"], "nK" => [-9, "K"], "nL" => [-9, "L"], "nN" => [-9, "N"], "nP" => [-9, "P"], "nPa" => [-9, "Pa"], "nS" => [-9, "S"], "nSt" => [-9, "St"], "nSv" => [-9, "Sv"], "nT" => [-9, "T"], "nV" => [-9, "V"], "nW" => [-9, "W"], "nWb" => [-9, "Wb"], "na" => [-9, "a"], "nac" => [-9, "ac"], "nanoCelsius" => [-9, "Celsius"], "nanoFahrenheit" => [-9, "Fahrenheit"], "nanoJulian_year" => [-9, "Julian_year"], "nanoPascal" => [-9, "Pascal"], "nanoacre" => [-9, "acre"], "nanoampere" => [-9, "ampere"], "nanoangstrom" => [-9, "angstrom"], "nanoangular_degree" => [-9, "angular_degree"], "nanoangular_minute" => [-9, "angular_minute"], "nanoangular_second" => [-9, "angular_second"], "nanoare" => [-9, "are"], "nanoatmosphere" => [-9, "atmosphere"], "nanocalorie" => [-9, "calorie"], "nanocelsius" => [-9, "celsius"], "nanocentigrade" => [-9, "centigrade"], "nanocentury" => [-9, "century"], "nanochain" => [-9, "chain"], "nanocommon_year" => [-9, "common_year"], "nanocoulomb" => [-9, "coulomb"], "nanoday" => [-9, "day"], "nanodegK" => [-9, "degK"], "nanodeg_K" => [-9, "deg_K"], "nanodegree" => [-9, "degree"], "nanodegreeK" => [-9, "degreeK"], "nanodyne" => [-9, "dyne"], "nanoerg" => [-9, "erg"], "nanofahrenheit" => [-9, "fahrenheit"], "nanofarad" => [-9, "farad"], "nanofermi" => [-9, "fermi"], "nanogal" => [-9, "gal"], "nanogauss" => [-9, "gauss"], "nanogram" => [-9, "gram"], "nanohectare" => [-9, "hectare"], "nanohertz" => [-9, "hertz"], "nanohour" => [-9, "hour"], "nanoinch" => [-9, "inch"], "nanojoule" => [-9, "joule"], "nanokelvin" => [-9, "kelvin"], "nanokilogram" => [-9, "kilogram"], "nanoknot" => [-9, "knot"], "nanolitre" => [-9, "litre"], "nanometer" => [-9, "meter"], "nanometre" => [-9, "metre"], "nanomicron" => [-9, "micron"], "nanomile" => [-9, "mile"], "nanomillibar" => [-9, "millibar"], "nanominute" => [-9, "minute"], "nanominute_angle" => [-9, "minute_angle"], "nanomole" => [-9, "mole"], "nanomonth" => [-9, "month"], "nanonewton" => [-9, "newton"], "nanoounce" => [-9, "ounce"], "nanoparsec" => [-9, "parsec"], "nanopascal" => [-9, "pascal"], "nanopentad" => [-9, "pentad"], "nanopoise" => [-9, "poise"], "nanopound" => [-9, "pound"], "nanoradian" => [-9, "radian"], "nanosecond" => [-9, "second"], "nanosecond_angle" => [-9, "second_angle"], "nanosteradian" => [-9, "steradian"], "nanostokes" => [-9, "stokes"], "nanotesla" => [-9, "tesla"], "nanoton" => [-9, "ton"], "nanotonne" => [-9, "tonne"], "nanotorr" => [-9, "torr"], "nanovolt" => [-9, "volt"], "nanowatt" => [-9, "watt"], "nanoweber" => [-9, "weber"], "nanoyard" => [-9, "yard"], "nanoyd" => [-9, "yd"], "nanoyear" => [-9, "year"], "natm" => [-9, "atm"], "nbar" => [-9, "bar"], "ncal" => [-9, "cal"], "nconventional_mercury" => [-9, "conventional_mercury"], "nd" => [-9, "d"], "ndegC" => [-9, "degC"], "ndegF" => [-9, "degF"], "ndeg_C" => [-9, "deg_C"], "ndeg_F" => [-9, "deg_F"], "ndegreeC" => [-9, "degreeC"], "ndegreeF" => [-9, "degreeF"], "ndegree_C" => [-9, "degree_C"], "ndegree_E" => [-9, "degree_E"], "ndegree_F" => [-9, "degree_F"], "ndegree_N" => [-9, "degree_N"], "ndegree_R" => [-9, "degree_R"], "ndegree_S" => [-9, "degree_S"], "ndegree_W" => [-9, "degree_W"], "ndegree_c" => [-9, "degree_c"], "ndegree_east" => [-9, "degree_east"], "ndegree_f" => [-9, "degree_f"], "ndegree_north" => [-9, "degree_north"], "ndegree_south" => [-9, "degree_south"], "ndegree_west" => [-9, "degree_west"], "ndegrees_east" => [-9, "degrees_east"], "ndegrees_north" => [-9, "degrees_north"], "ndegrees_south" => [-9, "degrees_south"], "ndegrees_west" => [-9, "degrees_west"], "ndyn" => [-9, "dyn"], "nerg" => [-9, "erg"], "newtons" => [0, "newton"], "nforce" => [-9, "force"], "ng" => [-9, "g"], "ngravity" => [-9, "gravity"], "nh" => [-9, "h"], "nhg" => [-9, "hg"], "nhr" => [-9, "hr"], "nin" => [-9, "in"], "nkg" => [-9, "kg"], "nkgf" => [-9, "kgf"], "nkph" => [-9, "kph"], "nlb" => [-9, "lb"], "nlm" => [-9, "lm"], "nlx" => [-9, "lx"], "nly" => [-9, "ly"], "nm" => [-9, "m"], "nmb" => [-9, "mb"], "nmercury" => [-9, "mercury"], "nmgal" => [-9, "mgal"], "nmin" => [-9, "min"], "nmol" => [-9, "mol"], "nmon" => [-9, "mon"], "nmph" => [-9, "mph"], "nohm" => [-9, "ohm"], "noz" => [-9, "oz"], "npc" => [-9, "pc"], "npercent" => [-9, "percent"], "npermil" => [-9, "permil"], "npsi" => [-9, "psi"], "nrad" => [-9, "rad"], "ns" => [-9, "s"], "nsr" => [-9, "sr"], "nt" => [-9, "t"], "nyr" => [-9, "yr"], "ounces" => [0, "ounce"], "p%" => [-12, "%"], "pA" => [-12, "A"], "pAu" => [-12, "Au"], "pBq" => [-12, "Bq"], "pC" => [-12, "C"], "pF" => [-12, "F"], "pG" => [-12, "G"], "pGal" => [-12, "Gal"], "pGy" => [-12, "Gy"], "pH" => [-12, "H"], "pHg" => [-12, "Hg"], "pHz" => [-12, "Hz"], "pJ" => [-12, "J"], "pK" => [-12, "K"], "pL" => [-12, "L"], "pN" => [-12, "N"], "pP" => [-12, "P"], "pPa" => [-12, "Pa"], "pS" => [-12, "S"], "pSt" => [-12, "St"], "pSv" => [-12, "Sv"], "pT" => [-12, "T"], "pV" => [-12, "V"], "pW" => [-12, "W"], "pWb" => [-12, "Wb"], "pa" => [-12, "a"], "pac" => [-12, "ac"], "parsecs" => [0, "parsec"], "pascals" => [0, "pascal"], "patm" => [-12, "atm"], "pbar" => [-12, "bar"], "pcal" => [-12, "cal"], "pconventional_mercury" => [-12, "conventional_mercury"], "pd" => [-12, "d"], "pdegC" => [-12, "degC"], "pdegF" => [-12, "degF"], "pdeg_C" => [-12, "deg_C"], "pdeg_F" => [-12, "deg_F"], "pdegreeC" => [-12, "degreeC"], "pdegreeF" => [-12, "degreeF"], "pdegree_C" => [-12, "degree_C"], "pdegree_E" => [-12, "degree_E"], "pdegree_F" => [-12, "degree_F"], "pdegree_N" => [-12, "degree_N"], "pdegree_R" => [-12, "degree_R"], "pdegree_S" => [-12, "degree_S"], "pdegree_W" => [-12, "degree_W"], "pdegree_c" => [-12, "degree_c"], "pdegree_east" => [-12, "degree_east"], "pdegree_f" => [-12, "degree_f"], "pdegree_north" => [-12, "degree_north"], "pdegree_south" => [-12, "degree_south"], "pdegree_west" => [-12, "degree_west"], "pdegrees_east" => [-12, "degrees_east"], "pdegrees_north" => [-12, "degrees_north"], "pdegrees_south" => [-12, "degrees_south"], "pdegrees_west" => [-12, "degrees_west"], "pdyn" => [-12, "dyn"], "pentads" => [0, "pentad"], "perg" => [-12, "erg"], "petaCelsius" => [15, "Celsius"], "petaFahrenheit" => [15, "Fahrenheit"], "petaJulian_year" => [15, "Julian_year"], "petaPascal" => [15, "Pascal"], "petaacre" => [15, "acre"], "petaampere" => [15, "ampere"], "petaangstrom" => [15, "angstrom"], "petaangular_degree" => [15, "angular_degree"], "petaangular_minute" => [15, "angular_minute"], "petaangular_second" => [15, "angular_second"], "petaare" => [15, "are"], "petaatmosphere" => [15, "atmosphere"], "petacalorie" => [15, "calorie"], "petacelsius" => [15, "celsius"], "petacentigrade" => [15, "centigrade"], "petacentury" => [15, "century"], "petachain" => [15, "chain"], "petacommon_year" => [15, "common_year"], "petacoulomb" => [15, "coulomb"], "petaday" => [15, "day"], "petadegK" => [15, "degK"], "petadeg_K" => [15, "deg_K"], "petadegree" => [15, "degree"], "petadegreeK" => [15, "degreeK"], "petadyne" => [15, "dyne"], "petaerg" => [15, "erg"], "petafahrenheit" => [15, "fahrenheit"], "petafarad" => [15, "farad"], "petafermi" => [15, "fermi"], "petagal" => [15, "gal"], "petagauss" => [15, "gauss"], "petagram" => [15, "gram"], "petahectare" => [15, "hectare"], "petahertz" => [15, "hertz"], "petahour" => [15, "hour"], "petainch" => [15, "inch"], "petajoule" => [15, "joule"], "petakelvin" => [15, "kelvin"], "petakilogram" => [15, "kilogram"], "petaknot" => [15, "knot"], "petalitre" => [15, "litre"], "petameter" => [15, "meter"], "petametre" => [15, "metre"], "petamicron" => [15, "micron"], "petamile" => [15, "mile"], "petamillibar" => [15, "millibar"], "petaminute" => [15, "minute"], "petaminute_angle" => [15, "minute_angle"], "petamole" => [15, "mole"], "petamonth" => [15, "month"], "petanewton" => [15, "newton"], "petaounce" => [15, "ounce"], "petaparsec" => [15, "parsec"], "petapascal" => [15, "pascal"], "petapentad" => [15, "pentad"], "petapoise" => [15, "poise"], "petapound" => [15, "pound"], "petaradian" => [15, "radian"], "petasecond" => [15, "second"], "petasecond_angle" => [15, "second_angle"], "petasteradian" => [15, "steradian"], "petastokes" => [15, "stokes"], "petatesla" => [15, "tesla"], "petaton" => [15, "ton"], "petatonne" => [15, "tonne"], "petatorr" => [15, "torr"], "petavolt" => [15, "volt"], "petawatt" => [15, "watt"], "petaweber" => [15, "weber"], "petayard" => [15, "yard"], "petayd" => [15, "yd"], "petayear" => [15, "year"], "pforce" => [-12, "force"], "pg" => [-12, "g"], "pgravity" => [-12, "gravity"], "ph" => [-12, "h"], "phg" => [-12, "hg"], "phr" => [-12, "hr"], "picoCelsius" => [-12, "Celsius"], "picoFahrenheit" => [-12, "Fahrenheit"], "picoJulian_year" => [-12, "Julian_year"], "picoPascal" => [-12, "Pascal"], "picoacre" => [-12, "acre"], "picoampere" => [-12, "ampere"], "picoangstrom" => [-12, "angstrom"], "picoangular_degree" => [-12, "angular_degree"], "picoangular_minute" => [-12, "angular_minute"], "picoangular_second" => [-12, "angular_second"], "picoare" => [-12, "are"], "picoatmosphere" => [-12, "atmosphere"], "picocalorie" => [-12, "calorie"], "picocelsius" => [-12, "celsius"], "picocentigrade" => [-12, "centigrade"], "picocentury" => [-12, "century"], "picochain" => [-12, "chain"], "picocommon_year" => [-12, "common_year"], "picocoulomb" => [-12, "coulomb"], "picoday" => [-12, "day"], "picodegK" => [-12, "degK"], "picodeg_K" => [-12, "deg_K"], "picodegree" => [-12, "degree"], "picodegreeK" => [-12, "degreeK"], "picodyne" => [-12, "dyne"], "picoerg" => [-12, "erg"], "picofahrenheit" => [-12, "fahrenheit"], "picofarad" => [-12, "farad"], "picofermi" => [-12, "fermi"], "picogal" => [-12, "gal"], "picogauss" => [-12, "gauss"], "picogram" => [-12, "gram"], "picohectare" => [-12, "hectare"], "picohertz" => [-12, "hertz"], "picohour" => [-12, "hour"], "picoinch" => [-12, "inch"], "picojoule" => [-12, "joule"], "picokelvin" => [-12, "kelvin"], "picokilogram" => [-12, "kilogram"], "picoknot" => [-12, "knot"], "picolitre" => [-12, "litre"], "picometer" => [-12, "meter"], "picometre" => [-12, "metre"], "picomicron" => [-12, "micron"], "picomile" => [-12, "mile"], "picomillibar" => [-12, "millibar"], "picominute" => [-12, "minute"], "picominute_angle" => [-12, "minute_angle"], "picomole" => [-12, "mole"], "picomonth" => [-12, "month"], "piconewton" => [-12, "newton"], "picoounce" => [-12, "ounce"], "picoparsec" => [-12, "parsec"], "picopascal" => [-12, "pascal"], "picopentad" => [-12, "pentad"], "picopoise" => [-12, "poise"], "picopound" => [-12, "pound"], "picoradian" => [-12, "radian"], "picosecond" => [-12, "second"], "picosecond_angle" => [-12, "second_angle"], "picosteradian" => [-12, "steradian"], "picostokes" => [-12, "stokes"], "picotesla" => [-12, "tesla"], "picoton" => [-12, "ton"], "picotonne" => [-12, "tonne"], "picotorr" => [-12, "torr"], "picovolt" => [-12, "volt"], "picowatt" => [-12, "watt"], "picoweber" => [-12, "weber"], "picoyard" => [-12, "yard"], "picoyd" => [-12, "yd"], "picoyear" => [-12, "year"], "pin" => [-12, "in"], "pkg" => [-12, "kg"], "pkgf" => [-12, "kgf"], "pkph" => [-12, "kph"], "plb" => [-12, "lb"], "plm" => [-12, "lm"], "plx" => [-12, "lx"], "ply" => [-12, "ly"], "pm" => [-12, "m"], "pmb" => [-12, "mb"], "pmercury" => [-12, "mercury"], "pmgal" => [-12, "mgal"], "pmin" => [-12, "min"], "pmol" => [-12, "mol"], "pmon" => [-12, "mon"], "pmph" => [-12, "mph"], "pohm" => [-12, "ohm"], "poises" => [0, "poise"], "pounds" => [0, "pound"], "poz" => [-12, "oz"], "ppc" => [-12, "pc"], "ppercent" => [-12, "percent"], "ppermil" => [-12, "permil"], "ppsi" => [-12, "psi"], "prad" => [-12, "rad"], "ps" => [-12, "s"], "psr" => [-12, "sr"], "pt" => [-12, "t"], "pyr" => [-12, "yr"], "radians" => [0, "radian"], "seconds" => [0, "second"], "seconds_angle" => [0, "second_angle"], "steradians" => [0, "steradian"], "stokeses" => [0, "stokes"], "telaCelsius" => [12, "Celsius"], "telaFahrenheit" => [12, "Fahrenheit"], "telaJulian_year" => [12, "Julian_year"], "telaPascal" => [12, "Pascal"], "telaacre" => [12, "acre"], "telaampere" => [12, "ampere"], "telaangstrom" => [12, "angstrom"], "telaangular_degree" => [12, "angular_degree"], "telaangular_minute" => [12, "angular_minute"], "telaangular_second" => [12, "angular_second"], "telaare" => [12, "are"], "telaatmosphere" => [12, "atmosphere"], "telacalorie" => [12, "calorie"], "telacelsius" => [12, "celsius"], "telacentigrade" => [12, "centigrade"], "telacentury" => [12, "century"], "telachain" => [12, "chain"], "telacommon_year" => [12, "common_year"], "telacoulomb" => [12, "coulomb"], "teladay" => [12, "day"], "teladegK" => [12, "degK"], "teladeg_K" => [12, "deg_K"], "teladegree" => [12, "degree"], "teladegreeK" => [12, "degreeK"], "teladyne" => [12, "dyne"], "telaerg" => [12, "erg"], "telafahrenheit" => [12, "fahrenheit"], "telafarad" => [12, "farad"], "telafermi" => [12, "fermi"], "telagal" => [12, "gal"], "telagauss" => [12, "gauss"], "telagram" => [12, "gram"], "telahectare" => [12, "hectare"], "telahertz" => [12, "hertz"], "telahour" => [12, "hour"], "telainch" => [12, "inch"], "telajoule" => [12, "joule"], "telakelvin" => [12, "kelvin"], "telakilogram" => [12, "kilogram"], "telaknot" => [12, "knot"], "telalitre" => [12, "litre"], "telameter" => [12, "meter"], "telametre" => [12, "metre"], "telamicron" => [12, "micron"], "telamile" => [12, "mile"], "telamillibar" => [12, "millibar"], "telaminute" => [12, "minute"], "telaminute_angle" => [12, "minute_angle"], "telamole" => [12, "mole"], "telamonth" => [12, "month"], "telanewton" => [12, "newton"], "telaounce" => [12, "ounce"], "telaparsec" => [12, "parsec"], "telapascal" => [12, "pascal"], "telapentad" => [12, "pentad"], "telapoise" => [12, "poise"], "telapound" => [12, "pound"], "telaradian" => [12, "radian"], "telasecond" => [12, "second"], "telasecond_angle" => [12, "second_angle"], "telasteradian" => [12, "steradian"], "telastokes" => [12, "stokes"], "telatesla" => [12, "tesla"], "telaton" => [12, "ton"], "telatonne" => [12, "tonne"], "telatorr" => [12, "torr"], "telavolt" => [12, "volt"], "telawatt" => [12, "watt"], "telaweber" => [12, "weber"], "telayard" => [12, "yard"], "telayd" => [12, "yd"], "telayear" => [12, "year"], "teslas" => [0, "tesla"], "tonnes" => [0, "tonne"], "tons" => [0, "ton"], "torrs" => [0, "torr"], "u%" => [-6, "%"], "uA" => [-6, "A"], "uAu" => [-6, "Au"], "uBq" => [-6, "Bq"], "uC" => [-6, "C"], "uF" => [-6, "F"], "uG" => [-6, "G"], "uGal" => [-6, "Gal"], "uGy" => [-6, "Gy"], "uH" => [-6, "H"], "uHg" => [-6, "Hg"], "uHz" => [-6, "Hz"], "uJ" => [-6, "J"], "uK" => [-6, "K"], "uL" => [-6, "L"], "uN" => [-6, "N"], "uP" => [-6, "P"], "uPa" => [-6, "Pa"], "uS" => [-6, "S"], "uSt" => [-6, "St"], "uSv" => [-6, "Sv"], "uT" => [-6, "T"], "uV" => [-6, "V"], "uW" => [-6, "W"], "uWb" => [-6, "Wb"], "ua" => [-6, "a"], "uac" => [-6, "ac"], "uatm" => [-6, "atm"], "ubar" => [-6, "bar"], "ucal" => [-6, "cal"], "uconventional_mercury" => [-6, "conventional_mercury"], "ud" => [-6, "d"], "udegC" => [-6, "degC"], "udegF" => [-6, "degF"], "udeg_C" => [-6, "deg_C"], "udeg_F" => [-6, "deg_F"], "udegreeC" => [-6, "degreeC"], "udegreeF" => [-6, "degreeF"], "udegree_C" => [-6, "degree_C"], "udegree_E" => [-6, "degree_E"], "udegree_F" => [-6, "degree_F"], "udegree_N" => [-6, "degree_N"], "udegree_R" => [-6, "degree_R"], "udegree_S" => [-6, "degree_S"], "udegree_W" => [-6, "degree_W"], "udegree_c" => [-6, "degree_c"], "udegree_east" => [-6, "degree_east"], "udegree_f" => [-6, "degree_f"], "udegree_north" => [-6, "degree_north"], "udegree_south" => [-6, "degree_south"], "udegree_west" => [-6, "degree_west"], "udegrees_east" => [-6, "degrees_east"], "udegrees_north" => [-6, "degrees_north"], "udegrees_south" => [-6, "degrees_south"], "udegrees_west" => [-6, "degrees_west"], "udyn" => [-6, "dyn"], "uerg" => [-6, "erg"], "uforce" => [-6, "force"], "ug" => [-6, "g"], "ugravity" => [-6, "gravity"], "uh" => [-6, "h"], "uhg" => [-6, "hg"], "uhr" => [-6, "hr"], "uin" => [-6, "in"], "ukg" => [-6, "kg"], "ukgf" => [-6, "kgf"], "ukph" => [-6, "kph"], "ulb" => [-6, "lb"], "ulm" => [-6, "lm"], "ulx" => [-6, "lx"], "uly" => [-6, "ly"], "um" => [-6, "m"], "umb" => [-6, "mb"], "umercury" => [-6, "mercury"], "umgal" => [-6, "mgal"], "umin" => [-6, "min"], "umol" => [-6, "mol"], "umon" => [-6, "mon"], "umph" => [-6, "mph"], "uohm" => [-6, "ohm"], "uoz" => [-6, "oz"], "upc" => [-6, "pc"], "upercent" => [-6, "percent"], "upermil" => [-6, "permil"], "upsi" => [-6, "psi"], "urad" => [-6, "rad"], "us" => [-6, "s"], "usr" => [-6, "sr"], "ut" => [-6, "t"], "uyr" => [-6, "yr"], "volts" => [0, "volt"], "watts" => [0, "watt"], "webers" => [0, "weber"], "yards" => [0, "yard"], "yds" => [0, "yd"], "years" => [0, "year"], } UPLURALS = { "Celsiuses" => "Celsius", "Fahrenheits" => "Fahrenheit", "Julians_year" => "Julian_year", "Pascals" => "Pascal", "acres" => "acre", "amperes" => "ampere", "angstroms" => "angstrom", "angulars_degree" => "angular_degree", "angulars_minute" => "angular_minute", "angulars_second" => "angular_second", "ares" => "are", "atmospheres" => "atmosphere", "calories" => "calorie", "celsiuses" => "celsius", "centigrades" => "centigrade", "centuries" => "century", "chains" => "chain", "commons_year" => "common_year", "coulombs" => "coulomb", "days" => "day", "degKs" => "degK", "degreeKs" => "degreeK", "degrees" => "degree", "degs_K" => "deg_K", "dynes" => "dyne", "ergs" => "erg", "fahrenheits" => "fahrenheit", "farads" => "farad", "fermis" => "fermi", "gals" => "gal", "gausses" => "gauss", "grams" => "gram", "hectares" => "hectare", "hertzes" => "hertz", "hours" => "hour", "inchs" => "inch", "joules" => "joule", "kelvins" => "kelvin", "kilograms" => "kilogram", "knots" => "knot", "litres" => "litre", "meters" => "meter", "metres" => "metre", "microns" => "micron", "miles" => "mile", "millibars" => "millibar", "minutes" => "minute", "minutes_angle" => "minute_angle", "moles" => "mole", "months" => "month", "newtons" => "newton", "ounces" => "ounce", "parsecs" => "parsec", "pascals" => "pascal", "pentads" => "pentad", "poises" => "poise", "pounds" => "pound", "radians" => "radian", "seconds" => "second", "seconds_angle" => "second_angle", "steradians" => "steradian", "stokeses" => "stokes", "teslas" => "tesla", "tonnes" => "tonne", "tons" => "ton", "torrs" => "torr", "volts" => "volt", "watts" => "watt", "webers" => "weber", "yards" => "yard", "yds" => "yd", "years" => "year", } end class NumberNode < TerminalNode def initialize(arg) raise TypeError unless Numeric === arg @a = arg end UNITY = NumberNode.new(1) ZERO = NumberNode.new(0) def to_s if @a == @a.to_i sprintf("%d",@a) else String(@a) end end attr_reader :a alias :value :a alias :factor :a def == (other) case other when NumberNode @a == other.a else false end end def add_eval(another) raise TypeError unless NumberNode === another NumberNode.new(@a + another.value) end def mul_eval(another) case another when NumberNode then NumberNode.new(@a * another.a) when PowNode raise TypeError unless NumberNode === another.lhs raise TypeError unless NumberNode === another.rhs NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value)) else raise TypeError end end def name; "1"; end def power; UNITY; end end class XDate def initialize(year, month, day) @year, @month, @day = year.to_i, month.to_i, day.to_i end attr_reader :year, :month, :day def to_s format('%04d-%02d-%02d', @year, @month, @day) end alias :inspect :to_s def to_time Time.gm(@year, @month, @day) end def to_date Date.new(@year, @month, @day) end def -(other) case other when XDate (to_date - other.to_date) when Time to_time - other when Date (to_date - other.to_date) else to_date - other end end def +(other) t = to_date + other self.class.new(t.year, t.month, t.mday) end end class TimeNode < TerminalNode def initialize(date, time, zone) @date, @time, @zone = date, time, zone if :now === @date then now = Time.now.utc @date = XDate.new(now.year, now.month, now.day) @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec)) else qdays = (@time / 86400).floor if not qdays.zero? @date += qdays @time -= (qdays * 86400) end end raise TypeError unless XDate === @date @time = 0.0 unless @time raise TypeError unless Float === @time @zone = 0 unless @zone raise TypeError unless Integer === @zone end attr_reader :date, :time, :zone def to_s hr = @time.floor / 3600 mi = (@time.floor / 60) % 60 sc = @time % 60 tzm = @zone.abs tzh = tzm / 60 tzm %= 60 tzh = -tzh if @zone < 0 format("%sT%02d:%02d:%05.2f %+03d:%02d", \ @date.to_s, hr, mi, sc, tzh, tzm) end def self::pentad(d) (d > 25) ? 5 : ((d - 1) / 5) end def add_time(increment) inc = increment.reduce5 case inc.name when 's' t2 = @time + inc.factor d2 = @date + (t2 / 86400) t2 = t2 % 86400 self.class.new(d2, t2, @zone) when 'pentad' ifac = Integer(inc.factor) ipen = ifac % 6 imon = ifac / 6 spen = self.class.pentad(@date.day) smon = @date.month + imon + spen / 6 spen = spen % 6 sday = spen * 5 + (@date.day - 1) % 5 + 1 syear = @date.year + (smon - 1) / 12 smon = (smon - 1) % 12 + 1 sdate = XDate.new(syear, smon, sday) self.class.new(sdate, @time, @zone) else raise "bad time unit '#{inc.name}'" end end def utcsod @time - @zone * 60 end def div_time(units) base = units.ref inc = units.deref.reduce5 begin incname = inc.name rescue Exception incname = "(undefined)" end case incname when 's' dif = (@date - base.date) * 86400 + (utcsod - base.utcsod) dif / inc.factor when 'pentad' dif = (@date.year - base.date.year) * 72 dif += (@date.month - base.date.month) * 6 dif += self.class.pentad(@date.day) dif -= self.class.pentad(base.date.day) dif = Float(dif) if dif % inc.factor != 0 dif / inc.factor else raise "bad time unit '#{incname}'" end end end class PowNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs raise TypeError unless NumberNode === @rhs end def to_s lhs = @lhs.to_s case lhs when /\d$/, /[\d\.]/ lhs = "(#{lhs})" end rhs = @rhs.to_s if rhs == '1' lhs else rhs = "^(#{rhs})" if (/\./ =~ rhs) lhs + rhs end end attr_reader :lhs, :rhs alias :power :rhs def pow_eval(other) case other when NumberNode PowNode.new(@lhs, @rhs.mul_eval(other)) else super(other) end end def flatten2 x = @lhs.flatten2 case x when NumberNode a = @lhs.pow_eval(@rhs) when TerminalNode a = self when PowNode a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs)) when MulNode, MultiNode a = MultiNode.new() for gc in x a.append(gc.pow_eval(@rhs)) end else raise "internal error" end return a end def name case @lhs when NumberNode, NameNode @lhs.name else raise "internal error" end end def value case @lhs when NumberNode Units::pow_f(@lhs.value, @rhs.value) else raise(format('%s#value: internal error', self.class.to_s)) end end def mul_eval(another) raise "internal error (#{name}, #{another.name})" if name != another.name case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value) else self.class.new(@lhs, @rhs.add_eval(another.power)) end end def sort case @lhs when NumberNode NumberNode.new(Units::pow_f(@lhs.value, @rhs.value)) else self end end def factor Units::pow_f(@lhs.factor, @rhs.value) end end module Kakezan def flatten2 r = MultiNode.new() each do |child| case child when MultiNode r.append child when MulNode r.append child.flatten2 when ContainerNode r.append child.flatten2 else r.append child end end r end def name n = nil for c in @children next if NumberNode === c na = c.name if n.nil? n = na else raise "multiple names found" if na != n end end n = "1" if n.nil? n end def factor f = 1 for c in @children f *= c.factor end f end end class MulNode < ContainerNode include BinaryNode include Kakezan def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end def to_s lhs = @lhs.to_s rhs = @rhs.to_s if (/\d$/ =~ lhs && /^\w/ =~ rhs) then "#{lhs} #{rhs}" else "#{lhs}.#{rhs}" end end end class MultiNode < ContainerNode include Kakezan def initialize(*children) @children = children for c in @children raise "# MultiNode.new(#{children.inspect})" unless Node === c end end def to_s s = @children.join(';') s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.') end def each @children.each {|child| yield child } end attr_reader :children def append(other) case other when MultiNode @children += other.children else @children.push other end end def sort table = {} for child in self name = child.name if (table.include?(name)) then table[name] = table[name].mul_eval(child) else table[name] = child end end list = [] for name in table.keys.sort candi = table[name] if PowNode === candi and NumberNode === candi.lhs then v = candi.value list.push NumberNode.new(v) unless v == 1 next end next if candi.power.value == 0 list.push candi end if list.length > 1 list.delete(NumberNode::UNITY) end self.class.new(*list) end def collect_hash(stopper, op) list = [] for child in self list.push(child.send(op, stopper)) end self.class.new(*list).flatten2 end def expand(stopper) collect_hash(stopper, :expand) end def unalias(stopper) collect_hash(stopper, :unalias) end def foldnumber(stopper) collect_hash(stopper, :foldnumber) end def value raise "this is dimensional units" if (@children.size > 1) @children.first ? @children.first.value : NumberNode::UNITY.value end end class ShiftNode < ContainerNode include BinaryNode def initialize(lhs, rhs) @lhs, @rhs = lhs, rhs end attr_reader :lhs, :rhs alias :ref :rhs def to_s "(#{@lhs.to_s} @ #{@rhs.to_s})" end def trim2; @lhs; end def trim self.class.new(@lhs.trim, @rhs.trim2) end def flatten2; @lhs; end def flatten lf = @lhs.flatten case lf when ShiftNode rf = lf.rhs.add_eval(@rhs) self.class.new(lf.lhs, rf) else self.class.new(lf, @rhs.flatten) end end def sort self.class.new(@lhs.sort, @rhs.sort) end def ref case @lhs when ShiftNode @lhs.ref.add_eval(@rhs) else @rhs end end def deref case @lhs when ShiftNode @lhs.deref else @lhs end end def name @lhs.name end def factor @lhs.factor end end def initialize string case string when String @string, @ptree = string, nil when Node @string, @ptree = nil, string else @string, @ptree = String(string), nil end @copy = @lexstat = nil end # # === LEXICAL ANALYZER === # def rewind @copy = @string.dup.strip @lexstat = nil end RE_SPACE = '([ \t])' RE_INTEGER = '([-+]?\d+)' RE_EXP = '([eE][-+]?[0-9]+)' RE_REAL = "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))" RE_YEAR = "([-+]?[0-9]{1,4})" RE_MONTH = "(0?[1-9]|1[0-2])" RE_DAY = "([12][0-9]|30|31|0?[1-9])" RE_HOUR = "(2[0-3]|[0-1]?[0-9])" RE_MINUTE = "([0-5]?[0-9])" RE_SECOND = "((#{RE_MINUTE}|60)(\\.[0-9]*)?)" RE_NAME = "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)" RE_DATE = "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}" RE_TIME = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?" RE_HandM = "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?" def next_token # decomment @copy.sub!(/^#.*/, ''); if @copy.sub!(%r{^\s*(\))}, '') then @lexstat = nil return [$1, $1] end if @copy.sub!(%r{^\s*(\()\s*}, '') then return [$1, $1] end if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then @lexstat = :SHIFT_SEEN return [:SHIFT, $1] end if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \ or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then @lexstat = nil return [:DIVIDE, $1] end if @copy.sub!(%r{^(\^|\*\*)}, '') then @lexstat = nil return [:EXPONENT, $1] end if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then y, m, d = $1, $2, $3 @lexstat = :DATE_SEEN return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)] end if :SHIFT_SEEN === @lexstat \ and @copy.sub!(%r{^now[ \t]*}, '') then @lexstat = nil return [:DATE, :now] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then h, m, s = $1, $3, $5 m = m.sub(/:/,'') if m s = 0 if s.nil? @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :DATE_SEEN === @lexstat \ and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then h, m = $1, $2 @lexstat = :TIME_SEEN return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^(UTC|Z)[ \t]*}, '') then @lexstat = nil return [:ZONE, 0] end if :TIME_SEEN === @lexstat \ and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then sgn, h, m = $1, $2, $4 m = m.sub(/:/,'') if m @lexstat = nil h = h.to_i h = -h if sgn == "-" m = m.to_i m = -m if sgn == "-" return [:ZONE, ((h * 60) + m)] end if @copy.sub!(%r{^#{RE_NAME}}, '') then @lexstat = nil return [:NAME, $1] end if @copy.sub!(%r{^#{RE_REAL}}, '') then @lexstat = nil return [:REAL, $1.to_f] end if @copy.sub!(%r{^#{RE_INTEGER}}, '') then @lexstat = nil return [:INT, $1.to_i] end if @copy.sub!(%r{^(-)}, '') then @lexstat = nil return [:MULTIPLY, $1] end if @copy.sub!(%r{^(.)}, '') then return [$1, $1] end return [false, false] end # # === USER LEVEL METHODS === # def tokens rewind x = [] while (t = next_token).first x.push t end x end def do_parse2 rewind return NumberNode.new(1) if @string.nil? or @string.empty? pa = do_parse pa ? pa : ErrorNode.new(@string) end def ptree @ptree = do_parse2 if not @ptree @ptree end def dup @string ? self.class.new(@string) : self.class.new(@ptree) end def parse dup.parse! end def parse! @ptree = do_parse2 if not @ptree self end def self::parse(string) new(string).parse! end =begin --- reduce0 just do nothing. =end def reduce0 self end =begin --- reduce1 removes unnecessary parentheses. =end def reduce1 @string = ptree.to_s self end =begin --- reduce2 removes shift operator within multiplication/division/exponent =end def reduce2 @ptree = ptree.reduce2 @string = nil self end =begin --- reduce3 flattens expression and collects all factors =end def reduce3 @ptree = ptree.reduce3 @string = nil self end =begin --- reduce4 collects terms with the same name =end def reduce4 @ptree = ptree.reduce4 @string = nil self end =begin --- reduce5 expands all terms recursively =end def reduce5 @ptree = ptree.reduce5 @string = nil self end attr_reader :string def to_s @string = @ptree.to_s if @string.nil? @string end def inspect if @ptree.nil? then "Units{#{@string}}" else "Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[') end end def self::[](string) new(string) end def self::parse(string) new(string).parse! end def eval(x = 0) r5 = ptree.reduce5 case r = r5.ref when TimeNode r.add(x, r5.name) else fac = NumberNode.new(x + r.value) self.class.new(MulNode.new(fac, r5.deref)) end end def convert(numeric, to_units) to_units = Units.new( to_units ) if to_units.is_a?(String) r5 = dup.ptree.reduce5 case r = r5.ref when TimeNode r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree) else shift1 = r.value numeric = shift1 + numeric if shift1 != 0 fact = r5.divide(tp = to_units.dup.ptree).reduce5.value numeric *= fact if fact != 1 shift2 = tp.reduce5.ref.value numeric = numeric - shift2 if shift2 != 0 numeric end end def factor_and_offset(to_units) # To convert a numeric from self to to_units: # scale_factor * numeric + add_offset to_units = Units.new( to_units ) if to_units.is_a?(String) add_offset = convert(0, to_units) scale_factor = convert(1, to_units) - add_offset [ scale_factor, add_offset ] end def convert2(val, to_units) # Like Units#convert, but applicable to any Numeric-like objects. # Returns the original value if the units are incompatible. to_units = Units.new( to_units ) if to_units.is_a?(String) if ( self == to_units ) val elsif ( self =~ to_units ) if Numeric===val convert( val, to_units ) else factor, offset = factor_and_offset( to_units ) val*factor + offset end else unless $VERBOSE.nil? $stderr.print( "*WARNING*: " + "incompatible units: #{self.to_s} and #{to_units.to_s}\n") caller(0).each{|c| $stderr.print "\t* ",c,"\n"} end val end end @@reduce = :reduce4 def self::reduce_level @@reduce.to_s[-1] end def self::reduce_level=(n) @@reduce = case n when 1 then :reduce1 when 2 then :reduce2 when 3 then :reduce3 when 4 then :reduce4 else :reduce5 end end def binop(op, other) case other when Numeric other = NumberNode.new(other) when Units other = other.ptree end q = self.ptree.send(op, other).send(@@reduce) Units.new(q) end def *(other) binop(:mul, other) end def **(other) binop(:pow, other) end def /(other) binop(:divide, other) end def ^(other) binop(:shift, other) end def ==(other) case other when self.class dup.reduce5.to_s == other.dup.reduce5.to_s else false end end #def === (other) # reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s #end alias === == #def === (other) # # returns true if other is within a factor and/or offset of difference. # case other # when self.class # (self/other).reduce5.ptree.children.each do |child| # return false if !( NumberNode === child ) # end # true # else # false # end #end def =~(other) case other when self.class (self/other).reduce5.ptree.children.each{ |node| return false unless NumberNode === node } true else false end end def self::pow_f(a, b) if Integer === b and b < 0 then a ** b.to_f else a ** b end end ...end units.racc/module_eval... ##### State transition tables begin ### racc_action_table = [ 3, 9, 35, 9, 32, 9, 19, 11, 10, 7, 10, 9, 10, 8, 25, 31, 36, 23, 10, 7, 9, 37, 9, 8, 9, 38, nil, 10, 7, 10, 7, 10, 8, 25, 8, 9, 23, nil, 12, 9, 14, 15, 10, 9, 7, 17, 10, 31, 8, 17, 10, 9, nil, 9, nil, nil, nil, 17, 10, 17, 10 ] racc_action_check = [ 0, 0, 25, 31, 18, 23, 11, 1, 0, 0, 31, 14, 23, 0, 23, 31, 33, 23, 14, 14, 8, 34, 15, 14, 12, 35, nil, 8, 8, 15, 15, 12, 8, 12, 15, 17, 12, nil, 4, 5, 4, 4, 17, 28, 4, 5, 5, 17, 4, 28, 28, 13, nil, 26, nil, nil, nil, 13, 13, 26, 26 ] racc_action_pointer = [ -1, 7, nil, nil, 34, 37, nil, nil, 18, nil, nil, 6, 22, 49, 9, 20, nil, 33, -11, nil, nil, nil, nil, 3, nil, -10, 51, nil, 41, nil, nil, 1, nil, 1, 6, 12, nil, nil, nil ] racc_action_default = [ -1, -27, -2, -3, -4, -7, -8, -14, -27, -20, -21, -27, -27, -9, -27, -27, -15, -27, -27, 39, -5, -6, -18, -27, -22, -24, -10, -12, -11, -13, -16, -27, -17, -27, -27, -25, -19, -23, -26 ] racc_goto_table = [ 6, 20, 21, 2, 1, nil, 30, nil, 6, 13, nil, 18, 22, 34, 27, 29, nil, 22, nil, 26, 28, nil, nil, 22, nil, nil, nil, nil, nil, nil, nil, 22 ] racc_goto_check = [ 7, 4, 5, 2, 1, nil, 4, nil, 7, 6, nil, 2, 7, 5, 7, 7, nil, 7, nil, 6, 6, nil, nil, 7, nil, nil, nil, nil, nil, nil, nil, 7 ] racc_goto_pointer = [ nil, 4, 3, nil, -11, -10, 5, 0, nil ] racc_goto_default = [ nil, nil, nil, 4, 33, nil, 5, 16, 24 ] racc_reduce_table = [ 0, 0, :racc_error, 0, 17, :_reduce_none, 1, 17, :_reduce_2, 1, 17, :_reduce_3, 1, 18, :_reduce_none, 3, 18, :_reduce_5, 3, 18, :_reduce_6, 1, 19, :_reduce_none, 1, 19, :_reduce_none, 2, 19, :_reduce_9, 3, 19, :_reduce_10, 3, 19, :_reduce_11, 3, 19, :_reduce_12, 3, 19, :_reduce_13, 1, 22, :_reduce_14, 2, 22, :_reduce_15, 3, 22, :_reduce_16, 3, 22, :_reduce_17, 1, 20, :_reduce_none, 3, 20, :_reduce_19, 1, 23, :_reduce_20, 1, 23, :_reduce_21, 1, 21, :_reduce_none, 3, 21, :_reduce_23, 1, 24, :_reduce_24, 2, 24, :_reduce_25, 3, 24, :_reduce_26 ] racc_reduce_n = 27 racc_shift_n = 39 racc_token_table = { false => 0, :error => 1, :INT => 2, :ERR => 3, :SHIFT => 4, :SPACE => 5, :MULTIPLY => 6, :DIVIDE => 7, :EXPONENT => 8, :REAL => 9, :NAME => 10, :DATE => 11, :TIME => 12, :ZONE => 13, "(" => 14, ")" => 15 } racc_nt_base = 16 racc_use_result_var = false Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ "$end", "error", "INT", "ERR", "SHIFT", "SPACE", "MULTIPLY", "DIVIDE", "EXPONENT", "REAL", "NAME", "DATE", "TIME", "ZONE", "\"(\"", "\")\"", "$start", "unit_spec", "origin_exp", "unit_exp", "value_exp", "timestamp", "power_exp", "number_exp", "time_exp" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted # reduce 1 omitted module_eval(<<'.,.,', 'units.racc', 9) def _reduce_2(val, _values) val[0] end .,., module_eval(<<'.,.,', 'units.racc', 10) def _reduce_3(val, _values) yyerrok end .,., # reduce 4 omitted module_eval(<<'.,.,', 'units.racc', 15) def _reduce_5(val, _values) val[0].shift(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 16) def _reduce_6(val, _values) val[0].shift(val[2]) end .,., # reduce 7 omitted # reduce 8 omitted module_eval(<<'.,.,', 'units.racc', 22) def _reduce_9(val, _values) val[0].mul(val[1]) end .,., module_eval(<<'.,.,', 'units.racc', 23) def _reduce_10(val, _values) val[0].mul(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 24) def _reduce_11(val, _values) val[0].divide(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 25) def _reduce_12(val, _values) val[0].mul(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 26) def _reduce_13(val, _values) val[0].divide(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 30) def _reduce_14(val, _values) NameNode.new(val[0]) end .,., module_eval(<<'.,.,', 'units.racc', 31) def _reduce_15(val, _values) val[0].pow(val[1]) end .,., module_eval(<<'.,.,', 'units.racc', 32) def _reduce_16(val, _values) val[0].pow(val[2]) end .,., module_eval(<<'.,.,', 'units.racc', 33) def _reduce_17(val, _values) val[1] end .,., # reduce 18 omitted module_eval(<<'.,.,', 'units.racc', 38) def _reduce_19(val, _values) val[1] end .,., module_eval(<<'.,.,', 'units.racc', 42) def _reduce_20(val, _values) NumberNode.new(val[0]) end .,., module_eval(<<'.,.,', 'units.racc', 43) def _reduce_21(val, _values) NumberNode.new(val[0]) end .,., # reduce 22 omitted module_eval(<<'.,.,', 'units.racc', 48) def _reduce_23(val, _values) val[1] end .,., module_eval(<<'.,.,', 'units.racc', 52) def _reduce_24(val, _values) TimeNode.new(val[0], 0.0, 0) end .,., module_eval(<<'.,.,', 'units.racc', 53) def _reduce_25(val, _values) TimeNode.new(val[0], val[1], 0) end .,., module_eval(<<'.,.,', 'units.racc', 54) def _reduce_26(val, _values) TimeNode.new(val[0], val[1], val[2]) end .,., def _reduce_none(val, _values) val[0] end end # class Units end # module NumRu #################### if $0 == __FILE__ include NumRu def assert(test, seikai) raise "#{test.inspect} != #{seikai.inspect}" if test != seikai puts "ok #{seikai.inspect}" end puts "=== reduce1 ===" assert Units.new('').reduce1.to_s, "1" assert Units.new('m').reduce1.to_s, "m" assert Units.new('3').reduce1.to_s, "3" assert Units.new('3.14').reduce1.to_s, "3.14" assert Units.new('m2').reduce1.to_s, "m2" assert Units.new('m.s').reduce1.to_s, "m.s" assert Units.new('m/s').reduce1.to_s, "m.s-1" assert Units.new('kg.m/s2').reduce1.to_s, "kg.m.(s2)-1" assert Units.new('s @ 2003-11-29').reduce1.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('s @ 2003-11-29T11:24').reduce1.to_s, "(s @ 2003-11-29T11:24:00.00 +00:00)" assert Units.new('s @ 2003-11-29T11:24:11 -09:00').reduce1.to_s, "(s @ 2003-11-29T11:24:11.00 -09:00)" assert Units.new('100').reduce1.to_s, "100" assert Units.new('(10)^2').reduce1.to_s, "(10)2" assert Units.new('(10)^2/100').reduce1.to_s, "(10)2.(100)-1" puts "=== reduce2 ===" assert Units.new('s @ 2003-11-29').reduce2.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('m/(s @ 2003-11-29)').reduce2.to_s, "m.s-1" assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce2.to_s, "m.(K.s)-1" assert Units.new('(10)^2/100').reduce2.to_s, "(10)2.(100)-1" puts "=== reduce3 ===" assert Units::MultiNode.new(Units::NameNode.new('a'), \ Units::NumberNode.new(1), \ Units::NameNode.new('b')).to_s, 'a.1 b' assert Units.new('kg').reduce3.inspect, "Units[Name[kg]]" assert Units.new('kg.m').reduce3.inspect, "Units[Multi[Name[kg], Name[m]]]" assert Units.new('kg.m.s').reduce3.inspect, "Units[Multi[Name[kg], Name[m], Name[s]]]" assert Units.new('(m.s)^2').reduce3.inspect, "Units[Multi[Pow[Name[m], Number[2]], Pow[Name[s], Number[2]]]]" assert Units.new('K @ 273.15').reduce3.inspect, "Units[Shift[Name[K], Number[273.15]]]" assert Units.new('((a.b)^2)^2').reduce3.inspect, "Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]]]]" assert Units.new('((a.b)^2 c4 d)^2').reduce3.inspect, "Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]], Pow[Name[c], Number[8]], Pow[Name[d], Number[2]]]]" assert Units.new('((a.b)^2 c4 d)^2').reduce3.to_s, "a4 b4 c8 d2" assert Units.new('((a.b)^2 a4 b)^2').reduce3.to_s, "a4 b4 a8 b2" assert Units.new('s @ 2003-11-29').reduce3.to_s, "(s @ 2003-11-29T00:00:00.00 +00:00)" assert Units.new('m/(s @ 2003-11-29)').reduce3.to_s, "m.s-1" assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce3.to_s, "m.K-1 s-1" assert Units.new('(10)^2/100').reduce3.to_s, "(10)2.(100)-1" puts "=== reduce4 ===" assert Units.new('((a.b)^2 a4 b @ now)^2 @ 273.15').reduce4.to_s, "(a12 b6 @ 273.15)" assert Units.new('km2').reduce4.to_s, "km2" assert Units.new('hours.hour').reduce4.to_s, "hour2" assert Units.new('(10)^2').reduce4.to_s, "100" assert Units.new('100/10').reduce4.to_s, "10" assert Units.new('(10)^2/100').reduce4.to_s, "1" puts "=== reduce5 ===" assert Units.new('km2').reduce5.to_s, "1000000 m2" assert Units.new('(10)^2/100').reduce5.to_s, "1" assert Units.new('hPa').reduce5.to_s, "100 kg.m-1 s-2" assert Units.new('mb').reduce5.to_s, "100 kg.m-1 s-2" assert Units.new('hPa/mb').reduce5.to_s, "1" assert Units.new('(K @ 273.15)@ 10').reduce5.to_s, "(K @ 283.15)" puts "=== APPLICATIONS ===" assert Units.new('km @ 2').convert(3, Units.new('m @ 100')), 4900 assert Units.new('degree_F').convert(32, Units.new('K')).to_s, ((32+459.67)*(1.8**-1)).to_s u1 = Units.new('m/s') u2 = Units.new('mm/s') assert((u1/u2).to_s, "m.mm-1") assert((u1*u2).to_s, "m.mm.s-2") u1 = Units.new('years since 1999-01-01 00:00').reduce4 u2 = Units.new('hours since 2001-01-01 00:00').reduce4 assert u1.convert(3, u2), 24 * 365 u3 = Units.new('months since 2001-01-01 00:00').reduce4 assert u1.convert(3, u3), 12.0 Units.reduce_level = 3 assert((Units.new('hours') ** 2).to_s, "hours2") Units.reduce_level = 4 assert((Units.new('hours') ** 2).to_s, "hour2") Units.reduce_level = 5 assert((Units.new('hours') ** 2).to_s, "12960000 s2") assert(Units.new('day') =~ Units.new('s since 2002-01-01'), true) assert(Units.new('m') =~ Units.new('1'), false) un1 = Units['day since 2000-01-01'] un2 = Units['s since 2000-01-01'] assert(un1.convert(0, un2), 0.0) assert(un1.convert(1, un2), 86400.0) end numru-units-1.9.0/install.rb0000644000175000017500000000303013025004162015643 0ustar uwabamiuwabamirequire 'rbconfig' require 'find' include RbConfig require 'fileutils' default_destdir = CONFIG["sitelibdir"] def install_rb(srcdir, destdir) libdir = "lib" libdir = File.join(srcdir, libdir) if srcdir path = [] dir = [] Find.find(libdir) do |f| next unless FileTest.file?(f) next if (f = f[libdir.length+1..-1]) == nil next if (/CVS$/ =~ File.dirname(f)) path.push f dir |= [File.dirname(f)] end for f in dir next if f == "." next if f == "CVS" FileUtils.makedirs(File.join(destdir, f)) end for f in path next if (/\~$/ =~ f) next if (/^\./ =~ File.basename(f)) FileUtils.install(File.join("lib", f), File.join(destdir, f), {:mode => 0644, :verbose => true}) end end def ARGV.switch return nil if self.empty? arg = self.shift return nil if arg == '--' if arg =~ /^-(.)(.*)/ return arg if $1 == '-' raise 'unknown switch "-"' if $2.index('-') self.unshift "-#{$2}" if $2.size > 0 "-#{$1}" else self.unshift arg nil end end def ARGV.req_arg self.shift || raise('missing argument') end destdir = default_destdir begin while switch = ARGV.switch case switch when '-d', '--destdir' destdir = ARGV.req_arg # when '-u', '--uninstall' # uninstall = true else raise "unknown switch #{switch.dump}" end end rescue STDERR.puts $!.to_s STDERR.puts File.basename($0) + " -d " exit 1 end #if( defined?(uninstall) && uninstall ) # uninstall_rb(nil, destdir) #else install_rb(nil, destdir) #end numru-units-1.9.0/numru-units.gemspec0000644000175000017500000000242113025004163017527 0ustar uwabamiuwabami# coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'numru/units/version' Gem::Specification.new do |spec| spec.name = "numru-units" spec.version = Numru::Units::VERSION spec.authors = ["Eizi Toyoda","Takeshi Horinouchi"] spec.email = ["eriko@gfd-dennou.org"] spec.summary = %q{Class to handle units of physical quantities} spec.description = %q{This is a class to handle units of physical quantities. It covers most functionality of UNIDATA's UDUNITS Library, however, with a more sophisticated handling of string expressions. See the documentation for more infomation.} spec.homepage = 'http://www.gfd-dennou.org/arch/ruby/products/numru-units/' spec.licenses = ["Takeshi Horinouchi", "GFD Dennou Club"] spec.files = `git ls-files -z`.split("\x0") #spec.extra_rdoc_files = ['./doc/units.rd'] #spec.extra_rdoc_files = spec.files.grep(%r{^(doc)/}) #spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] #spec.add_development_dependency "bundler", "~> 1.7" #spec.add_development_dependency "rake", "~> 10.0" end numru-units-1.9.0/Makefile0000644000175000017500000000030213025004162015307 0ustar uwabamiuwabamiall: @(cd src && make && cp -p units.rb ../lib/numru/) @(cd doc && make) install: ruby install.rb test: @(cd src && make test) distclean: clean clean: @rm -f `find . -name "*~" -print` numru-units-1.9.0/ChangeLog0000644000175000017500000001453113025004162015432 0ustar uwabamiuwabamiTue Feb 17 2015 T Horinouchi * version 1.9 released ((cvs) tag: numru-units-1_9) Fri Jan 23 2015 T Horinouchi * dcunits.txt * added a description as comments at the beginning of the file * added units: cd, candela * changed the mode of the following units * S to N: kg, %, permil, d * S to P: percent * added a meteorological unit gpm (mode: N, definition: m). * LICENSE.txt: updated (years) * src/version.rb: added * src/Makefile: updated to use version.rb Tue Jan 20 2015 T Horinouchi * src/lex.rb: Regexp changed: UTC --> (UTC|Z) Mon Jan 12 2015 T Horinouchi * version 1.8 released ((cvs) tag: numru-units-1_8) Mon Jan 12 2015 T Horinouchi <-- S Nishizawa [dennou-ruby:003805] and T Koshiro [dennou-ruby:003806] (files to patch was corrected, though) * src/rules.rb: Update to support ruby 2.1 or later (l.10: origin_exp { yyaccept; } --> origin_exp { val[0] }) and a cleaner treatment of the NumRu:: wrapper (l.1: class Units --> class NumRu::Units). * src/test.rb: updated (handling of "" and numeric expressions: float --> rational) * src/Makefile: updated in response to the change in rule.rb * install.rb: updated (ruby 1.6 support abondoned) * src/units.racc, src/units.rb, lib/numru/units.rb: regenreated Fri Mar 14 2014 T Koshiro < M Nakano [dennou-ruby:003646] * install.rb: for Ruby 2.x Thu Aug 4 2011 T Horinouchi * version 1.7 released ((cvs) tag: numru-units-1_7) * LICENSE.txt: added (BSD 2-clause) * doc/units.rd, doc/units.html: updated (added entry to dcunits.txt) Wed Aug 3 2011 T Horinouchi * mulnode.rb: to_s changed to explicitly handle a Float whose value is an integer. * Makefile: adopet to the change in the "tail" command (tail +2 --> tail -n +2). Mon Mar 15 2010 T Horinouchi * version 1.6 released ((cvs) tag: numru-units-1_6) Fri May 23 2008 T Horinouchi * dcunits.txt: added the following units: percent [S], % [S], permil [S], centigrade [P], millibar [P] * rules.rb: changed not to accept empty unit_spec * lex.rb: * method do_parse2: to treat empty string units '' as '1' (to return NumberNode.new(1) instead of ErrorNode.new('')) Fri Feb 8 2008 T Koshiro * lex.rb: next_token: at least one space or tab character is required before/after 'per', 'after', 'from', 'since', 'ref' Wed Aug 24 2005 T Horinouchi * version 1.5 released ((cvs) tag: numru-units-1_5) Wed Jun 8 2005 T Horinouchi * lex.rb: * debug in RE_SECOND * debug in time zone parser (many bugs) * improvement in time parser RE_TIME to support hhmm type in addition to [h]h:[m]m * timenode.rb: * TimeNode#utcsod : debug in time zone treatment (IT WAS A FATAL BUG!!) * TimeNode#to_s : debug in the expression of seconds (not to take the floor of seconds). Wed May 25 2005 T Horinouchi * version 1.4 released ((cvs) tag: numru-units-1_4) * lex.rb: debug in RE_HOUR. It did not handle hours after 20 properly. Mon Nov 29 2004 T Horinouchi * timenode.rb: class XDate: added to_date (for intenal usage), and modified +(ohter) and -(ohter) methods to use it as long as possible. This is to widen the coverage of time -- up to now, only very recent years (such as AD19xx-20xx) are accpeted, since the Time intrincic class is always used. Tue Nov 9 2004 T Horinouchi * lex.rb: Units#convert2: changed warning messaging to show backtrace Sun Aug 10 2004 T Horinouchi * lex.rb: lex.rb Units#convert, Units#==: debug not to change (reduce5) self and input units. Sun Aug 8 2004 T Horinouchi * version 1.3 released * mulnode.rb: improved Multi#sort: to eliminate Number[1] if length >= 2. Then, Units.new('1m').reduce5.to_s gives 'm'; it used to give '1 m'. * numbernode.rb: defined == (to compare by values -- implicitly used in the new Multi#sort) * dcunits.txt: added some units from udunits: Pascal, deg[KF], deg_[CFK], degree[CFK], [Cc]elcius, angular_(degree|minute|secont), [Ff]ahrenheit, farad, gravity, conventional_mercury, mercury, Hg, hg, Julian_year, common_year, tesla * lex.rb: debug === (aliased to ==. The change on May 4 was enbug). debug =~: to handle other classes (return false) Tue May 4 2004 T Horinouchi * pownode.rb: PowNode#to_s: if the expopnent is 1, omit it. * lex.rb: debug === (to allow a difference of a factor and/or offset) Sun May 2 2004 T Horinouchi * dcunits.txt: added degree_east/degrees_east etc. Sun Mar 21 2004 T Horinouchi * version 1.2 released ((cvs) tag: numru-units-1_2) Fri Mar 19 2004 T Horinouchi * mulnode.rb: MutiNode#value: to return 1 if @children.size == 0 * dcunits.txt: added degC * lex.rb: convert2: warn if $VERBOSE --> warn regardress $VERBOSE Mon Mar 1 2004 T Horinouchi * version 1.1 released ((cvs) tag: numru-units-1_1) Mon Mar 1 2004 E Toyoda * test.rb: revised due to the change of reduce4; updated * timenode.rb debugged (Unexpected generation of Float by Date#- is avoided using Date-like wrapper to Time.) * node.rb: unalias (such as "kilometer" -> "10^3 m") will not occur at reduce4. (plurals still recognized in reduce4) * namenode.rb,numbernode.rb: unused methods "nameable?" removed * makeutab.rb: Bugfix: units like "second" or "metre" were not unaliased to its primary name (such as "s" or "m") due to improper parsing of dcunits.txt. Sun Feb 29 2004 E Toyoda (Commited by T Horinouchi) * makeutab.rb: debug plural treatment (/y$/ -> /[^aeou]y$/) Fri Feb 27 2004 T Horinouchi * src/lex.rb: added Units#convert2 (similar to Units#convert but more suitable for UNumeric constraction). debug in =~ * test.rb: added a test of =~ Thu Feb 26 2004 T Horinouchi * src/lex.rb: added Units#factor_and_offset * doc/units.rd: updated Wed Feb 25 2004 T Horinouchi * src/Makefile: add -l option to racc -- not to convert line #s for better readability of exception messages * Makefile: (very minor) cp --> cp -p Tue Feb 24 2004 T Horinouchi * version 1.0 released * packaging for distribution * put Units into the NumRu module ( --> class NumRu::Units ) * cvs version control started (CVSROOT= dennou-k.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/ruby/cvsroot project name: numru-units) Fri Feb 6 2004 TOYODA Eizi (log written by T Horinouchi 2004/03/24) * revised Fri Nov 7 2003 TOYODA Eizi (log written by T Horinouchi 2004/03/24) * revized Fri Oct 24 2003(or before) TOYODA Eizi(log written by T Horinouchi 2004/03/24) * created