---input--- // public domain module Deflate open System open System.Collections.Generic open System.IO open System.Linq open Crc let maxbuf = 32768 let maxlen = 258 let getBit (b:byte) (bit:int) = if b &&& (1uy <<< bit) = 0uy then 0 else 1 type BitReader(sin:Stream) = let mutable bit = 8 let mutable cur = 0uy member x.Skip() = bit <- 8 member x.ReadBit() = if bit = 8 then bit <- 0 let b = sin.ReadByte() if b = -1 then failwith "バッファを超過しました" cur <- byte b let ret = if cur &&& (1uy <<< bit) = 0uy then 0 else 1 bit <- bit + 1 ret member x.ReadLE n = let mutable ret = 0 for i = 0 to n - 1 do if x.ReadBit() = 1 then ret <- ret ||| (1 <<< i) ret member x.ReadBE n = let mutable ret = 0 for i = 0 to n - 1 do ret <- (ret <<< 1) ||| x.ReadBit() ret member x.ReadBytes len = if bit <> 8 then bit <- 8 let buf = Array.zeroCreate len ignore <| sin.Read(buf, 0, len) buf type WriteBuffer(sout:Stream) = let mutable prev:byte[] = null let mutable buf = Array.zeroCreate maxbuf let mutable p = 0 let next newbuf = prev <- buf buf <- if newbuf then Array.zeroCreate maxbuf else null p <- 0 member x.Close() = next false next false interface IDisposable with member x.Dispose() = x.Close() member x.WriteByte (b:byte) = buf.[p] <- b sout.WriteByte b p <- p + 1 if p = maxbuf then next true member x.Write (src:byte[]) start len = let maxlen = maxbuf - p if len <= maxlen then Array.Copy(src, start, buf, p, len) sout.Write(src, start, len) p <- p + len if p = maxbuf then next true else x.Write src start maxlen x.Write src (start + maxlen) (len - maxlen) member x.Copy len dist = if dist < 1 then failwith <| sprintf "dist too small: %d < 1" dist elif dist > maxbuf then failwith <| sprintf "dist too big: %d > %d" dist maxbuf let pp = p - dist if pp < 0 then if prev = null then failwith <| sprintf "dist too big: %d > %d" dist p let pp = pp + maxbuf let maxlen = maxbuf - pp if len <= maxlen then x.Write prev pp len else x.Write prev pp maxlen x.Copy (len - maxlen) dist else let maxlen = p - pp if len <= maxlen then x.Write buf pp len else if dist = 1 then let b = buf.[pp] for i = 1 to len do x.WriteByte b else let buf' = buf let mutable len' = len while len' > 0 do let len'' = Math.Min(len', maxlen) x.Write buf' pp len'' len' <- len' - len'' type Huffman(lens:int[]) = let vals = Array.zeroCreate lens.Length let min = lens.Where(fun x -> x > 0).Min() let max = lens.Max() let counts = Array.zeroCreate (max + 1) let firsts = Array.zeroCreate (max + 1) let nexts = Array.zeroCreate (max + 1) let tables = Array.zeroCreate(max + 1) do for len in lens do if len > 0 then counts.[len] <- counts.[len] + 1 for i = 1 to max do firsts.[i] <- (firsts.[i - 1] + counts.[i - 1]) <<< 1 Array.Copy(firsts, 0, nexts, 0, max + 1) for i = 0 to vals.Length - 1 do let len = lens.[i] if len > 0 then vals.[i] <- nexts.[len] nexts.[len] <- nexts.[len] + 1 for i = 0 to vals.Length - 1 do let len = lens.[i] if len > 0 then let start = firsts.[len] if tables.[len] = null then let count = nexts.[len] - start tables.[len] <- Array.zeroCreate count tables.[len].[vals.[i] - start] <- i member x.GetValue h = let rec getv i = if i > max then -1 else if h < nexts.[i] then tables.[i].[h - firsts.[i]] else getv (i + 1) getv min member x.Read(br:BitReader) = let rec read h i = if h < nexts.[i] then tables.[i].[h - firsts.[i]] else read ((h <<< 1) ||| br.ReadBit()) (i + 1) read (br.ReadBE min) min type [] HuffmanDecoder() = abstract GetValue: unit->int abstract GetDistance: unit->int type FixedHuffman(br:BitReader) = inherit HuffmanDecoder() override x.GetValue() = let v = br.ReadBE 7 if v < 24 then v + 256 else let v = (v <<< 1) ||| br.ReadBit() if v < 192 then v - 48 elif v < 200 then v + 88 else ((v <<< 1) ||| br.ReadBit()) - 256 override x.GetDistance() = br.ReadBE 5 type DynamicHuffman(br:BitReader) = inherit HuffmanDecoder() let lit, dist = let hlit = let hlit = (br.ReadLE 5) + 257 if hlit > 286 then failwith <| sprintf "hlit: %d > 286" hlit hlit let hdist = let hdist = (br.ReadLE 5) + 1 if hdist > 32 then failwith <| sprintf "hdist: %d > 32" hdist hdist let hclen = let hclen = (br.ReadLE 4) + 4 if hclen > 19 then failwith <| sprintf "hclen: %d > 19" hclen hclen let clen = let hclens = Array.zeroCreate 19 let order = [| 16; 17; 18; 0; 8; 7; 9; 6; 10; 5; 11; 4; 12; 3; 13; 2; 14; 1; 15 |] for i = 0 to hclen - 1 do hclens.[order.[i]] <- br.ReadLE 3 new Huffman(hclens) let ld = Array.zeroCreate(hlit + hdist) let mutable i = 0 while i < ld.Length do let v = clen.Read(br) if v < 16 then ld.[i] <- v i <- i + 1 else let r, v = match v with | 16 -> (br.ReadLE 2) + 3, ld.[i - 1] | 17 -> (br.ReadLE 3) + 3, 0 | 18 -> (br.ReadLE 7) + 11, 0 | _ -> failwith "不正な値です。" for j = 0 to r - 1 do ld.[i + j] <- v i <- i + r new Huffman(ld.[0 .. hlit - 1]), new Huffman(ld.[hlit .. hlit + hdist - 1]) override x.GetValue() = lit.Read br override x.GetDistance() = dist.Read br let getLitExLen v = if v < 265 || v = 285 then 0 else (v - 261) >>> 2 let getDistExLen d = if d < 4 then 0 else (d - 2) >>> 1 let litlens = let litlens = Array.zeroCreate 286 let mutable v = 3 for i = 257 to 284 do litlens.[i] <- v v <- v + (1 <<< (getLitExLen i)) litlens.[285] <- maxlen litlens.[257..285] let distlens = let distlens = Array.zeroCreate 30 let mutable v = 1 for i = 0 to 29 do distlens.[i] <- v v <- v + (1 <<< (getDistExLen i)) distlens type Reader(sin:Stream) = inherit Stream() let br = new BitReader(sin) let fh = new FixedHuffman(br) let sout = new MemoryStream() let dbuf = new WriteBuffer(sout) let mutable cache:byte[] = null let mutable canRead = true let rec read (h:HuffmanDecoder) = let v = h.GetValue() if v > 285 then failwith <| sprintf "不正な値: %d" v if v < 256 then dbuf.WriteByte(byte v) elif v > 256 then let len = if v < 265 then v - 254 else litlens.[v - 257] + (br.ReadLE (getLitExLen v)) let dist = let d = h.GetDistance() if d > 29 then failwith <| sprintf "不正な距離: %d" d if d < 4 then d + 1 else distlens.[d] + (br.ReadLE (getDistExLen d)) dbuf.Copy len dist if v <> 256 then read h override x.CanRead = canRead override x.CanWrite = false override x.CanSeek = false override x.Flush() = () override x.Close() = dbuf.Close() canRead <- false override x.Read(buffer, offset, count) = let offset = if cache = null then 0 else let clen = cache.Length let len = Math.Min(clen, count) Array.Copy(cache, 0, buffer, offset, len) cache <- if len = clen then null else cache.[len .. clen - 1] len let req = int64 <| count - offset while canRead && sout.Length < req do x.readBlock() let len = if sout.Length = 0L then 0 else let data = sout.ToArray() sout.SetLength(0L) let dlen = data.Length let len = Math.Min(int req, dlen) Array.Copy(data, 0, buffer, offset, len) if dlen > len then cache <- data.[len..] len offset + len override x.Position with get() = raise <| new NotImplementedException() and set(v) = raise <| new NotImplementedException() override x.Length = raise <| new NotImplementedException() override x.Seek(_, _) = raise <| new NotImplementedException() override x.Write(_, _, _) = raise <| new NotImplementedException() override x.SetLength(_) = raise <| new NotImplementedException() member private x.readBlock() = let bfinal = br.ReadBit() match br.ReadLE 2 with | 0 -> br.Skip() let len = br.ReadLE 16 let nlen = br.ReadLE 16 if len + nlen <> 0x10000 then failwith "不正な非圧縮長" dbuf.Write (br.ReadBytes len) 0 len | 1 -> read fh | 2 -> read (new DynamicHuffman(br)) | _ -> failwith "不正なブロックタイプ" if bfinal = 1 then canRead <- false x.Close() type BitWriter(sout:Stream) = let mutable bit = 0 let mutable cur = 0uy member x.Skip() = if bit > 0 then sout.WriteByte(cur) bit <- 0 cur <- 0uy interface IDisposable with member x.Dispose() = x.Skip() sout.Flush() member x.WriteBit(b:int) = cur <- cur ||| ((byte b) <<< bit) bit <- bit + 1 if bit = 8 then sout.WriteByte(cur) bit <- 0 cur <- 0uy member x.WriteLE (len:int) (b:int) = for i = 0 to len - 1 do x.WriteBit <| if (b &&& (1 <<< i)) = 0 then 0 else 1 member x.WriteBE (len:int) (b:int) = for i = len - 1 downto 0 do x.WriteBit <| if (b &&& (1 <<< i)) = 0 then 0 else 1 member x.WriteBytes(data:byte[]) = x.Skip() sout.Write(data, 0, data.Length) type FixedHuffmanWriter(bw:BitWriter) = member x.Write (b:int) = if b < 144 then bw.WriteBE 8 (b + 0b110000) elif b < 256 then bw.WriteBE 9 (b - 144 + 0b110010000) elif b < 280 then bw.WriteBE 7 (b - 256) elif b < 288 then bw.WriteBE 8 (b - 280 + 0b11000000) member x.WriteLen (len:int) = if len < 3 || len > maxlen then failwith <| sprintf "不正な長さ: %d" len let mutable ll = 285 while len < litlens.[ll - 257] do ll <- ll - 1 x.Write ll bw.WriteLE (getLitExLen ll) (len - litlens.[ll - 257]) member x.WriteDist (d:int) = if d < 1 || d > maxbuf then failwith <| sprintf "不正な距離: %d" d let mutable dl = 29 while d < distlens.[dl] do dl <- dl - 1 bw.WriteBE 5 dl bw.WriteLE (getDistExLen dl) (d - distlens.[dl]) let maxbuf2 = maxbuf * 2 let buflen = maxbuf2 + maxlen let inline getHash (buf:byte[]) pos = ((int buf.[pos]) <<< 4) ^^^ ((int buf.[pos + 1]) <<< 2) ^^^ (int buf.[pos + 2]) let inline addHash (hash:List[]) (buf:byte[]) pos = if buf.[pos] <> buf.[pos + 1] then hash.[getHash buf pos].Add pos let inline addHash2 (tables:int[,]) (counts:int[]) (buf:byte[]) pos = if buf.[pos] <> buf.[pos + 1] then let h = getHash buf pos let c = counts.[h] tables.[h, c &&& 15] <- pos counts.[h] <- c + 1 type Writer(t:int, sin:Stream) = let mutable length = buflen let buf = Array.zeroCreate buflen let tables, counts = if t = 2 then Array2D.zeroCreate 4096 16, Array.create 4096 0 else null, null let hash = if tables = null then [| for _ in 0..4095 -> new List() |] else null let mutable crc = ~~~0u let read pos len = let rlen = sin.Read(buf, pos, len) if rlen < len then length <- pos + rlen for i = pos to pos + rlen - 1 do let b = int(crc ^^^ (uint32 buf.[i])) &&& 0xff crc <- (crc >>> 8) ^^^ crc32_table.[b] if hash <> null then for list in hash do list.Clear() else Array.fill counts 0 counts.Length 0 do read 0 buflen let search (pos:int) = let mutable maxp = -1 let mutable maxl = 2 let mlen = Math.Min(maxlen, length - pos) let last = Math.Max(0, pos - maxbuf) let h = getHash buf pos if hash <> null then let list = hash.[h] let mutable i = list.Count - 1 while i >= 0 do let p = list.[i] if p < last then i <- 0 else let mutable len = 0 while len < mlen && buf.[p + len] = buf.[pos + len] do len <- len + 1 if len > maxl then maxp <- p maxl <- len i <- i - 1 else let c = counts.[h] let p1, p2 = if c < 16 then 0, c - 1 else c + 1, c + 16 let mutable i = p2 while i >= p1 do let p = tables.[h, i &&& 15] if p < last then i <- 0 else let mutable len = 0 while len < mlen && buf.[p + len] = buf.[pos + len] do len <- len + 1 if len > maxl then maxp <- p maxl <- len i <- i - 1 maxp, maxl member x.Crc = ~~~crc member x.Compress (sout:Stream) = use bw = new BitWriter(sout) bw.WriteBit 1 bw.WriteLE 2 1 let hw = new FixedHuffmanWriter(bw) let mutable p = 0 match t with | 2 -> while p < length do let b = buf.[p] if p < length - 4 && b = buf.[p + 1] && b = buf.[p + 2] && b = buf.[p + 3] then let mutable len = 4 let mlen = Math.Min(maxlen + 1, length - p) while len < mlen && b = buf.[p + len] do len <- len + 1 hw.Write(int b) hw.WriteLen(len - 1) hw.WriteDist 1 p <- p + len else let maxp, maxl = search p if maxp < 0 then hw.Write(int b) addHash2 tables counts buf p p <- p + 1 else hw.WriteLen maxl hw.WriteDist (p - maxp) for i = p to p + maxl - 1 do addHash2 tables counts buf i p <- p + maxl if p > maxbuf2 then Array.Copy(buf, maxbuf, buf, 0, maxbuf + maxlen) if length < buflen then length <- length - maxbuf else read (maxbuf + maxlen) maxbuf p <- p - maxbuf for i = 0 to p - 1 do addHash2 tables counts buf i | 1 -> while p < length do let b = buf.[p] if p < length - 4 && b = buf.[p + 1] && b = buf.[p + 2] && b = buf.[p + 3] then let mutable len = 4 let mlen = Math.Min(maxlen + 1, length - p) while len < mlen && b = buf.[p + len] do len <- len + 1 hw.Write(int b) hw.WriteLen(len - 1) hw.WriteDist 1 p <- p + len else let maxp, maxl = search p if maxp < 0 then hw.Write(int b) addHash hash buf p p <- p + 1 else hw.WriteLen maxl hw.WriteDist (p - maxp) for i = p to p + maxl - 1 do addHash hash buf i p <- p + maxl if p > maxbuf2 then Array.Copy(buf, maxbuf, buf, 0, maxbuf + maxlen) if length < buflen then length <- length - maxbuf else read (maxbuf + maxlen) maxbuf p <- p - maxbuf for i = 0 to p - 1 do addHash hash buf i | _ -> while p < length do let maxp, maxl = search p if maxp < 0 then hw.Write(int buf.[p]) hash.[getHash buf p].Add p p <- p + 1 else hw.WriteLen maxl hw.WriteDist (p - maxp) for i = p to p + maxl - 1 do hash.[getHash buf i].Add i p <- p + maxl if p > maxbuf2 then Array.Copy(buf, maxbuf, buf, 0, maxbuf + maxlen) if length < buflen then length <- length - maxbuf else read (maxbuf + maxlen) maxbuf p <- p - maxbuf for i = 0 to p - 1 do hash.[getHash buf i].Add i hw.Write 256 let GetCompressBytes (sin:Stream) = let now = DateTime.Now let ms = new MemoryStream() let w = new Writer(1, sin) w.Compress ms ms.ToArray(), w.Crc ---tokens--- '// public domain\n' Comment.Single '\n' Text 'module' Keyword ' ' Text 'Deflate' Name.Namespace '\n\n' Text 'open' Keyword ' ' Text 'System' Name.Namespace '\n' Text 'open' Keyword ' ' Text 'System.Collections.Generic' Name.Namespace '\n' Text 'open' Keyword ' ' Text 'System.IO' Name.Namespace '\n' Text 'open' Keyword ' ' Text 'System.Linq' Name.Namespace '\n' Text 'open' Keyword ' ' Text 'Crc' Name.Namespace '\n\n' Text 'let' Keyword ' ' Text 'maxbuf' Name.Variable ' ' Text '=' Operator ' ' Text '32768' Literal.Number.Integer '\n' Text 'let' Keyword ' ' Text 'maxlen' Name.Variable ' ' Text '=' Operator ' ' Text '258' Literal.Number.Integer '\n\n' Text 'let' Keyword ' ' Text 'getBit' Name.Variable ' ' Text '(' Operator 'b' Name ':' Operator 'byte' Keyword.Type ')' Operator ' ' Text '(' Operator 'bit' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'b' Name ' ' Text '&&' Operator '&' Operator ' ' Text '(' Operator '1uy' Literal.Number.Integer ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text 'bit' Name ')' Operator ' ' Text '=' Operator ' ' Text '0uy' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text '1' Literal.Number.Integer '\n\n' Text 'type' Keyword ' ' Text 'BitReader' Name.Class '(' Operator 'sin' Name ':' Operator 'Stream' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'bit' Name ' ' Text '=' Operator ' ' Text '8' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'cur' Name ' ' Text '=' Operator ' ' Text '0uy' Literal.Number.Integer '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Skip' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'bit' Name ' ' Text '<-' Operator ' ' Text '8' Literal.Number.Integer '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'ReadBit' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'bit' Name ' ' Text '=' Operator ' ' Text '8' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'bit' Name ' ' Text '<-' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'b' Name.Variable ' ' Text '=' Operator ' ' Text 'sin' Name '.' Operator 'ReadByte' Name '()' Name.Builtin.Pseudo '\n ' Text 'if' Keyword ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text '-' Operator '1' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'failwith' Name ' ' Text '"' Literal.String 'バッファを超過しました' Literal.String '"' Literal.String '\n ' Text 'cur' Name ' ' Text '<-' Operator ' ' Text 'byte' Keyword.Type ' ' Text 'b' Name '\n ' Text 'let' Keyword ' ' Text 'ret' Name.Variable ' ' Text '=' Operator ' ' Text 'if' Keyword ' ' Text 'cur' Name ' ' Text '&&' Operator '&' Operator ' ' Text '(' Operator '1uy' Literal.Number.Integer ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text 'bit' Name ')' Operator ' ' Text '=' Operator ' ' Text '0uy' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text '1' Literal.Number.Integer '\n ' Text 'bit' Name ' ' Text '<-' Operator ' ' Text 'bit' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'ret' Name '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'ReadLE' Name.Function ' ' Text 'n' Name ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'ret' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'n' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'if' Keyword ' ' Text 'x' Name '.' Operator 'ReadBit' Name '()' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'ret' Name ' ' Text '<-' Operator ' ' Text 'ret' Name ' ' Text '|' Operator '|' Operator '|' Operator ' ' Text '(' Operator '1' Literal.Number.Integer ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text 'i' Name ')' Operator '\n ' Text 'ret' Name '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'ReadBE' Name.Function ' ' Text 'n' Name ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'ret' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'n' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'ret' Name ' ' Text '<-' Operator ' ' Text '(' Operator 'ret' Name ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '1' Literal.Number.Integer ')' Operator ' ' Text '|' Operator '|' Operator '|' Operator ' ' Text 'x' Name '.' Operator 'ReadBit' Name '()' Name.Builtin.Pseudo '\n ' Text 'ret' Name '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'ReadBytes' Name.Function ' ' Text 'len' Name ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'bit' Name ' ' Text '<' Operator '>' Operator ' ' Text '8' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'bit' Name ' ' Text '<-' Operator ' ' Text '8' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'buf' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'byte' Keyword.Type '>' Operator ' ' Text 'len' Name '\n ' Text 'ignore' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sin' Name '.' Operator 'Read' Name '(' Operator 'buf' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'len' Name ')' Operator '\n ' Text 'buf' Name '\n\n' Text 'type' Keyword ' ' Text 'WriteBuffer' Name.Class '(' Operator 'sout' Name ':' Operator 'Stream' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'prev' Name ':' Operator 'byte' Keyword.Type '[]' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text 'null' Keyword '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'buf' Name ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'byte' Keyword.Type '>' Operator ' ' Text 'maxbuf' Name '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'p' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n \n ' Text 'let' Keyword ' ' Text 'next' Name.Variable ' ' Text 'newbuf' Name ' ' Text '=' Operator '\n ' Text 'prev' Name ' ' Text '<-' Operator ' ' Text 'buf' Name '\n ' Text 'buf' Name ' ' Text '<-' Operator ' ' Text 'if' Keyword ' ' Text 'newbuf' Name ' ' Text 'then' Keyword ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'byte' Keyword.Type '>' Operator ' ' Text 'maxbuf' Name ' ' Text 'else' Keyword ' ' Text 'null' Keyword '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text '0' Literal.Number.Integer '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Close' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'next' Name ' ' Text 'false' Keyword '\n ' Text 'next' Name ' ' Text 'false' Keyword '\n \n ' Text 'interface' Keyword ' ' Text 'IDisposable' Name ' ' Text 'with' Keyword '\n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Dispose' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text 'x' Name '.' Operator 'Close' Name '()' Name.Builtin.Pseudo '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'WriteByte' Name.Function ' ' Text '(' Operator 'b' Name ':' Operator 'byte' Keyword.Type ')' Operator ' ' Text '=' Operator '\n ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'b' Name '\n ' Text 'sout' Name '.' Operator 'WriteByte' Name ' ' Text 'b' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '=' Operator ' ' Text 'maxbuf' Name ' ' Text 'then' Keyword ' ' Text 'next' Name ' ' Text 'true' Keyword '\n\n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Write' Name.Function ' ' Text '(' Operator 'src' Name ':' Operator 'byte' Keyword.Type '[]' Name.Builtin.Pseudo ')' Operator ' ' Text 'start' Name ' ' Text 'len' Name ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'maxlen' Name.Variable ' ' Text '=' Operator ' ' Text 'maxbuf' Name ' ' Text '-' Operator ' ' Text 'p' Name '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '<' Operator '=' Operator ' ' Text 'maxlen' Name ' ' Text 'then' Keyword '\n ' Text 'Array' Name.Namespace '.' Punctuation 'Copy' Name '(' Operator 'src' Name ',' Operator ' ' Text 'start' Name ',' Operator ' ' Text 'buf' Name ',' Operator ' ' Text 'p' Name ',' Operator ' ' Text 'len' Name ')' Operator '\n ' Text 'sout' Name '.' Operator 'Write' Name '(' Operator 'src' Name ',' Operator ' ' Text 'start' Name ',' Operator ' ' Text 'len' Name ')' Operator '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'len' Name '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '=' Operator ' ' Text 'maxbuf' Name ' ' Text 'then' Keyword ' ' Text 'next' Name ' ' Text 'true' Keyword '\n ' Text 'else' Keyword '\n ' Text 'x' Name '.' Operator 'Write' Name ' ' Text 'src' Name ' ' Text 'start' Name ' ' Text 'maxlen' Name '\n ' Text 'x' Name '.' Operator 'Write' Name ' ' Text 'src' Name ' ' Text '(' Operator 'start' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name ')' Operator ' ' Text '(' Operator 'len' Name ' ' Text '-' Operator ' ' Text 'maxlen' Name ')' Operator '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Copy' Name.Function ' ' Text 'len' Name ' ' Text 'dist' Name ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'dist' Name ' ' Text '<' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String 'dist too small: %d < 1' Literal.String '"' Literal.String ' ' Text 'dist' Name '\n ' Text 'elif' Keyword ' ' Text 'dist' Name ' ' Text '>' Operator ' ' Text 'maxbuf' Name ' ' Text 'then' Keyword '\n ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String 'dist too big: %d > %d' Literal.String '"' Literal.String ' ' Text 'dist' Name ' ' Text 'maxbuf' Name '\n ' Text 'let' Keyword ' ' Text 'pp' Name.Variable ' ' Text '=' Operator ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text 'dist' Name '\n ' Text 'if' Keyword ' ' Text 'pp' Name ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'if' Keyword ' ' Text 'prev' Name ' ' Text '=' Operator ' ' Text 'null' Keyword ' ' Text 'then' Keyword '\n ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String 'dist too big: %d > %d' Literal.String '"' Literal.String ' ' Text 'dist' Name ' ' Text 'p' Name '\n ' Text 'let' Keyword ' ' Text 'pp' Name.Variable ' ' Text '=' Operator ' ' Text 'pp' Name ' ' Text '+' Operator ' ' Text 'maxbuf' Name '\n ' Text 'let' Keyword ' ' Text 'maxlen' Name.Variable ' ' Text '=' Operator ' ' Text 'maxbuf' Name ' ' Text '-' Operator ' ' Text 'pp' Name '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '<' Operator '=' Operator ' ' Text 'maxlen' Name ' ' Text 'then' Keyword '\n ' Text 'x' Name '.' Operator 'Write' Name ' ' Text 'prev' Name ' ' Text 'pp' Name ' ' Text 'len' Name '\n ' Text 'else' Keyword '\n ' Text 'x' Name '.' Operator 'Write' Name ' ' Text 'prev' Name ' ' Text 'pp' Name ' ' Text 'maxlen' Name '\n ' Text 'x' Name '.' Operator 'Copy' Name ' ' Text '(' Operator 'len' Name ' ' Text '-' Operator ' ' Text 'maxlen' Name ')' Operator ' ' Text 'dist' Name '\n ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'maxlen' Name.Variable ' ' Text '=' Operator ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text 'pp' Name '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '<' Operator '=' Operator ' ' Text 'maxlen' Name ' ' Text 'then' Keyword '\n ' Text 'x' Name '.' Operator 'Write' Name ' ' Text 'buf' Name ' ' Text 'pp' Name ' ' Text 'len' Name '\n ' Text 'else' Keyword '\n ' Text 'if' Keyword ' ' Text 'dist' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'b' Name.Variable ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'pp' Name ']' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'len' Name ' ' Text 'do' Keyword '\n ' Text 'x' Name '.' Operator 'WriteByte' Name ' ' Text 'b' Name '\n ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'buf' Name.Variable "'" Keyword ' ' Text '=' Operator ' ' Text 'buf' Name '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text "len'" Name ' ' Text '=' Operator ' ' Text 'len' Name '\n ' Text 'while' Keyword ' ' Text "len'" Name ' ' Text '>' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable "'" Keyword "'" Keyword ' ' Text '=' Operator ' ' Text 'Math' Name.Namespace '.' Punctuation 'Min' Name '(' Operator "len'" Name ',' Operator ' ' Text 'maxlen' Name ')' Operator '\n ' Text 'x' Name '.' Operator 'Write' Name ' ' Text "buf'" Name ' ' Text 'pp' Name ' ' Text "len''" Name '\n ' Text "len'" Name ' ' Text '<-' Operator ' ' Text "len'" Name ' ' Text '-' Operator ' ' Text "len''" Name '\n\n' Text 'type' Keyword ' ' Text 'Huffman' Name.Class '(' Operator 'lens' Name ':' Operator 'int' Name '[]' Name.Builtin.Pseudo ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'vals' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text 'lens' Name '.' Operator 'Length' Name '\n ' Text 'let' Keyword ' ' Text 'min' Name.Variable ' ' Text '=' Operator ' ' Text 'lens' Name '.' Operator 'Where' Name '(' Operator 'fun' Keyword ' ' Text 'x' Name ' ' Text '->' Operator ' ' Text 'x' Name ' ' Text '>' Operator ' ' Text '0' Literal.Number.Integer ')' Operator '.' Operator 'Min' Name '()' Name.Builtin.Pseudo '\n ' Text 'let' Keyword ' ' Text 'max' Name.Variable ' ' Text '=' Operator ' ' Text 'lens' Name '.' Operator 'Max' Name '()' Name.Builtin.Pseudo '\n ' Text 'let' Keyword ' ' Text 'counts' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text '(' Operator 'max' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'let' Keyword ' ' Text 'firsts' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text '(' Operator 'max' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'let' Keyword ' ' Text 'nexts' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text '(' Operator 'max' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'let' Keyword ' ' Text 'tables' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '[]' Name.Builtin.Pseudo '>' Operator '(' Operator 'max' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n \n ' Text 'do' Keyword '\n ' Text 'for' Keyword ' ' Text 'len' Name ' ' Text 'in' Keyword ' ' Text 'lens' Name ' ' Text 'do' Keyword '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '>' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'counts' Name '.' Operator '[' Operator 'len' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'counts' Name '.' Operator '[' Operator 'len' Name ']' Operator ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'max' Name ' ' Text 'do' Keyword '\n ' Text 'firsts' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text '<-' Operator ' ' Text '(' Operator 'firsts' Name '.' Operator '[' Operator 'i' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ' ' Text '+' Operator ' ' Text 'counts' Name '.' Operator '[' Operator 'i' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ')' Operator ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'Array' Name.Namespace '.' Punctuation 'Copy' Name '(' Operator 'firsts' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'nexts' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'max' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'vals' Name '.' Operator 'Length' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable ' ' Text '=' Operator ' ' Text 'lens' Name '.' Operator '[' Operator 'i' Name ']' Operator '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '>' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'vals' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'nexts' Name '.' Operator '[' Operator 'len' Name ']' Operator '\n ' Text 'nexts' Name '.' Operator '[' Operator 'len' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'nexts' Name '.' Operator '[' Operator 'len' Name ']' Operator ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n \n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'vals' Name '.' Operator 'Length' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable ' ' Text '=' Operator ' ' Text 'lens' Name '.' Operator '[' Operator 'i' Name ']' Operator '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '>' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'start' Name.Variable ' ' Text '=' Operator ' ' Text 'firsts' Name '.' Operator '[' Operator 'len' Name ']' Operator '\n ' Text 'if' Keyword ' ' Text 'tables' Name '.' Operator '[' Operator 'len' Name ']' Operator ' ' Text '=' Operator ' ' Text 'null' Keyword ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'count' Name.Variable ' ' Text '=' Operator ' ' Text 'nexts' Name '.' Operator '[' Operator 'len' Name ']' Operator ' ' Text '-' Operator ' ' Text 'start' Name '\n ' Text 'tables' Name '.' Operator '[' Operator 'len' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text 'count' Name '\n ' Text 'tables' Name '.' Operator '[' Operator 'len' Name ']' Operator '.' Operator '[' Operator 'vals' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text '-' Operator ' ' Text 'start' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'i' Name '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'GetValue' Name.Function ' ' Text 'h' Name ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'rec' Name.Variable ' ' Text 'getv' Name ' ' Text 'i' Name ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'i' Name ' ' Text '>' Operator ' ' Text 'max' Name ' ' Text 'then' Keyword ' ' Text '-' Operator '1' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'if' Keyword ' ' Text 'h' Name ' ' Text '<' Operator ' ' Text 'nexts' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text 'then' Keyword '\n ' Text 'tables' Name '.' Operator '[' Operator 'i' Name ']' Operator '.' Operator '[' Operator 'h' Name ' ' Text '-' Operator ' ' Text 'firsts' Name '.' Operator '[' Operator 'i' Name ']' Operator ']' Operator '\n ' Text 'else' Keyword '\n ' Text 'getv' Name ' ' Text '(' Operator 'i' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'getv' Name ' ' Text 'min' Name '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Read' Name.Function '(' Operator 'br' Name ':' Operator 'BitReader' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'rec' Name.Variable ' ' Text 'read' Name ' ' Text 'h' Name ' ' Text 'i' Name ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'h' Name ' ' Text '<' Operator ' ' Text 'nexts' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text 'then' Keyword '\n ' Text 'tables' Name '.' Operator '[' Operator 'i' Name ']' Operator '.' Operator '[' Operator 'h' Name ' ' Text '-' Operator ' ' Text 'firsts' Name '.' Operator '[' Operator 'i' Name ']' Operator ']' Operator '\n ' Text 'else' Keyword '\n ' Text 'read' Name ' ' Text '(' Operator '(' Operator 'h' Name ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '1' Literal.Number.Integer ')' Operator ' ' Text '|' Operator '|' Operator '|' Operator ' ' Text 'br' Name '.' Operator 'ReadBit' Name '()' Name.Builtin.Pseudo ')' Operator ' ' Text '(' Operator 'i' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'read' Name ' ' Text '(' Operator 'br' Name '.' Operator 'ReadBE' Name ' ' Text 'min' Name ')' Operator ' ' Text 'min' Name '\n\n' Text 'type' Keyword ' ' Text '[<' Operator 'AbstractClass' Name '>]' Operator ' ' Text 'HuffmanDecoder' Name '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'abstract' Keyword ' ' Text 'GetValue' Name ':' Operator ' ' Text 'unit' Keyword.Type '->' Operator 'int' Name '\n ' Text 'abstract' Keyword ' ' Text 'GetDistance' Name ':' Operator ' ' Text 'unit' Keyword.Type '->' Operator 'int' Name '\n\n' Text 'type' Keyword ' ' Text 'FixedHuffman' Name.Class '(' Operator 'br' Name ':' Operator 'BitReader' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'inherit' Keyword ' ' Text 'HuffmanDecoder' Name '()' Name.Builtin.Pseudo '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'GetValue' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'v' Name.Variable ' ' Text '=' Operator ' ' Text 'br' Name '.' Operator 'ReadBE' Name ' ' Text '7' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '<' Operator ' ' Text '24' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'v' Name ' ' Text '+' Operator ' ' Text '256' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'v' Name.Variable ' ' Text '=' Operator ' ' Text '(' Operator 'v' Name ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '1' Literal.Number.Integer ')' Operator ' ' Text '|' Operator '|' Operator '|' Operator ' ' Text 'br' Name '.' Operator 'ReadBit' Name '()' Name.Builtin.Pseudo '\n ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '<' Operator ' ' Text '192' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'v' Name ' ' Text '-' Operator ' ' Text '48' Literal.Number.Integer '\n ' Text 'elif' Keyword ' ' Text 'v' Name ' ' Text '<' Operator ' ' Text '200' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'v' Name ' ' Text '+' Operator ' ' Text '88' Literal.Number.Integer '\n ' Text 'else' Keyword ' ' Text '(' Operator '(' Operator 'v' Name ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '1' Literal.Number.Integer ')' Operator ' ' Text '|' Operator '|' Operator '|' Operator ' ' Text 'br' Name '.' Operator 'ReadBit' Name '()' Name.Builtin.Pseudo ')' Operator ' ' Text '-' Operator ' ' Text '256' Literal.Number.Integer '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'GetDistance' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text 'br' Name '.' Operator 'ReadBE' Name ' ' Text '5' Literal.Number.Integer '\n\n' Text 'type' Keyword ' ' Text 'DynamicHuffman' Name.Class '(' Operator 'br' Name ':' Operator 'BitReader' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'inherit' Keyword ' ' Text 'HuffmanDecoder' Name '()' Name.Builtin.Pseudo '\n \n ' Text 'let' Keyword ' ' Text 'lit' Name.Variable ',' Operator ' ' Text 'dist' Name ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'hlit' Name.Variable ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'hlit' Name.Variable ' ' Text '=' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '5' Literal.Number.Integer ')' Operator ' ' Text '+' Operator ' ' Text '257' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'hlit' Name ' ' Text '>' Operator ' ' Text '286' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String 'hlit: %d > 286' Literal.String '"' Literal.String ' ' Text 'hlit' Name '\n ' Text 'hlit' Name '\n \n ' Text 'let' Keyword ' ' Text 'hdist' Name.Variable ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'hdist' Name.Variable ' ' Text '=' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '5' Literal.Number.Integer ')' Operator ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'hdist' Name ' ' Text '>' Operator ' ' Text '32' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String 'hdist: %d > 32' Literal.String '"' Literal.String ' ' Text 'hdist' Name '\n ' Text 'hdist' Name '\n \n ' Text 'let' Keyword ' ' Text 'hclen' Name.Variable ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'hclen' Name.Variable ' ' Text '=' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '4' Literal.Number.Integer ')' Operator ' ' Text '+' Operator ' ' Text '4' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'hclen' Name ' ' Text '>' Operator ' ' Text '19' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String 'hclen: %d > 19' Literal.String '"' Literal.String ' ' Text 'hclen' Name '\n ' Text 'hclen' Name '\n \n ' Text 'let' Keyword ' ' Text 'clen' Name.Variable ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'hclens' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text '19' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'order' Name.Variable ' ' Text '=' Operator ' ' Text '[|' Operator ' ' Text '16' Literal.Number.Integer ';' Operator ' ' Text '17' Literal.Number.Integer ';' Operator ' ' Text '18' Literal.Number.Integer ';' Operator ' ' Text '0' Literal.Number.Integer ';' Operator ' ' Text '8' Literal.Number.Integer ';' Operator ' ' Text '7' Literal.Number.Integer ';' Operator ' ' Text '9' Literal.Number.Integer ';' Operator ' ' Text '6' Literal.Number.Integer ';' Operator ' ' Text '10' Literal.Number.Integer ';' Operator ' ' Text '5' Literal.Number.Integer ';' Operator '\n ' Text '11' Literal.Number.Integer ';' Operator ' ' Text '4' Literal.Number.Integer ';' Operator ' ' Text '12' Literal.Number.Integer ';' Operator ' ' Text '3' Literal.Number.Integer ';' Operator ' ' Text '13' Literal.Number.Integer ';' Operator ' ' Text '2' Literal.Number.Integer ';' Operator ' ' Text '14' Literal.Number.Integer ';' Operator ' ' Text '1' Literal.Number.Integer ';' Operator ' ' Text '15' Literal.Number.Integer ' ' Text '|]' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'hclen' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'hclens' Name '.' Operator '[' Operator 'order' Name '.' Operator '[' Operator 'i' Name ']' Operator ']' Operator ' ' Text '<-' Operator ' ' Text 'br' Name '.' Operator 'ReadLE' Name ' ' Text '3' Literal.Number.Integer '\n ' Text 'new' Keyword ' ' Text 'Huffman' Name '(' Operator 'hclens' Name ')' Operator '\n \n ' Text 'let' Keyword ' ' Text 'ld' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator '(' Operator 'hlit' Name ' ' Text '+' Operator ' ' Text 'hdist' Name ')' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'while' Keyword ' ' Text 'i' Name ' ' Text '<' Operator ' ' Text 'ld' Name '.' Operator 'Length' Name ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'v' Name.Variable ' ' Text '=' Operator ' ' Text 'clen' Name '.' Operator 'Read' Name '(' Operator 'br' Name ')' Operator '\n ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '<' Operator ' ' Text '16' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'ld' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'v' Name '\n ' Text 'i' Name ' ' Text '<-' Operator ' ' Text 'i' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'r' Name.Variable ',' Operator ' ' Text 'v' Name ' ' Text '=' Operator '\n ' Text 'match' Keyword ' ' Text 'v' Name ' ' Text 'with' Keyword '\n ' Text '|' Operator ' ' Text '16' Literal.Number.Integer ' ' Text '->' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '2' Literal.Number.Integer ')' Operator ' ' Text '+' Operator ' ' Text '3' Literal.Number.Integer ',' Operator ' ' Text 'ld' Name '.' Operator '[' Operator 'i' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ']' Operator '\n ' Text '|' Operator ' ' Text '17' Literal.Number.Integer ' ' Text '->' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '3' Literal.Number.Integer ')' Operator ' ' Text '+' Operator ' ' Text '3' Literal.Number.Integer ',' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text '|' Operator ' ' Text '18' Literal.Number.Integer ' ' Text '->' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '7' Literal.Number.Integer ')' Operator ' ' Text '+' Operator ' ' Text '11' Literal.Number.Integer ',' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text '|' Operator ' ' Text '_' Operator ' ' Text '->' Operator ' ' Text 'failwith' Name ' ' Text '"' Literal.String '不正な値です。' Literal.String '"' Literal.String '\n ' Text 'for' Keyword ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'r' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'ld' Name '.' Operator '[' Operator 'i' Name ' ' Text '+' Operator ' ' Text 'j' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'v' Name '\n ' Text 'i' Name ' ' Text '<-' Operator ' ' Text 'i' Name ' ' Text '+' Operator ' ' Text 'r' Name '\n \n ' Text 'new' Keyword ' ' Text 'Huffman' Name '(' Operator 'ld' Name '.' Operator '[' Operator '0' Literal.Number.Integer ' ' Text '..' Operator ' ' Text 'hlit' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ')' Operator ',' Operator '\n ' Text 'new' Keyword ' ' Text 'Huffman' Name '(' Operator 'ld' Name '.' Operator '[' Operator 'hlit' Name ' ' Text '..' Operator ' ' Text 'hlit' Name ' ' Text '+' Operator ' ' Text 'hdist' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ')' Operator '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'GetValue' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text 'lit' Name '.' Operator 'Read' Name ' ' Text 'br' Name '\n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'GetDistance' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text 'dist' Name '.' Operator 'Read' Name ' ' Text 'br' Name '\n\n' Text 'let' Keyword ' ' Text 'getLitExLen' Name.Variable ' ' Text 'v' Name ' ' Text '=' Operator ' ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '<' Operator ' ' Text '265' Literal.Number.Integer ' ' Text '|' Operator '|' Operator ' ' Text 'v' Name ' ' Text '=' Operator ' ' Text '285' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text '(' Operator 'v' Name ' ' Text '-' Operator ' ' Text '261' Literal.Number.Integer ')' Operator ' ' Text '>' Operator '>' Operator '>' Operator ' ' Text '2' Literal.Number.Integer '\n' Text 'let' Keyword ' ' Text 'getDistExLen' Name.Variable ' ' Text 'd' Name ' ' Text '=' Operator ' ' Text 'if' Keyword ' ' Text 'd' Name ' ' Text '<' Operator ' ' Text '4' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text '(' Operator 'd' Name ' ' Text '-' Operator ' ' Text '2' Literal.Number.Integer ')' Operator ' ' Text '>' Operator '>' Operator '>' Operator ' ' Text '1' Literal.Number.Integer '\n\n' Text 'let' Keyword ' ' Text 'litlens' Name.Variable ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'litlens' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text '286' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'v' Name ' ' Text '=' Operator ' ' Text '3' Literal.Number.Integer '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '257' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text '284' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'litlens' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'v' Name '\n ' Text 'v' Name ' ' Text '<-' Operator ' ' Text 'v' Name ' ' Text '+' Operator ' ' Text '(' Operator '1' Literal.Number.Integer ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '(' Operator 'getLitExLen' Name ' ' Text 'i' Name ')' Operator ')' Operator '\n ' Text 'litlens' Name '.' Operator '[' Operator '285' Literal.Number.Integer ']' Operator ' ' Text '<-' Operator ' ' Text 'maxlen' Name '\n ' Text 'litlens' Name '.' Operator '[' Operator '257' Literal.Number.Integer '..' Operator '285' Literal.Number.Integer ']' Operator '\n\n' Text 'let' Keyword ' ' Text 'distlens' Name.Variable ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'distlens' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text '30' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'v' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text '29' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'distlens' Name '.' Operator '[' Operator 'i' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'v' Name '\n ' Text 'v' Name ' ' Text '<-' Operator ' ' Text 'v' Name ' ' Text '+' Operator ' ' Text '(' Operator '1' Literal.Number.Integer ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '(' Operator 'getDistExLen' Name ' ' Text 'i' Name ')' Operator ')' Operator '\n ' Text 'distlens' Name '\n\n' Text 'type' Keyword ' ' Text 'Reader' Name.Class '(' Operator 'sin' Name ':' Operator 'Stream' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'inherit' Keyword ' ' Text 'Stream' Name '()' Name.Builtin.Pseudo '\n \n ' Text 'let' Keyword ' ' Text 'br' Name.Variable ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'BitReader' Name '(' Operator 'sin' Name ')' Operator '\n ' Text 'let' Keyword ' ' Text 'fh' Name.Variable ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'FixedHuffman' Name '(' Operator 'br' Name ')' Operator '\n \n ' Text 'let' Keyword ' ' Text 'sout' Name.Variable ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'MemoryStream' Name '()' Name.Builtin.Pseudo '\n ' Text 'let' Keyword ' ' Text 'dbuf' Name.Variable ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'WriteBuffer' Name '(' Operator 'sout' Name ')' Operator '\n \n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'cache' Name ':' Operator 'byte' Keyword.Type '[]' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text 'null' Keyword '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'canRead' Name ' ' Text '=' Operator ' ' Text 'true' Keyword '\n\n ' Text 'let' Keyword ' ' Text 'rec' Name.Variable ' ' Text 'read' Name ' ' Text '(' Operator 'h' Name ':' Operator 'HuffmanDecoder' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'v' Name.Variable ' ' Text '=' Operator ' ' Text 'h' Name '.' Operator 'GetValue' Name '()' Name.Builtin.Pseudo '\n ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '>' Operator ' ' Text '285' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String '不正な値: %d' Literal.String '"' Literal.String ' ' Text 'v' Name '\n ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '<' Operator ' ' Text '256' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'dbuf' Name '.' Operator 'WriteByte' Name '(' Operator 'byte' Keyword.Type ' ' Text 'v' Name ')' Operator '\n ' Text 'elif' Keyword ' ' Text 'v' Name ' ' Text '>' Operator ' ' Text '256' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '<' Operator ' ' Text '265' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'v' Name ' ' Text '-' Operator ' ' Text '254' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'litlens' Name '.' Operator '[' Operator 'v' Name ' ' Text '-' Operator ' ' Text '257' Literal.Number.Integer ']' Operator ' ' Text '+' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '(' Operator 'getLitExLen' Name ' ' Text 'v' Name ')' Operator ')' Operator '\n ' Text 'let' Keyword ' ' Text 'dist' Name.Variable ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'd' Name.Variable ' ' Text '=' Operator ' ' Text 'h' Name '.' Operator 'GetDistance' Name '()' Name.Builtin.Pseudo '\n ' Text 'if' Keyword ' ' Text 'd' Name ' ' Text '>' Operator ' ' Text '29' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String '不正な距離: %d' Literal.String '"' Literal.String ' ' Text 'd' Name '\n ' Text 'if' Keyword ' ' Text 'd' Name ' ' Text '<' Operator ' ' Text '4' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'd' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'distlens' Name '.' Operator '[' Operator 'd' Name ']' Operator ' ' Text '+' Operator ' ' Text '(' Operator 'br' Name '.' Operator 'ReadLE' Name ' ' Text '(' Operator 'getDistExLen' Name ' ' Text 'd' Name ')' Operator ')' Operator '\n ' Text 'dbuf' Name '.' Operator 'Copy' Name ' ' Text 'len' Name ' ' Text 'dist' Name '\n ' Text 'if' Keyword ' ' Text 'v' Name ' ' Text '<' Operator '>' Operator ' ' Text '256' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'read' Name ' ' Text 'h' Name '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'CanRead' Name.Function ' ' Text '=' Operator ' ' Text 'canRead' Name '\n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'CanWrite' Name.Function ' ' Text '=' Operator ' ' Text 'false' Keyword '\n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'CanSeek' Name.Function ' ' Text '=' Operator ' ' Text 'false' Keyword '\n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'Flush' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text '()' Name.Builtin.Pseudo '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'Close' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'dbuf' Name '.' Operator 'Close' Name '()' Name.Builtin.Pseudo '\n ' Text 'canRead' Name ' ' Text '<-' Operator ' ' Text 'false' Keyword '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'Read' Name.Function '(' Operator 'buffer' Name ',' Operator ' ' Text 'offset' Name ',' Operator ' ' Text 'count' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'offset' Name.Variable ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'cache' Name ' ' Text '=' Operator ' ' Text 'null' Keyword ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'clen' Name.Variable ' ' Text '=' Operator ' ' Text 'cache' Name '.' Operator 'Length' Name '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable ' ' Text '=' Operator ' ' Text 'Math' Name.Namespace '.' Punctuation 'Min' Name '(' Operator 'clen' Name ',' Operator ' ' Text 'count' Name ')' Operator '\n ' Text 'Array' Name.Namespace '.' Punctuation 'Copy' Name '(' Operator 'cache' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'buffer' Name ',' Operator ' ' Text 'offset' Name ',' Operator ' ' Text 'len' Name ')' Operator '\n ' Text 'cache' Name ' ' Text '<-' Operator ' ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '=' Operator ' ' Text 'clen' Name ' ' Text 'then' Keyword ' ' Text 'null' Keyword '\n ' Text 'else' Keyword ' ' Text 'cache' Name '.' Operator '[' Operator 'len' Name ' ' Text '..' Operator ' ' Text 'clen' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ']' Operator '\n ' Text 'len' Name '\n ' Text 'let' Keyword ' ' Text 'req' Name.Variable ' ' Text '=' Operator ' ' Text 'int64' Keyword.Type ' ' Text '<' Operator '|' Operator ' ' Text 'count' Name ' ' Text '-' Operator ' ' Text 'offset' Name '\n ' Text 'while' Keyword ' ' Text 'canRead' Name ' ' Text '&&' Operator ' ' Text 'sout' Name '.' Operator 'Length' Name ' ' Text '<' Operator ' ' Text 'req' Name ' ' Text 'do' Keyword '\n ' Text 'x' Name '.' Operator 'readBlock' Name '()' Name.Builtin.Pseudo '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'sout' Name '.' Operator 'Length' Name ' ' Text '=' Operator ' ' Text '0L' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'data' Name.Variable ' ' Text '=' Operator ' ' Text 'sout' Name '.' Operator 'ToArray' Name '()' Name.Builtin.Pseudo '\n ' Text 'sout' Name '.' Operator 'SetLength' Name '(' Operator '0L' Literal.Number.Integer ')' Operator '\n ' Text 'let' Keyword ' ' Text 'dlen' Name.Variable ' ' Text '=' Operator ' ' Text 'data' Name '.' Operator 'Length' Name '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable ' ' Text '=' Operator ' ' Text 'Math' Name.Namespace '.' Punctuation 'Min' Name '(' Operator 'int' Name ' ' Text 'req' Name ',' Operator ' ' Text 'dlen' Name ')' Operator '\n ' Text 'Array' Name.Namespace '.' Punctuation 'Copy' Name '(' Operator 'data' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'buffer' Name ',' Operator ' ' Text 'offset' Name ',' Operator ' ' Text 'len' Name ')' Operator '\n ' Text 'if' Keyword ' ' Text 'dlen' Name ' ' Text '>' Operator ' ' Text 'len' Name ' ' Text 'then' Keyword '\n ' Text 'cache' Name ' ' Text '<-' Operator ' ' Text 'data' Name '.' Operator '[' Operator 'len' Name '..' Operator ']' Operator '\n ' Text 'len' Name '\n ' Text 'offset' Name ' ' Text '+' Operator ' ' Text 'len' Name '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'Position' Name.Function '\n ' Text 'with' Keyword ' ' Text 'get' Name '()' Name.Builtin.Pseudo ' ' Text '=' Operator ' ' Text 'raise' Name ' ' Text '<' Operator '|' Operator ' ' Text 'new' Keyword ' ' Text 'NotImplementedException' Name '()' Name.Builtin.Pseudo '\n ' Text 'and' Operator.Word ' ' Text 'set' Name '(' Operator 'v' Name ')' Operator ' ' Text '=' Operator ' ' Text 'raise' Name ' ' Text '<' Operator '|' Operator ' ' Text 'new' Keyword ' ' Text 'NotImplementedException' Name '()' Name.Builtin.Pseudo '\n \n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'Length' Name.Function ' ' Text '=' Operator ' ' Text 'raise' Name ' ' Text '<' Operator '|' Operator ' ' Text 'new' Keyword ' ' Text 'NotImplementedException' Name '()' Name.Builtin.Pseudo '\n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'Seek' Name.Function '(' Operator '_' Operator ',' Operator ' ' Text '_' Operator ')' Operator ' ' Text '=' Operator ' ' Text 'raise' Name ' ' Text '<' Operator '|' Operator ' ' Text 'new' Keyword ' ' Text 'NotImplementedException' Name '()' Name.Builtin.Pseudo '\n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'Write' Name.Function '(' Operator '_' Operator ',' Operator ' ' Text '_' Operator ',' Operator ' ' Text '_' Operator ')' Operator ' ' Text '=' Operator ' ' Text 'raise' Name ' ' Text '<' Operator '|' Operator ' ' Text 'new' Keyword ' ' Text 'NotImplementedException' Name '()' Name.Builtin.Pseudo '\n ' Text 'override' Keyword ' ' Text 'x' Name '.' Punctuation 'SetLength' Name.Function '(' Operator '_' Operator ')' Operator ' ' Text '=' Operator ' ' Text 'raise' Name ' ' Text '<' Operator '|' Operator ' ' Text 'new' Keyword ' ' Text 'NotImplementedException' Name '()' Name.Builtin.Pseudo '\n \n ' Text 'member' Keyword ' ' Text 'private' Keyword ' ' Text 'x' Name '.' Operator 'readBlock' Name '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'bfinal' Name.Variable ' ' Text '=' Operator ' ' Text 'br' Name '.' Operator 'ReadBit' Name '()' Name.Builtin.Pseudo '\n ' Text 'match' Keyword ' ' Text 'br' Name '.' Operator 'ReadLE' Name ' ' Text '2' Literal.Number.Integer ' ' Text 'with' Keyword '\n ' Text '|' Operator ' ' Text '0' Literal.Number.Integer ' ' Text '->' Operator ' ' Text 'br' Name '.' Operator 'Skip' Name '()' Name.Builtin.Pseudo '\n ' Text 'let' Keyword ' ' Text 'len' Name.Variable ' ' Text '=' Operator ' ' Text 'br' Name '.' Operator 'ReadLE' Name ' ' Text '16' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'nlen' Name.Variable ' ' Text '=' Operator ' ' Text 'br' Name '.' Operator 'ReadLE' Name ' ' Text '16' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '+' Operator ' ' Text 'nlen' Name ' ' Text '<' Operator '>' Operator ' ' Text '0' Literal.Number.Integer 'x10000' Name ' ' Text 'then' Keyword '\n ' Text 'failwith' Name ' ' Text '"' Literal.String '不正な非圧縮長' Literal.String '"' Literal.String '\n ' Text 'dbuf' Name '.' Operator 'Write' Name ' ' Text '(' Operator 'br' Name '.' Operator 'ReadBytes' Name ' ' Text 'len' Name ')' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'len' Name '\n ' Text '|' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '->' Operator ' ' Text 'read' Name ' ' Text 'fh' Name '\n ' Text '|' Operator ' ' Text '2' Literal.Number.Integer ' ' Text '->' Operator ' ' Text 'read' Name ' ' Text '(' Operator 'new' Keyword ' ' Text 'DynamicHuffman' Name '(' Operator 'br' Name ')' Operator ')' Operator '\n ' Text '|' Operator ' ' Text '_' Operator ' ' Text '->' Operator ' ' Text 'failwith' Name ' ' Text '"' Literal.String '不正なブロックタイプ' Literal.String '"' Literal.String '\n ' Text 'if' Keyword ' ' Text 'bfinal' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'canRead' Name ' ' Text '<-' Operator ' ' Text 'false' Keyword '\n ' Text 'x' Name '.' Operator 'Close' Name '()' Name.Builtin.Pseudo '\n\n' Text 'type' Keyword ' ' Text 'BitWriter' Name.Class '(' Operator 'sout' Name ':' Operator 'Stream' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'bit' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'cur' Name ' ' Text '=' Operator ' ' Text '0uy' Literal.Number.Integer '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Skip' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'bit' Name ' ' Text '>' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'sout' Name '.' Operator 'WriteByte' Name '(' Operator 'cur' Name ')' Operator '\n ' Text 'bit' Name ' ' Text '<-' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'cur' Name ' ' Text '<-' Operator ' ' Text '0uy' Literal.Number.Integer '\n \n ' Text 'interface' Keyword ' ' Text 'IDisposable' Name ' ' Text 'with' Keyword '\n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Dispose' Name.Function '()' Name.Builtin.Pseudo ' ' Text '=' Operator '\n ' Text 'x' Name '.' Operator 'Skip' Name '()' Name.Builtin.Pseudo '\n ' Text 'sout' Name '.' Operator 'Flush' Name '()' Name.Builtin.Pseudo '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'WriteBit' Name.Function '(' Operator 'b' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'cur' Name ' ' Text '<-' Operator ' ' Text 'cur' Name ' ' Text '|' Operator '|' Operator '|' Operator ' ' Text '(' Operator '(' Operator 'byte' Keyword.Type ' ' Text 'b' Name ')' Operator ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text 'bit' Name ')' Operator '\n ' Text 'bit' Name ' ' Text '<-' Operator ' ' Text 'bit' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'bit' Name ' ' Text '=' Operator ' ' Text '8' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'sout' Name '.' Operator 'WriteByte' Name '(' Operator 'cur' Name ')' Operator '\n ' Text 'bit' Name ' ' Text '<-' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'cur' Name ' ' Text '<-' Operator ' ' Text '0uy' Literal.Number.Integer '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'WriteLE' Name.Function ' ' Text '(' Operator 'len' Name ':' Operator 'int' Name ')' Operator ' ' Text '(' Operator 'b' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'len' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'x' Name '.' Operator 'WriteBit' Name ' ' Text '<' Operator '|' Operator ' ' Text 'if' Keyword ' ' Text '(' Operator 'b' Name ' ' Text '&&' Operator '&' Operator ' ' Text '(' Operator '1' Literal.Number.Integer ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text 'i' Name ')' Operator ')' Operator ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text '1' Literal.Number.Integer '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'WriteBE' Name.Function ' ' Text '(' Operator 'len' Name ':' Operator 'int' Name ')' Operator ' ' Text '(' Operator 'b' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'len' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'downto' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'x' Name '.' Operator 'WriteBit' Name ' ' Text '<' Operator '|' Operator ' ' Text 'if' Keyword ' ' Text '(' Operator 'b' Name ' ' Text '&&' Operator '&' Operator ' ' Text '(' Operator '1' Literal.Number.Integer ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text 'i' Name ')' Operator ')' Operator ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text '1' Literal.Number.Integer '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'WriteBytes' Name.Function '(' Operator 'data' Name ':' Operator 'byte' Keyword.Type '[]' Name.Builtin.Pseudo ')' Operator ' ' Text '=' Operator '\n ' Text 'x' Name '.' Operator 'Skip' Name '()' Name.Builtin.Pseudo '\n ' Text 'sout' Name '.' Operator 'Write' Name '(' Operator 'data' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'data' Name '.' Operator 'Length' Name ')' Operator '\n\n' Text 'type' Keyword ' ' Text 'FixedHuffmanWriter' Name.Class '(' Operator 'bw' Name ':' Operator 'BitWriter' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Write' Name.Function ' ' Text '(' Operator 'b' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'b' Name ' ' Text '<' Operator ' ' Text '144' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'bw' Name '.' Operator 'WriteBE' Name ' ' Text '8' Literal.Number.Integer ' ' Text '(' Operator 'b' Name ' ' Text '+' Operator ' ' Text '0' Literal.Number.Integer 'b110000' Name ')' Operator '\n ' Text 'elif' Keyword ' ' Text 'b' Name ' ' Text '<' Operator ' ' Text '256' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'bw' Name '.' Operator 'WriteBE' Name ' ' Text '9' Literal.Number.Integer ' ' Text '(' Operator 'b' Name ' ' Text '-' Operator ' ' Text '144' Literal.Number.Integer ' ' Text '+' Operator ' ' Text '0' Literal.Number.Integer 'b110010000' Name ')' Operator '\n ' Text 'elif' Keyword ' ' Text 'b' Name ' ' Text '<' Operator ' ' Text '280' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'bw' Name '.' Operator 'WriteBE' Name ' ' Text '7' Literal.Number.Integer ' ' Text '(' Operator 'b' Name ' ' Text '-' Operator ' ' Text '256' Literal.Number.Integer ')' Operator '\n ' Text 'elif' Keyword ' ' Text 'b' Name ' ' Text '<' Operator ' ' Text '288' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'bw' Name '.' Operator 'WriteBE' Name ' ' Text '8' Literal.Number.Integer ' ' Text '(' Operator 'b' Name ' ' Text '-' Operator ' ' Text '280' Literal.Number.Integer ' ' Text '+' Operator ' ' Text '0' Literal.Number.Integer 'b11000000' Name ')' Operator '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'WriteLen' Name.Function ' ' Text '(' Operator 'len' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '<' Operator ' ' Text '3' Literal.Number.Integer ' ' Text '|' Operator '|' Operator ' ' Text 'len' Name ' ' Text '>' Operator ' ' Text 'maxlen' Name ' ' Text 'then' Keyword '\n ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String '不正な長さ: %d' Literal.String '"' Literal.String ' ' Text 'len' Name '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'll' Name ' ' Text '=' Operator ' ' Text '285' Literal.Number.Integer '\n ' Text 'while' Keyword ' ' Text 'len' Name ' ' Text '<' Operator ' ' Text 'litlens' Name '.' Operator '[' Operator 'll' Name ' ' Text '-' Operator ' ' Text '257' Literal.Number.Integer ']' Operator ' ' Text 'do' Keyword '\n ' Text 'll' Name ' ' Text '<-' Operator ' ' Text 'll' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'x' Name '.' Operator 'Write' Name ' ' Text 'll' Name '\n ' Text 'bw' Name '.' Operator 'WriteLE' Name ' ' Text '(' Operator 'getLitExLen' Name ' ' Text 'll' Name ')' Operator ' ' Text '(' Operator 'len' Name ' ' Text '-' Operator ' ' Text 'litlens' Name '.' Operator '[' Operator 'll' Name ' ' Text '-' Operator ' ' Text '257' Literal.Number.Integer ']' Operator ')' Operator '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'WriteDist' Name.Function ' ' Text '(' Operator 'd' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'd' Name ' ' Text '<' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '|' Operator '|' Operator ' ' Text 'd' Name ' ' Text '>' Operator ' ' Text 'maxbuf' Name ' ' Text 'then' Keyword '\n ' Text 'failwith' Name ' ' Text '<' Operator '|' Operator ' ' Text 'sprintf' Name ' ' Text '"' Literal.String '不正な距離: %d' Literal.String '"' Literal.String ' ' Text 'd' Name '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'dl' Name ' ' Text '=' Operator ' ' Text '29' Literal.Number.Integer '\n ' Text 'while' Keyword ' ' Text 'd' Name ' ' Text '<' Operator ' ' Text 'distlens' Name '.' Operator '[' Operator 'dl' Name ']' Operator ' ' Text 'do' Keyword '\n ' Text 'dl' Name ' ' Text '<-' Operator ' ' Text 'dl' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'bw' Name '.' Operator 'WriteBE' Name ' ' Text '5' Literal.Number.Integer ' ' Text 'dl' Name '\n ' Text 'bw' Name '.' Operator 'WriteLE' Name ' ' Text '(' Operator 'getDistExLen' Name ' ' Text 'dl' Name ')' Operator ' ' Text '(' Operator 'd' Name ' ' Text '-' Operator ' ' Text 'distlens' Name '.' Operator '[' Operator 'dl' Name ']' Operator ')' Operator '\n\n' Text 'let' Keyword ' ' Text 'maxbuf2' Name.Variable ' ' Text '=' Operator ' ' Text 'maxbuf' Name ' ' Text '*' Operator ' ' Text '2' Literal.Number.Integer '\n' Text 'let' Keyword ' ' Text 'buflen' Name.Variable ' ' Text '=' Operator ' ' Text 'maxbuf2' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name '\n\n' Text 'let' Keyword ' ' Text 'inline' Name.Variable ' ' Text 'getHash' Name ' ' Text '(' Operator 'buf' Name ':' Operator 'byte' Keyword.Type '[]' Name.Builtin.Pseudo ')' Operator ' ' Text 'pos' Name ' ' Text '=' Operator '\n ' Text '(' Operator '(' Operator 'int' Name ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ']' Operator ')' Operator ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '4' Literal.Number.Integer ')' Operator ' ' Text '^^' Operator '^' Operator ' ' Text '(' Operator '(' Operator 'int' Name ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ')' Operator ' ' Text '<' Operator '<' Operator '<' Operator ' ' Text '2' Literal.Number.Integer ')' Operator ' ' Text '^^' Operator '^' Operator ' ' Text '(' Operator 'int' Name ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ' ' Text '+' Operator ' ' Text '2' Literal.Number.Integer ']' Operator ')' Operator '\n\n' Text 'let' Keyword ' ' Text 'inline' Name.Variable ' ' Text 'addHash' Name ' ' Text '(' Operator 'hash' Name ':' Operator 'List' Name '<' Operator 'int' Name '>' Operator '[]' Name.Builtin.Pseudo ')' Operator ' ' Text '(' Operator 'buf' Name ':' Operator 'byte' Keyword.Type '[]' Name.Builtin.Pseudo ')' Operator ' ' Text 'pos' Name ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ']' Operator ' ' Text '<' Operator '>' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ' ' Text 'then' Keyword '\n ' Text 'hash' Name '.' Operator '[' Operator 'getHash' Name ' ' Text 'buf' Name ' ' Text 'pos' Name ']' Operator '.' Operator 'Add' Name ' ' Text 'pos' Name '\n\n' Text 'let' Keyword ' ' Text 'inline' Name.Variable ' ' Text 'addHash2' Name ' ' Text '(' Operator 'tables' Name ':' Operator 'int' Name '[' Operator ',' Operator ']' Operator ')' Operator ' ' Text '(' Operator 'counts' Name ':' Operator 'int' Name '[]' Name.Builtin.Pseudo ')' Operator ' ' Text '(' Operator 'buf' Name ':' Operator 'byte' Keyword.Type '[]' Name.Builtin.Pseudo ')' Operator ' ' Text 'pos' Name ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ']' Operator ' ' Text '<' Operator '>' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'h' Name.Variable ' ' Text '=' Operator ' ' Text 'getHash' Name ' ' Text 'buf' Name ' ' Text 'pos' Name '\n ' Text 'let' Keyword ' ' Text 'c' Name.Variable ' ' Text '=' Operator ' ' Text 'counts' Name '.' Operator '[' Operator 'h' Name ']' Operator '\n ' Text 'tables' Name '.' Operator '[' Operator 'h' Name ',' Operator ' ' Text 'c' Name ' ' Text '&&' Operator '&' Operator ' ' Text '15' Literal.Number.Integer ']' Operator ' ' Text '<-' Operator ' ' Text 'pos' Name '\n ' Text 'counts' Name '.' Operator '[' Operator 'h' Name ']' Operator ' ' Text '<-' Operator ' ' Text 'c' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n\n' Text 'type' Keyword ' ' Text 'Writer' Name.Class '(' Operator 't' Name ':' Operator 'int' Name ',' Operator ' ' Text 'sin' Name ':' Operator 'Stream' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'length' Name ' ' Text '=' Operator ' ' Text 'buflen' Name '\n ' Text 'let' Keyword ' ' Text 'buf' Name.Variable ' ' Text '=' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'byte' Keyword.Type '>' Operator ' ' Text 'buflen' Name '\n ' Text 'let' Keyword ' ' Text 'tables' Name.Variable ',' Operator ' ' Text 'counts' Name ' ' Text '=' Operator '\n ' Text 'if' Keyword ' ' Text 't' Name ' ' Text '=' Operator ' ' Text '2' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text 'Array2D' Name.Namespace '.' Punctuation 'zeroCreate' Name '<' Operator 'int' Name '>' Operator ' ' Text '4096' Literal.Number.Integer ' ' Text '16' Literal.Number.Integer ',' Operator ' ' Text 'Array' Name.Namespace '.' Punctuation 'create' Name ' ' Text '4096' Literal.Number.Integer ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text 'null' Keyword ',' Operator ' ' Text 'null' Keyword '\n ' Text 'let' Keyword ' ' Text 'hash' Name.Variable ' ' Text '=' Operator ' ' Text 'if' Keyword ' ' Text 'tables' Name ' ' Text '=' Operator ' ' Text 'null' Keyword ' ' Text 'then' Keyword ' ' Text '[|' Operator ' ' Text 'for' Keyword ' ' Text '_' Operator ' ' Text 'in' Keyword ' ' Text '0' Literal.Number.Integer '..' Operator '4095' Literal.Number.Integer ' ' Text '->' Operator ' ' Text 'new' Keyword ' ' Text 'List' Name '<' Operator 'int' Name '>' Operator '()' Name.Builtin.Pseudo ' ' Text '|]' Operator ' ' Text 'else' Keyword ' ' Text 'null' Keyword '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'crc' Name ' ' Text '=' Operator ' ' Text '~' Operator '~' Operator '~' Operator '0u' Literal.Number.Integer '\n \n ' Text 'let' Keyword ' ' Text 'read' Name.Variable ' ' Text 'pos' Name ' ' Text 'len' Name ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'rlen' Name.Variable ' ' Text '=' Operator ' ' Text 'sin' Name '.' Operator 'Read' Name '(' Operator 'buf' Name ',' Operator ' ' Text 'pos' Name ',' Operator ' ' Text 'len' Name ')' Operator '\n ' Text 'if' Keyword ' ' Text 'rlen' Name ' ' Text '<' Operator ' ' Text 'len' Name ' ' Text 'then' Keyword ' ' Text 'length' Name ' ' Text '<-' Operator ' ' Text 'pos' Name ' ' Text '+' Operator ' ' Text 'rlen' Name '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'pos' Name ' ' Text 'to' Keyword ' ' Text 'pos' Name ' ' Text '+' Operator ' ' Text 'rlen' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'b' Name.Variable ' ' Text '=' Operator ' ' Text 'int' Name '(' Operator 'crc' Name ' ' Text '^^' Operator '^' Operator ' ' Text '(' Operator 'uint32' Keyword.Type ' ' Text 'buf' Name '.' Operator '[' Operator 'i' Name ']' Operator ')' Operator ')' Operator ' ' Text '&&' Operator '&' Operator ' ' Text '0' Literal.Number.Integer 'xff' Name '\n ' Text 'crc' Name ' ' Text '<-' Operator ' ' Text '(' Operator 'crc' Name ' ' Text '>' Operator '>' Operator '>' Operator ' ' Text '8' Literal.Number.Integer ')' Operator ' ' Text '^^' Operator '^' Operator ' ' Text 'crc32_table' Name '.' Operator '[' Operator 'b' Name ']' Operator '\n ' Text 'if' Keyword ' ' Text 'hash' Name ' ' Text '<' Operator '>' Operator ' ' Text 'null' Keyword ' ' Text 'then' Keyword '\n ' Text 'for' Keyword ' ' Text 'list' Keyword.Type ' ' Text 'in' Keyword ' ' Text 'hash' Name ' ' Text 'do' Keyword ' ' Text 'list' Keyword.Type '.' Operator 'Clear' Name '()' Name.Builtin.Pseudo '\n ' Text 'else' Keyword '\n ' Text 'Array' Name.Namespace '.' Punctuation 'fill' Name ' ' Text 'counts' Name ' ' Text '0' Literal.Number.Integer ' ' Text 'counts' Name '.' Operator 'Length' Name ' ' Text '0' Literal.Number.Integer '\n \n ' Text 'do' Keyword '\n ' Text 'read' Name ' ' Text '0' Literal.Number.Integer ' ' Text 'buflen' Name '\n \n ' Text 'let' Keyword ' ' Text 'search' Name.Variable ' ' Text '(' Operator 'pos' Name ':' Operator 'int' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'maxp' Name ' ' Text '=' Operator ' ' Text '-' Operator '1' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'maxl' Name ' ' Text '=' Operator ' ' Text '2' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mlen' Name.Variable ' ' Text '=' Operator ' ' Text 'Math' Name.Namespace '.' Punctuation 'Min' Name '(' Operator 'maxlen' Name ',' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text 'pos' Name ')' Operator '\n ' Text 'let' Keyword ' ' Text 'last' Name.Variable ' ' Text '=' Operator ' ' Text 'Math' Name.Namespace '.' Punctuation 'Max' Name '(' Operator '0' Literal.Number.Integer ',' Operator ' ' Text 'pos' Name ' ' Text '-' Operator ' ' Text 'maxbuf' Name ')' Operator '\n ' Text 'let' Keyword ' ' Text 'h' Name.Variable ' ' Text '=' Operator ' ' Text 'getHash' Name ' ' Text 'buf' Name ' ' Text 'pos' Name '\n ' Text 'if' Keyword ' ' Text 'hash' Name ' ' Text '<' Operator '>' Operator ' ' Text 'null' Keyword ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'list' Name.Variable ' ' Text '=' Operator ' ' Text 'hash' Name '.' Operator '[' Operator 'h' Name ']' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'list' Keyword.Type '.' Operator 'Count' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'while' Keyword ' ' Text 'i' Name ' ' Text '>' Operator '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'p' Name.Variable ' ' Text '=' Operator ' ' Text 'list' Keyword.Type '.' Operator '[' Operator 'i' Name ']' Operator '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '<' Operator ' ' Text 'last' Name ' ' Text 'then' Keyword ' ' Text 'i' Name ' ' Text '<-' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'len' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'while' Keyword ' ' Text 'len' Name ' ' Text '<' Operator ' ' Text 'mlen' Name ' ' Text '&&' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text 'len' Name ']' Operator ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ' ' Text '+' Operator ' ' Text 'len' Name ']' Operator ' ' Text 'do' Keyword '\n ' Text 'len' Name ' ' Text '<-' Operator ' ' Text 'len' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '>' Operator ' ' Text 'maxl' Name ' ' Text 'then' Keyword '\n ' Text 'maxp' Name ' ' Text '<-' Operator ' ' Text 'p' Name '\n ' Text 'maxl' Name ' ' Text '<-' Operator ' ' Text 'len' Name '\n ' Text 'i' Name ' ' Text '<-' Operator ' ' Text 'i' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'c' Name.Variable ' ' Text '=' Operator ' ' Text 'counts' Name '.' Operator '[' Operator 'h' Name ']' Operator '\n ' Text 'let' Keyword ' ' Text 'p1' Name.Variable ',' Operator ' ' Text 'p2' Name ' ' Text '=' Operator ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '<' Operator ' ' Text '16' Literal.Number.Integer ' ' Text 'then' Keyword ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'c' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'else' Keyword ' ' Text 'c' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ',' Operator ' ' Text 'c' Name ' ' Text '+' Operator ' ' Text '16' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'p2' Name '\n ' Text 'while' Keyword ' ' Text 'i' Name ' ' Text '>' Operator '=' Operator ' ' Text 'p1' Name ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'p' Name.Variable ' ' Text '=' Operator ' ' Text 'tables' Name '.' Operator '[' Operator 'h' Name ',' Operator ' ' Text 'i' Name ' ' Text '&&' Operator '&' Operator ' ' Text '15' Literal.Number.Integer ']' Operator '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '<' Operator ' ' Text 'last' Name ' ' Text 'then' Keyword ' ' Text 'i' Name ' ' Text '<-' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'len' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'while' Keyword ' ' Text 'len' Name ' ' Text '<' Operator ' ' Text 'mlen' Name ' ' Text '&&' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text 'len' Name ']' Operator ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'pos' Name ' ' Text '+' Operator ' ' Text 'len' Name ']' Operator ' ' Text 'do' Keyword '\n ' Text 'len' Name ' ' Text '<-' Operator ' ' Text 'len' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'if' Keyword ' ' Text 'len' Name ' ' Text '>' Operator ' ' Text 'maxl' Name ' ' Text 'then' Keyword '\n ' Text 'maxp' Name ' ' Text '<-' Operator ' ' Text 'p' Name '\n ' Text 'maxl' Name ' ' Text '<-' Operator ' ' Text 'len' Name '\n ' Text 'i' Name ' ' Text '<-' Operator ' ' Text 'i' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'maxp' Name ',' Operator ' ' Text 'maxl' Name '\n \n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Crc' Name.Function ' ' Text '=' Operator ' ' Text '~' Operator '~' Operator '~' Operator 'crc' Name '\n\n ' Text 'member' Keyword ' ' Text 'x' Name '.' Punctuation 'Compress' Name.Function ' ' Text '(' Operator 'sout' Name ':' Operator 'Stream' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'use' Keyword ' ' Text 'bw' Name ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'BitWriter' Name '(' Operator 'sout' Name ')' Operator '\n ' Text 'bw' Name '.' Operator 'WriteBit' Name ' ' Text '1' Literal.Number.Integer '\n ' Text 'bw' Name '.' Operator 'WriteLE' Name ' ' Text '2' Literal.Number.Integer ' ' Text '1' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'hw' Name.Variable ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'FixedHuffmanWriter' Name '(' Operator 'bw' Name ')' Operator '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'p' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n ' Text 'match' Keyword ' ' Text 't' Name ' ' Text 'with' Keyword '\n ' Text '|' Operator ' ' Text '2' Literal.Number.Integer ' ' Text '->' Operator '\n ' Text 'while' Keyword ' ' Text 'p' Name ' ' Text '<' Operator ' ' Text 'length' Name ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'b' Name.Variable ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ']' Operator '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '<' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text '4' Literal.Number.Integer ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text '2' Literal.Number.Integer ']' Operator ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text '3' Literal.Number.Integer ']' Operator ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'len' Name ' ' Text '=' Operator ' ' Text '4' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mlen' Name.Variable ' ' Text '=' Operator ' ' Text 'Math' Name.Namespace '.' Punctuation 'Min' Name '(' Operator 'maxlen' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ',' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text 'p' Name ')' Operator '\n ' Text 'while' Keyword ' ' Text 'len' Name ' ' Text '<' Operator ' ' Text 'mlen' Name ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text 'len' Name ']' Operator ' ' Text 'do' Keyword '\n ' Text 'len' Name ' ' Text '<-' Operator ' ' Text 'len' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'hw' Name '.' Operator 'Write' Name '(' Operator 'int' Name ' ' Text 'b' Name ')' Operator '\n ' Text 'hw' Name '.' Operator 'WriteLen' Name '(' Operator 'len' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'hw' Name '.' Operator 'WriteDist' Name ' ' Text '1' Literal.Number.Integer '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'len' Name '\n ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'maxp' Name.Variable ',' Operator ' ' Text 'maxl' Name ' ' Text '=' Operator ' ' Text 'search' Name ' ' Text 'p' Name '\n ' Text 'if' Keyword ' ' Text 'maxp' Name ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'hw' Name '.' Operator 'Write' Name '(' Operator 'int' Name ' ' Text 'b' Name ')' Operator '\n ' Text 'addHash2' Name ' ' Text 'tables' Name ' ' Text 'counts' Name ' ' Text 'buf' Name ' ' Text 'p' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'else' Keyword '\n ' Text 'hw' Name '.' Operator 'WriteLen' Name ' ' Text 'maxl' Name '\n ' Text 'hw' Name '.' Operator 'WriteDist' Name ' ' Text '(' Operator 'p' Name ' ' Text '-' Operator ' ' Text 'maxp' Name ')' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'p' Name ' ' Text 'to' Keyword ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'maxl' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'addHash2' Name ' ' Text 'tables' Name ' ' Text 'counts' Name ' ' Text 'buf' Name ' ' Text 'i' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'maxl' Name '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '>' Operator ' ' Text 'maxbuf2' Name ' ' Text 'then' Keyword '\n ' Text 'Array' Name.Namespace '.' Punctuation 'Copy' Name '(' Operator 'buf' Name ',' Operator ' ' Text 'maxbuf' Name ',' Operator ' ' Text 'buf' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'maxbuf' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name ')' Operator '\n ' Text 'if' Keyword ' ' Text 'length' Name ' ' Text '<' Operator ' ' Text 'buflen' Name ' ' Text 'then' Keyword ' ' Text 'length' Name ' ' Text '<-' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text 'maxbuf' Name ' ' Text 'else' Keyword '\n ' Text 'read' Name ' ' Text '(' Operator 'maxbuf' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name ')' Operator ' ' Text 'maxbuf' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text 'maxbuf' Name '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'addHash2' Name ' ' Text 'tables' Name ' ' Text 'counts' Name ' ' Text 'buf' Name ' ' Text 'i' Name '\n ' Text '|' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '->' Operator '\n ' Text 'while' Keyword ' ' Text 'p' Name ' ' Text '<' Operator ' ' Text 'length' Name ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'b' Name.Variable ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ']' Operator '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '<' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text '4' Literal.Number.Integer ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ']' Operator ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text '2' Literal.Number.Integer ']' Operator ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text '3' Literal.Number.Integer ']' Operator ' ' Text 'then' Keyword '\n ' Text 'let' Keyword ' ' Text 'mutable' Name.Variable ' ' Text 'len' Name ' ' Text '=' Operator ' ' Text '4' Literal.Number.Integer '\n ' Text 'let' Keyword ' ' Text 'mlen' Name.Variable ' ' Text '=' Operator ' ' Text 'Math' Name.Namespace '.' Punctuation 'Min' Name '(' Operator 'maxlen' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer ',' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text 'p' Name ')' Operator '\n ' Text 'while' Keyword ' ' Text 'len' Name ' ' Text '<' Operator ' ' Text 'mlen' Name ' ' Text '&&' Operator ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ' ' Text '+' Operator ' ' Text 'len' Name ']' Operator ' ' Text 'do' Keyword '\n ' Text 'len' Name ' ' Text '<-' Operator ' ' Text 'len' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'hw' Name '.' Operator 'Write' Name '(' Operator 'int' Name ' ' Text 'b' Name ')' Operator '\n ' Text 'hw' Name '.' Operator 'WriteLen' Name '(' Operator 'len' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ')' Operator '\n ' Text 'hw' Name '.' Operator 'WriteDist' Name ' ' Text '1' Literal.Number.Integer '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'len' Name '\n ' Text 'else' Keyword '\n ' Text 'let' Keyword ' ' Text 'maxp' Name.Variable ',' Operator ' ' Text 'maxl' Name ' ' Text '=' Operator ' ' Text 'search' Name ' ' Text 'p' Name '\n ' Text 'if' Keyword ' ' Text 'maxp' Name ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'hw' Name '.' Operator 'Write' Name '(' Operator 'int' Name ' ' Text 'b' Name ')' Operator '\n ' Text 'addHash' Name ' ' Text 'hash' Name ' ' Text 'buf' Name ' ' Text 'p' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'else' Keyword '\n ' Text 'hw' Name '.' Operator 'WriteLen' Name ' ' Text 'maxl' Name '\n ' Text 'hw' Name '.' Operator 'WriteDist' Name ' ' Text '(' Operator 'p' Name ' ' Text '-' Operator ' ' Text 'maxp' Name ')' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'p' Name ' ' Text 'to' Keyword ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'maxl' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'addHash' Name ' ' Text 'hash' Name ' ' Text 'buf' Name ' ' Text 'i' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'maxl' Name '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '>' Operator ' ' Text 'maxbuf2' Name ' ' Text 'then' Keyword '\n ' Text 'Array' Name.Namespace '.' Punctuation 'Copy' Name '(' Operator 'buf' Name ',' Operator ' ' Text 'maxbuf' Name ',' Operator ' ' Text 'buf' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'maxbuf' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name ')' Operator '\n ' Text 'if' Keyword ' ' Text 'length' Name ' ' Text '<' Operator ' ' Text 'buflen' Name ' ' Text 'then' Keyword ' ' Text 'length' Name ' ' Text '<-' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text 'maxbuf' Name ' ' Text 'else' Keyword '\n ' Text 'read' Name ' ' Text '(' Operator 'maxbuf' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name ')' Operator ' ' Text 'maxbuf' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text 'maxbuf' Name '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'addHash' Name ' ' Text 'hash' Name ' ' Text 'buf' Name ' ' Text 'i' Name '\n ' Text '|' Operator ' ' Text '_' Operator ' ' Text '->' Operator '\n ' Text 'while' Keyword ' ' Text 'p' Name ' ' Text '<' Operator ' ' Text 'length' Name ' ' Text 'do' Keyword '\n ' Text 'let' Keyword ' ' Text 'maxp' Name.Variable ',' Operator ' ' Text 'maxl' Name ' ' Text '=' Operator ' ' Text 'search' Name ' ' Text 'p' Name '\n ' Text 'if' Keyword ' ' Text 'maxp' Name ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'then' Keyword '\n ' Text 'hw' Name '.' Operator 'Write' Name '(' Operator 'int' Name ' ' Text 'buf' Name '.' Operator '[' Operator 'p' Name ']' Operator ')' Operator '\n ' Text 'hash' Name '.' Operator '[' Operator 'getHash' Name ' ' Text 'buf' Name ' ' Text 'p' Name ']' Operator '.' Operator 'Add' Name ' ' Text 'p' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n ' Text 'else' Keyword '\n ' Text 'hw' Name '.' Operator 'WriteLen' Name ' ' Text 'maxl' Name '\n ' Text 'hw' Name '.' Operator 'WriteDist' Name ' ' Text '(' Operator 'p' Name ' ' Text '-' Operator ' ' Text 'maxp' Name ')' Operator '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'p' Name ' ' Text 'to' Keyword ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'maxl' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'hash' Name '.' Operator '[' Operator 'getHash' Name ' ' Text 'buf' Name ' ' Text 'i' Name ']' Operator '.' Operator 'Add' Name ' ' Text 'i' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text 'maxl' Name '\n ' Text 'if' Keyword ' ' Text 'p' Name ' ' Text '>' Operator ' ' Text 'maxbuf2' Name ' ' Text 'then' Keyword '\n ' Text 'Array' Name.Namespace '.' Punctuation 'Copy' Name '(' Operator 'buf' Name ',' Operator ' ' Text 'maxbuf' Name ',' Operator ' ' Text 'buf' Name ',' Operator ' ' Text '0' Literal.Number.Integer ',' Operator ' ' Text 'maxbuf' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name ')' Operator '\n ' Text 'if' Keyword ' ' Text 'length' Name ' ' Text '<' Operator ' ' Text 'buflen' Name ' ' Text 'then' Keyword ' ' Text 'length' Name ' ' Text '<-' Operator ' ' Text 'length' Name ' ' Text '-' Operator ' ' Text 'maxbuf' Name ' ' Text 'else' Keyword '\n ' Text 'read' Name ' ' Text '(' Operator 'maxbuf' Name ' ' Text '+' Operator ' ' Text 'maxlen' Name ')' Operator ' ' Text 'maxbuf' Name '\n ' Text 'p' Name ' ' Text '<-' Operator ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text 'maxbuf' Name '\n ' Text 'for' Keyword ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer ' ' Text 'to' Keyword ' ' Text 'p' Name ' ' Text '-' Operator ' ' Text '1' Literal.Number.Integer ' ' Text 'do' Keyword '\n ' Text 'hash' Name '.' Operator '[' Operator 'getHash' Name ' ' Text 'buf' Name ' ' Text 'i' Name ']' Operator '.' Operator 'Add' Name ' ' Text 'i' Name '\n ' Text 'hw' Name '.' Operator 'Write' Name ' ' Text '256' Literal.Number.Integer '\n\n' Text 'let' Keyword ' ' Text 'GetCompressBytes' Name.Variable ' ' Text '(' Operator 'sin' Name ':' Operator 'Stream' Name ')' Operator ' ' Text '=' Operator '\n ' Text 'let' Keyword ' ' Text 'now' Name.Variable ' ' Text '=' Operator ' ' Text 'DateTime' Name.Namespace '.' Punctuation 'Now' Name '\n ' Text 'let' Keyword ' ' Text 'ms' Name.Variable ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'MemoryStream' Name '()' Name.Builtin.Pseudo '\n ' Text 'let' Keyword ' ' Text 'w' Name.Variable ' ' Text '=' Operator ' ' Text 'new' Keyword ' ' Text 'Writer' Name '(' Operator '1' Literal.Number.Integer ',' Operator ' ' Text 'sin' Name ')' Operator '\n ' Text 'w' Name '.' Operator 'Compress' Name ' ' Text 'ms' Name '\n ' Text 'ms' Name '.' Operator 'ToArray' Name '()' Name.Builtin.Pseudo ',' Operator ' ' Text 'w' Name '.' Operator 'Crc' Name '\n' Text