protocol-hpack-1.5.1/0000755000004100000410000000000014700501542014471 5ustar www-datawww-dataprotocol-hpack-1.5.1/lib/0000755000004100000410000000000014700501542015237 5ustar www-datawww-dataprotocol-hpack-1.5.1/lib/protocol/0000755000004100000410000000000014700501542017100 5ustar www-datawww-dataprotocol-hpack-1.5.1/lib/protocol/hpack/0000755000004100000410000000000014700501542020166 5ustar www-datawww-dataprotocol-hpack-1.5.1/lib/protocol/hpack/decompressor.rb0000644000004100000410000001322214700501542023220 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2018-2024, by Samuel Williams. # Copyright, 2024, by Maruth Goyal. # Copyright, 2024, by Nathan Froyd. require_relative "context" require_relative "huffman" module Protocol module HPACK # Responsible for decoding received headers and maintaining compression # context of the opposing peer. Decompressor must be initialized with # appropriate starting context based on local role: client or server. class Decompressor MASK_SHIFT_4 = (~0x0 >> 4) << 4 def initialize(buffer, context = Context.new, table_size_limit: nil) @buffer = buffer @context = context @offset = 0 @table_size_limit = table_size_limit end attr :buffer attr :context attr :offset attr :table_size_limit def end? @offset >= @buffer.bytesize end def read_byte if byte = @buffer.getbyte(@offset) @offset += 1 end return byte end def peek_byte @buffer.getbyte(@offset) end def read_bytes(length) slice = @buffer.byteslice(@offset, length) @offset += length return slice end # Decodes integer value from provided buffer. # # @param bits [Integer] number of available bits # @return [Integer] def read_integer(bits) limit = 2**bits - 1 value = bits.zero? ? 0 : (read_byte & limit) shift = 0 while byte = read_byte value += ((byte & 127) << shift) shift += 7 break if (byte & 128).zero? end if (value == limit) return value end # Decodes string value from provided buffer. # # @return [String] UTF-8 encoded string # @raise [CompressionError] when input is malformed def read_string huffman = (peek_byte & 0x80) == 0x80 length = read_integer(7) raise CompressionError, "Invalid string length!" unless length string = read_bytes(length) raise CompressionError, "Invalid string length, got #{string.bytesize}, expecting #{length}!" unless string.bytesize == length string = Huffman.decode(string) if huffman return string.force_encoding(Encoding::UTF_8) end # Decodes header command from provided buffer. # # @param buffer [Buffer] # @return [Hash] command def read_header pattern = peek_byte header = {} type = nil # (pattern & MASK_SHIFT_4) clears bottom 4 bits, # equivalent to (pattern >> 4) << 4. For the # no-index and never-indexed type we only need to clear # the bottom 4 bits (as specified by NO_INDEX_TYPE[:prefix]) # so we directly check against NO_INDEX_TYPE[:pattern]. # But for change-table-size, incremental, and indexed # we must clear 5,6, and 7 bits respectively. # Consider indexed where we need to clear 7 bits. # Since (pattern & MASK_SHIFT_4)'s bottom 4 bits are cleared # you can visualize it as # # INDEXED_TYPE[:pattern] = 0 0 0 0 0 0 0 # ^^^^^^^^^^^^^^^^ 7 bits # (pattern & MASK_SHIFT_4) = b1 b2 b3 0 0 0 0 # # Computing equality after masking bottom 7 bits (i.e., set b1 = b2 = b3 = 0) # is the same as checking equality against # x1 x2 x3 0 0 0 0 # For *every* possible value of x1, x2, x3 (that is, 2^3 = 8 values). # INDEXED_TYPE[:pattern] = 0x80, so we check against 0x80, 0x90 = 0x80 + (0b001 << 4) # 0xa0 = 0x80 + (0b001 << 5), ..., 0xf0 = 0x80 + (0b111 << 4). # While not the most readable, we have written out everything as constant literals # so Ruby can optimize this case-when to a hash lookup. # # There's no else case as this list is exhaustive. # (0..255).map { |x| (x & -16).to_s(16) }.uniq will show this case (pattern & MASK_SHIFT_4) when 0x00 header[:type] = :no_index type = NO_INDEX_TYPE when 0x10 header[:type] = :never_indexed type = NEVER_INDEXED_TYPE # checking if (pattern >> 5) << 5 == 0x20 # Since we cleared bottom 4 bits, the 5th # bit can be either 0 or 1, so check both # cases. when 0x20, 0x30 header[:type] = :change_table_size type = CHANGE_TABLE_SIZE_TYPE # checking if (pattern >> 6) << 6 == 0x40 # Same logic as above, but now over the 4 # possible combinations of 2 bits (5th, 6th) when 0x40, 0x50, 0x60, 0x70 header[:type] = :incremental type = INCREMENTAL_TYPE # checking if (pattern >> 7) << 7 == 0x80 when 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0 header[:type] = :indexed type = INDEXED_TYPE end header_name = read_integer(type[:prefix]) case header[:type] when :indexed raise CompressionError if header_name.zero? header[:name] = header_name - 1 when :change_table_size header[:name] = header_name header[:value] = header_name if @table_size_limit and header[:value] > @table_size_limit raise CompressionError, "Table size #{header[:value]} exceeds limit #{@table_size_limit}!" end else if header_name.zero? header[:name] = read_string else header[:name] = header_name - 1 end header[:value] = read_string end return header end # Decodes and processes header commands within provided buffer. # # @param buffer [Buffer] # @return [Array] +[[name, value], ...]+ def decode(list = []) while !end? command = read_header if pair = @context.decode(command) list << pair end end if command and command[:type] == :change_table_size raise CompressionError, "Trailing table size update!" end return list end end end end protocol-hpack-1.5.1/lib/protocol/hpack/huffman.rb0000644000004100000410000001544714700501542022152 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2014-2015, by Kaoru Maeda. # Copyright, 2015, by Ilya Grigorik. # Copyright, 2015, by Tamir Duberstein. # Copyright, 2018-2024, by Samuel Williams. # Copyright, 2022, by Daniel Morrison. # Copyright, 2024, by Nathan Froyd. require_relative "huffman/machine" require_relative "error" module Protocol module HPACK # Implementation of huffman encoding for HPACK. class Huffman BITS_AT_ONCE = 4 EOS = 256 # Encodes provided value via huffman encoding. # Length is not encoded in this method. # # @param str [String] # @return [String] binary string def self.encode(str) bitstring = str.each_byte.map {|chr| ENCODE_TABLE[chr]}.join bitstring << "1" * ((8 - bitstring.size) % 8) [bitstring].pack("B*") end # Decodes provided Huffman coded string. # # @param buf [Buffer] # @return [String] binary string # @raise [CompressionError] when Huffman coded string is malformed def self.decode(buffer) emit = String.new.b state = 0 # start state mask = (1 << BITS_AT_ONCE) - 1 buffer.each_byte do |c| shift = BITS_AT_ONCE while shift >= 0 branch = (c >> shift) & mask # MACHINE[state] = [final, [transitions]] # [final] unfinished bits so far are prefix of the EOS code. # Each transition is [emit, next] # [emit] character to be emitted on this transition, empty string, or EOS. # [next] next state number. value, state = MACHINE[state][branch] raise CompressionError, "Huffman decode error (EOS found)" if value == EOS emit << value.chr if value shift -= BITS_AT_ONCE end end # Check whether partial input is correctly filled unless state <= MAX_FINAL_STATE raise CompressionError, "Huffman decode error (EOS invalid)" end emit.force_encoding(Encoding::BINARY) end # Huffman table as specified in https://tools.ietf.org/html/rfc7541#appendix-B CODES = [ [0x1ff8, 13], [0x7fffd8, 23], [0xfffffe2, 28], [0xfffffe3, 28], [0xfffffe4, 28], [0xfffffe5, 28], [0xfffffe6, 28], [0xfffffe7, 28], [0xfffffe8, 28], [0xffffea, 24], [0x3ffffffc, 30], [0xfffffe9, 28], [0xfffffea, 28], [0x3ffffffd, 30], [0xfffffeb, 28], [0xfffffec, 28], [0xfffffed, 28], [0xfffffee, 28], [0xfffffef, 28], [0xffffff0, 28], [0xffffff1, 28], [0xffffff2, 28], [0x3ffffffe, 30], [0xffffff3, 28], [0xffffff4, 28], [0xffffff5, 28], [0xffffff6, 28], [0xffffff7, 28], [0xffffff8, 28], [0xffffff9, 28], [0xffffffa, 28], [0xffffffb, 28], [0x14, 6], [0x3f8, 10], [0x3f9, 10], [0xffa, 12], [0x1ff9, 13], [0x15, 6], [0xf8, 8], [0x7fa, 11], [0x3fa, 10], [0x3fb, 10], [0xf9, 8], [0x7fb, 11], [0xfa, 8], [0x16, 6], [0x17, 6], [0x18, 6], [0x0, 5], [0x1, 5], [0x2, 5], [0x19, 6], [0x1a, 6], [0x1b, 6], [0x1c, 6], [0x1d, 6], [0x1e, 6], [0x1f, 6], [0x5c, 7], [0xfb, 8], [0x7ffc, 15], [0x20, 6], [0xffb, 12], [0x3fc, 10], [0x1ffa, 13], [0x21, 6], [0x5d, 7], [0x5e, 7], [0x5f, 7], [0x60, 7], [0x61, 7], [0x62, 7], [0x63, 7], [0x64, 7], [0x65, 7], [0x66, 7], [0x67, 7], [0x68, 7], [0x69, 7], [0x6a, 7], [0x6b, 7], [0x6c, 7], [0x6d, 7], [0x6e, 7], [0x6f, 7], [0x70, 7], [0x71, 7], [0x72, 7], [0xfc, 8], [0x73, 7], [0xfd, 8], [0x1ffb, 13], [0x7fff0, 19], [0x1ffc, 13], [0x3ffc, 14], [0x22, 6], [0x7ffd, 15], [0x3, 5], [0x23, 6], [0x4, 5], [0x24, 6], [0x5, 5], [0x25, 6], [0x26, 6], [0x27, 6], [0x6, 5], [0x74, 7], [0x75, 7], [0x28, 6], [0x29, 6], [0x2a, 6], [0x7, 5], [0x2b, 6], [0x76, 7], [0x2c, 6], [0x8, 5], [0x9, 5], [0x2d, 6], [0x77, 7], [0x78, 7], [0x79, 7], [0x7a, 7], [0x7b, 7], [0x7ffe, 15], [0x7fc, 11], [0x3ffd, 14], [0x1ffd, 13], [0xffffffc, 28], [0xfffe6, 20], [0x3fffd2, 22], [0xfffe7, 20], [0xfffe8, 20], [0x3fffd3, 22], [0x3fffd4, 22], [0x3fffd5, 22], [0x7fffd9, 23], [0x3fffd6, 22], [0x7fffda, 23], [0x7fffdb, 23], [0x7fffdc, 23], [0x7fffdd, 23], [0x7fffde, 23], [0xffffeb, 24], [0x7fffdf, 23], [0xffffec, 24], [0xffffed, 24], [0x3fffd7, 22], [0x7fffe0, 23], [0xffffee, 24], [0x7fffe1, 23], [0x7fffe2, 23], [0x7fffe3, 23], [0x7fffe4, 23], [0x1fffdc, 21], [0x3fffd8, 22], [0x7fffe5, 23], [0x3fffd9, 22], [0x7fffe6, 23], [0x7fffe7, 23], [0xffffef, 24], [0x3fffda, 22], [0x1fffdd, 21], [0xfffe9, 20], [0x3fffdb, 22], [0x3fffdc, 22], [0x7fffe8, 23], [0x7fffe9, 23], [0x1fffde, 21], [0x7fffea, 23], [0x3fffdd, 22], [0x3fffde, 22], [0xfffff0, 24], [0x1fffdf, 21], [0x3fffdf, 22], [0x7fffeb, 23], [0x7fffec, 23], [0x1fffe0, 21], [0x1fffe1, 21], [0x3fffe0, 22], [0x1fffe2, 21], [0x7fffed, 23], [0x3fffe1, 22], [0x7fffee, 23], [0x7fffef, 23], [0xfffea, 20], [0x3fffe2, 22], [0x3fffe3, 22], [0x3fffe4, 22], [0x7ffff0, 23], [0x3fffe5, 22], [0x3fffe6, 22], [0x7ffff1, 23], [0x3ffffe0, 26], [0x3ffffe1, 26], [0xfffeb, 20], [0x7fff1, 19], [0x3fffe7, 22], [0x7ffff2, 23], [0x3fffe8, 22], [0x1ffffec, 25], [0x3ffffe2, 26], [0x3ffffe3, 26], [0x3ffffe4, 26], [0x7ffffde, 27], [0x7ffffdf, 27], [0x3ffffe5, 26], [0xfffff1, 24], [0x1ffffed, 25], [0x7fff2, 19], [0x1fffe3, 21], [0x3ffffe6, 26], [0x7ffffe0, 27], [0x7ffffe1, 27], [0x3ffffe7, 26], [0x7ffffe2, 27], [0xfffff2, 24], [0x1fffe4, 21], [0x1fffe5, 21], [0x3ffffe8, 26], [0x3ffffe9, 26], [0xffffffd, 28], [0x7ffffe3, 27], [0x7ffffe4, 27], [0x7ffffe5, 27], [0xfffec, 20], [0xfffff3, 24], [0xfffed, 20], [0x1fffe6, 21], [0x3fffe9, 22], [0x1fffe7, 21], [0x1fffe8, 21], [0x7ffff3, 23], [0x3fffea, 22], [0x3fffeb, 22], [0x1ffffee, 25], [0x1ffffef, 25], [0xfffff4, 24], [0xfffff5, 24], [0x3ffffea, 26], [0x7ffff4, 23], [0x3ffffeb, 26], [0x7ffffe6, 27], [0x3ffffec, 26], [0x3ffffed, 26], [0x7ffffe7, 27], [0x7ffffe8, 27], [0x7ffffe9, 27], [0x7ffffea, 27], [0x7ffffeb, 27], [0xffffffe, 28], [0x7ffffec, 27], [0x7ffffed, 27], [0x7ffffee, 27], [0x7ffffef, 27], [0x7fffff0, 27], [0x3ffffee, 26], [0x3fffffff, 30], ].each(&:freeze).freeze ENCODE_TABLE = CODES.map {|c, l| [c].pack("N").unpack1("B*")[-l..-1]}.each(&:freeze).freeze end end end protocol-hpack-1.5.1/lib/protocol/hpack/error.rb0000644000004100000410000000041714700501542021646 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2019-2024, by Samuel Williams. module Protocol module HPACK class Error < StandardError end class CompressionError < Error end class DecompressionError < Error end end end protocol-hpack-1.5.1/lib/protocol/hpack/huffman/0000755000004100000410000000000014700501542021612 5ustar www-datawww-dataprotocol-hpack-1.5.1/lib/protocol/hpack/huffman/generator.rb0000644000004100000410000001066214700501542024132 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2014, by Kaoru Maeda. # Copyright, 2015, by Tamir Duberstein. # Copyright, 2015, by Ilya Grigorik. # Copyright, 2016, by George Ulmer. # Copyright, 2018-2024, by Samuel Williams. # Copyright, 2024, by Nathan Froyd. require_relative "../huffman" require "set" module Protocol module HPACK class Huffman module Generator EOS = 256 class Node attr_accessor :next, :emit, :final, :depth attr_accessor :transitions attr_accessor :id @@id = 0 def initialize(depth) @next = [nil, nil] @id = @@id @@id += 1 @final = false @depth = depth end def add(code, len, chr) self.final = true if chr == EOS && @depth <= 7 if len.zero? @emit = chr else bit = (code & (1 << (len - 1))).zero? ? 0 : 1 node = @next[bit] ||= Node.new(@depth + 1) node.add(code, len - 1, chr) end end class Transition attr_accessor :emit, :node def initialize(emit, node) @emit = emit @node = node end end def self.generate_tree @root = new(0) Protocol::HPACK::Huffman::CODES.each_with_index do |c, chr| code, len = c @root.add(code, len, chr) end puts "#{@@id} nodes" @root end def self.generate_machine generate_tree # Using un-ordered sets (potentially) produces non-deterministic results: togo = Set[@root] @states = Set[@root] until togo.empty? node = togo.first togo.delete(node) next if node.transitions node.transitions = Array[1 << BITS_AT_ONCE] (1 << BITS_AT_ONCE).times do |input| n = node emit = +"" (BITS_AT_ONCE - 1).downto(0) do |i| bit = (input & (1 << i)).zero? ? 0 : 1 n = n.next[bit] next unless n.emit if n.emit == EOS emit = EOS # cause error on decoding else emit << n.emit.chr(Encoding::BINARY) unless emit == EOS end n = @root end node.transitions[input] = Transition.new(emit, n) togo << n @states << n end end puts "#{@states.size} states" @root end MACHINE_PATH = File.expand_path("machine.rb", __dir__) def self.generate_state_table(output_path = MACHINE_PATH) generate_machine state_id = {} id_state = {} state_id[@root] = 0 id_state[0] = @root max_final = 0 id = 1 (@states - [@root]).sort_by {|s| s.final ? 0 : 1}.each do |s| state_id[s] = id id_state[id] = s max_final = id if s.final id += 1 end File.open(output_path, "w") do |file| file.print <<~HEADER # frozen_string_literal: true # Released under the MIT License. # Copyright, 2018-2024, by Samuel Williams. # Machine generated Huffman decoder state machine. # DO NOT EDIT THIS FILE. module Protocol module HPACK class Huffman # :nodoc: MAX_FINAL_STATE = #{max_final} MACHINE = [ HEADER id.times do |i| n = id_state[i] file.print "\t\t\t\t[" string = (1 << BITS_AT_ONCE).times.map do |t| transition = n.transitions.fetch(t) emit = transition.emit unless emit == EOS bytes = emit.bytes fail ArgumentError if bytes.size > 1 emit = bytes.first end "[#{emit.inspect}, #{state_id.fetch(transition.node)}]" end.join(", ") file.print(string) file.print "],\n" end file.print <<~FOOTER ].each {|arr| arr.each {|subarr| subarr.each(&:freeze)}.freeze}.freeze end end end FOOTER end end class << self attr_reader :root end # Test decoder def self.decode(input) emit = "" n = root nibbles = input.unpack("C*").flat_map {|b| [((b & 0xf0) >> 4), b & 0xf]} until nibbles.empty? nb = nibbles.shift t = n.transitions[nb] emit << t.emit n = t.node end unless n.final && nibbles.all? {|x| x == 0xf} puts "len = #{emit.size} n.final = #{n.final} nibbles = #{nibbles}" end emit end end end end end end protocol-hpack-1.5.1/lib/protocol/hpack/huffman/machine.rb0000644000004100000410000013422514700501542023552 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2018-2024, by Samuel Williams. # Machine generated Huffman decoder state machine. # DO NOT EDIT THIS FILE. module Protocol module HPACK class Huffman # :nodoc: MAX_FINAL_STATE = 7 MACHINE = [ [[nil, 163], [nil, 164], [nil, 165], [nil, 166], [nil, 167], [nil, 168], [nil, 169], [nil, 170], [nil, 171], [nil, 172], [nil, 173], [nil, 174], [nil, 175], [nil, 176], [nil, 177], [nil, 3]], [[33, 188], [33, 6], [34, 188], [34, 6], [40, 188], [40, 6], [41, 188], [41, 6], [63, 188], [63, 6], [39, 0], [43, 0], [124, 0], [nil, 236], [nil, 237], [nil, 238]], [[88, 185], [88, 186], [88, 187], [88, 7], [90, 185], [90, 186], [90, 187], [90, 7], [33, 0], [34, 0], [40, 0], [41, 0], [63, 0], [nil, 239], [nil, 240], [nil, 241]], [[119, 188], [119, 6], [120, 188], [120, 6], [121, 188], [121, 6], [122, 188], [122, 6], [38, 0], [42, 0], [44, 0], [59, 0], [88, 0], [90, 0], [nil, 189], [nil, 190]], [[85, 0], [86, 0], [87, 0], [89, 0], [106, 0], [107, 0], [113, 0], [118, 0], [119, 0], [120, 0], [121, 0], [122, 0], [nil, 191], [nil, 192], [nil, 193], [nil, 1]], [[38, 188], [38, 6], [42, 188], [42, 6], [44, 188], [44, 6], [59, 188], [59, 6], [88, 188], [88, 6], [90, 188], [90, 6], [nil, 242], [nil, 243], [nil, 244], [nil, 245]], [[nil, 155], [nil, 156], [nil, 157], [nil, 158], [nil, 159], [nil, 160], [nil, 161], [nil, 162], [nil, 225], [nil, 226], [nil, 227], [nil, 228], [nil, 229], [nil, 230], [nil, 231], [nil, 5]], [[nil, 134], [nil, 135], [nil, 136], [nil, 137], [nil, 138], [nil, 139], [nil, 140], [nil, 141], [nil, 142], [nil, 143], [nil, 144], [nil, 145], [nil, 146], [nil, 147], [nil, 148], [nil, 2]], [[239, 178], [239, 179], [239, 180], [239, 181], [239, 182], [239, 183], [239, 184], [239, 4], [9, 185], [9, 186], [9, 187], [9, 7], [142, 185], [142, 186], [142, 187], [142, 7]], [[197, 178], [197, 179], [197, 180], [197, 181], [197, 182], [197, 183], [197, 184], [197, 4], [231, 178], [231, 179], [231, 180], [231, 181], [231, 182], [231, 183], [231, 184], [231, 4]], [[188, 178], [188, 179], [188, 180], [188, 181], [188, 182], [188, 183], [188, 184], [188, 4], [191, 178], [191, 179], [191, 180], [191, 181], [191, 182], [191, 183], [191, 184], [191, 4]], [[182, 178], [182, 179], [182, 180], [182, 181], [182, 182], [182, 183], [182, 184], [182, 4], [183, 178], [183, 179], [183, 180], [183, 181], [183, 182], [183, 183], [183, 184], [183, 4]], [[175, 178], [175, 179], [175, 180], [175, 181], [175, 182], [175, 183], [175, 184], [175, 4], [180, 178], [180, 179], [180, 180], [180, 181], [180, 182], [180, 183], [180, 184], [180, 4]], [[168, 178], [168, 179], [168, 180], [168, 181], [168, 182], [168, 183], [168, 184], [168, 4], [174, 178], [174, 179], [174, 180], [174, 181], [174, 182], [174, 183], [174, 184], [174, 4]], [[165, 178], [165, 179], [165, 180], [165, 181], [165, 182], [165, 183], [165, 184], [165, 4], [166, 178], [166, 179], [166, 180], [166, 181], [166, 182], [166, 183], [166, 184], [166, 4]], [[157, 178], [157, 179], [157, 180], [157, 181], [157, 182], [157, 183], [157, 184], [157, 4], [158, 178], [158, 179], [158, 180], [158, 181], [158, 182], [158, 183], [158, 184], [158, 4]], [[152, 178], [152, 179], [152, 180], [152, 181], [152, 182], [152, 183], [152, 184], [152, 4], [155, 178], [155, 179], [155, 180], [155, 181], [155, 182], [155, 183], [155, 184], [155, 4]], [[150, 178], [150, 179], [150, 180], [150, 181], [150, 182], [150, 183], [150, 184], [150, 4], [151, 178], [151, 179], [151, 180], [151, 181], [151, 182], [151, 183], [151, 184], [151, 4]], [[147, 178], [147, 179], [147, 180], [147, 181], [147, 182], [147, 183], [147, 184], [147, 4], [149, 178], [149, 179], [149, 180], [149, 181], [149, 182], [149, 183], [149, 184], [149, 4]], [[141, 178], [141, 179], [141, 180], [141, 181], [141, 182], [141, 183], [141, 184], [141, 4], [143, 178], [143, 179], [143, 180], [143, 181], [143, 182], [143, 183], [143, 184], [143, 4]], [[139, 178], [139, 179], [139, 180], [139, 181], [139, 182], [139, 183], [139, 184], [139, 4], [140, 178], [140, 179], [140, 180], [140, 181], [140, 182], [140, 183], [140, 184], [140, 4]], [[198, 178], [198, 179], [198, 180], [198, 181], [198, 182], [198, 183], [198, 184], [198, 4], [228, 178], [228, 179], [228, 180], [228, 181], [228, 182], [228, 183], [228, 184], [228, 4]], [[190, 178], [190, 179], [190, 180], [190, 181], [190, 182], [190, 183], [190, 184], [190, 4], [196, 178], [196, 179], [196, 180], [196, 181], [196, 182], [196, 183], [196, 184], [196, 4]], [[187, 178], [187, 179], [187, 180], [187, 181], [187, 182], [187, 183], [187, 184], [187, 4], [189, 178], [189, 179], [189, 180], [189, 181], [189, 182], [189, 183], [189, 184], [189, 4]], [[185, 178], [185, 179], [185, 180], [185, 181], [185, 182], [185, 183], [185, 184], [185, 4], [186, 178], [186, 179], [186, 180], [186, 181], [186, 182], [186, 183], [186, 184], [186, 4]], [[178, 178], [178, 179], [178, 180], [178, 181], [178, 182], [178, 183], [178, 184], [178, 4], [181, 178], [181, 179], [181, 180], [181, 181], [181, 182], [181, 183], [181, 184], [181, 4]], [[170, 178], [170, 179], [170, 180], [170, 181], [170, 182], [170, 183], [170, 184], [170, 4], [173, 178], [173, 179], [173, 180], [173, 181], [173, 182], [173, 183], [173, 184], [173, 4]], [[164, 178], [164, 179], [164, 180], [164, 181], [164, 182], [164, 183], [164, 184], [164, 4], [169, 178], [169, 179], [169, 180], [169, 181], [169, 182], [169, 183], [169, 184], [169, 4]], [[160, 178], [160, 179], [160, 180], [160, 181], [160, 182], [160, 183], [160, 184], [160, 4], [163, 178], [163, 179], [163, 180], [163, 181], [163, 182], [163, 183], [163, 184], [163, 4]], [[154, 178], [154, 179], [154, 180], [154, 181], [154, 182], [154, 183], [154, 184], [154, 4], [156, 178], [156, 179], [156, 180], [156, 181], [156, 182], [156, 183], [156, 184], [156, 4]], [[136, 178], [136, 179], [136, 180], [136, 181], [136, 182], [136, 183], [136, 184], [136, 4], [146, 178], [146, 179], [146, 180], [146, 181], [146, 182], [146, 183], [146, 184], [146, 4]], [[133, 178], [133, 179], [133, 180], [133, 181], [133, 182], [133, 183], [133, 184], [133, 4], [134, 178], [134, 179], [134, 180], [134, 181], [134, 182], [134, 183], [134, 184], [134, 4]], [[129, 178], [129, 179], [129, 180], [129, 181], [129, 182], [129, 183], [129, 184], [129, 4], [132, 178], [132, 179], [132, 180], [132, 181], [132, 182], [132, 183], [132, 184], [132, 4]], [[nil, 129], [nil, 130], [nil, 131], [nil, 70], [nil, 71], [nil, 72], [nil, 73], [nil, 74], [nil, 75], [nil, 76], [nil, 77], [nil, 78], [nil, 79], [nil, 80], [nil, 81], [nil, 82]], [[192, 0], [193, 0], [200, 0], [201, 0], [202, 0], [205, 0], [210, 0], [213, 0], [218, 0], [219, 0], [238, 0], [240, 0], [242, 0], [243, 0], [255, 0], [nil, 128]], [[236, 185], [236, 186], [236, 187], [236, 7], [237, 185], [237, 186], [237, 187], [237, 7], [199, 188], [199, 6], [207, 188], [207, 6], [234, 188], [234, 6], [235, 188], [235, 6]], [[171, 185], [171, 186], [171, 187], [171, 7], [206, 185], [206, 186], [206, 187], [206, 7], [215, 185], [215, 186], [215, 187], [215, 7], [225, 185], [225, 186], [225, 187], [225, 7]], [[144, 185], [144, 186], [144, 187], [144, 7], [145, 185], [145, 186], [145, 187], [145, 7], [148, 185], [148, 186], [148, 187], [148, 7], [159, 185], [159, 186], [159, 187], [159, 7]], [[224, 185], [224, 186], [224, 187], [224, 7], [226, 185], [226, 186], [226, 187], [226, 7], [153, 188], [153, 6], [161, 188], [161, 6], [167, 188], [167, 6], [172, 188], [172, 6]], [[176, 188], [176, 6], [177, 188], [177, 6], [179, 188], [179, 6], [209, 188], [209, 6], [216, 188], [216, 6], [217, 188], [217, 6], [227, 188], [227, 6], [229, 188], [229, 6]], [[230, 188], [230, 6], [129, 0], [132, 0], [133, 0], [134, 0], [136, 0], [146, 0], [154, 0], [156, 0], [160, 0], [163, 0], [164, 0], [169, 0], [170, 0], [173, 0]], [[178, 0], [181, 0], [185, 0], [186, 0], [187, 0], [189, 0], [190, 0], [196, 0], [198, 0], [228, 0], [232, 0], [233, 0], [nil, 68], [nil, 69], [nil, 20], [nil, 19]], [[nil, 18], [nil, 17], [nil, 16], [nil, 15], [nil, 14], [nil, 13], [nil, 12], [nil, 11], [nil, 10], [nil, 9], [nil, 8], [nil, 37], [nil, 36], [nil, 35], [nil, 34], [nil, 33]], [[92, 185], [92, 186], [92, 187], [92, 7], [195, 185], [195, 186], [195, 187], [195, 7], [208, 185], [208, 186], [208, 187], [208, 7], [128, 188], [128, 6], [130, 188], [130, 6]], [[131, 188], [131, 6], [162, 188], [162, 6], [184, 188], [184, 6], [194, 188], [194, 6], [224, 188], [224, 6], [226, 188], [226, 6], [153, 0], [161, 0], [167, 0], [172, 0]], [[176, 0], [177, 0], [179, 0], [209, 0], [216, 0], [217, 0], [227, 0], [229, 0], [230, 0], [nil, 32], [nil, 31], [nil, 30], [nil, 29], [nil, 28], [nil, 27], [nil, 26]], [[nil, 25], [nil, 24], [nil, 23], [nil, 22], [nil, 21], [nil, 101], [nil, 102], [nil, 103], [nil, 104], [nil, 105], [nil, 106], [nil, 107], [nil, 108], [nil, 109], [nil, 110], [nil, 111]], [[199, 178], [199, 179], [199, 180], [199, 181], [199, 182], [199, 183], [199, 184], [199, 4], [207, 178], [207, 179], [207, 180], [207, 181], [207, 182], [207, 183], [207, 184], [207, 4]], [[234, 178], [234, 179], [234, 180], [234, 181], [234, 182], [234, 183], [234, 184], [234, 4], [235, 178], [235, 179], [235, 180], [235, 181], [235, 182], [235, 183], [235, 184], [235, 4]], [[192, 185], [192, 186], [192, 187], [192, 7], [193, 185], [193, 186], [193, 187], [193, 7], [200, 185], [200, 186], [200, 187], [200, 7], [201, 185], [201, 186], [201, 187], [201, 7]], [[202, 185], [202, 186], [202, 187], [202, 7], [205, 185], [205, 186], [205, 187], [205, 7], [210, 185], [210, 186], [210, 187], [210, 7], [213, 185], [213, 186], [213, 187], [213, 7]], [[218, 185], [218, 186], [218, 187], [218, 7], [219, 185], [219, 186], [219, 187], [219, 7], [238, 185], [238, 186], [238, 187], [238, 7], [240, 185], [240, 186], [240, 187], [240, 7]], [[242, 185], [242, 186], [242, 187], [242, 7], [243, 185], [243, 186], [243, 187], [243, 7], [255, 185], [255, 186], [255, 187], [255, 7], [203, 188], [203, 6], [204, 188], [204, 6]], [[211, 188], [211, 6], [212, 188], [212, 6], [214, 188], [214, 6], [221, 188], [221, 6], [222, 188], [222, 6], [223, 188], [223, 6], [241, 188], [241, 6], [244, 188], [244, 6]], [[245, 188], [245, 6], [246, 188], [246, 6], [247, 188], [247, 6], [248, 188], [248, 6], [250, 188], [250, 6], [251, 188], [251, 6], [252, 188], [252, 6], [253, 188], [253, 6]], [[254, 188], [254, 6], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0], [7, 0], [8, 0], [11, 0], [12, 0], [14, 0], [15, 0], [16, 0], [17, 0], [18, 0]], [[19, 0], [20, 0], [21, 0], [23, 0], [24, 0], [25, 0], [26, 0], [27, 0], [28, 0], [29, 0], [30, 0], [31, 0], [127, 0], [220, 0], [249, 0], [nil, 112]], [[9, 178], [9, 179], [9, 180], [9, 181], [9, 182], [9, 183], [9, 184], [9, 4], [142, 178], [142, 179], [142, 180], [142, 181], [142, 182], [142, 183], [142, 184], [142, 4]], [[144, 178], [144, 179], [144, 180], [144, 181], [144, 182], [144, 183], [144, 184], [144, 4], [145, 178], [145, 179], [145, 180], [145, 181], [145, 182], [145, 183], [145, 184], [145, 4]], [[148, 178], [148, 179], [148, 180], [148, 181], [148, 182], [148, 183], [148, 184], [148, 4], [159, 178], [159, 179], [159, 180], [159, 181], [159, 182], [159, 183], [159, 184], [159, 4]], [[171, 178], [171, 179], [171, 180], [171, 181], [171, 182], [171, 183], [171, 184], [171, 4], [206, 178], [206, 179], [206, 180], [206, 181], [206, 182], [206, 183], [206, 184], [206, 4]], [[215, 178], [215, 179], [215, 180], [215, 181], [215, 182], [215, 183], [215, 184], [215, 4], [225, 178], [225, 179], [225, 180], [225, 181], [225, 182], [225, 183], [225, 184], [225, 4]], [[236, 178], [236, 179], [236, 180], [236, 181], [236, 182], [236, 183], [236, 184], [236, 4], [237, 178], [237, 179], [237, 180], [237, 181], [237, 182], [237, 183], [237, 184], [237, 4]], [[199, 185], [199, 186], [199, 187], [199, 7], [207, 185], [207, 186], [207, 187], [207, 7], [234, 185], [234, 186], [234, 187], [234, 7], [235, 185], [235, 186], [235, 187], [235, 7]], [[192, 188], [192, 6], [193, 188], [193, 6], [200, 188], [200, 6], [201, 188], [201, 6], [202, 188], [202, 6], [205, 188], [205, 6], [210, 188], [210, 6], [213, 188], [213, 6]], [[218, 188], [218, 6], [219, 188], [219, 6], [238, 188], [238, 6], [240, 188], [240, 6], [242, 188], [242, 6], [243, 188], [243, 6], [255, 188], [255, 6], [203, 0], [204, 0]], [[211, 0], [212, 0], [214, 0], [221, 0], [222, 0], [223, 0], [241, 0], [244, 0], [245, 0], [246, 0], [247, 0], [248, 0], [250, 0], [251, 0], [252, 0], [253, 0]], [[254, 0], [nil, 113], [nil, 114], [nil, 115], [nil, 116], [nil, 117], [nil, 118], [nil, 119], [nil, 120], [nil, 121], [nil, 122], [nil, 123], [nil, 124], [nil, 125], [nil, 126], [nil, 127]], [[1, 178], [1, 179], [1, 180], [1, 181], [1, 182], [1, 183], [1, 184], [1, 4], [135, 178], [135, 179], [135, 180], [135, 181], [135, 182], [135, 183], [135, 184], [135, 4]], [[137, 178], [137, 179], [137, 180], [137, 181], [137, 182], [137, 183], [137, 184], [137, 4], [138, 178], [138, 179], [138, 180], [138, 181], [138, 182], [138, 183], [138, 184], [138, 4]], [[241, 178], [241, 179], [241, 180], [241, 181], [241, 182], [241, 183], [241, 184], [241, 4], [244, 178], [244, 179], [244, 180], [244, 181], [244, 182], [244, 183], [244, 184], [244, 4]], [[245, 178], [245, 179], [245, 180], [245, 181], [245, 182], [245, 183], [245, 184], [245, 4], [246, 178], [246, 179], [246, 180], [246, 181], [246, 182], [246, 183], [246, 184], [246, 4]], [[247, 178], [247, 179], [247, 180], [247, 181], [247, 182], [247, 183], [247, 184], [247, 4], [248, 178], [248, 179], [248, 180], [248, 181], [248, 182], [248, 183], [248, 184], [248, 4]], [[250, 178], [250, 179], [250, 180], [250, 181], [250, 182], [250, 183], [250, 184], [250, 4], [251, 178], [251, 179], [251, 180], [251, 181], [251, 182], [251, 183], [251, 184], [251, 4]], [[252, 178], [252, 179], [252, 180], [252, 181], [252, 182], [252, 183], [252, 184], [252, 4], [253, 178], [253, 179], [253, 180], [253, 181], [253, 182], [253, 183], [253, 184], [253, 4]], [[254, 178], [254, 179], [254, 180], [254, 181], [254, 182], [254, 183], [254, 184], [254, 4], [2, 185], [2, 186], [2, 187], [2, 7], [3, 185], [3, 186], [3, 187], [3, 7]], [[4, 185], [4, 186], [4, 187], [4, 7], [5, 185], [5, 186], [5, 187], [5, 7], [6, 185], [6, 186], [6, 187], [6, 7], [7, 185], [7, 186], [7, 187], [7, 7]], [[8, 185], [8, 186], [8, 187], [8, 7], [11, 185], [11, 186], [11, 187], [11, 7], [12, 185], [12, 186], [12, 187], [12, 7], [14, 185], [14, 186], [14, 187], [14, 7]], [[15, 185], [15, 186], [15, 187], [15, 7], [16, 185], [16, 186], [16, 187], [16, 7], [17, 185], [17, 186], [17, 187], [17, 7], [18, 185], [18, 186], [18, 187], [18, 7]], [[19, 185], [19, 186], [19, 187], [19, 7], [20, 185], [20, 186], [20, 187], [20, 7], [21, 185], [21, 186], [21, 187], [21, 7], [23, 185], [23, 186], [23, 187], [23, 7]], [[24, 185], [24, 186], [24, 187], [24, 7], [25, 185], [25, 186], [25, 187], [25, 7], [26, 185], [26, 186], [26, 187], [26, 7], [27, 185], [27, 186], [27, 187], [27, 7]], [[28, 185], [28, 186], [28, 187], [28, 7], [29, 185], [29, 186], [29, 187], [29, 7], [30, 185], [30, 186], [30, 187], [30, 7], [31, 185], [31, 186], [31, 187], [31, 7]], [[127, 185], [127, 186], [127, 187], [127, 7], [220, 185], [220, 186], [220, 187], [220, 7], [249, 185], [249, 186], [249, 187], [249, 7], [10, 0], [13, 0], [22, 0], [256, 0]], [[192, 178], [192, 179], [192, 180], [192, 181], [192, 182], [192, 183], [192, 184], [192, 4], [193, 178], [193, 179], [193, 180], [193, 181], [193, 182], [193, 183], [193, 184], [193, 4]], [[200, 178], [200, 179], [200, 180], [200, 181], [200, 182], [200, 183], [200, 184], [200, 4], [201, 178], [201, 179], [201, 180], [201, 181], [201, 182], [201, 183], [201, 184], [201, 4]], [[202, 178], [202, 179], [202, 180], [202, 181], [202, 182], [202, 183], [202, 184], [202, 4], [205, 178], [205, 179], [205, 180], [205, 181], [205, 182], [205, 183], [205, 184], [205, 4]], [[210, 178], [210, 179], [210, 180], [210, 181], [210, 182], [210, 183], [210, 184], [210, 4], [213, 178], [213, 179], [213, 180], [213, 181], [213, 182], [213, 183], [213, 184], [213, 4]], [[218, 178], [218, 179], [218, 180], [218, 181], [218, 182], [218, 183], [218, 184], [218, 4], [219, 178], [219, 179], [219, 180], [219, 181], [219, 182], [219, 183], [219, 184], [219, 4]], [[238, 178], [238, 179], [238, 180], [238, 181], [238, 182], [238, 183], [238, 184], [238, 4], [240, 178], [240, 179], [240, 180], [240, 181], [240, 182], [240, 183], [240, 184], [240, 4]], [[242, 178], [242, 179], [242, 180], [242, 181], [242, 182], [242, 183], [242, 184], [242, 4], [243, 178], [243, 179], [243, 180], [243, 181], [243, 182], [243, 183], [243, 184], [243, 4]], [[255, 178], [255, 179], [255, 180], [255, 181], [255, 182], [255, 183], [255, 184], [255, 4], [203, 185], [203, 186], [203, 187], [203, 7], [204, 185], [204, 186], [204, 187], [204, 7]], [[211, 185], [211, 186], [211, 187], [211, 7], [212, 185], [212, 186], [212, 187], [212, 7], [214, 185], [214, 186], [214, 187], [214, 7], [221, 185], [221, 186], [221, 187], [221, 7]], [[222, 185], [222, 186], [222, 187], [222, 7], [223, 185], [223, 186], [223, 187], [223, 7], [241, 185], [241, 186], [241, 187], [241, 7], [244, 185], [244, 186], [244, 187], [244, 7]], [[245, 185], [245, 186], [245, 187], [245, 7], [246, 185], [246, 186], [246, 187], [246, 7], [247, 185], [247, 186], [247, 187], [247, 7], [248, 185], [248, 186], [248, 187], [248, 7]], [[250, 185], [250, 186], [250, 187], [250, 7], [251, 185], [251, 186], [251, 187], [251, 7], [252, 185], [252, 186], [252, 187], [252, 7], [253, 185], [253, 186], [253, 187], [253, 7]], [[254, 185], [254, 186], [254, 187], [254, 7], [2, 188], [2, 6], [3, 188], [3, 6], [4, 188], [4, 6], [5, 188], [5, 6], [6, 188], [6, 6], [7, 188], [7, 6]], [[8, 188], [8, 6], [11, 188], [11, 6], [12, 188], [12, 6], [14, 188], [14, 6], [15, 188], [15, 6], [16, 188], [16, 6], [17, 188], [17, 6], [18, 188], [18, 6]], [[19, 188], [19, 6], [20, 188], [20, 6], [21, 188], [21, 6], [23, 188], [23, 6], [24, 188], [24, 6], [25, 188], [25, 6], [26, 188], [26, 6], [27, 188], [27, 6]], [[28, 188], [28, 6], [29, 188], [29, 6], [30, 188], [30, 6], [31, 188], [31, 6], [127, 188], [127, 6], [220, 188], [220, 6], [249, 188], [249, 6], [nil, 99], [nil, 100]], [[10, 178], [10, 179], [10, 180], [10, 181], [10, 182], [10, 183], [10, 184], [10, 4], [13, 178], [13, 179], [13, 180], [13, 181], [13, 182], [13, 183], [13, 184], [13, 4]], [[22, 178], [22, 179], [22, 180], [22, 181], [22, 182], [22, 183], [22, 184], [22, 4], [256, 178], [256, 179], [256, 180], [256, 181], [256, 182], [256, 183], [256, 184], [256, 4]], [[232, 178], [232, 179], [232, 180], [232, 181], [232, 182], [232, 183], [232, 184], [232, 4], [233, 178], [233, 179], [233, 180], [233, 181], [233, 182], [233, 183], [233, 184], [233, 4]], [[1, 185], [1, 186], [1, 187], [1, 7], [135, 185], [135, 186], [135, 187], [135, 7], [137, 185], [137, 186], [137, 187], [137, 7], [138, 185], [138, 186], [138, 187], [138, 7]], [[139, 185], [139, 186], [139, 187], [139, 7], [140, 185], [140, 186], [140, 187], [140, 7], [141, 185], [141, 186], [141, 187], [141, 7], [143, 185], [143, 186], [143, 187], [143, 7]], [[147, 185], [147, 186], [147, 187], [147, 7], [149, 185], [149, 186], [149, 187], [149, 7], [150, 185], [150, 186], [150, 187], [150, 7], [151, 185], [151, 186], [151, 187], [151, 7]], [[152, 185], [152, 186], [152, 187], [152, 7], [155, 185], [155, 186], [155, 187], [155, 7], [157, 185], [157, 186], [157, 187], [157, 7], [158, 185], [158, 186], [158, 187], [158, 7]], [[165, 185], [165, 186], [165, 187], [165, 7], [166, 185], [166, 186], [166, 187], [166, 7], [168, 185], [168, 186], [168, 187], [168, 7], [174, 185], [174, 186], [174, 187], [174, 7]], [[175, 185], [175, 186], [175, 187], [175, 7], [180, 185], [180, 186], [180, 187], [180, 7], [182, 185], [182, 186], [182, 187], [182, 7], [183, 185], [183, 186], [183, 187], [183, 7]], [[188, 185], [188, 186], [188, 187], [188, 7], [191, 185], [191, 186], [191, 187], [191, 7], [197, 185], [197, 186], [197, 187], [197, 7], [231, 185], [231, 186], [231, 187], [231, 7]], [[239, 185], [239, 186], [239, 187], [239, 7], [9, 188], [9, 6], [142, 188], [142, 6], [144, 188], [144, 6], [145, 188], [145, 6], [148, 188], [148, 6], [159, 188], [159, 6]], [[171, 188], [171, 6], [206, 188], [206, 6], [215, 188], [215, 6], [225, 188], [225, 6], [236, 188], [236, 6], [237, 188], [237, 6], [199, 0], [207, 0], [234, 0], [235, 0]], [[nil, 83], [nil, 84], [nil, 85], [nil, 86], [nil, 87], [nil, 88], [nil, 89], [nil, 90], [nil, 91], [nil, 92], [nil, 93], [nil, 94], [nil, 95], [nil, 96], [nil, 97], [nil, 98]], [[10, 185], [10, 186], [10, 187], [10, 7], [13, 185], [13, 186], [13, 187], [13, 7], [22, 185], [22, 186], [22, 187], [22, 7], [256, 185], [256, 186], [256, 187], [256, 7]], [[2, 178], [2, 179], [2, 180], [2, 181], [2, 182], [2, 183], [2, 184], [2, 4], [3, 178], [3, 179], [3, 180], [3, 181], [3, 182], [3, 183], [3, 184], [3, 4]], [[4, 178], [4, 179], [4, 180], [4, 181], [4, 182], [4, 183], [4, 184], [4, 4], [5, 178], [5, 179], [5, 180], [5, 181], [5, 182], [5, 183], [5, 184], [5, 4]], [[6, 178], [6, 179], [6, 180], [6, 181], [6, 182], [6, 183], [6, 184], [6, 4], [7, 178], [7, 179], [7, 180], [7, 181], [7, 182], [7, 183], [7, 184], [7, 4]], [[8, 178], [8, 179], [8, 180], [8, 181], [8, 182], [8, 183], [8, 184], [8, 4], [11, 178], [11, 179], [11, 180], [11, 181], [11, 182], [11, 183], [11, 184], [11, 4]], [[12, 178], [12, 179], [12, 180], [12, 181], [12, 182], [12, 183], [12, 184], [12, 4], [14, 178], [14, 179], [14, 180], [14, 181], [14, 182], [14, 183], [14, 184], [14, 4]], [[15, 178], [15, 179], [15, 180], [15, 181], [15, 182], [15, 183], [15, 184], [15, 4], [16, 178], [16, 179], [16, 180], [16, 181], [16, 182], [16, 183], [16, 184], [16, 4]], [[17, 178], [17, 179], [17, 180], [17, 181], [17, 182], [17, 183], [17, 184], [17, 4], [18, 178], [18, 179], [18, 180], [18, 181], [18, 182], [18, 183], [18, 184], [18, 4]], [[19, 178], [19, 179], [19, 180], [19, 181], [19, 182], [19, 183], [19, 184], [19, 4], [20, 178], [20, 179], [20, 180], [20, 181], [20, 182], [20, 183], [20, 184], [20, 4]], [[21, 178], [21, 179], [21, 180], [21, 181], [21, 182], [21, 183], [21, 184], [21, 4], [23, 178], [23, 179], [23, 180], [23, 181], [23, 182], [23, 183], [23, 184], [23, 4]], [[24, 178], [24, 179], [24, 180], [24, 181], [24, 182], [24, 183], [24, 184], [24, 4], [25, 178], [25, 179], [25, 180], [25, 181], [25, 182], [25, 183], [25, 184], [25, 4]], [[26, 178], [26, 179], [26, 180], [26, 181], [26, 182], [26, 183], [26, 184], [26, 4], [27, 178], [27, 179], [27, 180], [27, 181], [27, 182], [27, 183], [27, 184], [27, 4]], [[28, 178], [28, 179], [28, 180], [28, 181], [28, 182], [28, 183], [28, 184], [28, 4], [29, 178], [29, 179], [29, 180], [29, 181], [29, 182], [29, 183], [29, 184], [29, 4]], [[30, 178], [30, 179], [30, 180], [30, 181], [30, 182], [30, 183], [30, 184], [30, 4], [31, 178], [31, 179], [31, 180], [31, 181], [31, 182], [31, 183], [31, 184], [31, 4]], [[127, 178], [127, 179], [127, 180], [127, 181], [127, 182], [127, 183], [127, 184], [127, 4], [220, 178], [220, 179], [220, 180], [220, 181], [220, 182], [220, 183], [220, 184], [220, 4]], [[249, 178], [249, 179], [249, 180], [249, 181], [249, 182], [249, 183], [249, 184], [249, 4], [10, 188], [10, 6], [13, 188], [13, 6], [22, 188], [22, 6], [256, 188], [256, 6]], [[203, 178], [203, 179], [203, 180], [203, 181], [203, 182], [203, 183], [203, 184], [203, 4], [204, 178], [204, 179], [204, 180], [204, 181], [204, 182], [204, 183], [204, 184], [204, 4]], [[211, 178], [211, 179], [211, 180], [211, 181], [211, 182], [211, 183], [211, 184], [211, 4], [212, 178], [212, 179], [212, 180], [212, 181], [212, 182], [212, 183], [212, 184], [212, 4]], [[214, 178], [214, 179], [214, 180], [214, 181], [214, 182], [214, 183], [214, 184], [214, 4], [221, 178], [221, 179], [221, 180], [221, 181], [221, 182], [221, 183], [221, 184], [221, 4]], [[222, 178], [222, 179], [222, 180], [222, 181], [222, 182], [222, 183], [222, 184], [222, 4], [223, 178], [223, 179], [223, 180], [223, 181], [223, 182], [223, 183], [223, 184], [223, 4]], [[58, 178], [58, 179], [58, 180], [58, 181], [58, 182], [58, 183], [58, 184], [58, 4], [66, 178], [66, 179], [66, 180], [66, 181], [66, 182], [66, 183], [66, 184], [66, 4]], [[67, 178], [67, 179], [67, 180], [67, 181], [67, 182], [67, 183], [67, 184], [67, 4], [68, 178], [68, 179], [68, 180], [68, 181], [68, 182], [68, 183], [68, 184], [68, 4]], [[69, 178], [69, 179], [69, 180], [69, 181], [69, 182], [69, 183], [69, 184], [69, 4], [70, 178], [70, 179], [70, 180], [70, 181], [70, 182], [70, 183], [70, 184], [70, 4]], [[71, 178], [71, 179], [71, 180], [71, 181], [71, 182], [71, 183], [71, 184], [71, 4], [72, 178], [72, 179], [72, 180], [72, 181], [72, 182], [72, 183], [72, 184], [72, 4]], [[73, 178], [73, 179], [73, 180], [73, 181], [73, 182], [73, 183], [73, 184], [73, 4], [74, 178], [74, 179], [74, 180], [74, 181], [74, 182], [74, 183], [74, 184], [74, 4]], [[75, 178], [75, 179], [75, 180], [75, 181], [75, 182], [75, 183], [75, 184], [75, 4], [76, 178], [76, 179], [76, 180], [76, 181], [76, 182], [76, 183], [76, 184], [76, 4]], [[77, 178], [77, 179], [77, 180], [77, 181], [77, 182], [77, 183], [77, 184], [77, 4], [78, 178], [78, 179], [78, 180], [78, 181], [78, 182], [78, 183], [78, 184], [78, 4]], [[79, 178], [79, 179], [79, 180], [79, 181], [79, 182], [79, 183], [79, 184], [79, 4], [80, 178], [80, 179], [80, 180], [80, 181], [80, 182], [80, 183], [80, 184], [80, 4]], [[81, 178], [81, 179], [81, 180], [81, 181], [81, 182], [81, 183], [81, 184], [81, 4], [82, 178], [82, 179], [82, 180], [82, 181], [82, 182], [82, 183], [82, 184], [82, 4]], [[83, 178], [83, 179], [83, 180], [83, 181], [83, 182], [83, 183], [83, 184], [83, 4], [84, 178], [84, 179], [84, 180], [84, 181], [84, 182], [84, 183], [84, 184], [84, 4]], [[85, 178], [85, 179], [85, 180], [85, 181], [85, 182], [85, 183], [85, 184], [85, 4], [86, 178], [86, 179], [86, 180], [86, 181], [86, 182], [86, 183], [86, 184], [86, 4]], [[87, 178], [87, 179], [87, 180], [87, 181], [87, 182], [87, 183], [87, 184], [87, 4], [89, 178], [89, 179], [89, 180], [89, 181], [89, 182], [89, 183], [89, 184], [89, 4]], [[106, 178], [106, 179], [106, 180], [106, 181], [106, 182], [106, 183], [106, 184], [106, 4], [107, 178], [107, 179], [107, 180], [107, 181], [107, 182], [107, 183], [107, 184], [107, 4]], [[113, 178], [113, 179], [113, 180], [113, 181], [113, 182], [113, 183], [113, 184], [113, 4], [118, 178], [118, 179], [118, 180], [118, 181], [118, 182], [118, 183], [118, 184], [118, 4]], [[119, 178], [119, 179], [119, 180], [119, 181], [119, 182], [119, 183], [119, 184], [119, 4], [120, 178], [120, 179], [120, 180], [120, 181], [120, 182], [120, 183], [120, 184], [120, 4]], [[121, 178], [121, 179], [121, 180], [121, 181], [121, 182], [121, 183], [121, 184], [121, 4], [122, 178], [122, 179], [122, 180], [122, 181], [122, 182], [122, 183], [122, 184], [122, 4]], [[38, 185], [38, 186], [38, 187], [38, 7], [42, 185], [42, 186], [42, 187], [42, 7], [44, 185], [44, 186], [44, 187], [44, 7], [59, 185], [59, 186], [59, 187], [59, 7]], [[32, 178], [32, 179], [32, 180], [32, 181], [32, 182], [32, 183], [32, 184], [32, 4], [37, 178], [37, 179], [37, 180], [37, 181], [37, 182], [37, 183], [37, 184], [37, 4]], [[45, 178], [45, 179], [45, 180], [45, 181], [45, 182], [45, 183], [45, 184], [45, 4], [46, 178], [46, 179], [46, 180], [46, 181], [46, 182], [46, 183], [46, 184], [46, 4]], [[47, 178], [47, 179], [47, 180], [47, 181], [47, 182], [47, 183], [47, 184], [47, 4], [51, 178], [51, 179], [51, 180], [51, 181], [51, 182], [51, 183], [51, 184], [51, 4]], [[52, 178], [52, 179], [52, 180], [52, 181], [52, 182], [52, 183], [52, 184], [52, 4], [53, 178], [53, 179], [53, 180], [53, 181], [53, 182], [53, 183], [53, 184], [53, 4]], [[54, 178], [54, 179], [54, 180], [54, 181], [54, 182], [54, 183], [54, 184], [54, 4], [55, 178], [55, 179], [55, 180], [55, 181], [55, 182], [55, 183], [55, 184], [55, 4]], [[56, 178], [56, 179], [56, 180], [56, 181], [56, 182], [56, 183], [56, 184], [56, 4], [57, 178], [57, 179], [57, 180], [57, 181], [57, 182], [57, 183], [57, 184], [57, 4]], [[61, 178], [61, 179], [61, 180], [61, 181], [61, 182], [61, 183], [61, 184], [61, 4], [65, 178], [65, 179], [65, 180], [65, 181], [65, 182], [65, 183], [65, 184], [65, 4]], [[95, 178], [95, 179], [95, 180], [95, 181], [95, 182], [95, 183], [95, 184], [95, 4], [98, 178], [98, 179], [98, 180], [98, 181], [98, 182], [98, 183], [98, 184], [98, 4]], [[100, 178], [100, 179], [100, 180], [100, 181], [100, 182], [100, 183], [100, 184], [100, 4], [102, 178], [102, 179], [102, 180], [102, 181], [102, 182], [102, 183], [102, 184], [102, 4]], [[103, 178], [103, 179], [103, 180], [103, 181], [103, 182], [103, 183], [103, 184], [103, 4], [104, 178], [104, 179], [104, 180], [104, 181], [104, 182], [104, 183], [104, 184], [104, 4]], [[108, 178], [108, 179], [108, 180], [108, 181], [108, 182], [108, 183], [108, 184], [108, 4], [109, 178], [109, 179], [109, 180], [109, 181], [109, 182], [109, 183], [109, 184], [109, 4]], [[110, 178], [110, 179], [110, 180], [110, 181], [110, 182], [110, 183], [110, 184], [110, 4], [112, 178], [112, 179], [112, 180], [112, 181], [112, 182], [112, 183], [112, 184], [112, 4]], [[114, 178], [114, 179], [114, 180], [114, 181], [114, 182], [114, 183], [114, 184], [114, 4], [117, 178], [117, 179], [117, 180], [117, 181], [117, 182], [117, 183], [117, 184], [117, 4]], [[58, 185], [58, 186], [58, 187], [58, 7], [66, 185], [66, 186], [66, 187], [66, 7], [67, 185], [67, 186], [67, 187], [67, 7], [68, 185], [68, 186], [68, 187], [68, 7]], [[48, 178], [48, 179], [48, 180], [48, 181], [48, 182], [48, 183], [48, 184], [48, 4], [49, 178], [49, 179], [49, 180], [49, 181], [49, 182], [49, 183], [49, 184], [49, 4]], [[50, 178], [50, 179], [50, 180], [50, 181], [50, 182], [50, 183], [50, 184], [50, 4], [97, 178], [97, 179], [97, 180], [97, 181], [97, 182], [97, 183], [97, 184], [97, 4]], [[99, 178], [99, 179], [99, 180], [99, 181], [99, 182], [99, 183], [99, 184], [99, 4], [101, 178], [101, 179], [101, 180], [101, 181], [101, 182], [101, 183], [101, 184], [101, 4]], [[105, 178], [105, 179], [105, 180], [105, 181], [105, 182], [105, 183], [105, 184], [105, 4], [111, 178], [111, 179], [111, 180], [111, 181], [111, 182], [111, 183], [111, 184], [111, 4]], [[115, 178], [115, 179], [115, 180], [115, 181], [115, 182], [115, 183], [115, 184], [115, 4], [116, 178], [116, 179], [116, 180], [116, 181], [116, 182], [116, 183], [116, 184], [116, 4]], [[32, 185], [32, 186], [32, 187], [32, 7], [37, 185], [37, 186], [37, 187], [37, 7], [45, 185], [45, 186], [45, 187], [45, 7], [46, 185], [46, 186], [46, 187], [46, 7]], [[47, 185], [47, 186], [47, 187], [47, 7], [51, 185], [51, 186], [51, 187], [51, 7], [52, 185], [52, 186], [52, 187], [52, 7], [53, 185], [53, 186], [53, 187], [53, 7]], [[54, 185], [54, 186], [54, 187], [54, 7], [55, 185], [55, 186], [55, 187], [55, 7], [56, 185], [56, 186], [56, 187], [56, 7], [57, 185], [57, 186], [57, 187], [57, 7]], [[61, 185], [61, 186], [61, 187], [61, 7], [65, 185], [65, 186], [65, 187], [65, 7], [95, 185], [95, 186], [95, 187], [95, 7], [98, 185], [98, 186], [98, 187], [98, 7]], [[100, 185], [100, 186], [100, 187], [100, 7], [102, 185], [102, 186], [102, 187], [102, 7], [103, 185], [103, 186], [103, 187], [103, 7], [104, 185], [104, 186], [104, 187], [104, 7]], [[108, 185], [108, 186], [108, 187], [108, 7], [109, 185], [109, 186], [109, 187], [109, 7], [110, 185], [110, 186], [110, 187], [110, 7], [112, 185], [112, 186], [112, 187], [112, 7]], [[114, 185], [114, 186], [114, 187], [114, 7], [117, 185], [117, 186], [117, 187], [117, 7], [58, 188], [58, 6], [66, 188], [66, 6], [67, 188], [67, 6], [68, 188], [68, 6]], [[69, 188], [69, 6], [70, 188], [70, 6], [71, 188], [71, 6], [72, 188], [72, 6], [73, 188], [73, 6], [74, 188], [74, 6], [75, 188], [75, 6], [76, 188], [76, 6]], [[77, 188], [77, 6], [78, 188], [78, 6], [79, 188], [79, 6], [80, 188], [80, 6], [81, 188], [81, 6], [82, 188], [82, 6], [83, 188], [83, 6], [84, 188], [84, 6]], [[85, 188], [85, 6], [86, 188], [86, 6], [87, 188], [87, 6], [89, 188], [89, 6], [106, 188], [106, 6], [107, 188], [107, 6], [113, 188], [113, 6], [118, 188], [118, 6]], [[48, 185], [48, 186], [48, 187], [48, 7], [49, 185], [49, 186], [49, 187], [49, 7], [50, 185], [50, 186], [50, 187], [50, 7], [97, 185], [97, 186], [97, 187], [97, 7]], [[99, 185], [99, 186], [99, 187], [99, 7], [101, 185], [101, 186], [101, 187], [101, 7], [105, 185], [105, 186], [105, 187], [105, 7], [111, 185], [111, 186], [111, 187], [111, 7]], [[115, 185], [115, 186], [115, 187], [115, 7], [116, 185], [116, 186], [116, 187], [116, 7], [32, 188], [32, 6], [37, 188], [37, 6], [45, 188], [45, 6], [46, 188], [46, 6]], [[47, 188], [47, 6], [51, 188], [51, 6], [52, 188], [52, 6], [53, 188], [53, 6], [54, 188], [54, 6], [55, 188], [55, 6], [56, 188], [56, 6], [57, 188], [57, 6]], [[61, 188], [61, 6], [65, 188], [65, 6], [95, 188], [95, 6], [98, 188], [98, 6], [100, 188], [100, 6], [102, 188], [102, 6], [103, 188], [103, 6], [104, 188], [104, 6]], [[108, 188], [108, 6], [109, 188], [109, 6], [110, 188], [110, 6], [112, 188], [112, 6], [114, 188], [114, 6], [117, 188], [117, 6], [58, 0], [66, 0], [67, 0], [68, 0]], [[69, 0], [70, 0], [71, 0], [72, 0], [73, 0], [74, 0], [75, 0], [76, 0], [77, 0], [78, 0], [79, 0], [80, 0], [81, 0], [82, 0], [83, 0], [84, 0]], [[48, 188], [48, 6], [49, 188], [49, 6], [50, 188], [50, 6], [97, 188], [97, 6], [99, 188], [99, 6], [101, 188], [101, 6], [105, 188], [105, 6], [111, 188], [111, 6]], [[115, 188], [115, 6], [116, 188], [116, 6], [32, 0], [37, 0], [45, 0], [46, 0], [47, 0], [51, 0], [52, 0], [53, 0], [54, 0], [55, 0], [56, 0], [57, 0]], [[61, 0], [65, 0], [95, 0], [98, 0], [100, 0], [102, 0], [103, 0], [104, 0], [108, 0], [109, 0], [110, 0], [112, 0], [114, 0], [117, 0], [nil, 132], [nil, 133]], [[48, 0], [49, 0], [50, 0], [97, 0], [99, 0], [101, 0], [105, 0], [111, 0], [115, 0], [116, 0], [nil, 149], [nil, 150], [nil, 151], [nil, 152], [nil, 153], [nil, 154]], [[33, 185], [33, 186], [33, 187], [33, 7], [34, 185], [34, 186], [34, 187], [34, 7], [40, 185], [40, 186], [40, 187], [40, 7], [41, 185], [41, 186], [41, 187], [41, 7]], [[63, 185], [63, 186], [63, 187], [63, 7], [39, 188], [39, 6], [43, 188], [43, 6], [124, 188], [124, 6], [35, 0], [62, 0], [nil, 232], [nil, 233], [nil, 234], [nil, 235]], [[38, 178], [38, 179], [38, 180], [38, 181], [38, 182], [38, 183], [38, 184], [38, 4], [42, 178], [42, 179], [42, 180], [42, 181], [42, 182], [42, 183], [42, 184], [42, 4]], [[44, 178], [44, 179], [44, 180], [44, 181], [44, 182], [44, 183], [44, 184], [44, 4], [59, 178], [59, 179], [59, 180], [59, 181], [59, 182], [59, 183], [59, 184], [59, 4]], [[88, 178], [88, 179], [88, 180], [88, 181], [88, 182], [88, 183], [88, 184], [88, 4], [90, 178], [90, 179], [90, 180], [90, 181], [90, 182], [90, 183], [90, 184], [90, 4]], [[179, 178], [179, 179], [179, 180], [179, 181], [179, 182], [179, 183], [179, 184], [179, 4], [209, 178], [209, 179], [209, 180], [209, 181], [209, 182], [209, 183], [209, 184], [209, 4]], [[216, 178], [216, 179], [216, 180], [216, 181], [216, 182], [216, 183], [216, 184], [216, 4], [217, 178], [217, 179], [217, 180], [217, 181], [217, 182], [217, 183], [217, 184], [217, 4]], [[227, 178], [227, 179], [227, 180], [227, 181], [227, 182], [227, 183], [227, 184], [227, 4], [229, 178], [229, 179], [229, 180], [229, 181], [229, 182], [229, 183], [229, 184], [229, 4]], [[230, 178], [230, 179], [230, 180], [230, 181], [230, 182], [230, 183], [230, 184], [230, 4], [129, 185], [129, 186], [129, 187], [129, 7], [132, 185], [132, 186], [132, 187], [132, 7]], [[133, 185], [133, 186], [133, 187], [133, 7], [134, 185], [134, 186], [134, 187], [134, 7], [136, 185], [136, 186], [136, 187], [136, 7], [146, 185], [146, 186], [146, 187], [146, 7]], [[154, 185], [154, 186], [154, 187], [154, 7], [156, 185], [156, 186], [156, 187], [156, 7], [160, 185], [160, 186], [160, 187], [160, 7], [163, 185], [163, 186], [163, 187], [163, 7]], [[164, 185], [164, 186], [164, 187], [164, 7], [169, 185], [169, 186], [169, 187], [169, 7], [170, 185], [170, 186], [170, 187], [170, 7], [173, 185], [173, 186], [173, 187], [173, 7]], [[178, 185], [178, 186], [178, 187], [178, 7], [181, 185], [181, 186], [181, 187], [181, 7], [185, 185], [185, 186], [185, 187], [185, 7], [186, 185], [186, 186], [186, 187], [186, 7]], [[187, 185], [187, 186], [187, 187], [187, 7], [189, 185], [189, 186], [189, 187], [189, 7], [190, 185], [190, 186], [190, 187], [190, 7], [196, 185], [196, 186], [196, 187], [196, 7]], [[198, 185], [198, 186], [198, 187], [198, 7], [228, 185], [228, 186], [228, 187], [228, 7], [232, 185], [232, 186], [232, 187], [232, 7], [233, 185], [233, 186], [233, 187], [233, 7]], [[1, 188], [1, 6], [135, 188], [135, 6], [137, 188], [137, 6], [138, 188], [138, 6], [139, 188], [139, 6], [140, 188], [140, 6], [141, 188], [141, 6], [143, 188], [143, 6]], [[147, 188], [147, 6], [149, 188], [149, 6], [150, 188], [150, 6], [151, 188], [151, 6], [152, 188], [152, 6], [155, 188], [155, 6], [157, 188], [157, 6], [158, 188], [158, 6]], [[165, 188], [165, 6], [166, 188], [166, 6], [168, 188], [168, 6], [174, 188], [174, 6], [175, 188], [175, 6], [180, 188], [180, 6], [182, 188], [182, 6], [183, 188], [183, 6]], [[188, 188], [188, 6], [191, 188], [191, 6], [197, 188], [197, 6], [231, 188], [231, 6], [239, 188], [239, 6], [9, 0], [142, 0], [144, 0], [145, 0], [148, 0], [159, 0]], [[171, 0], [206, 0], [215, 0], [225, 0], [236, 0], [237, 0], [nil, 47], [nil, 48], [nil, 49], [nil, 50], [nil, 51], [nil, 52], [nil, 53], [nil, 54], [nil, 55], [nil, 56]], [[128, 178], [128, 179], [128, 180], [128, 181], [128, 182], [128, 183], [128, 184], [128, 4], [130, 178], [130, 179], [130, 180], [130, 181], [130, 182], [130, 183], [130, 184], [130, 4]], [[131, 178], [131, 179], [131, 180], [131, 181], [131, 182], [131, 183], [131, 184], [131, 4], [162, 178], [162, 179], [162, 180], [162, 181], [162, 182], [162, 183], [162, 184], [162, 4]], [[184, 178], [184, 179], [184, 180], [184, 181], [184, 182], [184, 183], [184, 184], [184, 4], [194, 178], [194, 179], [194, 180], [194, 181], [194, 182], [194, 183], [194, 184], [194, 4]], [[224, 178], [224, 179], [224, 180], [224, 181], [224, 182], [224, 183], [224, 184], [224, 4], [226, 178], [226, 179], [226, 180], [226, 181], [226, 182], [226, 183], [226, 184], [226, 4]], [[153, 185], [153, 186], [153, 187], [153, 7], [161, 185], [161, 186], [161, 187], [161, 7], [167, 185], [167, 186], [167, 187], [167, 7], [172, 185], [172, 186], [172, 187], [172, 7]], [[176, 185], [176, 186], [176, 187], [176, 7], [177, 185], [177, 186], [177, 187], [177, 7], [179, 185], [179, 186], [179, 187], [179, 7], [209, 185], [209, 186], [209, 187], [209, 7]], [[216, 185], [216, 186], [216, 187], [216, 7], [217, 185], [217, 186], [217, 187], [217, 7], [227, 185], [227, 186], [227, 187], [227, 7], [229, 185], [229, 186], [229, 187], [229, 7]], [[230, 185], [230, 186], [230, 187], [230, 7], [129, 188], [129, 6], [132, 188], [132, 6], [133, 188], [133, 6], [134, 188], [134, 6], [136, 188], [136, 6], [146, 188], [146, 6]], [[154, 188], [154, 6], [156, 188], [156, 6], [160, 188], [160, 6], [163, 188], [163, 6], [164, 188], [164, 6], [169, 188], [169, 6], [170, 188], [170, 6], [173, 188], [173, 6]], [[178, 188], [178, 6], [181, 188], [181, 6], [185, 188], [185, 6], [186, 188], [186, 6], [187, 188], [187, 6], [189, 188], [189, 6], [190, 188], [190, 6], [196, 188], [196, 6]], [[198, 188], [198, 6], [228, 188], [228, 6], [232, 188], [232, 6], [233, 188], [233, 6], [1, 0], [135, 0], [137, 0], [138, 0], [139, 0], [140, 0], [141, 0], [143, 0]], [[147, 0], [149, 0], [150, 0], [151, 0], [152, 0], [155, 0], [157, 0], [158, 0], [165, 0], [166, 0], [168, 0], [174, 0], [175, 0], [180, 0], [182, 0], [183, 0]], [[188, 0], [191, 0], [197, 0], [231, 0], [239, 0], [nil, 57], [nil, 58], [nil, 59], [nil, 60], [nil, 61], [nil, 62], [nil, 63], [nil, 64], [nil, 65], [nil, 66], [nil, 67]], [[92, 178], [92, 179], [92, 180], [92, 181], [92, 182], [92, 183], [92, 184], [92, 4], [195, 178], [195, 179], [195, 180], [195, 181], [195, 182], [195, 183], [195, 184], [195, 4]], [[208, 178], [208, 179], [208, 180], [208, 181], [208, 182], [208, 183], [208, 184], [208, 4], [128, 185], [128, 186], [128, 187], [128, 7], [130, 185], [130, 186], [130, 187], [130, 7]], [[131, 185], [131, 186], [131, 187], [131, 7], [162, 185], [162, 186], [162, 187], [162, 7], [184, 185], [184, 186], [184, 187], [184, 7], [194, 185], [194, 186], [194, 187], [194, 7]], [[69, 185], [69, 186], [69, 187], [69, 7], [70, 185], [70, 186], [70, 187], [70, 7], [71, 185], [71, 186], [71, 187], [71, 7], [72, 185], [72, 186], [72, 187], [72, 7]], [[73, 185], [73, 186], [73, 187], [73, 7], [74, 185], [74, 186], [74, 187], [74, 7], [75, 185], [75, 186], [75, 187], [75, 7], [76, 185], [76, 186], [76, 187], [76, 7]], [[77, 185], [77, 186], [77, 187], [77, 7], [78, 185], [78, 186], [78, 187], [78, 7], [79, 185], [79, 186], [79, 187], [79, 7], [80, 185], [80, 186], [80, 187], [80, 7]], [[81, 185], [81, 186], [81, 187], [81, 7], [82, 185], [82, 186], [82, 187], [82, 7], [83, 185], [83, 186], [83, 187], [83, 7], [84, 185], [84, 186], [84, 187], [84, 7]], [[85, 185], [85, 186], [85, 187], [85, 7], [86, 185], [86, 186], [86, 187], [86, 7], [87, 185], [87, 186], [87, 187], [87, 7], [89, 185], [89, 186], [89, 187], [89, 7]], [[106, 185], [106, 186], [106, 187], [106, 7], [107, 185], [107, 186], [107, 187], [107, 7], [113, 185], [113, 186], [113, 187], [113, 7], [118, 185], [118, 186], [118, 187], [118, 7]], [[119, 185], [119, 186], [119, 187], [119, 7], [120, 185], [120, 186], [120, 187], [120, 7], [121, 185], [121, 186], [121, 187], [121, 7], [122, 185], [122, 186], [122, 187], [122, 7]], [[0, 178], [0, 179], [0, 180], [0, 181], [0, 182], [0, 183], [0, 184], [0, 4], [36, 178], [36, 179], [36, 180], [36, 181], [36, 182], [36, 183], [36, 184], [36, 4]], [[64, 178], [64, 179], [64, 180], [64, 181], [64, 182], [64, 183], [64, 184], [64, 4], [91, 178], [91, 179], [91, 180], [91, 181], [91, 182], [91, 183], [91, 184], [91, 4]], [[93, 178], [93, 179], [93, 180], [93, 181], [93, 182], [93, 183], [93, 184], [93, 4], [126, 178], [126, 179], [126, 180], [126, 181], [126, 182], [126, 183], [126, 184], [126, 4]], [[94, 185], [94, 186], [94, 187], [94, 7], [125, 185], [125, 186], [125, 187], [125, 7], [60, 188], [60, 6], [96, 188], [96, 6], [123, 188], [123, 6], [nil, 246], [nil, 247]], [[35, 178], [35, 179], [35, 180], [35, 181], [35, 182], [35, 183], [35, 184], [35, 4], [62, 178], [62, 179], [62, 180], [62, 181], [62, 182], [62, 183], [62, 184], [62, 4]], [[0, 185], [0, 186], [0, 187], [0, 7], [36, 185], [36, 186], [36, 187], [36, 7], [64, 185], [64, 186], [64, 187], [64, 7], [91, 185], [91, 186], [91, 187], [91, 7]], [[93, 185], [93, 186], [93, 187], [93, 7], [126, 185], [126, 186], [126, 187], [126, 7], [94, 188], [94, 6], [125, 188], [125, 6], [60, 0], [96, 0], [123, 0], [nil, 248]], [[39, 178], [39, 179], [39, 180], [39, 181], [39, 182], [39, 183], [39, 184], [39, 4], [43, 178], [43, 179], [43, 180], [43, 181], [43, 182], [43, 183], [43, 184], [43, 4]], [[124, 178], [124, 179], [124, 180], [124, 181], [124, 182], [124, 183], [124, 184], [124, 4], [35, 185], [35, 186], [35, 187], [35, 7], [62, 185], [62, 186], [62, 187], [62, 7]], [[0, 188], [0, 6], [36, 188], [36, 6], [64, 188], [64, 6], [91, 188], [91, 6], [93, 188], [93, 6], [126, 188], [126, 6], [94, 0], [125, 0], [nil, 249], [nil, 250]], [[33, 178], [33, 179], [33, 180], [33, 181], [33, 182], [33, 183], [33, 184], [33, 4], [34, 178], [34, 179], [34, 180], [34, 181], [34, 182], [34, 183], [34, 184], [34, 4]], [[40, 178], [40, 179], [40, 180], [40, 181], [40, 182], [40, 183], [40, 184], [40, 4], [41, 178], [41, 179], [41, 180], [41, 181], [41, 182], [41, 183], [41, 184], [41, 4]], [[63, 178], [63, 179], [63, 180], [63, 181], [63, 182], [63, 183], [63, 184], [63, 4], [39, 185], [39, 186], [39, 187], [39, 7], [43, 185], [43, 186], [43, 187], [43, 7]], [[124, 185], [124, 186], [124, 187], [124, 7], [35, 188], [35, 6], [62, 188], [62, 6], [0, 0], [36, 0], [64, 0], [91, 0], [93, 0], [126, 0], [nil, 251], [nil, 252]], [[92, 188], [92, 6], [195, 188], [195, 6], [208, 188], [208, 6], [128, 0], [130, 0], [131, 0], [162, 0], [184, 0], [194, 0], [224, 0], [226, 0], [nil, 253], [nil, 254]], [[nil, 255], [nil, 194], [nil, 195], [nil, 196], [nil, 197], [nil, 198], [nil, 199], [nil, 200], [nil, 201], [nil, 202], [nil, 203], [nil, 204], [nil, 205], [nil, 206], [nil, 207], [nil, 208]], [[92, 0], [195, 0], [208, 0], [nil, 209], [nil, 210], [nil, 211], [nil, 212], [nil, 213], [nil, 214], [nil, 215], [nil, 216], [nil, 217], [nil, 218], [nil, 219], [nil, 220], [nil, 221]], [[60, 178], [60, 179], [60, 180], [60, 181], [60, 182], [60, 183], [60, 184], [60, 4], [96, 178], [96, 179], [96, 180], [96, 181], [96, 182], [96, 183], [96, 184], [96, 4]], [[123, 178], [123, 179], [123, 180], [123, 181], [123, 182], [123, 183], [123, 184], [123, 4], [nil, 222], [nil, 223], [nil, 224], [nil, 38], [nil, 39], [nil, 40], [nil, 41], [nil, 42]], [[94, 178], [94, 179], [94, 180], [94, 181], [94, 182], [94, 183], [94, 184], [94, 4], [125, 178], [125, 179], [125, 180], [125, 181], [125, 182], [125, 183], [125, 184], [125, 4]], [[60, 185], [60, 186], [60, 187], [60, 7], [96, 185], [96, 186], [96, 187], [96, 7], [123, 185], [123, 186], [123, 187], [123, 7], [nil, 43], [nil, 44], [nil, 45], [nil, 46]], [[153, 178], [153, 179], [153, 180], [153, 181], [153, 182], [153, 183], [153, 184], [153, 4], [161, 178], [161, 179], [161, 180], [161, 181], [161, 182], [161, 183], [161, 184], [161, 4]], [[167, 178], [167, 179], [167, 180], [167, 181], [167, 182], [167, 183], [167, 184], [167, 4], [172, 178], [172, 179], [172, 180], [172, 181], [172, 182], [172, 183], [172, 184], [172, 4]], [[176, 178], [176, 179], [176, 180], [176, 181], [176, 182], [176, 183], [176, 184], [176, 4], [177, 178], [177, 179], [177, 180], [177, 181], [177, 182], [177, 183], [177, 184], [177, 4]], ].each {|arr| arr.each {|subarr| subarr.each(&:freeze)}.freeze}.freeze end end end protocol-hpack-1.5.1/lib/protocol/hpack/context.rb0000644000004100000410000002405214700501542022202 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2018-2024, by Samuel Williams. # Copyright, 2024, by Maruth Goyal. # Copyright, 2024, by Nathan Froyd. require_relative "huffman" module Protocol # Implementation of header compression for HTTP 2.0 (HPACK) format adapted # to efficiently represent HTTP headers in the context of HTTP 2.0. # # - http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-10 module HPACK # Header representation as defined by the spec. NO_INDEX_TYPE = {prefix: 4, pattern: 0x00}.freeze NEVER_INDEXED_TYPE = {prefix: 4, pattern: 0x10}.freeze CHANGE_TABLE_SIZE_TYPE = {prefix: 5, pattern: 0x20}.freeze INCREMENTAL_TYPE = {prefix: 6, pattern: 0x40}.freeze INDEXED_TYPE = {prefix: 7, pattern: 0x80}.freeze HEADER_REPRESENTATION = { indexed: INDEXED_TYPE, incremental: INCREMENTAL_TYPE, no_index: NO_INDEX_TYPE, never_indexed: NEVER_INDEXED_TYPE, change_table_size: CHANGE_TABLE_SIZE_TYPE } # To decompress header blocks, a decoder only needs to maintain a # dynamic table as a decoding context. # No other state information is needed. class Context # Static header table. # https://tools.ietf.org/html/rfc7541#appendix-A STATIC_TABLE = [ [":authority", ""], [":method", "GET"], [":method", "POST"], [":path", "/"], [":path", "/index.html"], [":scheme", "http"], [":scheme", "https"], [":status", "200"], [":status", "204"], [":status", "206"], [":status", "304"], [":status", "400"], [":status", "404"], [":status", "500"], ["accept-charset", ""], ["accept-encoding", "gzip, deflate"], ["accept-language", ""], ["accept-ranges", ""], ["accept", ""], ["access-control-allow-origin", ""], ["age", ""], ["allow", ""], ["authorization", ""], ["cache-control", ""], ["content-disposition", ""], ["content-encoding", ""], ["content-language", ""], ["content-length", ""], ["content-location", ""], ["content-range", ""], ["content-type", ""], ["cookie", ""], ["date", ""], ["etag", ""], ["expect", ""], ["expires", ""], ["from", ""], ["host", ""], ["if-match", ""], ["if-modified-since", ""], ["if-none-match", ""], ["if-range", ""], ["if-unmodified-since", ""], ["last-modified", ""], ["link", ""], ["location", ""], ["max-forwards", ""], ["proxy-authenticate", ""], ["proxy-authorization", ""], ["range", ""], ["referer", ""], ["refresh", ""], ["retry-after", ""], ["server", ""], ["set-cookie", ""], ["strict-transport-security", ""], ["transfer-encoding", ""], ["user-agent", ""], ["vary", ""], ["via", ""], ["www-authenticate", ""], ].each(&:freeze).freeze STATIC_EXACT_LOOKUP = {} STATIC_NAME_LOOKUP = {} STATIC_TABLE.each_with_index do |(name, value), i| exact_header_values = (STATIC_EXACT_LOOKUP[name] ||= []) exact_header_values << [value, i] STATIC_NAME_LOOKUP[name] = i if STATIC_NAME_LOOKUP[name].nil? end STATIC_EXACT_LOOKUP.each {|k, v| v.freeze} STATIC_EXACT_LOOKUP.freeze STATIC_NAME_LOOKUP.freeze # Initializes compression context with appropriate client/server defaults and maximum size of the dynamic table. # # @param table [Array] Table of header key-value pairs. # @option huffman [Symbol] One of `:always`, `:never`, `:shorter`. Controls use of compression. # @option index [Symbol] One of `:all`, `:static`, `:never`. Controls use of static/dynamic tables. # @option table_size [Integer] The current maximum dynamic table size. def initialize(table = nil, huffman: :shorter, index: :all, table_size: 4096) @huffman = huffman @index = index @table_size = table_size @table = (table&.dup) || [] end def initialize_copy(other) super # This is the only mutable state: @table = @table.dup end # Current table of header key-value pairs. attr :table attr :huffman attr :index attr :table_size # Finds an entry in current dynamic table by index. # Note that index is zero-based in this module. # # If the index is greater than the last index in the static table, # an entry in the dynamic table is dereferenced. # # If the index is greater than the last header index, an error is raised. # # @param index [Integer] zero-based index in the dynamic table. # @return [Array] +[key, value]+ def dereference(index) # NOTE: index is zero-based in this module. value = STATIC_TABLE[index] || @table[index - STATIC_TABLE.size] if value.nil? raise CompressionError, "Index #{index} too large!" end return value end # Header Block Processing # - http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-10#section-4.1 # # @param command [Hash] {type:, name:, value:, index:} # @return [Array] +[name, value]+ header field that is added to the decoded header list def decode(command) emit = nil case command[:type] when :change_table_size self.table_size = command[:value] when :indexed # Indexed Representation # An _indexed representation_ entails the following actions: # o The header field corresponding to the referenced entry in either # the static table or dynamic table is added to the decoded header # list. idx = command[:name] k, v = dereference(idx) emit = [k, v] when :incremental, :no_index, :never_indexed # A _literal representation_ that is _not added_ to the dynamic table # entails the following action: # o The header field is added to the decoded header list. # A _literal representation_ that is _added_ to the dynamic table # entails the following actions: # o The header field is added to the decoded header list. # o The header field is inserted at the beginning of the dynamic table. if command[:name].is_a? Integer k, v = dereference(command[:name]) command = command.dup command[:index] ||= command[:name] command[:value] ||= v command[:name] = k end emit = [command[:name], command[:value]] add_to_table(emit) if command[:type] == :incremental else raise CompressionError, "Invalid type: #{command[:type]}" end return emit end # Plan header compression according to +@index+ # :never Do not use dynamic table or static table reference at all. # :static Use static table only. # :all Use all of them. # # @param headers [Array] +[[name, value], ...]+ # @return [Array] array of commands def encode(headers) commands = [] # Literals commands are marked with :no_index when index is not used no_index = [:static, :never].include?(@index) headers.each do |field, value| command = add_command(field, value) command[:type] = :no_index if no_index && command[:type] == :incremental commands << command decode(command) end return commands end # Emits command for a header. # Prefer static table over dynamic table. # Prefer exact match over name-only match. # # +@index+ controls whether to use the dynamic table, # static table, or both. # :never Do not use dynamic table or static table reference at all. # :static Use static table only. # :all Use all of them. # # @param name [String] # @param value [String] # @return [Hash] command def add_command(name, value) exact = nil name_only = nil if @index == :all || @index == :static if (values_and_indices = STATIC_EXACT_LOOKUP[name]) values_and_indices.each do |known_value, index| if value == known_value exact = index break end end needs_name_lookup = exact.nil? else needs_name_lookup = true end if needs_name_lookup && (static_value = STATIC_NAME_LOOKUP[name]) name_only = static_value end end if @index == :all && !exact @table.each_index do |i| entry = @table[i] if entry.first == name if entry.last == value exact ||= i + STATIC_TABLE.size break else name_only ||= i + STATIC_TABLE.size end end end end if exact {name: exact, type: :indexed} elsif name_only {name: name_only, value: value, type: :incremental} else {name: name, value: value, type: :incremental} end end # Alter dynamic table size. # When the size is reduced, some headers might be evicted. def table_size= size @table_size = size size_check(nil) end def change_table_size(size) self.table_size = size # The command to resize the table: return {type: :change_table_size, value: size} end # Returns current table size in octets # @return [Integer] def compute_current_table_size @table.sum { |k, v| k.bytesize + v.bytesize + 32 } end private # Add a name-value pair to the dynamic table. Older entries might have been evicted so that the new entry fits in the dynamic table. The command and the component strings will be frozen. # # @param command [Array] +[name, value]+ def add_to_table(command) return unless size_check(command) command.each(&:freeze) command.freeze @table.unshift(command) @current_table_size += entry_size(command) end def entry_size(e) e[0].bytesize + e[1].bytesize + 32 end # To keep the dynamic table size lower than or equal to @table_size, # remove one or more entries at the end of the dynamic table. # # @param command [Hash] # @return [Boolean] whether +command+ fits in the dynamic table. def size_check(command) @current_table_size ||= compute_current_table_size cmdsize = command.nil? ? 0 : command[0].bytesize + command[1].bytesize + 32 while @current_table_size + cmdsize > @table_size break if @table.empty? e = @table.pop @current_table_size -= e[0].bytesize + e[1].bytesize + 32 end cmdsize <= @table_size end end end end protocol-hpack-1.5.1/lib/protocol/hpack/version.rb0000644000004100000410000000025114700501542022176 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2018-2024, by Samuel Williams. module Protocol module HPACK VERSION = "1.5.1" end end protocol-hpack-1.5.1/lib/protocol/hpack/compressor.rb0000644000004100000410000001252014700501542022707 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2013-2015, by Ilya Grigorik. # Copyright, 2014-2015, by Kaoru Maeda. # Copyright, 2015, by Tamir Duberstein. # Copyright, 2016, by George Ulmer. # Copyright, 2018, by Tiago Cardoso. # Copyright, 2018, by Byron Formwalt. # Copyright, 2018-2024, by Samuel Williams. # Copyright, 2018, by Kenichi Nakamura. # Copyright, 2019, by Jingyi Chen. # Copyright, 2020, by Justin Mazzocchi. # Copyright, 2024, by Nathan Froyd. require_relative "context" require_relative "huffman" module Protocol module HPACK # Predefined options set for Compressor # http://mew.org/~kazu/material/2014-hpack.pdf NAIVE = {index: :never, huffman: :never} LINEAR = {index: :all, huffman: :never} STATIC = {index: :static, huffman: :never} SHORTER = {index: :all, huffman: :never} NAIVE_HUFFMAN = {index: :never, huffman: :always} LINEAR_HUFFMAN = {index: :all, huffman: :always} STATIC_HUFFMAN = {index: :static, huffman: :always} SHORTER_HUFFMAN = {index: :all, huffman: :shorter} MODES = { naive: NAIVE, linear: LINEAR, static: STATIC, shorter: SHORTER, naive_huffman: NAIVE_HUFFMAN, linear_huffman: NAIVE_HUFFMAN, static_huffman: NAIVE_HUFFMAN, shorter_huffman: NAIVE_HUFFMAN, } # Responsible for encoding header key-value pairs using HPACK algorithm. class Compressor def initialize(buffer, context = Context.new, table_size_limit: nil) @buffer = buffer @context = context @table_size_limit = table_size_limit end attr :table_size_limit attr :buffer attr :context attr :offset def write_bytes(bytes) @buffer << bytes end # Encodes provided value via integer representation. # - http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-10#section-5.1 # # If I < 2^N - 1, encode I on N bits # Else # encode 2^N - 1 on N bits # I = I - (2^N - 1) # While I >= 128 # Encode (I % 128 + 128) on 8 bits # I = I / 128 # encode (I) on 8 bits # # @param value [Integer] value to encode # @param bits [Integer] number of available bits # @return [String] binary string def write_integer(value, bits) limit = (1 << bits) - 1 return @buffer << value if value < limit @buffer << limit unless bits.zero? value -= limit while value >= 128 @buffer << ((value & 0x7f) + 128) value /= 128 end @buffer << value end def huffman @context.huffman end # Encodes provided value via string literal representation. # - http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-10#section-5.2 # # * The string length, defined as the number of bytes needed to store # its UTF-8 representation, is represented as an integer with a seven # bits prefix. If the string length is strictly less than 127, it is # represented as one byte. # * If the bit 7 of the first byte is 1, the string value is represented # as a list of Huffman encoded octets # (padded with bit 1's until next octet boundary). # * If the bit 7 of the first byte is 0, the string value is # represented as a list of UTF-8 encoded octets. # # +@options [:huffman]+ controls whether to use Huffman encoding: # :never Do not use Huffman encoding # :always Always use Huffman encoding # :shorter Use Huffman when the result is strictly shorter # # @param string [String] # @return [String] binary string def write_string(string, huffman = self.huffman) if huffman != :never encoded = Huffman.encode(string) if huffman == :shorter and encoded.bytesize >= string.bytesize encoded = nil end end if encoded first = @buffer.bytesize write_integer(encoded.bytesize, 7) write_bytes(encoded.b) @buffer.setbyte(first, @buffer.getbyte(first).ord | 0x80) else write_integer(string.bytesize, 7) write_bytes(string.b) end end # Encodes header command with appropriate header representation. # # @param h [Hash] header command # @param buffer [String] # @return [Buffer] def write_header(command) representation = HEADER_REPRESENTATION[command[:type]] first = @buffer.bytesize case command[:type] when :indexed write_integer(command[:name] + 1, representation[:prefix]) when :change_table_size write_integer(command[:value], representation[:prefix]) else if command[:name].is_a? Integer write_integer(command[:name] + 1, representation[:prefix]) else write_integer(0, representation[:prefix]) write_string(command[:name]) end write_string(command[:value]) end # set header representation pattern on first byte @buffer.setbyte(first, @buffer.getbyte(first) | representation[:pattern]) end # Encodes provided list of HTTP headers. # # @param headers [Array] +[[name, value], ...]+ # @return [Buffer] def encode(headers, table_size = @table_size_limit) if table_size and table_size != @context.table_size command = @context.change_table_size(table_size) write_header(command) end commands = @context.encode(headers) commands.each do |command| write_header(command) end return @buffer end end end end protocol-hpack-1.5.1/lib/protocol/hpack.rb0000644000004100000410000000033214700501542020511 0ustar www-datawww-data# frozen_string_literal: true # Released under the MIT License. # Copyright, 2018-2024, by Samuel Williams. require_relative "hpack/version" require_relative "hpack/compressor" require_relative "hpack/decompressor" protocol-hpack-1.5.1/checksums.yaml.gz.sig0000444000004100000410000000060014700501542020534 0ustar www-datawww-datacȵ|^mZLA}&[+2g""V&O,sY3.W!&Ot^;ˆ3:P9d{hjwg>k@δ!j?:\4-mkq=s!uҍ?OWgH58ʱZ^4ˠen_բ=Qς]BE4X8hh0X̮WN;kAfxѴ/k$O#}Pƻ;+01_X_&"^Ri}'Ɲ[_0}oυ$nteQƠ3LӔ)5LS P*|: ( O![FtVCprotocol-hpack-1.5.1/readme.md0000644000004100000410000000346214700501542016255 0ustar www-datawww-data# Protocol::HPACK Provides a compressor and decompressor for HTTP 2.0 headers, HPACK, as defined by [RFC7541](https://tools.ietf.org/html/rfc7541). [![Development Status](https://github.com/socketry/protocol-hpack/workflows/Test/badge.svg)](https://github.com/socketry/protocol-hpack/actions?workflow=Test) ## Usage Please see the [project documentation](https://socketry.github.io/protocol-hpack/) for more details. - [Getting Started](https://socketry.github.io/protocol-hpack/guides/getting-started/index) - This guide explains how to use the `protocol-hpack` gem to compress and decompress HTTP/2 headers using HPACK. ## See Also - [protocol-http2](https://github.com/socketry/protocol-http2) - Provides an HTTP/2 client and server implementation. - [async-http](https://github.com/socketry/async-http) - Provides a complete HTTP client and server implementation on top of Async. ## Contributing We welcome contributions to this project. 1. Fork it. 2. Create your feature branch (`git checkout -b my-new-feature`). 3. Commit your changes (`git commit -am 'Add some feature'`). 4. Push to the branch (`git push origin my-new-feature`). 5. Create new Pull Request. ### Developer Certificate of Origin In order to protect users of this project, we require all contributors to comply with the [Developer Certificate of Origin](https://developercertificate.org/). This ensures that all contributions are properly licensed and attributed. ### Community Guidelines This project is best served by a collaborative and respectful environment. Treat each other professionally, respect differing viewpoints, and engage constructively. Harassment, discrimination, or harmful behavior is not tolerated. Communicate clearly, listen actively, and support one another. If any issues arise, please inform the project maintainers. protocol-hpack-1.5.1/data.tar.gz.sig0000444000004100000410000000060014700501542017304 0ustar www-datawww-data5w @&87"*P [`7yì G̯zر&>Brm?; lU g%Bl$p}=\I@o3Qe~ niC.:lS%bևlj 8_υź9Hgx#Ʉ1©eḺ 2ZA4~,}צ3*9WkP!ޝѠ&]w}F:Z x= a]m/kOGNWJ:0wPOdYsBڈb]3;T^#B4VDߌ^s>()`5tO;~>[և+[ 02@GVɗ6!^protocol-hpack-1.5.1/license.md0000644000004100000410000000323214700501542016435 0ustar www-datawww-data# MIT License Copyright, 2013-2016, by Ilya Grigorik. Copyright, 2014-2015, by Kaoru Maeda. Copyright, 2015, by Tamir Duberstein. Copyright, 2016, by Kien Nguyen Trung. Copyright, 2016, by George Ulmer. Copyright, 2018, by Tiago Cardoso. Copyright, 2018, by Byron Formwalt. Copyright, 2018-2024, by Samuel Williams. Copyright, 2018, by Kenichi Nakamura. Copyright, 2019, by Jingyi Chen. Copyright, 2019, by Cyril Roelandt. Copyright, 2020, by Olle Jonsson. Copyright, 2020, by Justin Mazzocchi. Copyright, 2022, by Daniel Morrison. Copyright, 2022, by Felix Yan. Copyright, 2024, by Maruth Goyal. Copyright, 2024, by Nathan Froyd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. protocol-hpack-1.5.1/protocol-hpack.gemspec0000644000004100000410000000704514700501542020771 0ustar www-datawww-data######################################################### # This file has been automatically generated by gem2tgz # ######################################################### # -*- encoding: utf-8 -*- # stub: protocol-hpack 1.5.1 ruby lib Gem::Specification.new do |s| s.name = "protocol-hpack".freeze s.version = "1.5.1" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.metadata = { "documentation_uri" => "https://socketry.github.io/protocol-hpack/", "source_code_uri" => "https://github.com/socketry/http-hpack.git" } if s.respond_to? :metadata= s.require_paths = ["lib".freeze] s.authors = ["Samuel Williams".freeze, "Ilya Grigorik".freeze, "Tamir Duberstein".freeze, "Nathan Froyd".freeze, "Kaoru Maeda".freeze, "Tiago Cardoso".freeze, "Byron Formwalt".freeze, "Cyril Roelandt".freeze, "Daniel Morrison".freeze, "Felix Yan".freeze, "George Ulmer".freeze, "Jingyi Chen".freeze, "Justin Mazzocchi".freeze, "Kenichi Nakamura".freeze, "Kien Nguyen Trung".freeze, "Maruth Goyal".freeze, "Olle Jonsson".freeze] s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11\nZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK\nCZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz\nMjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd\nMBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj\nbzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB\nigKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2\n9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW\nsGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE\ne5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN\nXibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss\nRZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn\ntUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM\nzp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW\nxm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O\nBBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs\naWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs\naWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE\ncBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl\nxCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/\nc1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp\n8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws\nJkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP\neX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt\nQ2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8\nvoD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=\n-----END CERTIFICATE-----\n".freeze] s.date = "2024-09-13" s.files = ["lib/protocol/hpack.rb".freeze, "lib/protocol/hpack/compressor.rb".freeze, "lib/protocol/hpack/context.rb".freeze, "lib/protocol/hpack/decompressor.rb".freeze, "lib/protocol/hpack/error.rb".freeze, "lib/protocol/hpack/huffman.rb".freeze, "lib/protocol/hpack/huffman/generator.rb".freeze, "lib/protocol/hpack/huffman/machine.rb".freeze, "lib/protocol/hpack/version.rb".freeze, "license.md".freeze, "readme.md".freeze] s.homepage = "https://github.com/socketry/http-hpack".freeze s.licenses = ["MIT".freeze] s.required_ruby_version = Gem::Requirement.new(">= 3.1".freeze) s.rubygems_version = "3.3.15".freeze s.summary = "A compresssor and decompressor for HTTP/2's HPACK format.".freeze end protocol-hpack-1.5.1/metadata.gz.sig0000444000004100000410000000060014700501542017366 0ustar www-datawww-datajv|*ɚs0iB~6i>gVI#աhDs9lRAy}W9pMD^Ͱ;Q?BkLSl_k$?, <q_Py>clx֧Ҹ:w Zbc:~dyڰw+Qy.VPU Oٸeݛ5l[6hA( *?X^UaW+ gt*uXE.G44u?HG|J0f]0b~*,k;R %I%RHM_9=m]yZT*ou{Nvx59l!$:(^2ȴS/