diff --git a/waypoint_manager/manager-GUI-for-windows.zip b/waypoint_manager/manager-GUI-for-windows.zip deleted file mode 100644 index 3c55507..0000000 --- a/waypoint_manager/manager-GUI-for-windows.zip +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager-GUI-for-windows11.zip b/waypoint_manager/manager-GUI-for-windows11.zip deleted file mode 100644 index 2aeb8e1..0000000 --- a/waypoint_manager/manager-GUI-for-windows11.zip +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/BdfFontFile.py b/waypoint_manager/manager_GUI/PIL/BdfFontFile.py deleted file mode 100644 index 102b72e..0000000 --- a/waypoint_manager/manager_GUI/PIL/BdfFontFile.py +++ /dev/null @@ -1,110 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# bitmap distribution font (bdf) file parser -# -# history: -# 1996-05-16 fl created (as bdf2pil) -# 1997-08-25 fl converted to FontFile driver -# 2001-05-25 fl removed bogus __init__ call -# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) -# 2003-04-22 fl more robustification (from Graham Dumpleton) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -Parse X Bitmap Distribution Format (BDF) -""" - - -from . import FontFile, Image - -bdf_slant = { - "R": "Roman", - "I": "Italic", - "O": "Oblique", - "RI": "Reverse Italic", - "RO": "Reverse Oblique", - "OT": "Other", -} - -bdf_spacing = {"P": "Proportional", "M": "Monospaced", "C": "Cell"} - - -def bdf_char(f): - # skip to STARTCHAR - while True: - s = f.readline() - if not s: - return None - if s[:9] == b"STARTCHAR": - break - id = s[9:].strip().decode("ascii") - - # load symbol properties - props = {} - while True: - s = f.readline() - if not s or s[:6] == b"BITMAP": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - - # load bitmap - bitmap = [] - while True: - s = f.readline() - if not s or s[:7] == b"ENDCHAR": - break - bitmap.append(s[:-1]) - bitmap = b"".join(bitmap) - - [x, y, l, d] = [int(p) for p in props["BBX"].split()] - [dx, dy] = [int(p) for p in props["DWIDTH"].split()] - - bbox = (dx, dy), (l, -d - y, x + l, -d), (0, 0, x, y) - - try: - im = Image.frombytes("1", (x, y), bitmap, "hex", "1") - except ValueError: - # deal with zero-width characters - im = Image.new("1", (x, y)) - - return id, int(props["ENCODING"]), bbox, im - - -class BdfFontFile(FontFile.FontFile): - """Font file plugin for the X11 BDF format.""" - - def __init__(self, fp): - super().__init__() - - s = fp.readline() - if s[:13] != b"STARTFONT 2.1": - raise SyntaxError("not a valid BDF file") - - props = {} - comments = [] - - while True: - s = fp.readline() - if not s or s[:13] == b"ENDPROPERTIES": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - if s[:i] in [b"COMMENT", b"COPYRIGHT"]: - if s.find(b"LogicalFontDescription") < 0: - comments.append(s[i + 1 : -1].decode("ascii")) - - while True: - c = bdf_char(fp) - if not c: - break - id, ch, (xy, dst, src), im = c - if 0 <= ch < len(self.glyph): - self.glyph[ch] = xy, dst, src, im diff --git a/waypoint_manager/manager_GUI/PIL/BlpImagePlugin.py b/waypoint_manager/manager_GUI/PIL/BlpImagePlugin.py deleted file mode 100644 index 104fbad..0000000 --- a/waypoint_manager/manager_GUI/PIL/BlpImagePlugin.py +++ /dev/null @@ -1,484 +0,0 @@ -""" -Blizzard Mipmap Format (.blp) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -BLP1 files, used mostly in Warcraft III, are not fully supported. -All types of BLP2 files used in World of Warcraft are supported. - -The BLP file structure consists of a header, up to 16 mipmaps of the -texture - -Texture sizes must be powers of two, though the two dimensions do -not have to be equal; 512x256 is valid, but 512x200 is not. -The first mipmap (mipmap #0) is the full size image; each subsequent -mipmap halves both dimensions. The final mipmap should be 1x1. - -BLP files come in many different flavours: -* JPEG-compressed (type == 0) - only supported for BLP1. -* RAW images (type == 1, encoding == 1). Each mipmap is stored as an - array of 8-bit values, one per pixel, left to right, top to bottom. - Each value is an index to the palette. -* DXT-compressed (type == 1, encoding == 2): -- DXT1 compression is used if alpha_encoding == 0. - - An additional alpha bit is used if alpha_depth == 1. - - DXT3 compression is used if alpha_encoding == 1. - - DXT5 compression is used if alpha_encoding == 7. -""" - -import os -import struct -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile -from ._deprecate import deprecate - - -class Format(IntEnum): - JPEG = 0 - - -class Encoding(IntEnum): - UNCOMPRESSED = 1 - DXT = 2 - UNCOMPRESSED_RAW_BGRA = 3 - - -class AlphaEncoding(IntEnum): - DXT1 = 0 - DXT3 = 1 - DXT5 = 7 - - -def __getattr__(name): - for enum, prefix in { - Format: "BLP_FORMAT_", - Encoding: "BLP_ENCODING_", - AlphaEncoding: "BLP_ALPHA_ENCODING_", - }.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -def unpack_565(i): - return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 - - -def decode_dxt1(data, alpha=False): - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 8 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - # Decode next 8-byte block. - idx = block * 8 - color0, color1, bits = struct.unpack_from("> 2 - - a = 0xFF - if control == 0: - r, g, b = r0, g0, b0 - elif control == 1: - r, g, b = r1, g1, b1 - elif control == 2: - if color0 > color1: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - else: - r = (r0 + r1) // 2 - g = (g0 + g1) // 2 - b = (b0 + b1) // 2 - elif control == 3: - if color0 > color1: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - else: - r, g, b, a = 0, 0, 0, 0 - - if alpha: - ret[j].extend([r, g, b, a]) - else: - ret[j].extend([r, g, b]) - - return ret - - -def decode_dxt3(data): - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - idx = block * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - bits = struct.unpack_from("<8B", block) - color0, color1 = struct.unpack_from(">= 4 - else: - high = True - a &= 0xF - a *= 17 # We get a value between 0 and 15 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -def decode_dxt5(data): - """ - input: one "row" of data (i.e. will produce 4 * width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - idx = block * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 - elif alphacode_index == 15: - alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) - else: # alphacode_index >= 18 and alphacode_index <= 45 - alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 - - if alphacode == 0: - a = a0 - elif alphacode == 1: - a = a1 - elif a0 > a1: - a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 - elif alphacode == 6: - a = 0 - elif alphacode == 7: - a = 255 - else: - a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -class BLPFormatError(NotImplementedError): - pass - - -def _accept(prefix): - return prefix[:4] in (b"BLP1", b"BLP2") - - -class BlpImageFile(ImageFile.ImageFile): - """ - Blizzard Mipmap Format - """ - - format = "BLP" - format_description = "Blizzard Mipmap Format" - - def _open(self): - self.magic = self.fp.read(4) - - self.fp.seek(5, os.SEEK_CUR) - (self._blp_alpha_depth,) = struct.unpack(" mode, rawmode - 1: ("P", "P;1"), - 4: ("P", "P;4"), - 8: ("P", "P"), - 16: ("RGB", "BGR;15"), - 24: ("RGB", "BGR"), - 32: ("RGB", "BGRX"), -} - - -def _accept(prefix): - return prefix[:2] == b"BM" - - -def _dib_accept(prefix): - return i32(prefix) in [12, 40, 64, 108, 124] - - -# ============================================================================= -# Image plugin for the Windows BMP format. -# ============================================================================= -class BmpImageFile(ImageFile.ImageFile): - """Image plugin for the Windows Bitmap format (BMP)""" - - # ------------------------------------------------------------- Description - format_description = "Windows Bitmap" - format = "BMP" - - # -------------------------------------------------- BMP Compression values - COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} - for k, v in COMPRESSIONS.items(): - vars()[k] = v - - def _bitmap(self, header=0, offset=0): - """Read relevant info about the BMP""" - read, seek = self.fp.read, self.fp.seek - if header: - seek(header) - # read bmp header size @offset 14 (this is part of the header size) - file_info = {"header_size": i32(read(4)), "direction": -1} - - # -------------------- If requested, read header at a specific position - # read the rest of the bmp header, without its size - header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) - - # -------------------------------------------------- IBM OS/2 Bitmap v1 - # ----- This format has different offsets because of width/height types - if file_info["header_size"] == 12: - file_info["width"] = i16(header_data, 0) - file_info["height"] = i16(header_data, 2) - file_info["planes"] = i16(header_data, 4) - file_info["bits"] = i16(header_data, 6) - file_info["compression"] = self.RAW - file_info["palette_padding"] = 3 - - # --------------------------------------------- Windows Bitmap v2 to v5 - # v3, OS/2 v2, v4, v5 - elif file_info["header_size"] in (40, 64, 108, 124): - file_info["y_flip"] = header_data[7] == 0xFF - file_info["direction"] = 1 if file_info["y_flip"] else -1 - file_info["width"] = i32(header_data, 0) - file_info["height"] = ( - i32(header_data, 4) - if not file_info["y_flip"] - else 2**32 - i32(header_data, 4) - ) - file_info["planes"] = i16(header_data, 8) - file_info["bits"] = i16(header_data, 10) - file_info["compression"] = i32(header_data, 12) - # byte size of pixel data - file_info["data_size"] = i32(header_data, 16) - file_info["pixels_per_meter"] = ( - i32(header_data, 20), - i32(header_data, 24), - ) - file_info["colors"] = i32(header_data, 28) - file_info["palette_padding"] = 4 - self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) - if file_info["compression"] == self.BITFIELDS: - if len(header_data) >= 52: - for idx, mask in enumerate( - ["r_mask", "g_mask", "b_mask", "a_mask"] - ): - file_info[mask] = i32(header_data, 36 + idx * 4) - else: - # 40 byte headers only have the three components in the - # bitfields masks, ref: - # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx - # See also - # https://github.com/python-pillow/Pillow/issues/1293 - # There is a 4th component in the RGBQuad, in the alpha - # location, but it is listed as a reserved component, - # and it is not generally an alpha channel - file_info["a_mask"] = 0x0 - for mask in ["r_mask", "g_mask", "b_mask"]: - file_info[mask] = i32(read(4)) - file_info["rgb_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - ) - file_info["rgba_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - file_info["a_mask"], - ) - else: - raise OSError(f"Unsupported BMP header type ({file_info['header_size']})") - - # ------------------ Special case : header is reported 40, which - # ---------------------- is shorter than real size for bpp >= 16 - self._size = file_info["width"], file_info["height"] - - # ------- If color count was not found in the header, compute from bits - file_info["colors"] = ( - file_info["colors"] - if file_info.get("colors", 0) - else (1 << file_info["bits"]) - ) - if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: - offset += 4 * file_info["colors"] - - # ---------------------- Check bit depth for unusual unsupported values - self.mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None)) - if self.mode is None: - raise OSError(f"Unsupported BMP pixel depth ({file_info['bits']})") - - # ---------------- Process BMP with Bitfields compression (not palette) - decoder_name = "raw" - if file_info["compression"] == self.BITFIELDS: - SUPPORTED = { - 32: [ - (0xFF0000, 0xFF00, 0xFF, 0x0), - (0xFF0000, 0xFF00, 0xFF, 0xFF000000), - (0xFF, 0xFF00, 0xFF0000, 0xFF000000), - (0x0, 0x0, 0x0, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0x0), - ], - 24: [(0xFF0000, 0xFF00, 0xFF)], - 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], - } - MASK_MODES = { - (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", - (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", - (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", - (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", - (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", - (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", - (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", - } - if file_info["bits"] in SUPPORTED: - if ( - file_info["bits"] == 32 - and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] - ): - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] - self.mode = "RGBA" if "A" in raw_mode else self.mode - elif ( - file_info["bits"] in (24, 16) - and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] - ): - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] - else: - raise OSError("Unsupported BMP bitfields layout") - else: - raise OSError("Unsupported BMP bitfields layout") - elif file_info["compression"] == self.RAW: - if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset - raw_mode, self.mode = "BGRA", "RGBA" - elif file_info["compression"] == self.RLE8: - decoder_name = "bmp_rle" - else: - raise OSError(f"Unsupported BMP compression ({file_info['compression']})") - - # --------------- Once the header is processed, process the palette/LUT - if self.mode == "P": # Paletted for 1, 4 and 8 bit images - - # ---------------------------------------------------- 1-bit images - if not (0 < file_info["colors"] <= 65536): - raise OSError(f"Unsupported BMP Palette size ({file_info['colors']})") - else: - padding = file_info["palette_padding"] - palette = read(padding * file_info["colors"]) - greyscale = True - indices = ( - (0, 255) - if file_info["colors"] == 2 - else list(range(file_info["colors"])) - ) - - # ----------------- Check if greyscale and ignore palette if so - for ind, val in enumerate(indices): - rgb = palette[ind * padding : ind * padding + 3] - if rgb != o8(val) * 3: - greyscale = False - - # ------- If all colors are grey, white or black, ditch palette - if greyscale: - self.mode = "1" if file_info["colors"] == 2 else "L" - raw_mode = self.mode - else: - self.mode = "P" - self.palette = ImagePalette.raw( - "BGRX" if padding == 4 else "BGR", palette - ) - - # ---------------------------- Finally set the tile data for the plugin - self.info["compression"] = file_info["compression"] - self.tile = [ - ( - decoder_name, - (0, 0, file_info["width"], file_info["height"]), - offset or self.fp.tell(), - ( - raw_mode, - ((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3), - file_info["direction"], - ), - ) - ] - - def _open(self): - """Open file, check magic number and read header""" - # read 14 bytes: magic number, filesize, reserved, header final offset - head_data = self.fp.read(14) - # choke if the file does not have the required magic bytes - if not _accept(head_data): - raise SyntaxError("Not a BMP file") - # read the start position of the BMP image data (u32) - offset = i32(head_data, 10) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) - - -class BmpRleDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - data = bytearray() - x = 0 - while len(data) < self.state.xsize * self.state.ysize: - pixels = self.fd.read(1) - byte = self.fd.read(1) - if not pixels or not byte: - break - num_pixels = pixels[0] - if num_pixels: - # encoded mode - if x + num_pixels > self.state.xsize: - # Too much data for row - num_pixels = max(0, self.state.xsize - x) - data += byte * num_pixels - x += num_pixels - else: - if byte[0] == 0: - # end of line - while len(data) % self.state.xsize != 0: - data += b"\x00" - x = 0 - elif byte[0] == 1: - # end of bitmap - break - elif byte[0] == 2: - # delta - bytes_read = self.fd.read(2) - if len(bytes_read) < 2: - break - right, up = self.fd.read(2) - data += b"\x00" * (right + up * self.state.xsize) - x = len(data) % self.state.xsize - else: - # absolute mode - bytes_read = self.fd.read(byte[0]) - data += bytes_read - if len(bytes_read) < byte[0]: - break - x += byte[0] - - # align to 16-bit word boundary - if self.fd.tell() % 2 != 0: - self.fd.seek(1, os.SEEK_CUR) - rawmode = "L" if self.mode == "L" else "P" - self.set_as_raw(bytes(data), (rawmode, 0, self.args[-1])) - return -1, 0 - - -# ============================================================================= -# Image plugin for the DIB format (BMP alias) -# ============================================================================= -class DibImageFile(BmpImageFile): - - format = "DIB" - format_description = "Windows Bitmap" - - def _open(self): - self._bitmap() - - -# -# -------------------------------------------------------------------- -# Write BMP file - - -SAVE = { - "1": ("1", 1, 2), - "L": ("L", 8, 256), - "P": ("P", 8, 256), - "RGB": ("BGR", 24, 0), - "RGBA": ("BGRA", 32, 0), -} - - -def _dib_save(im, fp, filename): - _save(im, fp, filename, False) - - -def _save(im, fp, filename, bitmap_header=True): - try: - rawmode, bits, colors = SAVE[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as BMP") from e - - info = im.encoderinfo - - dpi = info.get("dpi", (96, 96)) - - # 1 meter == 39.3701 inches - ppm = tuple(map(lambda x: int(x * 39.3701 + 0.5), dpi)) - - stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) - header = 40 # or 64 for OS/2 version 2 - image = stride * im.size[1] - - # bitmap header - if bitmap_header: - offset = 14 + header + colors * 4 - file_size = offset + image - if file_size > 2**32 - 1: - raise ValueError("File size is too large for the BMP format") - fp.write( - b"BM" # file type (magic) - + o32(file_size) # file size - + o32(0) # reserved - + o32(offset) # image data offset - ) - - # bitmap info header - fp.write( - o32(header) # info header size - + o32(im.size[0]) # width - + o32(im.size[1]) # height - + o16(1) # planes - + o16(bits) # depth - + o32(0) # compression (0=uncompressed) - + o32(image) # size of bitmap - + o32(ppm[0]) # resolution - + o32(ppm[1]) # resolution - + o32(colors) # colors used - + o32(colors) # colors important - ) - - fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) - - if im.mode == "1": - for i in (0, 255): - fp.write(o8(i) * 4) - elif im.mode == "L": - for i in range(256): - fp.write(o8(i) * 4) - elif im.mode == "P": - fp.write(im.im.getpalette("RGB", "BGRX")) - - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))]) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(BmpImageFile.format, BmpImageFile, _accept) -Image.register_save(BmpImageFile.format, _save) - -Image.register_extension(BmpImageFile.format, ".bmp") - -Image.register_mime(BmpImageFile.format, "image/bmp") - -Image.register_decoder("bmp_rle", BmpRleDecoder) - -Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) -Image.register_save(DibImageFile.format, _dib_save) - -Image.register_extension(DibImageFile.format, ".dib") - -Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/waypoint_manager/manager_GUI/PIL/BufrStubImagePlugin.py b/waypoint_manager/manager_GUI/PIL/BufrStubImagePlugin.py deleted file mode 100644 index 9510f73..0000000 --- a/waypoint_manager/manager_GUI/PIL/BufrStubImagePlugin.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# BUFR stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific BUFR image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" - - -class BufrStubImageFile(ImageFile.StubImageFile): - - format = "BUFR" - format_description = "BUFR" - - def _open(self): - - offset = self.fp.tell() - - if not _accept(self.fp.read(4)): - raise SyntaxError("Not a BUFR file") - - self.fp.seek(offset) - - # make something up - self.mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("BUFR save handler not installed") - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) -Image.register_save(BufrStubImageFile.format, _save) - -Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/waypoint_manager/manager_GUI/PIL/ContainerIO.py b/waypoint_manager/manager_GUI/PIL/ContainerIO.py deleted file mode 100644 index 45e80b3..0000000 --- a/waypoint_manager/manager_GUI/PIL/ContainerIO.py +++ /dev/null @@ -1,120 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a class to read from a container file -# -# History: -# 1995-06-18 fl Created -# 1995-09-07 fl Added readline(), readlines() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -import io - - -class ContainerIO: - """ - A file object that provides read access to a part of an existing - file (for example a TAR file). - """ - - def __init__(self, file, offset, length): - """ - Create file object. - - :param file: Existing file. - :param offset: Start of region, in bytes. - :param length: Size of region, in bytes. - """ - self.fh = file - self.pos = 0 - self.offset = offset - self.length = length - self.fh.seek(offset) - - ## - # Always false. - - def isatty(self): - return False - - def seek(self, offset, mode=io.SEEK_SET): - """ - Move file pointer. - - :param offset: Offset in bytes. - :param mode: Starting position. Use 0 for beginning of region, 1 - for current offset, and 2 for end of region. You cannot move - the pointer outside the defined region. - """ - if mode == 1: - self.pos = self.pos + offset - elif mode == 2: - self.pos = self.length + offset - else: - self.pos = offset - # clamp - self.pos = max(0, min(self.pos, self.length)) - self.fh.seek(self.offset + self.pos) - - def tell(self): - """ - Get current file pointer. - - :returns: Offset from start of region, in bytes. - """ - return self.pos - - def read(self, n=0): - """ - Read data. - - :param n: Number of bytes to read. If omitted or zero, - read until end of region. - :returns: An 8-bit string. - """ - if n: - n = min(n, self.length - self.pos) - else: - n = self.length - self.pos - if not n: # EOF - return b"" if "b" in self.fh.mode else "" - self.pos = self.pos + n - return self.fh.read(n) - - def readline(self): - """ - Read a line of text. - - :returns: An 8-bit string. - """ - s = b"" if "b" in self.fh.mode else "" - newline_character = b"\n" if "b" in self.fh.mode else "\n" - while True: - c = self.read(1) - if not c: - break - s = s + c - if c == newline_character: - break - return s - - def readlines(self): - """ - Read multiple lines of text. - - :returns: A list of 8-bit strings. - """ - lines = [] - while True: - s = self.readline() - if not s: - break - lines.append(s) - return lines diff --git a/waypoint_manager/manager_GUI/PIL/CurImagePlugin.py b/waypoint_manager/manager_GUI/PIL/CurImagePlugin.py deleted file mode 100644 index 42af5ca..0000000 --- a/waypoint_manager/manager_GUI/PIL/CurImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Cursor support for PIL -# -# notes: -# uses BmpImagePlugin.py to read the bitmap data. -# -# history: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from . import BmpImagePlugin, Image -from ._binary import i16le as i16 -from ._binary import i32le as i32 - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:4] == b"\0\0\2\0" - - -## -# Image plugin for Windows Cursor files. - - -class CurImageFile(BmpImagePlugin.BmpImageFile): - - format = "CUR" - format_description = "Windows Cursor" - - def _open(self): - - offset = self.fp.tell() - - # check magic - s = self.fp.read(6) - if not _accept(s): - raise SyntaxError("not a CUR file") - - # pick the largest cursor in the file - m = b"" - for i in range(i16(s, 4)): - s = self.fp.read(16) - if not m: - m = s - elif s[0] > m[0] and s[1] > m[1]: - m = s - if not m: - raise TypeError("No cursors were found") - - # load as bitmap - self._bitmap(i32(m, 12) + offset) - - # patch up the bitmap height - self._size = self.size[0], self.size[1] // 2 - d, e, o, a = self.tile[0] - self.tile[0] = d, (0, 0) + self.size, o, a - - return - - -# -# -------------------------------------------------------------------- - -Image.register_open(CurImageFile.format, CurImageFile, _accept) - -Image.register_extension(CurImageFile.format, ".cur") diff --git a/waypoint_manager/manager_GUI/PIL/DcxImagePlugin.py b/waypoint_manager/manager_GUI/PIL/DcxImagePlugin.py deleted file mode 100644 index aeed1e7..0000000 --- a/waypoint_manager/manager_GUI/PIL/DcxImagePlugin.py +++ /dev/null @@ -1,80 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# DCX file handling -# -# DCX is a container file format defined by Intel, commonly used -# for fax applications. Each DCX file consists of a directory -# (a list of file offsets) followed by a set of (usually 1-bit) -# PCX files. -# -# History: -# 1995-09-09 fl Created -# 1996-03-20 fl Properly derived from PcxImageFile. -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2002-07-30 fl Fixed file handling -# -# Copyright (c) 1997-98 by Secret Labs AB. -# Copyright (c) 1995-96 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -from . import Image -from ._binary import i32le as i32 -from .PcxImagePlugin import PcxImageFile - -MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? - - -def _accept(prefix): - return len(prefix) >= 4 and i32(prefix) == MAGIC - - -## -# Image plugin for the Intel DCX format. - - -class DcxImageFile(PcxImageFile): - - format = "DCX" - format_description = "Intel DCX" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # Header - s = self.fp.read(4) - if not _accept(s): - raise SyntaxError("not a DCX file") - - # Component directory - self._offset = [] - for i in range(1024): - offset = i32(self.fp.read(4)) - if not offset: - break - self._offset.append(offset) - - self._fp = self.fp - self.frame = None - self.n_frames = len(self._offset) - self.is_animated = self.n_frames > 1 - self.seek(0) - - def seek(self, frame): - if not self._seek_check(frame): - return - self.frame = frame - self.fp = self._fp - self.fp.seek(self._offset[frame]) - PcxImageFile._open(self) - - def tell(self): - return self.frame - - -Image.register_open(DcxImageFile.format, DcxImageFile, _accept) - -Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/waypoint_manager/manager_GUI/PIL/DdsImagePlugin.py b/waypoint_manager/manager_GUI/PIL/DdsImagePlugin.py deleted file mode 100644 index 3a04bdb..0000000 --- a/waypoint_manager/manager_GUI/PIL/DdsImagePlugin.py +++ /dev/null @@ -1,249 +0,0 @@ -""" -A Pillow loader for .dds files (S3TC-compressed aka DXTC) -Jerome Leclanche - -Documentation: - https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ -""" - -import struct -from io import BytesIO - -from . import Image, ImageFile -from ._binary import o32le as o32 - -# Magic ("DDS ") -DDS_MAGIC = 0x20534444 - -# DDS flags -DDSD_CAPS = 0x1 -DDSD_HEIGHT = 0x2 -DDSD_WIDTH = 0x4 -DDSD_PITCH = 0x8 -DDSD_PIXELFORMAT = 0x1000 -DDSD_MIPMAPCOUNT = 0x20000 -DDSD_LINEARSIZE = 0x80000 -DDSD_DEPTH = 0x800000 - -# DDS caps -DDSCAPS_COMPLEX = 0x8 -DDSCAPS_TEXTURE = 0x1000 -DDSCAPS_MIPMAP = 0x400000 - -DDSCAPS2_CUBEMAP = 0x200 -DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 -DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 -DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 -DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 -DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 -DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 -DDSCAPS2_VOLUME = 0x200000 - -# Pixel Format -DDPF_ALPHAPIXELS = 0x1 -DDPF_ALPHA = 0x2 -DDPF_FOURCC = 0x4 -DDPF_PALETTEINDEXED8 = 0x20 -DDPF_RGB = 0x40 -DDPF_LUMINANCE = 0x20000 - - -# dds.h - -DDS_FOURCC = DDPF_FOURCC -DDS_RGB = DDPF_RGB -DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS -DDS_LUMINANCE = DDPF_LUMINANCE -DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS -DDS_ALPHA = DDPF_ALPHA -DDS_PAL8 = DDPF_PALETTEINDEXED8 - -DDS_HEADER_FLAGS_TEXTURE = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT -DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT -DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH -DDS_HEADER_FLAGS_PITCH = DDSD_PITCH -DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE - -DDS_HEIGHT = DDSD_HEIGHT -DDS_WIDTH = DDSD_WIDTH - -DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE -DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP -DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX - -DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX -DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX -DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY -DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY -DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ -DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ - - -# DXT1 -DXT1_FOURCC = 0x31545844 - -# DXT3 -DXT3_FOURCC = 0x33545844 - -# DXT5 -DXT5_FOURCC = 0x35545844 - - -# dxgiformat.h - -DXGI_FORMAT_R8G8B8A8_TYPELESS = 27 -DXGI_FORMAT_R8G8B8A8_UNORM = 28 -DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29 -DXGI_FORMAT_BC5_TYPELESS = 82 -DXGI_FORMAT_BC5_UNORM = 83 -DXGI_FORMAT_BC5_SNORM = 84 -DXGI_FORMAT_BC7_TYPELESS = 97 -DXGI_FORMAT_BC7_UNORM = 98 -DXGI_FORMAT_BC7_UNORM_SRGB = 99 - - -class DdsImageFile(ImageFile.ImageFile): - format = "DDS" - format_description = "DirectDraw Surface" - - def _open(self): - if not _accept(self.fp.read(4)): - raise SyntaxError("not a DDS file") - (header_size,) = struct.unpack(" 0: - s = fp.read(min(lengthfile, 100 * 1024)) - if not s: - break - lengthfile -= len(s) - f.write(s) - - device = "pngalpha" if transparency else "ppmraw" - - # Build Ghostscript command - command = [ - "gs", - "-q", # quiet mode - "-g%dx%d" % size, # set output geometry (pixels) - "-r%fx%f" % res, # set input DPI (dots per inch) - "-dBATCH", # exit after processing - "-dNOPAUSE", # don't pause between pages - "-dSAFER", # safe mode - f"-sDEVICE={device}", - f"-sOutputFile={outfile}", # output file - # adjust for image origin - "-c", - f"{-bbox[0]} {-bbox[1]} translate", - "-f", - infile, # input file - # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) - "-c", - "showpage", - ] - - if gs_windows_binary is not None: - if not gs_windows_binary: - raise OSError("Unable to locate Ghostscript on paths") - command[0] = gs_windows_binary - - # push data through Ghostscript - try: - startupinfo = None - if sys.platform.startswith("win"): - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - subprocess.check_call(command, startupinfo=startupinfo) - out_im = Image.open(outfile) - out_im.load() - finally: - try: - os.unlink(outfile) - if infile_temp: - os.unlink(infile_temp) - except OSError: - pass - - im = out_im.im.copy() - out_im.close() - return im - - -class PSFile: - """ - Wrapper for bytesio object that treats either CR or LF as end of line. - """ - - def __init__(self, fp): - self.fp = fp - self.char = None - - def seek(self, offset, whence=io.SEEK_SET): - self.char = None - self.fp.seek(offset, whence) - - def readline(self): - s = [self.char or b""] - self.char = None - - c = self.fp.read(1) - while (c not in b"\r\n") and len(c): - s.append(c) - c = self.fp.read(1) - - self.char = self.fp.read(1) - # line endings can be 1 or 2 of \r \n, in either order - if self.char in b"\r\n": - self.char = None - - return b"".join(s).decode("latin-1") - - -def _accept(prefix): - return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) - - -## -# Image plugin for Encapsulated PostScript. This plugin supports only -# a few variants of this format. - - -class EpsImageFile(ImageFile.ImageFile): - """EPS File Parser for the Python Imaging Library""" - - format = "EPS" - format_description = "Encapsulated Postscript" - - mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} - - def _open(self): - (length, offset) = self._find_offset(self.fp) - - # Rewrap the open file pointer in something that will - # convert line endings and decode to latin-1. - fp = PSFile(self.fp) - - # go to offset - start of "%!PS" - fp.seek(offset) - - box = None - - self.mode = "RGB" - self._size = 1, 1 # FIXME: huh? - - # - # Load EPS header - - s_raw = fp.readline() - s = s_raw.strip("\r\n") - - while s_raw: - if s: - if len(s) > 255: - raise SyntaxError("not an EPS file") - - try: - m = split.match(s) - except re.error as e: - raise SyntaxError("not an EPS file") from e - - if m: - k, v = m.group(1, 2) - self.info[k] = v - if k == "BoundingBox": - try: - # Note: The DSC spec says that BoundingBox - # fields should be integers, but some drivers - # put floating point values there anyway. - box = [int(float(i)) for i in v.split()] - self._size = box[2] - box[0], box[3] - box[1] - self.tile = [ - ("eps", (0, 0) + self.size, offset, (length, box)) - ] - except Exception: - pass - - else: - m = field.match(s) - if m: - k = m.group(1) - - if k == "EndComments": - break - if k[:8] == "PS-Adobe": - self.info[k[:8]] = k[9:] - else: - self.info[k] = "" - elif s[0] == "%": - # handle non-DSC PostScript comments that some - # tools mistakenly put in the Comments section - pass - else: - raise OSError("bad EPS header") - - s_raw = fp.readline() - s = s_raw.strip("\r\n") - - if s and s[:1] != "%": - break - - # - # Scan for an "ImageData" descriptor - - while s[:1] == "%": - - if len(s) > 255: - raise SyntaxError("not an EPS file") - - if s[:11] == "%ImageData:": - # Encoded bitmapped image. - x, y, bi, mo = s[11:].split(None, 7)[:4] - - if int(bi) != 8: - break - try: - self.mode = self.mode_map[int(mo)] - except ValueError: - break - - self._size = int(x), int(y) - return - - s = fp.readline().strip("\r\n") - if not s: - break - - if not box: - raise OSError("cannot determine EPS bounding box") - - def _find_offset(self, fp): - - s = fp.read(160) - - if s[:4] == b"%!PS": - # for HEAD without binary preview - fp.seek(0, io.SEEK_END) - length = fp.tell() - offset = 0 - elif i32(s, 0) == 0xC6D3D0C5: - # FIX for: Some EPS file not handled correctly / issue #302 - # EPS can contain binary data - # or start directly with latin coding - # more info see: - # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf - offset = i32(s, 4) - length = i32(s, 8) - else: - raise SyntaxError("not an EPS file") - - return length, offset - - def load(self, scale=1, transparency=False): - # Load EPS via Ghostscript - if self.tile: - self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) - self.mode = self.im.mode - self._size = self.im.size - self.tile = [] - return Image.Image.load(self) - - def load_seek(self, *args, **kwargs): - # we can't incrementally load, so force ImageFile.parser to - # use our custom load method by defining this method. - pass - - -# -# -------------------------------------------------------------------- - - -def _save(im, fp, filename, eps=1): - """EPS Writer for the Python Imaging Library.""" - - # - # make sure image data is available - im.load() - - # - # determine PostScript image mode - if im.mode == "L": - operator = (8, 1, b"image") - elif im.mode == "RGB": - operator = (8, 3, b"false 3 colorimage") - elif im.mode == "CMYK": - operator = (8, 4, b"false 4 colorimage") - else: - raise ValueError("image mode is not supported") - - if eps: - # - # write EPS header - fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") - fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") - # fp.write("%%CreationDate: %s"...) - fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) - fp.write(b"%%Pages: 1\n") - fp.write(b"%%EndComments\n") - fp.write(b"%%Page: 1 1\n") - fp.write(b"%%ImageData: %d %d " % im.size) - fp.write(b'%d %d 0 1 1 "%s"\n' % operator) - - # - # image header - fp.write(b"gsave\n") - fp.write(b"10 dict begin\n") - fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) - fp.write(b"%d %d scale\n" % im.size) - fp.write(b"%d %d 8\n" % im.size) # <= bits - fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) - fp.write(b"{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + b"\n") - if hasattr(fp, "flush"): - fp.flush() - - ImageFile._save(im, fp, [("eps", (0, 0) + im.size, 0, None)]) - - fp.write(b"\n%%%%EndBinary\n") - fp.write(b"grestore end\n") - if hasattr(fp, "flush"): - fp.flush() - - -# -# -------------------------------------------------------------------- - - -Image.register_open(EpsImageFile.format, EpsImageFile, _accept) - -Image.register_save(EpsImageFile.format, _save) - -Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) - -Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/waypoint_manager/manager_GUI/PIL/ExifTags.py b/waypoint_manager/manager_GUI/PIL/ExifTags.py deleted file mode 100644 index 7da2dda..0000000 --- a/waypoint_manager/manager_GUI/PIL/ExifTags.py +++ /dev/null @@ -1,331 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EXIF tags -# -# Copyright (c) 2003 by Secret Labs AB -# -# See the README file for information on usage and redistribution. -# - -""" -This module provides constants and clear-text names for various -well-known EXIF tags. -""" - - -TAGS = { - # possibly incomplete - 0x0001: "InteropIndex", - 0x000B: "ProcessingSoftware", - 0x00FE: "NewSubfileType", - 0x00FF: "SubfileType", - 0x0100: "ImageWidth", - 0x0101: "ImageLength", - 0x0102: "BitsPerSample", - 0x0103: "Compression", - 0x0106: "PhotometricInterpretation", - 0x0107: "Thresholding", - 0x0108: "CellWidth", - 0x0109: "CellLength", - 0x010A: "FillOrder", - 0x010D: "DocumentName", - 0x010E: "ImageDescription", - 0x010F: "Make", - 0x0110: "Model", - 0x0111: "StripOffsets", - 0x0112: "Orientation", - 0x0115: "SamplesPerPixel", - 0x0116: "RowsPerStrip", - 0x0117: "StripByteCounts", - 0x0118: "MinSampleValue", - 0x0119: "MaxSampleValue", - 0x011A: "XResolution", - 0x011B: "YResolution", - 0x011C: "PlanarConfiguration", - 0x011D: "PageName", - 0x0120: "FreeOffsets", - 0x0121: "FreeByteCounts", - 0x0122: "GrayResponseUnit", - 0x0123: "GrayResponseCurve", - 0x0124: "T4Options", - 0x0125: "T6Options", - 0x0128: "ResolutionUnit", - 0x0129: "PageNumber", - 0x012D: "TransferFunction", - 0x0131: "Software", - 0x0132: "DateTime", - 0x013B: "Artist", - 0x013C: "HostComputer", - 0x013D: "Predictor", - 0x013E: "WhitePoint", - 0x013F: "PrimaryChromaticities", - 0x0140: "ColorMap", - 0x0141: "HalftoneHints", - 0x0142: "TileWidth", - 0x0143: "TileLength", - 0x0144: "TileOffsets", - 0x0145: "TileByteCounts", - 0x014A: "SubIFDs", - 0x014C: "InkSet", - 0x014D: "InkNames", - 0x014E: "NumberOfInks", - 0x0150: "DotRange", - 0x0151: "TargetPrinter", - 0x0152: "ExtraSamples", - 0x0153: "SampleFormat", - 0x0154: "SMinSampleValue", - 0x0155: "SMaxSampleValue", - 0x0156: "TransferRange", - 0x0157: "ClipPath", - 0x0158: "XClipPathUnits", - 0x0159: "YClipPathUnits", - 0x015A: "Indexed", - 0x015B: "JPEGTables", - 0x015F: "OPIProxy", - 0x0200: "JPEGProc", - 0x0201: "JpegIFOffset", - 0x0202: "JpegIFByteCount", - 0x0203: "JpegRestartInterval", - 0x0205: "JpegLosslessPredictors", - 0x0206: "JpegPointTransforms", - 0x0207: "JpegQTables", - 0x0208: "JpegDCTables", - 0x0209: "JpegACTables", - 0x0211: "YCbCrCoefficients", - 0x0212: "YCbCrSubSampling", - 0x0213: "YCbCrPositioning", - 0x0214: "ReferenceBlackWhite", - 0x02BC: "XMLPacket", - 0x1000: "RelatedImageFileFormat", - 0x1001: "RelatedImageWidth", - 0x1002: "RelatedImageLength", - 0x4746: "Rating", - 0x4749: "RatingPercent", - 0x800D: "ImageID", - 0x828D: "CFARepeatPatternDim", - 0x828E: "CFAPattern", - 0x828F: "BatteryLevel", - 0x8298: "Copyright", - 0x829A: "ExposureTime", - 0x829D: "FNumber", - 0x83BB: "IPTCNAA", - 0x8649: "ImageResources", - 0x8769: "ExifOffset", - 0x8773: "InterColorProfile", - 0x8822: "ExposureProgram", - 0x8824: "SpectralSensitivity", - 0x8825: "GPSInfo", - 0x8827: "ISOSpeedRatings", - 0x8828: "OECF", - 0x8829: "Interlace", - 0x882A: "TimeZoneOffset", - 0x882B: "SelfTimerMode", - 0x8830: "SensitivityType", - 0x8831: "StandardOutputSensitivity", - 0x8832: "RecommendedExposureIndex", - 0x8833: "ISOSpeed", - 0x8834: "ISOSpeedLatitudeyyy", - 0x8835: "ISOSpeedLatitudezzz", - 0x9000: "ExifVersion", - 0x9003: "DateTimeOriginal", - 0x9004: "DateTimeDigitized", - 0x9010: "OffsetTime", - 0x9011: "OffsetTimeOriginal", - 0x9012: "OffsetTimeDigitized", - 0x9101: "ComponentsConfiguration", - 0x9102: "CompressedBitsPerPixel", - 0x9201: "ShutterSpeedValue", - 0x9202: "ApertureValue", - 0x9203: "BrightnessValue", - 0x9204: "ExposureBiasValue", - 0x9205: "MaxApertureValue", - 0x9206: "SubjectDistance", - 0x9207: "MeteringMode", - 0x9208: "LightSource", - 0x9209: "Flash", - 0x920A: "FocalLength", - 0x920B: "FlashEnergy", - 0x920C: "SpatialFrequencyResponse", - 0x920D: "Noise", - 0x9211: "ImageNumber", - 0x9212: "SecurityClassification", - 0x9213: "ImageHistory", - 0x9214: "SubjectLocation", - 0x9215: "ExposureIndex", - 0x9216: "TIFF/EPStandardID", - 0x927C: "MakerNote", - 0x9286: "UserComment", - 0x9290: "SubsecTime", - 0x9291: "SubsecTimeOriginal", - 0x9292: "SubsecTimeDigitized", - 0x9400: "AmbientTemperature", - 0x9401: "Humidity", - 0x9402: "Pressure", - 0x9403: "WaterDepth", - 0x9404: "Acceleration", - 0x9405: "CameraElevationAngle", - 0x9C9B: "XPTitle", - 0x9C9C: "XPComment", - 0x9C9D: "XPAuthor", - 0x9C9E: "XPKeywords", - 0x9C9F: "XPSubject", - 0xA000: "FlashPixVersion", - 0xA001: "ColorSpace", - 0xA002: "ExifImageWidth", - 0xA003: "ExifImageHeight", - 0xA004: "RelatedSoundFile", - 0xA005: "ExifInteroperabilityOffset", - 0xA20B: "FlashEnergy", - 0xA20C: "SpatialFrequencyResponse", - 0xA20E: "FocalPlaneXResolution", - 0xA20F: "FocalPlaneYResolution", - 0xA210: "FocalPlaneResolutionUnit", - 0xA214: "SubjectLocation", - 0xA215: "ExposureIndex", - 0xA217: "SensingMethod", - 0xA300: "FileSource", - 0xA301: "SceneType", - 0xA302: "CFAPattern", - 0xA401: "CustomRendered", - 0xA402: "ExposureMode", - 0xA403: "WhiteBalance", - 0xA404: "DigitalZoomRatio", - 0xA405: "FocalLengthIn35mmFilm", - 0xA406: "SceneCaptureType", - 0xA407: "GainControl", - 0xA408: "Contrast", - 0xA409: "Saturation", - 0xA40A: "Sharpness", - 0xA40B: "DeviceSettingDescription", - 0xA40C: "SubjectDistanceRange", - 0xA420: "ImageUniqueID", - 0xA430: "CameraOwnerName", - 0xA431: "BodySerialNumber", - 0xA432: "LensSpecification", - 0xA433: "LensMake", - 0xA434: "LensModel", - 0xA435: "LensSerialNumber", - 0xA460: "CompositeImage", - 0xA461: "CompositeImageCount", - 0xA462: "CompositeImageExposureTimes", - 0xA500: "Gamma", - 0xC4A5: "PrintImageMatching", - 0xC612: "DNGVersion", - 0xC613: "DNGBackwardVersion", - 0xC614: "UniqueCameraModel", - 0xC615: "LocalizedCameraModel", - 0xC616: "CFAPlaneColor", - 0xC617: "CFALayout", - 0xC618: "LinearizationTable", - 0xC619: "BlackLevelRepeatDim", - 0xC61A: "BlackLevel", - 0xC61B: "BlackLevelDeltaH", - 0xC61C: "BlackLevelDeltaV", - 0xC61D: "WhiteLevel", - 0xC61E: "DefaultScale", - 0xC61F: "DefaultCropOrigin", - 0xC620: "DefaultCropSize", - 0xC621: "ColorMatrix1", - 0xC622: "ColorMatrix2", - 0xC623: "CameraCalibration1", - 0xC624: "CameraCalibration2", - 0xC625: "ReductionMatrix1", - 0xC626: "ReductionMatrix2", - 0xC627: "AnalogBalance", - 0xC628: "AsShotNeutral", - 0xC629: "AsShotWhiteXY", - 0xC62A: "BaselineExposure", - 0xC62B: "BaselineNoise", - 0xC62C: "BaselineSharpness", - 0xC62D: "BayerGreenSplit", - 0xC62E: "LinearResponseLimit", - 0xC62F: "CameraSerialNumber", - 0xC630: "LensInfo", - 0xC631: "ChromaBlurRadius", - 0xC632: "AntiAliasStrength", - 0xC633: "ShadowScale", - 0xC634: "DNGPrivateData", - 0xC635: "MakerNoteSafety", - 0xC65A: "CalibrationIlluminant1", - 0xC65B: "CalibrationIlluminant2", - 0xC65C: "BestQualityScale", - 0xC65D: "RawDataUniqueID", - 0xC68B: "OriginalRawFileName", - 0xC68C: "OriginalRawFileData", - 0xC68D: "ActiveArea", - 0xC68E: "MaskedAreas", - 0xC68F: "AsShotICCProfile", - 0xC690: "AsShotPreProfileMatrix", - 0xC691: "CurrentICCProfile", - 0xC692: "CurrentPreProfileMatrix", - 0xC6BF: "ColorimetricReference", - 0xC6F3: "CameraCalibrationSignature", - 0xC6F4: "ProfileCalibrationSignature", - 0xC6F6: "AsShotProfileName", - 0xC6F7: "NoiseReductionApplied", - 0xC6F8: "ProfileName", - 0xC6F9: "ProfileHueSatMapDims", - 0xC6FA: "ProfileHueSatMapData1", - 0xC6FB: "ProfileHueSatMapData2", - 0xC6FC: "ProfileToneCurve", - 0xC6FD: "ProfileEmbedPolicy", - 0xC6FE: "ProfileCopyright", - 0xC714: "ForwardMatrix1", - 0xC715: "ForwardMatrix2", - 0xC716: "PreviewApplicationName", - 0xC717: "PreviewApplicationVersion", - 0xC718: "PreviewSettingsName", - 0xC719: "PreviewSettingsDigest", - 0xC71A: "PreviewColorSpace", - 0xC71B: "PreviewDateTime", - 0xC71C: "RawImageDigest", - 0xC71D: "OriginalRawFileDigest", - 0xC71E: "SubTileBlockSize", - 0xC71F: "RowInterleaveFactor", - 0xC725: "ProfileLookTableDims", - 0xC726: "ProfileLookTableData", - 0xC740: "OpcodeList1", - 0xC741: "OpcodeList2", - 0xC74E: "OpcodeList3", - 0xC761: "NoiseProfile", -} -"""Maps EXIF tags to tag names.""" - - -GPSTAGS = { - 0: "GPSVersionID", - 1: "GPSLatitudeRef", - 2: "GPSLatitude", - 3: "GPSLongitudeRef", - 4: "GPSLongitude", - 5: "GPSAltitudeRef", - 6: "GPSAltitude", - 7: "GPSTimeStamp", - 8: "GPSSatellites", - 9: "GPSStatus", - 10: "GPSMeasureMode", - 11: "GPSDOP", - 12: "GPSSpeedRef", - 13: "GPSSpeed", - 14: "GPSTrackRef", - 15: "GPSTrack", - 16: "GPSImgDirectionRef", - 17: "GPSImgDirection", - 18: "GPSMapDatum", - 19: "GPSDestLatitudeRef", - 20: "GPSDestLatitude", - 21: "GPSDestLongitudeRef", - 22: "GPSDestLongitude", - 23: "GPSDestBearingRef", - 24: "GPSDestBearing", - 25: "GPSDestDistanceRef", - 26: "GPSDestDistance", - 27: "GPSProcessingMethod", - 28: "GPSAreaInformation", - 29: "GPSDateStamp", - 30: "GPSDifferential", - 31: "GPSHPositioningError", -} -"""Maps EXIF GPS tags to tag names.""" diff --git a/waypoint_manager/manager_GUI/PIL/FitsImagePlugin.py b/waypoint_manager/manager_GUI/PIL/FitsImagePlugin.py deleted file mode 100644 index c16300e..0000000 --- a/waypoint_manager/manager_GUI/PIL/FitsImagePlugin.py +++ /dev/null @@ -1,71 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# FITS file handling -# -# Copyright (c) 1998-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import math - -from . import Image, ImageFile - - -def _accept(prefix): - return prefix[:6] == b"SIMPLE" - - -class FitsImageFile(ImageFile.ImageFile): - - format = "FITS" - format_description = "FITS" - - def _open(self): - headers = {} - while True: - header = self.fp.read(80) - if not header: - raise OSError("Truncated FITS file") - keyword = header[:8].strip() - if keyword == b"END": - break - value = header[8:].strip() - if value.startswith(b"="): - value = value[1:].strip() - if not headers and (not _accept(keyword) or value != b"T"): - raise SyntaxError("Not a FITS file") - headers[keyword] = value - - naxis = int(headers[b"NAXIS"]) - if naxis == 0: - raise ValueError("No image data") - elif naxis == 1: - self._size = 1, int(headers[b"NAXIS1"]) - else: - self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"]) - - number_of_bits = int(headers[b"BITPIX"]) - if number_of_bits == 8: - self.mode = "L" - elif number_of_bits == 16: - self.mode = "I" - # rawmode = "I;16S" - elif number_of_bits == 32: - self.mode = "I" - elif number_of_bits in (-32, -64): - self.mode = "F" - # rawmode = "F" if number_of_bits == -32 else "F;64F" - - offset = math.ceil(self.fp.tell() / 2880) * 2880 - self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))] - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(FitsImageFile.format, FitsImageFile, _accept) - -Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/waypoint_manager/manager_GUI/PIL/FitsStubImagePlugin.py b/waypoint_manager/manager_GUI/PIL/FitsStubImagePlugin.py deleted file mode 100644 index 440240a..0000000 --- a/waypoint_manager/manager_GUI/PIL/FitsStubImagePlugin.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# FITS stub adapter -# -# Copyright (c) 1998-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import FitsImagePlugin, Image, ImageFile -from ._deprecate import deprecate - -_handler = None - - -def register_handler(handler): - """ - Install application-specific FITS image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - deprecate( - "FitsStubImagePlugin", - 10, - action="FITS images can now be read without " - "a handler through FitsImagePlugin instead", - ) - - # Override FitsImagePlugin with this handler - # for backwards compatibility - try: - Image.ID.remove(FITSStubImageFile.format) - except ValueError: - pass - - Image.register_open( - FITSStubImageFile.format, FITSStubImageFile, FitsImagePlugin._accept - ) - - -class FITSStubImageFile(ImageFile.StubImageFile): - - format = FitsImagePlugin.FitsImageFile.format - format_description = FitsImagePlugin.FitsImageFile.format_description - - def _open(self): - offset = self.fp.tell() - - im = FitsImagePlugin.FitsImageFile(self.fp) - self._size = im.size - self.mode = im.mode - self.tile = [] - - self.fp.seek(offset) - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - raise OSError("FITS save handler not installed") - - -# -------------------------------------------------------------------- -# Registry - -Image.register_save(FITSStubImageFile.format, _save) diff --git a/waypoint_manager/manager_GUI/PIL/FliImagePlugin.py b/waypoint_manager/manager_GUI/PIL/FliImagePlugin.py deleted file mode 100644 index e13b177..0000000 --- a/waypoint_manager/manager_GUI/PIL/FliImagePlugin.py +++ /dev/null @@ -1,162 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# FLI/FLC file handling. -# -# History: -# 95-09-01 fl Created -# 97-01-03 fl Fixed parser, setup decoder tile -# 98-07-15 fl Renamed offset attribute to avoid name clash -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 - -# -# decoder - - -def _accept(prefix): - return ( - len(prefix) >= 6 - and i16(prefix, 4) in [0xAF11, 0xAF12] - and i16(prefix, 14) in [0, 3] # flags - ) - - -## -# Image plugin for the FLI/FLC animation format. Use the seek -# method to load individual frames. - - -class FliImageFile(ImageFile.ImageFile): - - format = "FLI" - format_description = "Autodesk FLI/FLC Animation" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # HEAD - s = self.fp.read(128) - if not (_accept(s) and s[20:22] == b"\x00\x00"): - raise SyntaxError("not an FLI/FLC file") - - # frames - self.n_frames = i16(s, 6) - self.is_animated = self.n_frames > 1 - - # image characteristics - self.mode = "P" - self._size = i16(s, 8), i16(s, 10) - - # animation speed - duration = i32(s, 16) - magic = i16(s, 4) - if magic == 0xAF11: - duration = (duration * 1000) // 70 - self.info["duration"] = duration - - # look for palette - palette = [(a, a, a) for a in range(256)] - - s = self.fp.read(16) - - self.__offset = 128 - - if i16(s, 4) == 0xF100: - # prefix chunk; ignore it - self.__offset = self.__offset + i32(s) - s = self.fp.read(16) - - if i16(s, 4) == 0xF1FA: - # look for palette chunk - s = self.fp.read(6) - if i16(s, 4) == 11: - self._palette(palette, 2) - elif i16(s, 4) == 4: - self._palette(palette, 0) - - palette = [o8(r) + o8(g) + o8(b) for (r, g, b) in palette] - self.palette = ImagePalette.raw("RGB", b"".join(palette)) - - # set things up to decode first frame - self.__frame = -1 - self._fp = self.fp - self.__rewind = self.fp.tell() - self.seek(0) - - def _palette(self, palette, shift): - # load palette - - i = 0 - for e in range(i16(self.fp.read(2))): - s = self.fp.read(2) - i = i + s[0] - n = s[1] - if n == 0: - n = 256 - s = self.fp.read(n * 3) - for n in range(0, len(s), 3): - r = s[n] << shift - g = s[n + 1] << shift - b = s[n + 2] << shift - palette[i] = (r, g, b) - i += 1 - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0) - - for f in range(self.__frame + 1, frame + 1): - self._seek(f) - - def _seek(self, frame): - if frame == 0: - self.__frame = -1 - self._fp.seek(self.__rewind) - self.__offset = 128 - else: - # ensure that the previous frame was loaded - self.load() - - if frame != self.__frame + 1: - raise ValueError(f"cannot seek to frame {frame}") - self.__frame = frame - - # move to next frame - self.fp = self._fp - self.fp.seek(self.__offset) - - s = self.fp.read(4) - if not s: - raise EOFError - - framesize = i32(s) - - self.decodermaxblock = framesize - self.tile = [("fli", (0, 0) + self.size, self.__offset, None)] - - self.__offset += framesize - - def tell(self): - return self.__frame - - -# -# registry - -Image.register_open(FliImageFile.format, FliImageFile, _accept) - -Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/waypoint_manager/manager_GUI/PIL/FontFile.py b/waypoint_manager/manager_GUI/PIL/FontFile.py deleted file mode 100644 index c5fc80b..0000000 --- a/waypoint_manager/manager_GUI/PIL/FontFile.py +++ /dev/null @@ -1,111 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# base class for raster font file parsers -# -# history: -# 1997-06-05 fl created -# 1997-08-19 fl restrict image width -# -# Copyright (c) 1997-1998 by Secret Labs AB -# Copyright (c) 1997-1998 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -import os - -from . import Image, _binary - -WIDTH = 800 - - -def puti16(fp, values): - """Write network order (big-endian) 16-bit sequence""" - for v in values: - if v < 0: - v += 65536 - fp.write(_binary.o16be(v)) - - -class FontFile: - """Base class for raster font file handlers.""" - - bitmap = None - - def __init__(self): - - self.info = {} - self.glyph = [None] * 256 - - def __getitem__(self, ix): - return self.glyph[ix] - - def compile(self): - """Create metrics and bitmap""" - - if self.bitmap: - return - - # create bitmap large enough to hold all data - h = w = maxwidth = 0 - lines = 1 - for glyph in self: - if glyph: - d, dst, src, im = glyph - h = max(h, src[3] - src[1]) - w = w + (src[2] - src[0]) - if w > WIDTH: - lines += 1 - w = src[2] - src[0] - maxwidth = max(maxwidth, w) - - xsize = maxwidth - ysize = lines * h - - if xsize == 0 and ysize == 0: - return "" - - self.ysize = h - - # paste glyphs into bitmap - self.bitmap = Image.new("1", (xsize, ysize)) - self.metrics = [None] * 256 - x = y = 0 - for i in range(256): - glyph = self[i] - if glyph: - d, dst, src, im = glyph - xx = src[2] - src[0] - # yy = src[3] - src[1] - x0, y0 = x, y - x = x + xx - if x > WIDTH: - x, y = 0, y + h - x0, y0 = x, y - x = xx - s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 - self.bitmap.paste(im.crop(src), s) - self.metrics[i] = d, dst, s - - def save(self, filename): - """Save font""" - - self.compile() - - # font data - self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") - - # font metrics - with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: - fp.write(b"PILfont\n") - fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! - fp.write(b"DATA\n") - for id in range(256): - m = self.metrics[id] - if not m: - puti16(fp, [0] * 10) - else: - puti16(fp, m[0] + m[1] + m[2]) diff --git a/waypoint_manager/manager_GUI/PIL/FpxImagePlugin.py b/waypoint_manager/manager_GUI/PIL/FpxImagePlugin.py deleted file mode 100644 index a55376d..0000000 --- a/waypoint_manager/manager_GUI/PIL/FpxImagePlugin.py +++ /dev/null @@ -1,245 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library. -# $Id$ -# -# FlashPix support for PIL -# -# History: -# 97-01-25 fl Created (reads uncompressed RGB images only) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -import olefile - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# we map from colour field tuples to (mode, rawmode) descriptors -MODES = { - # opacity - (0x00007FFE,): ("A", "L"), - # monochrome - (0x00010000,): ("L", "L"), - (0x00018000, 0x00017FFE): ("RGBA", "LA"), - # photo YCC - (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), - (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), - # standard RGB (NIFRGB) - (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), - (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), -} - - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for the FlashPix images. - - -class FpxImageFile(ImageFile.ImageFile): - - format = "FPX" - format_description = "FlashPix" - - def _open(self): - # - # read the OLE directory and see if this is a likely - # to be a FlashPix file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - raise SyntaxError("not an FPX file; invalid OLE file") from e - - if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": - raise SyntaxError("not an FPX file; bad root CLSID") - - self._open_index(1) - - def _open_index(self, index=1): - # - # get the Image Contents Property Set - - prop = self.ole.getproperties( - [f"Data Object Store {index:06d}", "\005Image Contents"] - ) - - # size (highest resolution) - - self._size = prop[0x1000002], prop[0x1000003] - - size = max(self.size) - i = 1 - while size > 64: - size = size / 2 - i += 1 - self.maxid = i - 1 - - # mode. instead of using a single field for this, flashpix - # requires you to specify the mode for each channel in each - # resolution subimage, and leaves it to the decoder to make - # sure that they all match. for now, we'll cheat and assume - # that this is always the case. - - id = self.maxid << 16 - - s = prop[0x2000002 | id] - - colors = [] - bands = i32(s, 4) - if bands > 4: - raise OSError("Invalid number of bands") - for i in range(bands): - # note: for now, we ignore the "uncalibrated" flag - colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF) - - self.mode, self.rawmode = MODES[tuple(colors)] - - # load JPEG tables, if any - self.jpeg = {} - for i in range(256): - id = 0x3000001 | (i << 16) - if id in prop: - self.jpeg[i] = prop[id] - - self._open_subimage(1, self.maxid) - - def _open_subimage(self, index=1, subimage=0): - # - # setup tile descriptors for a given subimage - - stream = [ - f"Data Object Store {index:06d}", - f"Resolution {subimage:04d}", - "Subimage 0000 Header", - ] - - fp = self.ole.openstream(stream) - - # skip prefix - fp.read(28) - - # header stream - s = fp.read(36) - - size = i32(s, 4), i32(s, 8) - # tilecount = i32(s, 12) - tilesize = i32(s, 16), i32(s, 20) - # channels = i32(s, 24) - offset = i32(s, 28) - length = i32(s, 32) - - if size != self.size: - raise OSError("subimage mismatch") - - # get tile descriptors - fp.seek(28 + offset) - s = fp.read(i32(s, 12) * length) - - x = y = 0 - xsize, ysize = size - xtile, ytile = tilesize - self.tile = [] - - for i in range(0, len(s), length): - - x1 = min(xsize, x + xtile) - y1 = min(ysize, y + ytile) - - compression = i32(s, i + 8) - - if compression == 0: - self.tile.append( - ( - "raw", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode,), - ) - ) - - elif compression == 1: - - # FIXME: the fill decoder is not implemented - self.tile.append( - ( - "fill", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode, s[12:16]), - ) - ) - - elif compression == 2: - - internal_color_conversion = s[14] - jpeg_tables = s[15] - rawmode = self.rawmode - - if internal_color_conversion: - # The image is stored as usual (usually YCbCr). - if rawmode == "RGBA": - # For "RGBA", data is stored as YCbCrA based on - # negative RGB. The following trick works around - # this problem : - jpegmode, rawmode = "YCbCrK", "CMYK" - else: - jpegmode = None # let the decoder decide - - else: - # The image is stored as defined by rawmode - jpegmode = rawmode - - self.tile.append( - ( - "jpeg", - (x, y, x1, y1), - i32(s, i) + 28, - (rawmode, jpegmode), - ) - ) - - # FIXME: jpeg tables are tile dependent; the prefix - # data must be placed in the tile descriptor itself! - - if jpeg_tables: - self.tile_prefix = self.jpeg[jpeg_tables] - - else: - raise OSError("unknown/invalid compression") - - x = x + xtile - if x >= xsize: - x, y = 0, y + ytile - if y >= ysize: - break # isn't really required - - self.stream = stream - self.fp = None - - def load(self): - - if not self.fp: - self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) - - return ImageFile.ImageFile.load(self) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(FpxImageFile.format, FpxImageFile, _accept) - -Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/waypoint_manager/manager_GUI/PIL/FtexImagePlugin.py b/waypoint_manager/manager_GUI/PIL/FtexImagePlugin.py deleted file mode 100644 index 1b714eb..0000000 --- a/waypoint_manager/manager_GUI/PIL/FtexImagePlugin.py +++ /dev/null @@ -1,122 +0,0 @@ -""" -A Pillow loader for .ftc and .ftu files (FTEX) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 - -The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a -packed custom format called FTEX. This file format uses file extensions FTC -and FTU. -* FTC files are compressed textures (using standard texture compression). -* FTU files are not compressed. -Texture File Format -The FTC and FTU texture files both use the same format. This -has the following structure: -{header} -{format_directory} -{data} -Where: -{header} = { - u32:magic, - u32:version, - u32:width, - u32:height, - u32:mipmap_count, - u32:format_count -} - -* The "magic" number is "FTEX". -* "width" and "height" are the dimensions of the texture. -* "mipmap_count" is the number of mipmaps in the texture. -* "format_count" is the number of texture formats (different versions of the -same texture) in this file. - -{format_directory} = format_count * { u32:format, u32:where } - -The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB -uncompressed textures. -The texture data for a format starts at the position "where" in the file. - -Each set of texture data in the file has the following structure: -{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } -* "mipmap_size" is the number of bytes in that mip level. For compressed -textures this is the size of the texture data compressed with DXT1. For 24 bit -uncompressed textures, this is 3 * width * height. Following this are the image -bytes for that mipmap level. - -Note: All data is stored in little-Endian (Intel) byte order. -""" - -import struct -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile -from ._deprecate import deprecate - -MAGIC = b"FTEX" - - -class Format(IntEnum): - DXT1 = 0 - UNCOMPRESSED = 1 - - -def __getattr__(name): - for enum, prefix in {Format: "FORMAT_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -class FtexImageFile(ImageFile.ImageFile): - format = "FTEX" - format_description = "Texture File Format (IW2:EOC)" - - def _open(self): - if not _accept(self.fp.read(4)): - raise SyntaxError("not an FTEX file") - struct.unpack("= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) - - -## -# Image plugin for the GIMP brush format. - - -class GbrImageFile(ImageFile.ImageFile): - - format = "GBR" - format_description = "GIMP brush file" - - def _open(self): - header_size = i32(self.fp.read(4)) - if header_size < 20: - raise SyntaxError("not a GIMP brush") - version = i32(self.fp.read(4)) - if version not in (1, 2): - raise SyntaxError(f"Unsupported GIMP brush version: {version}") - - width = i32(self.fp.read(4)) - height = i32(self.fp.read(4)) - color_depth = i32(self.fp.read(4)) - if width <= 0 or height <= 0: - raise SyntaxError("not a GIMP brush") - if color_depth not in (1, 4): - raise SyntaxError(f"Unsupported GIMP brush color depth: {color_depth}") - - if version == 1: - comment_length = header_size - 20 - else: - comment_length = header_size - 28 - magic_number = self.fp.read(4) - if magic_number != b"GIMP": - raise SyntaxError("not a GIMP brush, bad magic number") - self.info["spacing"] = i32(self.fp.read(4)) - - comment = self.fp.read(comment_length)[:-1] - - if color_depth == 1: - self.mode = "L" - else: - self.mode = "RGBA" - - self._size = width, height - - self.info["comment"] = comment - - # Image might not be small - Image._decompression_bomb_check(self.size) - - # Data is an uncompressed block of w * h * bytes/pixel - self._data_size = width * height * color_depth - - def load(self): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self._data_size)) - return Image.Image.load(self) - - -# -# registry - - -Image.register_open(GbrImageFile.format, GbrImageFile, _accept) -Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/waypoint_manager/manager_GUI/PIL/GdImageFile.py b/waypoint_manager/manager_GUI/PIL/GdImageFile.py deleted file mode 100644 index 1ac3b67..0000000 --- a/waypoint_manager/manager_GUI/PIL/GdImageFile.py +++ /dev/null @@ -1,95 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GD file handling -# -# History: -# 1996-04-12 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -""" -.. note:: - This format cannot be automatically recognized, so the - class is not registered for use with :py:func:`PIL.Image.open()`. To open a - gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. - -.. warning:: - THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This - implementation is provided for convenience and demonstrational - purposes only. -""" - - -from . import ImageFile, ImagePalette, UnidentifiedImageError -from ._binary import i16be as i16 -from ._binary import i32be as i32 - - -class GdImageFile(ImageFile.ImageFile): - """ - Image plugin for the GD uncompressed format. Note that this format - is not supported by the standard :py:func:`PIL.Image.open()` function. To use - this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and - use the :py:func:`PIL.GdImageFile.open()` function. - """ - - format = "GD" - format_description = "GD uncompressed images" - - def _open(self): - - # Header - s = self.fp.read(1037) - - if not i16(s) in [65534, 65535]: - raise SyntaxError("Not a valid GD 2.x .gd file") - - self.mode = "L" # FIXME: "P" - self._size = i16(s, 2), i16(s, 4) - - true_color = s[6] - true_color_offset = 2 if true_color else 0 - - # transparency index - tindex = i32(s, 7 + true_color_offset) - if tindex < 256: - self.info["transparency"] = tindex - - self.palette = ImagePalette.raw( - "XBGR", s[7 + true_color_offset + 4 : 7 + true_color_offset + 4 + 256 * 4] - ) - - self.tile = [ - ( - "raw", - (0, 0) + self.size, - 7 + true_color_offset + 4 + 256 * 4, - ("L", 0, 1), - ) - ] - - -def open(fp, mode="r"): - """ - Load texture from a GD image file. - - :param fp: GD file name, or an opened file handle. - :param mode: Optional mode. In this version, if the mode argument - is given, it must be "r". - :returns: An image instance. - :raises OSError: If the image could not be read. - """ - if mode != "r": - raise ValueError("bad mode") - - try: - return GdImageFile(fp) - except SyntaxError as e: - raise UnidentifiedImageError("cannot identify this image file") from e diff --git a/waypoint_manager/manager_GUI/PIL/GifImagePlugin.py b/waypoint_manager/manager_GUI/PIL/GifImagePlugin.py deleted file mode 100644 index c239a6a..0000000 --- a/waypoint_manager/manager_GUI/PIL/GifImagePlugin.py +++ /dev/null @@ -1,1058 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GIF file handling -# -# History: -# 1995-09-01 fl Created -# 1996-12-14 fl Added interlace support -# 1996-12-30 fl Added animation support -# 1997-01-05 fl Added write support, fixed local colour map bug -# 1997-02-23 fl Make sure to load raster data in getdata() -# 1997-07-05 fl Support external decoder (0.4) -# 1998-07-09 fl Handle all modes when saving (0.5) -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) -# 2001-04-17 fl Added palette optimization (0.7) -# 2002-06-06 fl Added transparency support for save (0.8) -# 2004-02-24 fl Disable interlacing for small images -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import itertools -import math -import os -import subprocess -from enum import IntEnum - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - - -class LoadingStrategy(IntEnum): - """.. versionadded:: 9.1.0""" - - RGB_AFTER_FIRST = 0 - RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 - RGB_ALWAYS = 2 - - -#: .. versionadded:: 9.1.0 -LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST - -# -------------------------------------------------------------------- -# Identify/read GIF files - - -def _accept(prefix): - return prefix[:6] in [b"GIF87a", b"GIF89a"] - - -## -# Image plugin for GIF images. This plugin supports both GIF87 and -# GIF89 images. - - -class GifImageFile(ImageFile.ImageFile): - - format = "GIF" - format_description = "Compuserve GIF" - _close_exclusive_fp_after_loading = False - - global_palette = None - - def data(self): - s = self.fp.read(1) - if s and s[0]: - return self.fp.read(s[0]) - return None - - def _is_palette_needed(self, p): - for i in range(0, len(p), 3): - if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): - return True - return False - - def _open(self): - - # Screen - s = self.fp.read(13) - if not _accept(s): - raise SyntaxError("not a GIF file") - - self.info["version"] = s[:6] - self._size = i16(s, 6), i16(s, 8) - self.tile = [] - flags = s[10] - bits = (flags & 7) + 1 - - if flags & 128: - # get global palette - self.info["background"] = s[11] - # check if palette contains colour indices - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - p = ImagePalette.raw("RGB", p) - self.global_palette = self.palette = p - - self._fp = self.fp # FIXME: hack - self.__rewind = self.fp.tell() - self._n_frames = None - self._is_animated = None - self._seek(0) # get ready to read first frame - - @property - def n_frames(self): - if self._n_frames is None: - current = self.tell() - try: - while True: - self._seek(self.tell() + 1, False) - except EOFError: - self._n_frames = self.tell() + 1 - self.seek(current) - return self._n_frames - - @property - def is_animated(self): - if self._is_animated is None: - if self._n_frames is not None: - self._is_animated = self._n_frames != 1 - else: - current = self.tell() - if current: - self._is_animated = True - else: - try: - self._seek(1, False) - self._is_animated = True - except EOFError: - self._is_animated = False - - self.seek(current) - return self._is_animated - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self.im = None - self._seek(0) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - raise EOFError("no more images in GIF file") from e - - def _seek(self, frame, update_image=True): - - if frame == 0: - # rewind - self.__offset = 0 - self.dispose = None - self.__frame = -1 - self._fp.seek(self.__rewind) - self.disposal_method = 0 - if "comment" in self.info: - del self.info["comment"] - else: - # ensure that the previous frame was loaded - if self.tile and update_image: - self.load() - - if frame != self.__frame + 1: - raise ValueError(f"cannot seek to frame {frame}") - - self.fp = self._fp - if self.__offset: - # backup to last frame - self.fp.seek(self.__offset) - while self.data(): - pass - self.__offset = 0 - - s = self.fp.read(1) - if not s or s == b";": - raise EOFError - - self.tile = [] - - palette = None - - info = {} - frame_transparency = None - interlace = None - frame_dispose_extent = None - while True: - - if not s: - s = self.fp.read(1) - if not s or s == b";": - break - - elif s == b"!": - # - # extensions - # - s = self.fp.read(1) - block = self.data() - if s[0] == 249: - # - # graphic control extension - # - flags = block[0] - if flags & 1: - frame_transparency = block[3] - info["duration"] = i16(block, 1) * 10 - - # disposal method - find the value of bits 4 - 6 - dispose_bits = 0b00011100 & flags - dispose_bits = dispose_bits >> 2 - if dispose_bits: - # only set the dispose if it is not - # unspecified. I'm not sure if this is - # correct, but it seems to prevent the last - # frame from looking odd for some animations - self.disposal_method = dispose_bits - elif s[0] == 254: - # - # comment extension - # - comment = b"" - - # Read this comment block - while block: - comment += block - block = self.data() - - if "comment" in info: - # If multiple comment blocks in frame, separate with \n - info["comment"] += b"\n" + comment - else: - info["comment"] = comment - s = None - continue - elif s[0] == 255 and frame == 0: - # - # application extension - # - info["extension"] = block, self.fp.tell() - if block[:11] == b"NETSCAPE2.0": - block = self.data() - if len(block) >= 3 and block[0] == 1: - self.info["loop"] = i16(block, 1) - while self.data(): - pass - - elif s == b",": - # - # local image - # - s = self.fp.read(9) - - # extent - x0, y0 = i16(s, 0), i16(s, 2) - x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) - if (x1 > self.size[0] or y1 > self.size[1]) and update_image: - self._size = max(x1, self.size[0]), max(y1, self.size[1]) - Image._decompression_bomb_check(self._size) - frame_dispose_extent = x0, y0, x1, y1 - flags = s[8] - - interlace = (flags & 64) != 0 - - if flags & 128: - bits = (flags & 7) + 1 - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - palette = ImagePalette.raw("RGB", p) - - # image data - bits = self.fp.read(1)[0] - self.__offset = self.fp.tell() - break - - else: - pass - # raise OSError, "illegal GIF tag `%x`" % s[0] - s = None - - if interlace is None: - # self._fp = None - raise EOFError - - self.__frame = frame - if not update_image: - return - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - - self._frame_palette = palette or self.global_palette - if frame == 0: - if self._frame_palette: - self.mode = ( - "RGB" if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS else "P" - ) - else: - self.mode = "L" - - if not palette and self.global_palette: - from copy import copy - - palette = copy(self.global_palette) - self.palette = palette - else: - self._frame_transparency = frame_transparency - if self.mode == "P": - if ( - LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY - or palette - ): - self.pyaccess = None - if "transparency" in self.info: - self.im.putpalettealpha(self.info["transparency"], 0) - self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) - self.mode = "RGBA" - del self.info["transparency"] - else: - self.mode = "RGB" - self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) - - def _rgb(color): - if self._frame_palette: - color = tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) - else: - color = (color, color, color) - return color - - self.dispose_extent = frame_dispose_extent - try: - if self.disposal_method < 2: - # do not dispose or none specified - self.dispose = None - elif self.disposal_method == 2: - # replace with background colour - - # only dispose the extent in this frame - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - - # by convention, attempt to use transparency first - dispose_mode = "P" - color = self.info.get("transparency", frame_transparency) - if color is not None: - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(color) + (0,) - else: - color = self.info.get("background", 0) - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGB" - color = _rgb(color) - self.dispose = Image.core.fill(dispose_mode, dispose_size, color) - else: - # replace with previous contents - if self.im is not None: - # only dispose the extent in this frame - self.dispose = self._crop(self.im, self.dispose_extent) - elif frame_transparency is not None: - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - dispose_mode = "P" - color = frame_transparency - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(frame_transparency) + (0,) - self.dispose = Image.core.fill(dispose_mode, dispose_size, color) - except AttributeError: - pass - - if interlace is not None: - transparency = -1 - if frame_transparency is not None: - if frame == 0: - self.info["transparency"] = frame_transparency - elif self.mode not in ("RGB", "RGBA"): - transparency = frame_transparency - self.tile = [ - ( - "gif", - (x0, y0, x1, y1), - self.__offset, - (bits, interlace, transparency), - ) - ] - - if info.get("comment"): - self.info["comment"] = info["comment"] - for k in ["duration", "extension"]: - if k in info: - self.info[k] = info[k] - elif k in self.info: - del self.info[k] - - def load_prepare(self): - temp_mode = "P" if self._frame_palette else "L" - self._prev_im = None - if self.__frame == 0: - if "transparency" in self.info: - self.im = Image.core.fill( - temp_mode, self.size, self.info["transparency"] - ) - elif self.mode in ("RGB", "RGBA"): - self._prev_im = self.im - if self._frame_palette: - self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) - self.im.putpalette(*self._frame_palette.getdata()) - else: - self.im = None - self.mode = temp_mode - self._frame_palette = None - - super().load_prepare() - - def load_end(self): - if self.__frame == 0: - if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - self.mode = "RGB" - self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) - return - if self.mode == "P" and self._prev_im: - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - frame_im = self.im.convert("RGBA") - else: - frame_im = self.im.convert("RGB") - else: - if not self._prev_im: - return - frame_im = self.im - frame_im = self._crop(frame_im, self.dispose_extent) - - self.im = self._prev_im - self.mode = self.im.mode - if frame_im.mode == "RGBA": - self.im.paste(frame_im, self.dispose_extent, frame_im) - else: - self.im.paste(frame_im, self.dispose_extent) - - def tell(self): - return self.__frame - - -# -------------------------------------------------------------------- -# Write GIF files - - -RAWMODE = {"1": "L", "L": "L", "P": "P"} - - -def _normalize_mode(im): - """ - Takes an image (or frame), returns an image in a mode that is appropriate - for saving in a Gif. - - It may return the original image, or it may return an image converted to - palette or 'L' mode. - - :param im: Image object - :returns: Image object - """ - if im.mode in RAWMODE: - im.load() - return im - if Image.getmodebase(im.mode) == "RGB": - im = im.convert("P", palette=Image.Palette.ADAPTIVE) - if im.palette.mode == "RGBA": - for rgba in im.palette.colors.keys(): - if rgba[3] == 0: - im.info["transparency"] = im.palette.colors[rgba] - break - return im - return im.convert("L") - - -def _normalize_palette(im, palette, info): - """ - Normalizes the palette for image. - - Sets the palette to the incoming palette, if provided. - - Ensures that there's a palette for L mode images - - Optimizes the palette if necessary/desired. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: Image object - """ - source_palette = None - if palette: - # a bytes palette - if isinstance(palette, (bytes, bytearray, list)): - source_palette = bytearray(palette[:768]) - if isinstance(palette, ImagePalette.ImagePalette): - source_palette = bytearray(palette.palette) - - if im.mode == "P": - if not source_palette: - source_palette = im.im.getpalette("RGB")[:768] - else: # L-mode - if not source_palette: - source_palette = bytearray(i // 3 for i in range(768)) - im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) - - if palette: - used_palette_colors = [] - for i in range(0, len(source_palette), 3): - source_color = tuple(source_palette[i : i + 3]) - try: - index = im.palette.colors[source_color] - except KeyError: - index = None - used_palette_colors.append(index) - for i, index in enumerate(used_palette_colors): - if index is None: - for j in range(len(used_palette_colors)): - if j not in used_palette_colors: - used_palette_colors[i] = j - break - im = im.remap_palette(used_palette_colors) - else: - used_palette_colors = _get_optimize(im, info) - if used_palette_colors is not None: - return im.remap_palette(used_palette_colors, source_palette) - - im.palette.palette = source_palette - return im - - -def _write_single_frame(im, fp, palette): - im_out = _normalize_mode(im) - for k, v in im_out.info.items(): - im.encoderinfo.setdefault(k, v) - im_out = _normalize_palette(im_out, palette, im.encoderinfo) - - for s in _get_global_header(im_out, im.encoderinfo): - fp.write(s) - - # local image header - flags = 0 - if get_interlace(im): - flags = flags | 64 - _write_local_header(fp, im, (0, 0), flags) - - im_out.encoderconfig = (8, get_interlace(im)) - ImageFile._save(im_out, fp, [("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])]) - - fp.write(b"\0") # end of image data - - -def _write_multiple_frames(im, fp, palette): - - duration = im.encoderinfo.get("duration") - disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) - - im_frames = [] - frame_count = 0 - background_im = None - for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): - for im_frame in ImageSequence.Iterator(imSequence): - # a copy is required here since seek can still mutate the image - im_frame = _normalize_mode(im_frame.copy()) - if frame_count == 0: - for k, v in im_frame.info.items(): - if k == "transparency": - continue - im.encoderinfo.setdefault(k, v) - - encoderinfo = im.encoderinfo.copy() - im_frame = _normalize_palette(im_frame, palette, encoderinfo) - if "transparency" in im_frame.info: - encoderinfo.setdefault("transparency", im_frame.info["transparency"]) - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - elif duration is None and "duration" in im_frame.info: - encoderinfo["duration"] = im_frame.info["duration"] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - frame_count += 1 - - if im_frames: - # delta frame - previous = im_frames[-1] - if encoderinfo.get("disposal") == 2: - if background_im is None: - color = im.encoderinfo.get( - "transparency", im.info.get("transparency", (0, 0, 0)) - ) - background = _get_background(im_frame, color) - background_im = Image.new("P", im_frame.size, background) - background_im.putpalette(im_frames[0]["im"].palette) - base_im = background_im - else: - base_im = previous["im"] - if _get_palette_bytes(im_frame) == _get_palette_bytes(base_im): - delta = ImageChops.subtract_modulo(im_frame, base_im) - else: - delta = ImageChops.subtract_modulo( - im_frame.convert("RGB"), base_im.convert("RGB") - ) - bbox = delta.getbbox() - if not bbox: - # This frame is identical to the previous frame - if duration: - previous["encoderinfo"]["duration"] += encoderinfo["duration"] - continue - else: - bbox = None - im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) - - if len(im_frames) > 1: - for frame_data in im_frames: - im_frame = frame_data["im"] - if not frame_data["bbox"]: - # global header - for s in _get_global_header(im_frame, frame_data["encoderinfo"]): - fp.write(s) - offset = (0, 0) - else: - # compress difference - if not palette: - frame_data["encoderinfo"]["include_color_table"] = True - - im_frame = im_frame.crop(frame_data["bbox"]) - offset = frame_data["bbox"][:2] - _write_frame_data(fp, im_frame, offset, frame_data["encoderinfo"]) - return True - elif "duration" in im.encoderinfo and isinstance( - im.encoderinfo["duration"], (list, tuple) - ): - # Since multiple frames will not be written, add together the frame durations - im.encoderinfo["duration"] = sum(im.encoderinfo["duration"]) - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -def _save(im, fp, filename, save_all=False): - # header - if "palette" in im.encoderinfo or "palette" in im.info: - palette = im.encoderinfo.get("palette", im.info.get("palette")) - else: - palette = None - im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) - - if not save_all or not _write_multiple_frames(im, fp, palette): - _write_single_frame(im, fp, palette) - - fp.write(b";") # end of file - - if hasattr(fp, "flush"): - fp.flush() - - -def get_interlace(im): - interlace = im.encoderinfo.get("interlace", 1) - - # workaround for @PIL153 - if min(im.size) < 16: - interlace = 0 - - return interlace - - -def _write_local_header(fp, im, offset, flags): - transparent_color_exists = False - try: - if "transparency" in im.encoderinfo: - transparency = im.encoderinfo["transparency"] - else: - transparency = im.info["transparency"] - transparency = int(transparency) - except (KeyError, ValueError): - pass - else: - # optimize the block away if transparent color is not used - transparent_color_exists = True - - used_palette_colors = _get_optimize(im, im.encoderinfo) - if used_palette_colors is not None: - # adjust the transparency index after optimize - try: - transparency = used_palette_colors.index(transparency) - except ValueError: - transparent_color_exists = False - - if "duration" in im.encoderinfo: - duration = int(im.encoderinfo["duration"] / 10) - else: - duration = 0 - - disposal = int(im.encoderinfo.get("disposal", 0)) - - if transparent_color_exists or duration != 0 or disposal: - packed_flag = 1 if transparent_color_exists else 0 - packed_flag |= disposal << 2 - if not transparent_color_exists: - transparency = 0 - - fp.write( - b"!" - + o8(249) # extension intro - + o8(4) # length - + o8(packed_flag) # packed fields - + o16(duration) # duration - + o8(transparency) # transparency index - + o8(0) - ) - - include_color_table = im.encoderinfo.get("include_color_table") - if include_color_table: - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - if color_table_size: - flags = flags | 128 # local color table flag - flags = flags | color_table_size - - fp.write( - b"," - + o16(offset[0]) # offset - + o16(offset[1]) - + o16(im.size[0]) # size - + o16(im.size[1]) - + o8(flags) # flags - ) - if include_color_table and color_table_size: - fp.write(_get_header_palette(palette_bytes)) - fp.write(o8(8)) # bits - - -def _save_netpbm(im, fp, filename): - - # Unused by default. - # To use, uncomment the register_save call at the end of the file. - # - # If you need real GIF compression and/or RGB quantization, you - # can use the external NETPBM/PBMPLUS utilities. See comments - # below for information on how to enable this. - tempfile = im._dump() - - try: - with open(filename, "wb") as f: - if im.mode != "RGB": - subprocess.check_call( - ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL - ) - else: - # Pipe ppmquant output into ppmtogif - # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) - quant_cmd = ["ppmquant", "256", tempfile] - togif_cmd = ["ppmtogif"] - quant_proc = subprocess.Popen( - quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL - ) - togif_proc = subprocess.Popen( - togif_cmd, - stdin=quant_proc.stdout, - stdout=f, - stderr=subprocess.DEVNULL, - ) - - # Allow ppmquant to receive SIGPIPE if ppmtogif exits - quant_proc.stdout.close() - - retcode = quant_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, quant_cmd) - - retcode = togif_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, togif_cmd) - finally: - try: - os.unlink(tempfile) - except OSError: - pass - - -# Force optimization so that we can test performance against -# cases where it took lots of memory and time previously. -_FORCE_OPTIMIZE = False - - -def _get_optimize(im, info): - """ - Palette optimization is a potentially expensive operation. - - This function determines if the palette should be optimized using - some heuristics, then returns the list of palette entries in use. - - :param im: Image object - :param info: encoderinfo - :returns: list of indexes of palette entries in use, or None - """ - if im.mode in ("P", "L") and info and info.get("optimize", 0): - # Potentially expensive operation. - - # The palette saves 3 bytes per color not used, but palette - # lengths are restricted to 3*(2**N) bytes. Max saving would - # be 768 -> 6 bytes if we went all the way down to 2 colors. - # * If we're over 128 colors, we can't save any space. - # * If there aren't any holes, it's not worth collapsing. - # * If we have a 'large' image, the palette is in the noise. - - # create the new palette if not every color is used - optimise = _FORCE_OPTIMIZE or im.mode == "L" - if optimise or im.width * im.height < 512 * 512: - # check which colors are used - used_palette_colors = [] - for i, count in enumerate(im.histogram()): - if count: - used_palette_colors.append(i) - - if optimise or max(used_palette_colors) >= len(used_palette_colors): - return used_palette_colors - - num_palette_colors = len(im.palette.palette) // Image.getmodebands( - im.palette.mode - ) - current_palette_size = 1 << (num_palette_colors - 1).bit_length() - if ( - # check that the palette would become smaller when saved - len(used_palette_colors) <= current_palette_size // 2 - # check that the palette is not already the smallest possible size - and current_palette_size > 2 - ): - return used_palette_colors - - -def _get_color_table_size(palette_bytes): - # calculate the palette size for the header - if not palette_bytes: - return 0 - elif len(palette_bytes) < 9: - return 1 - else: - return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 - - -def _get_header_palette(palette_bytes): - """ - Returns the palette, null padded to the next power of 2 (*3) bytes - suitable for direct inclusion in the GIF header - - :param palette_bytes: Unpadded palette bytes, in RGBRGB form - :returns: Null padded palette - """ - color_table_size = _get_color_table_size(palette_bytes) - - # add the missing amount of bytes - # the palette has to be 2< 0: - palette_bytes += o8(0) * 3 * actual_target_size_diff - return palette_bytes - - -def _get_palette_bytes(im): - """ - Gets the palette for inclusion in the gif header - - :param im: Image object - :returns: Bytes, len<=768 suitable for inclusion in gif header - """ - return im.palette.palette - - -def _get_background(im, info_background): - background = 0 - if info_background: - background = info_background - if isinstance(background, tuple): - # WebPImagePlugin stores an RGBA value in info["background"] - # So it must be converted to the same format as GifImagePlugin's - # info["background"] - a global color table index - try: - background = im.palette.getcolor(background, im) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for the background color - return 0 - else: - raise - return background - - -def _get_global_header(im, info): - """Return a list of strings representing a GIF header""" - - # Header Block - # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp - - version = b"87a" - if im.info.get("version") == b"89a" or ( - info - and ( - "transparency" in info - or "loop" in info - or info.get("duration") - or info.get("comment") - ) - ): - version = b"89a" - - background = _get_background(im, info.get("background")) - - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - - header = [ - b"GIF" # signature - + version # version - + o16(im.size[0]) # canvas width - + o16(im.size[1]), # canvas height - # Logical Screen Descriptor - # size of global color table + global color table flag - o8(color_table_size + 128), # packed fields - # background + reserved/aspect - o8(background) + o8(0), - # Global Color Table - _get_header_palette(palette_bytes), - ] - if "loop" in info: - header.append( - b"!" - + o8(255) # extension intro - + o8(11) - + b"NETSCAPE2.0" - + o8(3) - + o8(1) - + o16(info["loop"]) # number of loops - + o8(0) - ) - if info.get("comment"): - comment_block = b"!" + o8(254) # extension intro - - comment = info["comment"] - if isinstance(comment, str): - comment = comment.encode() - for i in range(0, len(comment), 255): - subblock = comment[i : i + 255] - comment_block += o8(len(subblock)) + subblock - - comment_block += o8(0) - header.append(comment_block) - return header - - -def _write_frame_data(fp, im_frame, offset, params): - try: - im_frame.encoderinfo = params - - # local image header - _write_local_header(fp, im_frame, offset, 0) - - ImageFile._save( - im_frame, fp, [("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])] - ) - - fp.write(b"\0") # end of image data - finally: - del im_frame.encoderinfo - - -# -------------------------------------------------------------------- -# Legacy GIF utilities - - -def getheader(im, palette=None, info=None): - """ - Legacy Method to get Gif data from image. - - Warning:: May modify image data. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: tuple of(list of header items, optimized palette) - - """ - used_palette_colors = _get_optimize(im, info) - - if info is None: - info = {} - - if "background" not in info and "background" in im.info: - info["background"] = im.info["background"] - - im_mod = _normalize_palette(im, palette, info) - im.palette = im_mod.palette - im.im = im_mod.im - header = _get_global_header(im, info) - - return header, used_palette_colors - - -def getdata(im, offset=(0, 0), **params): - """ - Legacy Method - - Return a list of strings representing this image. - The first string is a local image header, the rest contains - encoded image data. - - To specify duration, add the time in milliseconds, - e.g. ``getdata(im_frame, duration=1000)`` - - :param im: Image object - :param offset: Tuple of (x, y) pixels. Defaults to (0, 0) - :param \\**params: e.g. duration or other encoder info parameters - :returns: List of bytes containing GIF encoded frame data - - """ - - class Collector: - data = [] - - def write(self, data): - self.data.append(data) - - im.load() # make sure raster data is available - - fp = Collector() - - _write_frame_data(fp, im, offset, params) - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GifImageFile.format, GifImageFile, _accept) -Image.register_save(GifImageFile.format, _save) -Image.register_save_all(GifImageFile.format, _save_all) -Image.register_extension(GifImageFile.format, ".gif") -Image.register_mime(GifImageFile.format, "image/gif") - -# -# Uncomment the following line if you wish to use NETPBM/PBMPLUS -# instead of the built-in "uncompressed" GIF encoder - -# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/waypoint_manager/manager_GUI/PIL/GimpGradientFile.py b/waypoint_manager/manager_GUI/PIL/GimpGradientFile.py deleted file mode 100644 index 7ab7f99..0000000 --- a/waypoint_manager/manager_GUI/PIL/GimpGradientFile.py +++ /dev/null @@ -1,140 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read (and render) GIMP gradient files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -""" -Stuff to translate curve segments to palette values (derived from -the corresponding code in GIMP, written by Federico Mena Quintero. -See the GIMP distribution for more information.) -""" - - -from math import log, pi, sin, sqrt - -from ._binary import o8 - -EPSILON = 1e-10 -"""""" # Enable auto-doc for data member - - -def linear(middle, pos): - if pos <= middle: - if middle < EPSILON: - return 0.0 - else: - return 0.5 * pos / middle - else: - pos = pos - middle - middle = 1.0 - middle - if middle < EPSILON: - return 1.0 - else: - return 0.5 + 0.5 * pos / middle - - -def curved(middle, pos): - return pos ** (log(0.5) / log(max(middle, EPSILON))) - - -def sine(middle, pos): - return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 - - -def sphere_increasing(middle, pos): - return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) - - -def sphere_decreasing(middle, pos): - return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) - - -SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] -"""""" # Enable auto-doc for data member - - -class GradientFile: - - gradient = None - - def getpalette(self, entries=256): - - palette = [] - - ix = 0 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - for i in range(entries): - - x = i / (entries - 1) - - while x1 < x: - ix += 1 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - w = x1 - x0 - - if w < EPSILON: - scale = segment(0.5, 0.5) - else: - scale = segment((xm - x0) / w, (x - x0) / w) - - # expand to RGBA - r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) - g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) - b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) - a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) - - # add to palette - palette.append(r + g + b + a) - - return b"".join(palette), "RGBA" - - -class GimpGradientFile(GradientFile): - """File handler for GIMP's gradient format.""" - - def __init__(self, fp): - - if fp.readline()[:13] != b"GIMP Gradient": - raise SyntaxError("not a GIMP gradient file") - - line = fp.readline() - - # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do - if line.startswith(b"Name: "): - line = fp.readline().strip() - - count = int(line) - - gradient = [] - - for i in range(count): - - s = fp.readline().split() - w = [float(x) for x in s[:11]] - - x0, x1 = w[0], w[2] - xm = w[1] - rgb0 = w[3:7] - rgb1 = w[7:11] - - segment = SEGMENTS[int(s[11])] - cspace = int(s[12]) - - if cspace != 0: - raise OSError("cannot handle HSV colour space") - - gradient.append((x0, x1, xm, rgb0, rgb1, segment)) - - self.gradient = gradient diff --git a/waypoint_manager/manager_GUI/PIL/GimpPaletteFile.py b/waypoint_manager/manager_GUI/PIL/GimpPaletteFile.py deleted file mode 100644 index 4d7cfba..0000000 --- a/waypoint_manager/manager_GUI/PIL/GimpPaletteFile.py +++ /dev/null @@ -1,56 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read GIMP palette files -# -# History: -# 1997-08-23 fl Created -# 2004-09-07 fl Support GIMP 2.0 palette files. -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1997-2004. -# -# See the README file for information on usage and redistribution. -# - -import re - -from ._binary import o8 - - -class GimpPaletteFile: - """File handler for GIMP's palette format.""" - - rawmode = "RGB" - - def __init__(self, fp): - - self.palette = [o8(i) * 3 for i in range(256)] - - if fp.readline()[:12] != b"GIMP Palette": - raise SyntaxError("not a GIMP palette file") - - for i in range(256): - - s = fp.readline() - if not s: - break - - # skip fields and comment lines - if re.match(rb"\w+:|#", s): - continue - if len(s) > 100: - raise SyntaxError("bad palette file") - - v = tuple(map(int, s.split()[:3])) - if len(v) != 3: - raise ValueError("bad palette entry") - - self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) - - self.palette = b"".join(self.palette) - - def getpalette(self): - - return self.palette, self.rawmode diff --git a/waypoint_manager/manager_GUI/PIL/GribStubImagePlugin.py b/waypoint_manager/manager_GUI/PIL/GribStubImagePlugin.py deleted file mode 100644 index 4575f82..0000000 --- a/waypoint_manager/manager_GUI/PIL/GribStubImagePlugin.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# GRIB stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific GRIB image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:4] == b"GRIB" and prefix[7] == 1 - - -class GribStubImageFile(ImageFile.StubImageFile): - - format = "GRIB" - format_description = "GRIB" - - def _open(self): - - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - raise SyntaxError("Not a GRIB file") - - self.fp.seek(offset) - - # make something up - self.mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("GRIB save handler not installed") - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) -Image.register_save(GribStubImageFile.format, _save) - -Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/waypoint_manager/manager_GUI/PIL/Hdf5StubImagePlugin.py b/waypoint_manager/manager_GUI/PIL/Hdf5StubImagePlugin.py deleted file mode 100644 index df11cf2..0000000 --- a/waypoint_manager/manager_GUI/PIL/Hdf5StubImagePlugin.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# HDF5 stub adapter -# -# Copyright (c) 2000-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific HDF5 image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:8] == b"\x89HDF\r\n\x1a\n" - - -class HDF5StubImageFile(ImageFile.StubImageFile): - - format = "HDF5" - format_description = "HDF5" - - def _open(self): - - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - raise SyntaxError("Not an HDF file") - - self.fp.seek(offset) - - # make something up - self.mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("HDF5 save handler not installed") - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) -Image.register_save(HDF5StubImageFile.format, _save) - -Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/waypoint_manager/manager_GUI/PIL/IcnsImagePlugin.py b/waypoint_manager/manager_GUI/PIL/IcnsImagePlugin.py deleted file mode 100644 index fa192f0..0000000 --- a/waypoint_manager/manager_GUI/PIL/IcnsImagePlugin.py +++ /dev/null @@ -1,392 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# macOS icns file decoder, based on icns.py by Bob Ippolito. -# -# history: -# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. -# 2020-04-04 Allow saving on all operating systems. -# -# Copyright (c) 2004 by Bob Ippolito. -# Copyright (c) 2004 by Secret Labs. -# Copyright (c) 2004 by Fredrik Lundh. -# Copyright (c) 2014 by Alastair Houghton. -# Copyright (c) 2020 by Pan Jing. -# -# See the README file for information on usage and redistribution. -# - -import io -import os -import struct -import sys - -from PIL import Image, ImageFile, PngImagePlugin, features - -enable_jpeg2k = features.check_codec("jpg_2000") -if enable_jpeg2k: - from PIL import Jpeg2KImagePlugin - -MAGIC = b"icns" -HEADERSIZE = 8 - - -def nextheader(fobj): - return struct.unpack(">4sI", fobj.read(HEADERSIZE)) - - -def read_32t(fobj, start_length, size): - # The 128x128 icon seems to have an extra header for some reason. - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(4) - if sig != b"\x00\x00\x00\x00": - raise SyntaxError("Unknown signature, expecting 0x00000000") - return read_32(fobj, (start + 4, length - 4), size) - - -def read_32(fobj, start_length, size): - """ - Read a 32bit RGB icon resource. Seems to be either uncompressed or - an RLE packbits-like scheme. - """ - (start, length) = start_length - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - if length == sizesq * 3: - # uncompressed ("RGBRGBGB") - indata = fobj.read(length) - im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) - else: - # decode image - im = Image.new("RGB", pixel_size, None) - for band_ix in range(3): - data = [] - bytesleft = sizesq - while bytesleft > 0: - byte = fobj.read(1) - if not byte: - break - byte = byte[0] - if byte & 0x80: - blocksize = byte - 125 - byte = fobj.read(1) - for i in range(blocksize): - data.append(byte) - else: - blocksize = byte + 1 - data.append(fobj.read(blocksize)) - bytesleft -= blocksize - if bytesleft <= 0: - break - if bytesleft != 0: - raise SyntaxError(f"Error reading channel [{repr(bytesleft)} left]") - band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) - im.im.putband(band.im, band_ix) - return {"RGB": im} - - -def read_mk(fobj, start_length, size): - # Alpha masks seem to be uncompressed - start = start_length[0] - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) - return {"A": band} - - -def read_png_or_jpeg2000(fobj, start_length, size): - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(12) - if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": - fobj.seek(start) - im = PngImagePlugin.PngImageFile(fobj) - Image._decompression_bomb_check(im.size) - return {"RGBA": im} - elif ( - sig[:4] == b"\xff\x4f\xff\x51" - or sig[:4] == b"\x0d\x0a\x87\x0a" - or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ): - if not enable_jpeg2k: - raise ValueError( - "Unsupported icon subimage format (rebuild PIL " - "with JPEG 2000 support to fix this)" - ) - # j2k, jpc or j2c - fobj.seek(start) - jp2kstream = fobj.read(length) - f = io.BytesIO(jp2kstream) - im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) - Image._decompression_bomb_check(im.size) - if im.mode != "RGBA": - im = im.convert("RGBA") - return {"RGBA": im} - else: - raise ValueError("Unsupported icon subimage format") - - -class IcnsFile: - - SIZES = { - (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], - (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], - (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], - (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], - (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], - (128, 128, 1): [ - (b"ic07", read_png_or_jpeg2000), - (b"it32", read_32t), - (b"t8mk", read_mk), - ], - (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], - (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], - (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], - (32, 32, 1): [ - (b"icp5", read_png_or_jpeg2000), - (b"il32", read_32), - (b"l8mk", read_mk), - ], - (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], - (16, 16, 1): [ - (b"icp4", read_png_or_jpeg2000), - (b"is32", read_32), - (b"s8mk", read_mk), - ], - } - - def __init__(self, fobj): - """ - fobj is a file-like object as an icns resource - """ - # signature : (start, length) - self.dct = dct = {} - self.fobj = fobj - sig, filesize = nextheader(fobj) - if not _accept(sig): - raise SyntaxError("not an icns file") - i = HEADERSIZE - while i < filesize: - sig, blocksize = nextheader(fobj) - if blocksize <= 0: - raise SyntaxError("invalid block header") - i += HEADERSIZE - blocksize -= HEADERSIZE - dct[sig] = (i, blocksize) - fobj.seek(blocksize, io.SEEK_CUR) - i += blocksize - - def itersizes(self): - sizes = [] - for size, fmts in self.SIZES.items(): - for (fmt, reader) in fmts: - if fmt in self.dct: - sizes.append(size) - break - return sizes - - def bestsize(self): - sizes = self.itersizes() - if not sizes: - raise SyntaxError("No 32bit icon resources found") - return max(sizes) - - def dataforsize(self, size): - """ - Get an icon resource as {channel: array}. Note that - the arrays are bottom-up like windows bitmaps and will likely - need to be flipped or transposed in some way. - """ - dct = {} - for code, reader in self.SIZES[size]: - desc = self.dct.get(code) - if desc is not None: - dct.update(reader(self.fobj, desc, size)) - return dct - - def getimage(self, size=None): - if size is None: - size = self.bestsize() - if len(size) == 2: - size = (size[0], size[1], 1) - channels = self.dataforsize(size) - - im = channels.get("RGBA", None) - if im: - return im - - im = channels.get("RGB").copy() - try: - im.putalpha(channels["A"]) - except KeyError: - pass - return im - - -## -# Image plugin for Mac OS icons. - - -class IcnsImageFile(ImageFile.ImageFile): - """ - PIL image support for Mac OS .icns files. - Chooses the best resolution, but will possibly load - a different size image if you mutate the size attribute - before calling 'load'. - - The info dictionary has a key 'sizes' that is a list - of sizes that the icns file has. - """ - - format = "ICNS" - format_description = "Mac OS icns resource" - - def _open(self): - self.icns = IcnsFile(self.fp) - self.mode = "RGBA" - self.info["sizes"] = self.icns.itersizes() - self.best_size = self.icns.bestsize() - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - info_size = value - if info_size not in self.info["sizes"] and len(info_size) == 2: - info_size = (info_size[0], info_size[1], 1) - if ( - info_size not in self.info["sizes"] - and len(info_size) == 3 - and info_size[2] == 1 - ): - simple_sizes = [ - (size[0] * size[2], size[1] * size[2]) for size in self.info["sizes"] - ] - if value in simple_sizes: - info_size = self.info["sizes"][simple_sizes.index(value)] - if info_size not in self.info["sizes"]: - raise ValueError("This is not one of the allowed sizes of this image") - self._size = value - - def load(self): - if len(self.size) == 3: - self.best_size = self.size - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - px = Image.Image.load(self) - if self.im is not None and self.im.size == self.size: - # Already loaded - return px - self.load_prepare() - # This is likely NOT the best way to do it, but whatever. - im = self.icns.getimage(self.best_size) - - # If this is a PNG or JPEG 2000, it won't be loaded yet - px = im.load() - - self.im = im.im - self.mode = im.mode - self.size = im.size - - return px - - -def _save(im, fp, filename): - """ - Saves the image as a series of PNG files, - that are then combined into a .icns file. - """ - if hasattr(fp, "flush"): - fp.flush() - - sizes = { - b"ic07": 128, - b"ic08": 256, - b"ic09": 512, - b"ic10": 1024, - b"ic11": 32, - b"ic12": 64, - b"ic13": 256, - b"ic14": 512, - } - provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} - size_streams = {} - for size in set(sizes.values()): - image = ( - provided_images[size] - if size in provided_images - else im.resize((size, size)) - ) - - temp = io.BytesIO() - image.save(temp, "png") - size_streams[size] = temp.getvalue() - - entries = [] - for type, size in sizes.items(): - stream = size_streams[size] - entries.append( - {"type": type, "size": HEADERSIZE + len(stream), "stream": stream} - ) - - # Header - fp.write(MAGIC) - file_length = HEADERSIZE # Header - file_length += HEADERSIZE + 8 * len(entries) # TOC - file_length += sum(entry["size"] for entry in entries) - fp.write(struct.pack(">i", file_length)) - - # TOC - fp.write(b"TOC ") - fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) - for entry in entries: - fp.write(entry["type"]) - fp.write(struct.pack(">i", entry["size"])) - - # Data - for entry in entries: - fp.write(entry["type"]) - fp.write(struct.pack(">i", entry["size"])) - fp.write(entry["stream"]) - - if hasattr(fp, "flush"): - fp.flush() - - -def _accept(prefix): - return prefix[:4] == MAGIC - - -Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) -Image.register_extension(IcnsImageFile.format, ".icns") - -Image.register_save(IcnsImageFile.format, _save) -Image.register_mime(IcnsImageFile.format, "image/icns") - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 IcnsImagePlugin.py [file]") - sys.exit() - - with open(sys.argv[1], "rb") as fp: - imf = IcnsImageFile(fp) - for size in imf.info["sizes"]: - imf.size = size - imf.save("out-%s-%s-%s.png" % size) - with Image.open(sys.argv[1]) as im: - im.save("out.png") - if sys.platform == "windows": - os.startfile("out.png") diff --git a/waypoint_manager/manager_GUI/PIL/IcoImagePlugin.py b/waypoint_manager/manager_GUI/PIL/IcoImagePlugin.py deleted file mode 100644 index 17b9855..0000000 --- a/waypoint_manager/manager_GUI/PIL/IcoImagePlugin.py +++ /dev/null @@ -1,355 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Icon support for PIL -# -# History: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis -# . -# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki -# -# Icon format references: -# * https://en.wikipedia.org/wiki/ICO_(file_format) -# * https://msdn.microsoft.com/en-us/library/ms997538.aspx - - -import warnings -from io import BytesIO -from math import ceil, log - -from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o16le as o16 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -_MAGIC = b"\0\0\1\0" - - -def _save(im, fp, filename): - fp.write(_MAGIC) # (2+2) - bmp = im.encoderinfo.get("bitmap_format") == "bmp" - sizes = im.encoderinfo.get( - "sizes", - [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], - ) - frames = [] - provided_ims = [im] + im.encoderinfo.get("append_images", []) - width, height = im.size - for size in sorted(set(sizes)): - if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: - continue - - for provided_im in provided_ims: - if provided_im.size != size: - continue - frames.append(provided_im) - if bmp: - bits = BmpImagePlugin.SAVE[provided_im.mode][1] - bits_used = [bits] - for other_im in provided_ims: - if other_im.size != size: - continue - bits = BmpImagePlugin.SAVE[other_im.mode][1] - if bits not in bits_used: - # Another image has been supplied for this size - # with a different bit depth - frames.append(other_im) - bits_used.append(bits) - break - else: - # TODO: invent a more convenient method for proportional scalings - frame = provided_im.copy() - frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) - frames.append(frame) - fp.write(o16(len(frames))) # idCount(2) - offset = fp.tell() + len(frames) * 16 - for frame in frames: - width, height = frame.size - # 0 means 256 - fp.write(o8(width if width < 256 else 0)) # bWidth(1) - fp.write(o8(height if height < 256 else 0)) # bHeight(1) - - bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) - fp.write(o8(colors)) # bColorCount(1) - fp.write(b"\0") # bReserved(1) - fp.write(b"\0\0") # wPlanes(2) - fp.write(o16(bits)) # wBitCount(2) - - image_io = BytesIO() - if bmp: - frame.save(image_io, "dib") - - if bits != 32: - and_mask = Image.new("1", size) - ImageFile._save( - and_mask, image_io, [("raw", (0, 0) + size, 0, ("1", 0, -1))] - ) - else: - frame.save(image_io, "png") - image_io.seek(0) - image_bytes = image_io.read() - if bmp: - image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] - bytes_len = len(image_bytes) - fp.write(o32(bytes_len)) # dwBytesInRes(4) - fp.write(o32(offset)) # dwImageOffset(4) - current = fp.tell() - fp.seek(offset) - fp.write(image_bytes) - offset = offset + bytes_len - fp.seek(current) - - -def _accept(prefix): - return prefix[:4] == _MAGIC - - -class IcoFile: - def __init__(self, buf): - """ - Parse image from file-like object containing ico file data - """ - - # check magic - s = buf.read(6) - if not _accept(s): - raise SyntaxError("not an ICO file") - - self.buf = buf - self.entry = [] - - # Number of items in file - self.nb_items = i16(s, 4) - - # Get headers for each item - for i in range(self.nb_items): - s = buf.read(16) - - icon_header = { - "width": s[0], - "height": s[1], - "nb_color": s[2], # No. of colors in image (0 if >=8bpp) - "reserved": s[3], - "planes": i16(s, 4), - "bpp": i16(s, 6), - "size": i32(s, 8), - "offset": i32(s, 12), - } - - # See Wikipedia - for j in ("width", "height"): - if not icon_header[j]: - icon_header[j] = 256 - - # See Wikipedia notes about color depth. - # We need this just to differ images with equal sizes - icon_header["color_depth"] = ( - icon_header["bpp"] - or ( - icon_header["nb_color"] != 0 - and ceil(log(icon_header["nb_color"], 2)) - ) - or 256 - ) - - icon_header["dim"] = (icon_header["width"], icon_header["height"]) - icon_header["square"] = icon_header["width"] * icon_header["height"] - - self.entry.append(icon_header) - - self.entry = sorted(self.entry, key=lambda x: x["color_depth"]) - # ICO images are usually squares - # self.entry = sorted(self.entry, key=lambda x: x['width']) - self.entry = sorted(self.entry, key=lambda x: x["square"]) - self.entry.reverse() - - def sizes(self): - """ - Get a list of all available icon sizes and color depths. - """ - return {(h["width"], h["height"]) for h in self.entry} - - def getentryindex(self, size, bpp=False): - for (i, h) in enumerate(self.entry): - if size == h["dim"] and (bpp is False or bpp == h["color_depth"]): - return i - return 0 - - def getimage(self, size, bpp=False): - """ - Get an image from the icon - """ - return self.frame(self.getentryindex(size, bpp)) - - def frame(self, idx): - """ - Get an image from frame idx - """ - - header = self.entry[idx] - - self.buf.seek(header["offset"]) - data = self.buf.read(8) - self.buf.seek(header["offset"]) - - if data[:8] == PngImagePlugin._MAGIC: - # png frame - im = PngImagePlugin.PngImageFile(self.buf) - Image._decompression_bomb_check(im.size) - else: - # XOR + AND mask bmp frame - im = BmpImagePlugin.DibImageFile(self.buf) - Image._decompression_bomb_check(im.size) - - # change tile dimension to only encompass XOR image - im._size = (im.size[0], int(im.size[1] / 2)) - d, e, o, a = im.tile[0] - im.tile[0] = d, (0, 0) + im.size, o, a - - # figure out where AND mask image starts - bpp = header["bpp"] - if 32 == bpp: - # 32-bit color depth icon image allows semitransparent areas - # PIL's DIB format ignores transparency bits, recover them. - # The DIB is packed in BGRX byte order where X is the alpha - # channel. - - # Back up to start of bmp data - self.buf.seek(o) - # extract every 4th byte (eg. 3,7,11,15,...) - alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] - - # convert to an 8bpp grayscale image - mask = Image.frombuffer( - "L", # 8bpp - im.size, # (w, h) - alpha_bytes, # source chars - "raw", # raw decoder - ("L", 0, -1), # 8bpp inverted, unpadded, reversed - ) - else: - # get AND image from end of bitmap - w = im.size[0] - if (w % 32) > 0: - # bitmap row data is aligned to word boundaries - w += 32 - (im.size[0] % 32) - - # the total mask data is - # padded row size * height / bits per char - - total_bytes = int((w * im.size[1]) / 8) - and_mask_offset = header["offset"] + header["size"] - total_bytes - - self.buf.seek(and_mask_offset) - mask_data = self.buf.read(total_bytes) - - # convert raw data to image - mask = Image.frombuffer( - "1", # 1 bpp - im.size, # (w, h) - mask_data, # source chars - "raw", # raw decoder - ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed - ) - - # now we have two images, im is XOR image and mask is AND image - - # apply mask image as alpha channel - im = im.convert("RGBA") - im.putalpha(mask) - - return im - - -## -# Image plugin for Windows Icon files. - - -class IcoImageFile(ImageFile.ImageFile): - """ - PIL read-only image support for Microsoft Windows .ico files. - - By default the largest resolution image in the file will be loaded. This - can be changed by altering the 'size' attribute before calling 'load'. - - The info dictionary has a key 'sizes' that is a list of the sizes available - in the icon file. - - Handles classic, XP and Vista icon formats. - - When saving, PNG compression is used. Support for this was only added in - Windows Vista. If you are unable to view the icon in Windows, convert the - image to "RGBA" mode before saving. - - This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis - . - https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki - """ - - format = "ICO" - format_description = "Windows Icon" - - def _open(self): - self.ico = IcoFile(self.fp) - self.info["sizes"] = self.ico.sizes() - self.size = self.ico.entry[0]["dim"] - self.load() - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - if value not in self.info["sizes"]: - raise ValueError("This is not one of the allowed sizes of this image") - self._size = value - - def load(self): - if self.im is not None and self.im.size == self.size: - # Already loaded - return Image.Image.load(self) - im = self.ico.getimage(self.size) - # if tile is PNG, it won't really be loaded yet - im.load() - self.im = im.im - self.mode = im.mode - if im.size != self.size: - warnings.warn("Image was not the expected size") - - index = self.ico.getentryindex(self.size) - sizes = list(self.info["sizes"]) - sizes[index] = im.size - self.info["sizes"] = set(sizes) - - self.size = im.size - - def load_seek(self): - # Flag the ImageFile.Parser so that it - # just does all the decode at the end. - pass - - -# -# -------------------------------------------------------------------- - - -Image.register_open(IcoImageFile.format, IcoImageFile, _accept) -Image.register_save(IcoImageFile.format, _save) -Image.register_extension(IcoImageFile.format, ".ico") - -Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/waypoint_manager/manager_GUI/PIL/ImImagePlugin.py b/waypoint_manager/manager_GUI/PIL/ImImagePlugin.py deleted file mode 100644 index 78ccfb9..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImImagePlugin.py +++ /dev/null @@ -1,367 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IFUNC IM file handling for PIL -# -# history: -# 1995-09-01 fl Created. -# 1997-01-03 fl Save palette images -# 1997-01-08 fl Added sequence support -# 1997-01-23 fl Added P and RGB save support -# 1997-05-31 fl Read floating point images -# 1997-06-22 fl Save floating point images -# 1997-08-27 fl Read and save 1-bit images -# 1998-06-25 fl Added support for RGB+LUT images -# 1998-07-02 fl Added support for YCC images -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 1998-12-29 fl Added I;16 support -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# 2003-09-26 fl Added LA/PA support -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -import os -import re - -from . import Image, ImageFile, ImagePalette - -# -------------------------------------------------------------------- -# Standard tags - -COMMENT = "Comment" -DATE = "Date" -EQUIPMENT = "Digitalization equipment" -FRAMES = "File size (no of images)" -LUT = "Lut" -NAME = "Name" -SCALE = "Scale (x,y)" -SIZE = "Image size (x*y)" -MODE = "Image type" - -TAGS = { - COMMENT: 0, - DATE: 0, - EQUIPMENT: 0, - FRAMES: 0, - LUT: 0, - NAME: 0, - SCALE: 0, - SIZE: 0, - MODE: 0, -} - -OPEN = { - # ifunc93/p3cfunc formats - "0 1 image": ("1", "1"), - "L 1 image": ("1", "1"), - "Greyscale image": ("L", "L"), - "Grayscale image": ("L", "L"), - "RGB image": ("RGB", "RGB;L"), - "RLB image": ("RGB", "RLB"), - "RYB image": ("RGB", "RLB"), - "B1 image": ("1", "1"), - "B2 image": ("P", "P;2"), - "B4 image": ("P", "P;4"), - "X 24 image": ("RGB", "RGB"), - "L 32 S image": ("I", "I;32"), - "L 32 F image": ("F", "F;32"), - # old p3cfunc formats - "RGB3 image": ("RGB", "RGB;T"), - "RYB3 image": ("RGB", "RYB;T"), - # extensions - "LA image": ("LA", "LA;L"), - "PA image": ("LA", "PA;L"), - "RGBA image": ("RGBA", "RGBA;L"), - "RGBX image": ("RGBX", "RGBX;L"), - "CMYK image": ("CMYK", "CMYK;L"), - "YCC image": ("YCbCr", "YCbCr;L"), -} - -# ifunc95 extensions -for i in ["8", "8S", "16", "16S", "32", "32F"]: - OPEN[f"L {i} image"] = ("F", f"F;{i}") - OPEN[f"L*{i} image"] = ("F", f"F;{i}") -for i in ["16", "16L", "16B"]: - OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") - OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") -for i in ["32S"]: - OPEN[f"L {i} image"] = ("I", f"I;{i}") - OPEN[f"L*{i} image"] = ("I", f"I;{i}") -for i in range(2, 33): - OPEN[f"L*{i} image"] = ("F", f"F;{i}") - - -# -------------------------------------------------------------------- -# Read IM directory - -split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") - - -def number(s): - try: - return int(s) - except ValueError: - return float(s) - - -## -# Image plugin for the IFUNC IM file format. - - -class ImImageFile(ImageFile.ImageFile): - - format = "IM" - format_description = "IFUNC Image Memory" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # Quick rejection: if there's not an LF among the first - # 100 bytes, this is (probably) not a text header. - - if b"\n" not in self.fp.read(100): - raise SyntaxError("not an IM file") - self.fp.seek(0) - - n = 0 - - # Default values - self.info[MODE] = "L" - self.info[SIZE] = (512, 512) - self.info[FRAMES] = 1 - - self.rawmode = "L" - - while True: - - s = self.fp.read(1) - - # Some versions of IFUNC uses \n\r instead of \r\n... - if s == b"\r": - continue - - if not s or s == b"\0" or s == b"\x1A": - break - - # FIXME: this may read whole file if not a text file - s = s + self.fp.readline() - - if len(s) > 100: - raise SyntaxError("not an IM file") - - if s[-2:] == b"\r\n": - s = s[:-2] - elif s[-1:] == b"\n": - s = s[:-1] - - try: - m = split.match(s) - except re.error as e: - raise SyntaxError("not an IM file") from e - - if m: - - k, v = m.group(1, 2) - - # Don't know if this is the correct encoding, - # but a decent guess (I guess) - k = k.decode("latin-1", "replace") - v = v.decode("latin-1", "replace") - - # Convert value as appropriate - if k in [FRAMES, SCALE, SIZE]: - v = v.replace("*", ",") - v = tuple(map(number, v.split(","))) - if len(v) == 1: - v = v[0] - elif k == MODE and v in OPEN: - v, self.rawmode = OPEN[v] - - # Add to dictionary. Note that COMMENT tags are - # combined into a list of strings. - if k == COMMENT: - if k in self.info: - self.info[k].append(v) - else: - self.info[k] = [v] - else: - self.info[k] = v - - if k in TAGS: - n += 1 - - else: - - raise SyntaxError( - "Syntax error in IM header: " + s.decode("ascii", "replace") - ) - - if not n: - raise SyntaxError("Not an IM file") - - # Basic attributes - self._size = self.info[SIZE] - self.mode = self.info[MODE] - - # Skip forward to start of image data - while s and s[:1] != b"\x1A": - s = self.fp.read(1) - if not s: - raise SyntaxError("File truncated") - - if LUT in self.info: - # convert lookup table to palette or lut attribute - palette = self.fp.read(768) - greyscale = 1 # greyscale palette - linear = 1 # linear greyscale palette - for i in range(256): - if palette[i] == palette[i + 256] == palette[i + 512]: - if palette[i] != i: - linear = 0 - else: - greyscale = 0 - if self.mode in ["L", "LA", "P", "PA"]: - if greyscale: - if not linear: - self.lut = list(palette[:256]) - else: - if self.mode in ["L", "P"]: - self.mode = self.rawmode = "P" - elif self.mode in ["LA", "PA"]: - self.mode = "PA" - self.rawmode = "PA;L" - self.palette = ImagePalette.raw("RGB;L", palette) - elif self.mode == "RGB": - if not greyscale or not linear: - self.lut = list(palette) - - self.frame = 0 - - self.__offset = offs = self.fp.tell() - - self._fp = self.fp # FIXME: hack - - if self.rawmode[:2] == "F;": - - # ifunc95 formats - try: - # use bit decoder (if necessary) - bits = int(self.rawmode[2:]) - if bits not in [8, 16, 32]: - self.tile = [("bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1))] - return - except ValueError: - pass - - if self.rawmode in ["RGB;T", "RYB;T"]: - # Old LabEye/3PC files. Would be very surprised if anyone - # ever stumbled upon such a file ;-) - size = self.size[0] * self.size[1] - self.tile = [ - ("raw", (0, 0) + self.size, offs, ("G", 0, -1)), - ("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), - ("raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1)), - ] - else: - # LabEye/IFUNC files - self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] - - @property - def n_frames(self): - return self.info[FRAMES] - - @property - def is_animated(self): - return self.info[FRAMES] > 1 - - def seek(self, frame): - if not self._seek_check(frame): - return - - self.frame = frame - - if self.mode == "1": - bits = 1 - else: - bits = 8 * len(self.mode) - - size = ((self.size[0] * bits + 7) // 8) * self.size[1] - offs = self.__offset + frame * size - - self.fp = self._fp - - self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] - - def tell(self): - return self.frame - - -# -# -------------------------------------------------------------------- -# Save IM files - - -SAVE = { - # mode: (im type, raw mode) - "1": ("0 1", "1"), - "L": ("Greyscale", "L"), - "LA": ("LA", "LA;L"), - "P": ("Greyscale", "P"), - "PA": ("LA", "PA;L"), - "I": ("L 32S", "I;32S"), - "I;16": ("L 16", "I;16"), - "I;16L": ("L 16L", "I;16L"), - "I;16B": ("L 16B", "I;16B"), - "F": ("L 32F", "F;32F"), - "RGB": ("RGB", "RGB;L"), - "RGBA": ("RGBA", "RGBA;L"), - "RGBX": ("RGBX", "RGBX;L"), - "CMYK": ("CMYK", "CMYK;L"), - "YCbCr": ("YCC", "YCbCr;L"), -} - - -def _save(im, fp, filename): - - try: - image_type, rawmode = SAVE[im.mode] - except KeyError as e: - raise ValueError(f"Cannot save {im.mode} images as IM") from e - - frames = im.encoderinfo.get("frames", 1) - - fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) - if filename: - # Each line must be 100 characters or less, - # or: SyntaxError("not an IM file") - # 8 characters are used for "Name: " and "\r\n" - # Keep just the filename, ditch the potentially overlong path - name, ext = os.path.splitext(os.path.basename(filename)) - name = "".join([name[: 92 - len(ext)], ext]) - - fp.write(f"Name: {name}\r\n".encode("ascii")) - fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode("ascii")) - fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) - if im.mode in ["P", "PA"]: - fp.write(b"Lut: 1\r\n") - fp.write(b"\000" * (511 - fp.tell()) + b"\032") - if im.mode in ["P", "PA"]: - fp.write(im.im.getpalette("RGB", "RGB;L")) # 768 bytes - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))]) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(ImImageFile.format, ImImageFile) -Image.register_save(ImImageFile.format, _save) - -Image.register_extension(ImImageFile.format, ".im") diff --git a/waypoint_manager/manager_GUI/PIL/Image.py b/waypoint_manager/manager_GUI/PIL/Image.py deleted file mode 100644 index 8d1b3e9..0000000 --- a/waypoint_manager/manager_GUI/PIL/Image.py +++ /dev/null @@ -1,3721 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# the Image class wrapper -# -# partial release history: -# 1995-09-09 fl Created -# 1996-03-11 fl PIL release 0.0 (proof of concept) -# 1996-04-30 fl PIL release 0.1b1 -# 1999-07-28 fl PIL release 1.0 final -# 2000-06-07 fl PIL release 1.1 -# 2000-10-20 fl PIL release 1.1.1 -# 2001-05-07 fl PIL release 1.1.2 -# 2002-03-15 fl PIL release 1.1.3 -# 2003-05-10 fl PIL release 1.1.4 -# 2005-03-28 fl PIL release 1.1.5 -# 2006-12-02 fl PIL release 1.1.6 -# 2009-11-15 fl PIL release 1.1.7 -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import atexit -import builtins -import io -import logging -import math -import os -import re -import struct -import sys -import tempfile -import warnings -from collections.abc import Callable, MutableMapping -from enum import IntEnum -from pathlib import Path - -try: - import defusedxml.ElementTree as ElementTree -except ImportError: - ElementTree = None - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -from . import ImageMode, TiffTags, UnidentifiedImageError, __version__, _plugins -from ._binary import i32le, o32be, o32le -from ._deprecate import deprecate -from ._util import DeferredError, is_path - - -def __getattr__(name): - categories = {"NORMAL": 0, "SEQUENCE": 1, "CONTAINER": 2} - if name in categories: - deprecate("Image categories", 10, "is_animated", plural=True) - return categories[name] - elif name in ("NEAREST", "NONE"): - deprecate(name, 10, "Resampling.NEAREST or Dither.NONE") - return 0 - old_resampling = { - "LINEAR": "BILINEAR", - "CUBIC": "BICUBIC", - "ANTIALIAS": "LANCZOS", - } - if name in old_resampling: - deprecate(name, 10, f"Resampling.{old_resampling[name]}") - return Resampling[old_resampling[name]] - for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): - if name in enum.__members__: - deprecate(name, 10, f"{enum.__name__}.{name}") - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -logger = logging.getLogger(__name__) - - -class DecompressionBombWarning(RuntimeWarning): - pass - - -class DecompressionBombError(Exception): - pass - - -# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image -MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 // 4 // 3) - - -try: - # If the _imaging C module is not present, Pillow will not load. - # Note that other modules should not refer to _imaging directly; - # import Image and use the Image.core variable instead. - # Also note that Image.core is not a publicly documented interface, - # and should be considered private and subject to change. - from . import _imaging as core - - if __version__ != getattr(core, "PILLOW_VERSION", None): - raise ImportError( - "The _imaging extension was built for another version of Pillow or PIL:\n" - f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" - f"Pillow version: {__version__}" - ) - -except ImportError as v: - core = DeferredError(ImportError("The _imaging C module is not installed.")) - # Explanations for ways that we know we might have an import error - if str(v).startswith("Module use of python"): - # The _imaging C module is present, but not compiled for - # the right version (windows only). Print a warning, if - # possible. - warnings.warn( - "The _imaging extension was built for another version of Python.", - RuntimeWarning, - ) - elif str(v).startswith("The _imaging extension"): - warnings.warn(str(v), RuntimeWarning) - # Fail here anyway. Don't let people run with a mostly broken Pillow. - # see docs/porting.rst - raise - - -# works everywhere, win for pypy, not cpython -USE_CFFI_ACCESS = hasattr(sys, "pypy_version_info") -try: - import cffi -except ImportError: - cffi = None - - -def isImageType(t): - """ - Checks if an object is an image object. - - .. warning:: - - This function is for internal use only. - - :param t: object to check if it's an image - :returns: True if the object is an image - """ - return hasattr(t, "im") - - -# -# Constants - -# transpose -class Transpose(IntEnum): - FLIP_LEFT_RIGHT = 0 - FLIP_TOP_BOTTOM = 1 - ROTATE_90 = 2 - ROTATE_180 = 3 - ROTATE_270 = 4 - TRANSPOSE = 5 - TRANSVERSE = 6 - - -# transforms (also defined in Imaging.h) -class Transform(IntEnum): - AFFINE = 0 - EXTENT = 1 - PERSPECTIVE = 2 - QUAD = 3 - MESH = 4 - - -# resampling filters (also defined in Imaging.h) -class Resampling(IntEnum): - NEAREST = 0 - BOX = 4 - BILINEAR = 2 - HAMMING = 5 - BICUBIC = 3 - LANCZOS = 1 - - -_filters_support = { - Resampling.BOX: 0.5, - Resampling.BILINEAR: 1.0, - Resampling.HAMMING: 1.0, - Resampling.BICUBIC: 2.0, - Resampling.LANCZOS: 3.0, -} - - -# dithers -class Dither(IntEnum): - NONE = 0 - ORDERED = 1 # Not yet implemented - RASTERIZE = 2 # Not yet implemented - FLOYDSTEINBERG = 3 # default - - -# palettes/quantizers -class Palette(IntEnum): - WEB = 0 - ADAPTIVE = 1 - - -class Quantize(IntEnum): - MEDIANCUT = 0 - MAXCOVERAGE = 1 - FASTOCTREE = 2 - LIBIMAGEQUANT = 3 - - -if hasattr(core, "DEFAULT_STRATEGY"): - DEFAULT_STRATEGY = core.DEFAULT_STRATEGY - FILTERED = core.FILTERED - HUFFMAN_ONLY = core.HUFFMAN_ONLY - RLE = core.RLE - FIXED = core.FIXED - - -# -------------------------------------------------------------------- -# Registries - -ID = [] -OPEN = {} -MIME = {} -SAVE = {} -SAVE_ALL = {} -EXTENSION = {} -DECODERS = {} -ENCODERS = {} - -# -------------------------------------------------------------------- -# Modes - -_ENDIAN = "<" if sys.byteorder == "little" else ">" - - -def _conv_type_shape(im): - m = ImageMode.getmode(im.mode) - shape = (im.height, im.width) - extra = len(m.bands) - if extra != 1: - shape += (extra,) - return shape, m.typestr - - -MODES = ["1", "CMYK", "F", "HSV", "I", "L", "LAB", "P", "RGB", "RGBA", "RGBX", "YCbCr"] - -# raw modes that may be memory mapped. NOTE: if you change this, you -# may have to modify the stride calculation in map.c too! -_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") - - -def getmodebase(mode): - """ - Gets the "base" mode for given mode. This function returns "L" for - images that contain grayscale data, and "RGB" for images that - contain color data. - - :param mode: Input mode. - :returns: "L" or "RGB". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basemode - - -def getmodetype(mode): - """ - Gets the storage type mode. Given a mode, this function returns a - single-layer mode suitable for storing individual bands. - - :param mode: Input mode. - :returns: "L", "I", or "F". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basetype - - -def getmodebandnames(mode): - """ - Gets a list of individual band names. Given a mode, this function returns - a tuple containing the names of individual bands (use - :py:method:`~PIL.Image.getmodetype` to get the mode used to store each - individual band. - - :param mode: Input mode. - :returns: A tuple containing band names. The length of the tuple - gives the number of bands in an image of the given mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).bands - - -def getmodebands(mode): - """ - Gets the number of individual bands for this mode. - - :param mode: Input mode. - :returns: The number of bands in this mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return len(ImageMode.getmode(mode).bands) - - -# -------------------------------------------------------------------- -# Helpers - -_initialized = 0 - - -def preinit(): - """Explicitly load standard file format drivers.""" - - global _initialized - if _initialized >= 1: - return - - try: - from . import BmpImagePlugin - - assert BmpImagePlugin - except ImportError: - pass - try: - from . import GifImagePlugin - - assert GifImagePlugin - except ImportError: - pass - try: - from . import JpegImagePlugin - - assert JpegImagePlugin - except ImportError: - pass - try: - from . import PpmImagePlugin - - assert PpmImagePlugin - except ImportError: - pass - try: - from . import PngImagePlugin - - assert PngImagePlugin - except ImportError: - pass - # try: - # import TiffImagePlugin - # assert TiffImagePlugin - # except ImportError: - # pass - - _initialized = 1 - - -def init(): - """ - Explicitly initializes the Python Imaging Library. This function - loads all available file format drivers. - """ - - global _initialized - if _initialized >= 2: - return 0 - - for plugin in _plugins: - try: - logger.debug("Importing %s", plugin) - __import__(f"PIL.{plugin}", globals(), locals(), []) - except ImportError as e: - logger.debug("Image: failed to import %s: %s", plugin, e) - - if OPEN or SAVE: - _initialized = 2 - return 1 - - -# -------------------------------------------------------------------- -# Codec factories (used by tobytes/frombytes and ImageFile.load) - - -def _getdecoder(mode, decoder_name, args, extra=()): - - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - decoder = DECODERS[decoder_name] - except KeyError: - pass - else: - return decoder(mode, *args + extra) - - try: - # get decoder - decoder = getattr(core, decoder_name + "_decoder") - except AttributeError as e: - raise OSError(f"decoder {decoder_name} not available") from e - return decoder(mode, *args + extra) - - -def _getencoder(mode, encoder_name, args, extra=()): - - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - encoder = ENCODERS[encoder_name] - except KeyError: - pass - else: - return encoder(mode, *args + extra) - - try: - # get encoder - encoder = getattr(core, encoder_name + "_encoder") - except AttributeError as e: - raise OSError(f"encoder {encoder_name} not available") from e - return encoder(mode, *args + extra) - - -# -------------------------------------------------------------------- -# Simple expression analyzer - - -def coerce_e(value): - deprecate("coerce_e", 10) - return value if isinstance(value, _E) else _E(1, value) - - -# _E(scale, offset) represents the affine transformation scale * x + offset. -# The "data" field is named for compatibility with the old implementation, -# and should be renamed once coerce_e is removed. -class _E: - def __init__(self, scale, data): - self.scale = scale - self.data = data - - def __neg__(self): - return _E(-self.scale, -self.data) - - def __add__(self, other): - if isinstance(other, _E): - return _E(self.scale + other.scale, self.data + other.data) - return _E(self.scale, self.data + other) - - __radd__ = __add__ - - def __sub__(self, other): - return self + -other - - def __rsub__(self, other): - return other + -self - - def __mul__(self, other): - if isinstance(other, _E): - return NotImplemented - return _E(self.scale * other, self.data * other) - - __rmul__ = __mul__ - - def __truediv__(self, other): - if isinstance(other, _E): - return NotImplemented - return _E(self.scale / other, self.data / other) - - -def _getscaleoffset(expr): - a = expr(_E(1, 0)) - return (a.scale, a.data) if isinstance(a, _E) else (0, a) - - -# -------------------------------------------------------------------- -# Implementation wrapper - - -class Image: - """ - This class represents an image object. To create - :py:class:`~PIL.Image.Image` objects, use the appropriate factory - functions. There's hardly ever any reason to call the Image constructor - directly. - - * :py:func:`~PIL.Image.open` - * :py:func:`~PIL.Image.new` - * :py:func:`~PIL.Image.frombytes` - """ - - format = None - format_description = None - _close_exclusive_fp_after_loading = True - - def __init__(self): - # FIXME: take "new" parameters / other image? - # FIXME: turn mode and size into delegating properties? - self.im = None - self.mode = "" - self._size = (0, 0) - self.palette = None - self.info = {} - self._category = 0 - self.readonly = 0 - self.pyaccess = None - self._exif = None - - def __getattr__(self, name): - if name == "category": - deprecate("Image categories", 10, "is_animated", plural=True) - return self._category - raise AttributeError(name) - - @property - def width(self): - return self.size[0] - - @property - def height(self): - return self.size[1] - - @property - def size(self): - return self._size - - def _new(self, im): - new = Image() - new.im = im - new.mode = im.mode - new._size = im.size - if im.mode in ("P", "PA"): - if self.palette: - new.palette = self.palette.copy() - else: - from . import ImagePalette - - new.palette = ImagePalette.ImagePalette() - new.info = self.info.copy() - return new - - # Context manager support - def __enter__(self): - return self - - def __exit__(self, *args): - if hasattr(self, "fp") and getattr(self, "_exclusive_fp", False): - if getattr(self, "_fp", False): - if self._fp != self.fp: - self._fp.close() - self._fp = DeferredError(ValueError("Operation on closed image")) - if self.fp: - self.fp.close() - self.fp = None - - def close(self): - """ - Closes the file pointer, if possible. - - This operation will destroy the image core and release its memory. - The image data will be unusable afterward. - - This function is required to close images that have multiple frames or - have not had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for - more information. - """ - try: - if getattr(self, "_fp", False): - if self._fp != self.fp: - self._fp.close() - self._fp = DeferredError(ValueError("Operation on closed image")) - if self.fp: - self.fp.close() - self.fp = None - except Exception as msg: - logger.debug("Error closing: %s", msg) - - if getattr(self, "map", None): - self.map = None - - # Instead of simply setting to None, we're setting up a - # deferred error that will better explain that the core image - # object is gone. - self.im = DeferredError(ValueError("Operation on closed image")) - - def _copy(self): - self.load() - self.im = self.im.copy() - self.pyaccess = None - self.readonly = 0 - - def _ensure_mutable(self): - if self.readonly: - self._copy() - else: - self.load() - - def _dump(self, file=None, format=None, **options): - suffix = "" - if format: - suffix = "." + format - - if not file: - f, filename = tempfile.mkstemp(suffix) - os.close(f) - else: - filename = file - if not filename.endswith(suffix): - filename = filename + suffix - - self.load() - - if not format or format == "PPM": - self.im.save_ppm(filename) - else: - self.save(filename, format, **options) - - return filename - - def __eq__(self, other): - return ( - self.__class__ is other.__class__ - and self.mode == other.mode - and self.size == other.size - and self.info == other.info - and self._category == other._category - and self.getpalette() == other.getpalette() - and self.tobytes() == other.tobytes() - ) - - def __repr__(self): - return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - id(self), - ) - - def _repr_pretty_(self, p, cycle): - """IPython plain text display support""" - - # Same as __repr__ but without unpredicatable id(self), - # to keep Jupyter notebook `text/plain` output stable. - p.text( - "<%s.%s image mode=%s size=%dx%d>" - % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - ) - ) - - def _repr_png_(self): - """iPython display hook support - - :returns: png version of the image as bytes - """ - b = io.BytesIO() - try: - self.save(b, "PNG") - except Exception as e: - raise ValueError("Could not save to PNG for display") from e - return b.getvalue() - - @property - def __array_interface__(self): - # numpy array interface support - new = {} - shape, typestr = _conv_type_shape(self) - new["shape"] = shape - new["typestr"] = typestr - new["version"] = 3 - if self.mode == "1": - # Binary images need to be extended from bits to bytes - # See: https://github.com/python-pillow/Pillow/issues/350 - new["data"] = self.tobytes("raw", "L") - else: - new["data"] = self.tobytes() - return new - - def __getstate__(self): - return [self.info, self.mode, self.size, self.getpalette(), self.tobytes()] - - def __setstate__(self, state): - Image.__init__(self) - self.tile = [] - info, mode, size, palette, data = state - self.info = info - self.mode = mode - self._size = size - self.im = core.new(mode, size) - if mode in ("L", "LA", "P", "PA") and palette: - self.putpalette(palette) - self.frombytes(data) - - def tobytes(self, encoder_name="raw", *args): - """ - Return image as a bytes object. - - .. warning:: - - This method returns the raw image data from the internal - storage. For compressed image data (e.g. PNG, JPEG) use - :meth:`~.save`, with a BytesIO parameter for in-memory - data. - - :param encoder_name: What encoder to use. The default is to - use the standard "raw" encoder. - :param args: Extra arguments to the encoder. - :returns: A :py:class:`bytes` object. - """ - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if encoder_name == "raw" and args == (): - args = self.mode - - self.load() - - if self.width == 0 or self.height == 0: - return b"" - - # unpack data - e = _getencoder(self.mode, encoder_name, args) - e.setimage(self.im) - - bufsize = max(65536, self.size[0] * 4) # see RawEncode.c - - data = [] - while True: - l, s, d = e.encode(bufsize) - data.append(d) - if s: - break - if s < 0: - raise RuntimeError(f"encoder error {s} in tobytes") - - return b"".join(data) - - def tobitmap(self, name="image"): - """ - Returns the image converted to an X11 bitmap. - - .. note:: This method only works for mode "1" images. - - :param name: The name prefix to use for the bitmap variables. - :returns: A string containing an X11 bitmap. - :raises ValueError: If the mode is not "1" - """ - - self.load() - if self.mode != "1": - raise ValueError("not a bitmap") - data = self.tobytes("xbm") - return b"".join( - [ - f"#define {name}_width {self.size[0]}\n".encode("ascii"), - f"#define {name}_height {self.size[1]}\n".encode("ascii"), - f"static char {name}_bits[] = {{\n".encode("ascii"), - data, - b"};", - ] - ) - - def frombytes(self, data, decoder_name="raw", *args): - """ - Loads this image with pixel data from a bytes object. - - This method is similar to the :py:func:`~PIL.Image.frombytes` function, - but loads data into this image instead of creating a new image object. - """ - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - # default format - if decoder_name == "raw" and args == (): - args = self.mode - - # unpack data - d = _getdecoder(self.mode, decoder_name, args) - d.setimage(self.im) - s = d.decode(data) - - if s[0] >= 0: - raise ValueError("not enough image data") - if s[1] != 0: - raise ValueError("cannot decode image data") - - def load(self): - """ - Allocates storage for the image and loads the pixel data. In - normal cases, you don't need to call this method, since the - Image class automatically loads an opened image when it is - accessed for the first time. - - If the file associated with the image was opened by Pillow, then this - method will close it. The exception to this is if the image has - multiple frames, in which case the file will be left open for seek - operations. See :ref:`file-handling` for more information. - - :returns: An image access object. - :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` - """ - if self.im is not None and self.palette and self.palette.dirty: - # realize palette - mode, arr = self.palette.getdata() - self.im.putpalette(mode, arr) - self.palette.dirty = 0 - self.palette.rawmode = None - if "transparency" in self.info and mode in ("LA", "PA"): - if isinstance(self.info["transparency"], int): - self.im.putpalettealpha(self.info["transparency"], 0) - else: - self.im.putpalettealphas(self.info["transparency"]) - self.palette.mode = "RGBA" - else: - palette_mode = "RGBA" if mode.startswith("RGBA") else "RGB" - self.palette.mode = palette_mode - self.palette.palette = self.im.getpalette(palette_mode, palette_mode) - - if self.im is not None: - if cffi and USE_CFFI_ACCESS: - if self.pyaccess: - return self.pyaccess - from . import PyAccess - - self.pyaccess = PyAccess.new(self, self.readonly) - if self.pyaccess: - return self.pyaccess - return self.im.pixel_access(self.readonly) - - def verify(self): - """ - Verifies the contents of a file. For data read from a file, this - method attempts to determine if the file is broken, without - actually decoding the image data. If this method finds any - problems, it raises suitable exceptions. If you need to load - the image after using this method, you must reopen the image - file. - """ - pass - - def convert( - self, mode=None, matrix=None, dither=None, palette=Palette.WEB, colors=256 - ): - """ - Returns a converted copy of this image. For the "P" mode, this - method translates pixels through the palette. If mode is - omitted, a mode is chosen so that all information in the image - and the palette can be represented without a palette. - - The current version supports all possible conversions between - "L", "RGB" and "CMYK." The ``matrix`` argument only supports "L" - and "RGB". - - When translating a color image to greyscale (mode "L"), - the library uses the ITU-R 601-2 luma transform:: - - L = R * 299/1000 + G * 587/1000 + B * 114/1000 - - The default method of converting a greyscale ("L") or "RGB" - image into a bilevel (mode "1") image uses Floyd-Steinberg - dither to approximate the original image luminosity levels. If - dither is ``None``, all values larger than 127 are set to 255 (white), - all other values to 0 (black). To use other thresholds, use the - :py:meth:`~PIL.Image.Image.point` method. - - When converting from "RGBA" to "P" without a ``matrix`` argument, - this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, - and ``dither`` and ``palette`` are ignored. - - :param mode: The requested mode. See: :ref:`concept-modes`. - :param matrix: An optional conversion matrix. If given, this - should be 4- or 12-tuple containing floating point values. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). Note that this is not used when ``matrix`` is supplied. - :param palette: Palette to use when converting from mode "RGB" - to "P". Available palettes are :data:`Palette.WEB` or - :data:`Palette.ADAPTIVE`. - :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` - palette. Defaults to 256. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - has_transparency = self.info.get("transparency") is not None - if not mode and self.mode == "P": - # determine default mode - if self.palette: - mode = self.palette.mode - else: - mode = "RGB" - if mode == "RGB" and has_transparency: - mode = "RGBA" - if not mode or (mode == self.mode and not matrix): - return self.copy() - - if matrix: - # matrix conversion - if mode not in ("L", "RGB"): - raise ValueError("illegal conversion") - im = self.im.convert_matrix(mode, matrix) - new = self._new(im) - if has_transparency and self.im.bands == 3: - transparency = new.info["transparency"] - - def convert_transparency(m, v): - v = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 - return max(0, min(255, int(v))) - - if mode == "L": - transparency = convert_transparency(matrix, transparency) - elif len(mode) == 3: - transparency = tuple( - convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) - for i in range(0, len(transparency)) - ) - new.info["transparency"] = transparency - return new - - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) - - trns = None - delete_trns = False - # transparency handling - if has_transparency: - if (self.mode in ("1", "L", "I") and mode in ("LA", "RGBA")) or ( - self.mode == "RGB" and mode == "RGBA" - ): - # Use transparent conversion to promote from transparent - # color to an alpha channel. - new_im = self._new( - self.im.convert_transparent(mode, self.info["transparency"]) - ) - del new_im.info["transparency"] - return new_im - elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): - t = self.info["transparency"] - if isinstance(t, bytes): - # Dragons. This can't be represented by a single color - warnings.warn( - "Palette images with Transparency expressed in bytes should be " - "converted to RGBA images" - ) - delete_trns = True - else: - # get the new transparency color. - # use existing conversions - trns_im = Image()._new(core.new(self.mode, (1, 1))) - if self.mode == "P": - trns_im.putpalette(self.palette) - if isinstance(t, tuple): - err = "Couldn't allocate a palette color for transparency" - try: - t = trns_im.palette.getcolor(t, self) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - t = None - else: - raise ValueError(err) from e - if t is None: - trns = None - else: - trns_im.putpixel((0, 0), t) - - if mode in ("L", "RGB"): - trns_im = trns_im.convert(mode) - else: - # can't just retrieve the palette number, got to do it - # after quantization. - trns_im = trns_im.convert("RGB") - trns = trns_im.getpixel((0, 0)) - - elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): - t = self.info["transparency"] - delete_trns = True - - if isinstance(t, bytes): - self.im.putpalettealphas(t) - elif isinstance(t, int): - self.im.putpalettealpha(t, 0) - else: - raise ValueError("Transparency for P mode should be bytes or int") - - if mode == "P" and palette == Palette.ADAPTIVE: - im = self.im.quantize(colors) - new = self._new(im) - from . import ImagePalette - - new.palette = ImagePalette.ImagePalette("RGB", new.im.getpalette("RGB")) - if delete_trns: - # This could possibly happen if we requantize to fewer colors. - # The transparency would be totally off in that case. - del new.info["transparency"] - if trns is not None: - try: - new.info["transparency"] = new.palette.getcolor(trns, new) - except Exception: - # if we can't make a transparent color, don't leave the old - # transparency hanging around to mess us up. - del new.info["transparency"] - warnings.warn("Couldn't allocate palette entry for transparency") - return new - - # colorspace conversion - if dither is None: - dither = Dither.FLOYDSTEINBERG - - try: - im = self.im.convert(mode, dither) - except ValueError: - try: - # normalize source image and try again - im = self.im.convert(getmodebase(self.mode)) - im = im.convert(mode, dither) - except KeyError as e: - raise ValueError("illegal conversion") from e - - new_im = self._new(im) - if mode == "P" and palette != Palette.ADAPTIVE: - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette("RGB", list(range(256)) * 3) - if delete_trns: - # crash fail if we leave a bytes transparency in an rgb/l mode. - del new_im.info["transparency"] - if trns is not None: - if new_im.mode == "P": - try: - new_im.info["transparency"] = new_im.palette.getcolor(trns, new_im) - except ValueError as e: - del new_im.info["transparency"] - if str(e) != "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - warnings.warn( - "Couldn't allocate palette entry for transparency" - ) - else: - new_im.info["transparency"] = trns - return new_im - - def quantize( - self, - colors=256, - method=None, - kmeans=0, - palette=None, - dither=Dither.FLOYDSTEINBERG, - ): - """ - Convert the image to 'P' mode with the specified number - of colors. - - :param colors: The desired number of colors, <= 256 - :param method: :data:`Quantize.MEDIANCUT` (median cut), - :data:`Quantize.MAXCOVERAGE` (maximum coverage), - :data:`Quantize.FASTOCTREE` (fast octree), - :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support - using :py:func:`PIL.features.check_feature` with - ``feature="libimagequant"``). - - By default, :data:`Quantize.MEDIANCUT` will be used. - - The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` - and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so - :data:`Quantize.FASTOCTREE` is used by default instead. - :param kmeans: Integer - :param palette: Quantize to the palette of given - :py:class:`PIL.Image.Image`. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). - :returns: A new image - - """ - - self.load() - - if method is None: - # defaults: - method = Quantize.MEDIANCUT - if self.mode == "RGBA": - method = Quantize.FASTOCTREE - - if self.mode == "RGBA" and method not in ( - Quantize.FASTOCTREE, - Quantize.LIBIMAGEQUANT, - ): - # Caller specified an invalid mode. - raise ValueError( - "Fast Octree (method == 2) and libimagequant (method == 3) " - "are the only valid methods for quantizing RGBA images" - ) - - if palette: - # use palette from reference image - palette.load() - if palette.mode != "P": - raise ValueError("bad mode for palette image") - if self.mode != "RGB" and self.mode != "L": - raise ValueError( - "only RGB or L mode images can be quantized to a palette" - ) - im = self.im.convert("P", dither, palette.im) - new_im = self._new(im) - new_im.palette = palette.palette.copy() - return new_im - - im = self._new(self.im.quantize(colors, method, kmeans)) - - from . import ImagePalette - - mode = im.im.getpalettemode() - palette = im.im.getpalette(mode, mode)[: colors * len(mode)] - im.palette = ImagePalette.ImagePalette(mode, palette) - - return im - - def copy(self): - """ - Copies this image. Use this method if you wish to paste things - into an image, but still retain the original. - - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - self.load() - return self._new(self.im.copy()) - - __copy__ = copy - - def crop(self, box=None): - """ - Returns a rectangular region from this image. The box is a - 4-tuple defining the left, upper, right, and lower pixel - coordinate. See :ref:`coordinate-system`. - - Note: Prior to Pillow 3.4.0, this was a lazy operation. - - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if box is None: - return self.copy() - - if box[2] < box[0]: - raise ValueError("Coordinate 'right' is less than 'left'") - elif box[3] < box[1]: - raise ValueError("Coordinate 'lower' is less than 'upper'") - - self.load() - return self._new(self._crop(self.im, box)) - - def _crop(self, im, box): - """ - Returns a rectangular region from the core image object im. - - This is equivalent to calling im.crop((x0, y0, x1, y1)), but - includes additional sanity checks. - - :param im: a core image object - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :returns: A core image object. - """ - - x0, y0, x1, y1 = map(int, map(round, box)) - - absolute_values = (abs(x1 - x0), abs(y1 - y0)) - - _decompression_bomb_check(absolute_values) - - return im.crop((x0, y0, x1, y1)) - - def draft(self, mode, size): - """ - Configures the image file loader so it returns a version of the - image that as closely as possible matches the given mode and - size. For example, you can use this method to convert a color - JPEG to greyscale while loading it. - - If any changes are made, returns a tuple with the chosen ``mode`` and - ``box`` with coordinates of the original image within the altered one. - - Note that this method modifies the :py:class:`~PIL.Image.Image` object - in place. If the image has already been loaded, this method has no - effect. - - Note: This method is not implemented for most images. It is - currently implemented only for JPEG and MPO images. - - :param mode: The requested mode. - :param size: The requested size. - """ - pass - - def _expand(self, xmargin, ymargin=None): - if ymargin is None: - ymargin = xmargin - self.load() - return self._new(self.im.expand(xmargin, ymargin, 0)) - - def filter(self, filter): - """ - Filters this image using the given filter. For a list of - available filters, see the :py:mod:`~PIL.ImageFilter` module. - - :param filter: Filter kernel. - :returns: An :py:class:`~PIL.Image.Image` object.""" - - from . import ImageFilter - - self.load() - - if isinstance(filter, Callable): - filter = filter() - if not hasattr(filter, "filter"): - raise TypeError( - "filter argument should be ImageFilter.Filter instance or class" - ) - - multiband = isinstance(filter, ImageFilter.MultibandFilter) - if self.im.bands == 1 or multiband: - return self._new(filter.filter(self.im)) - - ims = [] - for c in range(self.im.bands): - ims.append(self._new(filter.filter(self.im.getband(c)))) - return merge(self.mode, ims) - - def getbands(self): - """ - Returns a tuple containing the name of each band in this image. - For example, ``getbands`` on an RGB image returns ("R", "G", "B"). - - :returns: A tuple containing band names. - :rtype: tuple - """ - return ImageMode.getmode(self.mode).bands - - def getbbox(self): - """ - Calculates the bounding box of the non-zero regions in the - image. - - :returns: The bounding box is returned as a 4-tuple defining the - left, upper, right, and lower pixel coordinate. See - :ref:`coordinate-system`. If the image is completely empty, this - method returns None. - - """ - - self.load() - return self.im.getbbox() - - def getcolors(self, maxcolors=256): - """ - Returns a list of colors used in this image. - - The colors will be in the image's mode. For example, an RGB image will - return a tuple of (red, green, blue) color values, and a P image will - return the index of the color in the palette. - - :param maxcolors: Maximum number of colors. If this number is - exceeded, this method returns None. The default limit is - 256 colors. - :returns: An unsorted list of (count, pixel) values. - """ - - self.load() - if self.mode in ("1", "L", "P"): - h = self.im.histogram() - out = [] - for i in range(256): - if h[i]: - out.append((h[i], i)) - if len(out) > maxcolors: - return None - return out - return self.im.getcolors(maxcolors) - - def getdata(self, band=None): - """ - Returns the contents of this image as a sequence object - containing pixel values. The sequence object is flattened, so - that values for line one follow directly after the values of - line zero, and so on. - - Note that the sequence object returned by this method is an - internal PIL data type, which only supports certain sequence - operations. To convert it to an ordinary sequence (e.g. for - printing), use ``list(im.getdata())``. - - :param band: What band to return. The default is to return - all bands. To return a single band, pass in the index - value (e.g. 0 to get the "R" band from an "RGB" image). - :returns: A sequence-like object. - """ - - self.load() - if band is not None: - return self.im.getband(band) - return self.im # could be abused - - def getextrema(self): - """ - Gets the minimum and maximum pixel values for each band in - the image. - - :returns: For a single-band image, a 2-tuple containing the - minimum and maximum pixel value. For a multi-band image, - a tuple containing one 2-tuple for each band. - """ - - self.load() - if self.im.bands > 1: - extrema = [] - for i in range(self.im.bands): - extrema.append(self.im.getband(i).getextrema()) - return tuple(extrema) - return self.im.getextrema() - - def _getxmp(self, xmp_tags): - def get_name(tag): - return tag.split("}")[1] - - def get_value(element): - value = {get_name(k): v for k, v in element.attrib.items()} - children = list(element) - if children: - for child in children: - name = get_name(child.tag) - child_value = get_value(child) - if name in value: - if not isinstance(value[name], list): - value[name] = [value[name]] - value[name].append(child_value) - else: - value[name] = child_value - elif value: - if element.text: - value["text"] = element.text - else: - return element.text - return value - - if ElementTree is None: - warnings.warn("XMP data cannot be read without defusedxml dependency") - return {} - else: - root = ElementTree.fromstring(xmp_tags) - return {get_name(root.tag): get_value(root)} - - def getexif(self): - if self._exif is None: - self._exif = Exif() - self._exif._loaded = False - elif self._exif._loaded: - return self._exif - self._exif._loaded = True - - exif_info = self.info.get("exif") - if exif_info is None: - if "Raw profile type exif" in self.info: - exif_info = bytes.fromhex( - "".join(self.info["Raw profile type exif"].split("\n")[3:]) - ) - elif hasattr(self, "tag_v2"): - self._exif.bigtiff = self.tag_v2._bigtiff - self._exif.endian = self.tag_v2._endian - self._exif.load_from_fp(self.fp, self.tag_v2._offset) - if exif_info is not None: - self._exif.load(exif_info) - - # XMP tags - if 0x0112 not in self._exif: - xmp_tags = self.info.get("XML:com.adobe.xmp") - if xmp_tags: - match = re.search(r'tiff:Orientation="([0-9])"', xmp_tags) - if match: - self._exif[0x0112] = int(match[1]) - - return self._exif - - def _reload_exif(self): - if self._exif is None or not self._exif._loaded: - return - self._exif._loaded = False - self.getexif() - - def getim(self): - """ - Returns a capsule that points to the internal image memory. - - :returns: A capsule object. - """ - - self.load() - return self.im.ptr - - def getpalette(self, rawmode="RGB"): - """ - Returns the image palette as a list. - - :param rawmode: The mode in which to return the palette. ``None`` will - return the palette in its current mode. - - .. versionadded:: 9.1.0 - - :returns: A list of color values [r, g, b, ...], or None if the - image has no palette. - """ - - self.load() - try: - mode = self.im.getpalettemode() - except ValueError: - return None # no palette - if rawmode is None: - rawmode = mode - return list(self.im.getpalette(mode, rawmode)) - - def apply_transparency(self): - """ - If a P mode image has a "transparency" key in the info dictionary, - remove the key and apply the transparency to the palette instead. - """ - if self.mode != "P" or "transparency" not in self.info: - return - - from . import ImagePalette - - palette = self.getpalette("RGBA") - transparency = self.info["transparency"] - if isinstance(transparency, bytes): - for i, alpha in enumerate(transparency): - palette[i * 4 + 3] = alpha - else: - palette[transparency * 4 + 3] = 0 - self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) - self.palette.dirty = 1 - - del self.info["transparency"] - - def getpixel(self, xy): - """ - Returns the pixel value at a given position. - - :param xy: The coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: The pixel value. If the image is a multi-layer image, - this method returns a tuple. - """ - - self.load() - if self.pyaccess: - return self.pyaccess.getpixel(xy) - return self.im.getpixel(xy) - - def getprojection(self): - """ - Get projection to x and y axes - - :returns: Two sequences, indicating where there are non-zero - pixels along the X-axis and the Y-axis, respectively. - """ - - self.load() - x, y = self.im.getprojection() - return list(x), list(y) - - def histogram(self, mask=None, extrema=None): - """ - Returns a histogram for the image. The histogram is returned as a - list of pixel counts, one for each pixel value in the source - image. Counts are grouped into 256 bins for each band, even if - the image has more than 8 bits per band. If the image has more - than one band, the histograms for all bands are concatenated (for - example, the histogram for an "RGB" image contains 768 values). - - A bilevel image (mode "1") is treated as a greyscale ("L") image - by this method. - - If a mask is provided, the method returns a histogram for those - parts of the image where the mask image is non-zero. The mask - image must have the same size as the image, and be either a - bi-level image (mode "1") or a greyscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A list containing pixel counts. - """ - self.load() - if mask: - mask.load() - return self.im.histogram((0, 0), mask.im) - if self.mode in ("I", "F"): - if extrema is None: - extrema = self.getextrema() - return self.im.histogram(extrema) - return self.im.histogram() - - def entropy(self, mask=None, extrema=None): - """ - Calculates and returns the entropy for the image. - - A bilevel image (mode "1") is treated as a greyscale ("L") - image by this method. - - If a mask is provided, the method employs the histogram for - those parts of the image where the mask image is non-zero. - The mask image must have the same size as the image, and be - either a bi-level image (mode "1") or a greyscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A float value representing the image entropy - """ - self.load() - if mask: - mask.load() - return self.im.entropy((0, 0), mask.im) - if self.mode in ("I", "F"): - if extrema is None: - extrema = self.getextrema() - return self.im.entropy(extrema) - return self.im.entropy() - - def paste(self, im, box=None, mask=None): - """ - Pastes another image into this image. The box argument is either - a 2-tuple giving the upper left corner, a 4-tuple defining the - left, upper, right, and lower pixel coordinate, or None (same as - (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size - of the pasted image must match the size of the region. - - If the modes don't match, the pasted image is converted to the mode of - this image (see the :py:meth:`~PIL.Image.Image.convert` method for - details). - - Instead of an image, the source can be a integer or tuple - containing pixel values. The method then fills the region - with the given color. When creating RGB images, you can - also use color strings as supported by the ImageColor module. - - If a mask is given, this method updates only the regions - indicated by the mask. You can use either "1", "L", "LA", "RGBA" - or "RGBa" images (if present, the alpha band is used as mask). - Where the mask is 255, the given image is copied as is. Where - the mask is 0, the current value is preserved. Intermediate - values will mix the two images together, including their alpha - channels if they have them. - - See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to - combine images with respect to their alpha channels. - - :param im: Source image or pixel value (integer or tuple). - :param box: An optional 4-tuple giving the region to paste into. - If a 2-tuple is used instead, it's treated as the upper left - corner. If omitted or None, the source is pasted into the - upper left corner. - - If an image is given as the second argument and there is no - third, the box defaults to (0, 0), and the second argument - is interpreted as a mask image. - :param mask: An optional mask image. - """ - - if isImageType(box) and mask is None: - # abbreviated paste(im, mask) syntax - mask = box - box = None - - if box is None: - box = (0, 0) - - if len(box) == 2: - # upper left corner given; get size from image or mask - if isImageType(im): - size = im.size - elif isImageType(mask): - size = mask.size - else: - # FIXME: use self.size here? - raise ValueError("cannot determine region size; use 4-item box") - box += (box[0] + size[0], box[1] + size[1]) - - if isinstance(im, str): - from . import ImageColor - - im = ImageColor.getcolor(im, self.mode) - - elif isImageType(im): - im.load() - if self.mode != im.mode: - if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): - # should use an adapter for this! - im = im.convert(self.mode) - im = im.im - - self._ensure_mutable() - - if mask: - mask.load() - self.im.paste(im, box, mask.im) - else: - self.im.paste(im, box) - - def alpha_composite(self, im, dest=(0, 0), source=(0, 0)): - """'In-place' analog of Image.alpha_composite. Composites an image - onto this image. - - :param im: image to composite over this one - :param dest: Optional 2 tuple (left, top) specifying the upper - left corner in this (destination) image. - :param source: Optional 2 (left, top) tuple for the upper left - corner in the overlay source image, or 4 tuple (left, top, right, - bottom) for the bounds of the source rectangle - - Performance Note: Not currently implemented in-place in the core layer. - """ - - if not isinstance(source, (list, tuple)): - raise ValueError("Source must be a tuple") - if not isinstance(dest, (list, tuple)): - raise ValueError("Destination must be a tuple") - if not len(source) in (2, 4): - raise ValueError("Source must be a 2 or 4-tuple") - if not len(dest) == 2: - raise ValueError("Destination must be a 2-tuple") - if min(source) < 0: - raise ValueError("Source must be non-negative") - - if len(source) == 2: - source = source + im.size - - # over image, crop if it's not the whole thing. - if source == (0, 0) + im.size: - overlay = im - else: - overlay = im.crop(source) - - # target for the paste - box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) - - # destination image. don't copy if we're using the whole image. - if box == (0, 0) + self.size: - background = self - else: - background = self.crop(box) - - result = alpha_composite(background, overlay) - self.paste(result, box) - - def point(self, lut, mode=None): - """ - Maps this image through a lookup table or function. - - :param lut: A lookup table, containing 256 (or 65536 if - self.mode=="I" and mode == "L") values per band in the - image. A function can be used instead, it should take a - single argument. The function is called once for each - possible pixel value, and the resulting table is applied to - all bands of the image. - - It may also be an :py:class:`~PIL.Image.ImagePointHandler` - object:: - - class Example(Image.ImagePointHandler): - def point(self, data): - # Return result - :param mode: Output mode (default is same as input). In the - current version, this can only be used if the source image - has mode "L" or "P", and the output has mode "1" or the - source image mode is "I" and the output mode is "L". - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - if isinstance(lut, ImagePointHandler): - return lut.point(self) - - if callable(lut): - # if it isn't a list, it should be a function - if self.mode in ("I", "I;16", "F"): - # check if the function can be used with point_transform - # UNDONE wiredfool -- I think this prevents us from ever doing - # a gamma function point transform on > 8bit images. - scale, offset = _getscaleoffset(lut) - return self._new(self.im.point_transform(scale, offset)) - # for other modes, convert the function to a table - lut = [lut(i) for i in range(256)] * self.im.bands - - if self.mode == "F": - # FIXME: _imaging returns a confusing error message for this case - raise ValueError("point operation not supported for this mode") - - if mode != "F": - lut = [round(i) for i in lut] - return self._new(self.im.point(lut, mode)) - - def putalpha(self, alpha): - """ - Adds or replaces the alpha layer in this image. If the image - does not have an alpha layer, it's converted to "LA" or "RGBA". - The new layer must be either "L" or "1". - - :param alpha: The new alpha layer. This can either be an "L" or "1" - image having the same size as this image, or an integer or - other color value. - """ - - self._ensure_mutable() - - if self.mode not in ("LA", "PA", "RGBA"): - # attempt to promote self to a matching alpha mode - try: - mode = getmodebase(self.mode) + "A" - try: - self.im.setmode(mode) - except (AttributeError, ValueError) as e: - # do things the hard way - im = self.im.convert(mode) - if im.mode not in ("LA", "PA", "RGBA"): - raise ValueError from e # sanity check - self.im = im - self.pyaccess = None - self.mode = self.im.mode - except KeyError as e: - raise ValueError("illegal image mode") from e - - if self.mode in ("LA", "PA"): - band = 1 - else: - band = 3 - - if isImageType(alpha): - # alpha layer - if alpha.mode not in ("1", "L"): - raise ValueError("illegal image mode") - alpha.load() - if alpha.mode == "1": - alpha = alpha.convert("L") - else: - # constant alpha - try: - self.im.fillband(band, alpha) - except (AttributeError, ValueError): - # do things the hard way - alpha = new("L", self.size, alpha) - else: - return - - self.im.putband(alpha.im, band) - - def putdata(self, data, scale=1.0, offset=0.0): - """ - Copies pixel data from a flattened sequence object into the image. The - values should start at the upper left corner (0, 0), continue to the - end of the line, followed directly by the first value of the second - line, and so on. Data will be read until either the image or the - sequence ends. The scale and offset values are used to adjust the - sequence values: **pixel = value*scale + offset**. - - :param data: A flattened sequence object. - :param scale: An optional scale value. The default is 1.0. - :param offset: An optional offset value. The default is 0.0. - """ - - self._ensure_mutable() - - self.im.putdata(data, scale, offset) - - def putpalette(self, data, rawmode="RGB"): - """ - Attaches a palette to this image. The image must be a "P", "PA", "L" - or "LA" image. - - The palette sequence must contain at most 256 colors, made up of one - integer value for each channel in the raw mode. - For example, if the raw mode is "RGB", then it can contain at most 768 - values, made up of red, green and blue values for the corresponding pixel - index in the 256 colors. - If the raw mode is "RGBA", then it can contain at most 1024 values, - containing red, green, blue and alpha values. - - Alternatively, an 8-bit string may be used instead of an integer sequence. - - :param data: A palette sequence (either a list or a string). - :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode - that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). - """ - from . import ImagePalette - - if self.mode not in ("L", "LA", "P", "PA"): - raise ValueError("illegal image mode") - if isinstance(data, ImagePalette.ImagePalette): - palette = ImagePalette.raw(data.rawmode, data.palette) - else: - if not isinstance(data, bytes): - data = bytes(data) - palette = ImagePalette.raw(rawmode, data) - self.mode = "PA" if "A" in self.mode else "P" - self.palette = palette - self.palette.mode = "RGB" - self.load() # install new palette - - def putpixel(self, xy, value): - """ - Modifies the pixel at the given position. The color is given as - a single numerical value for single-band images, and a tuple for - multi-band images. In addition to this, RGB and RGBA tuples are - accepted for P images. - - Note that this method is relatively slow. For more extensive changes, - use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` - module instead. - - See: - - * :py:meth:`~PIL.Image.Image.paste` - * :py:meth:`~PIL.Image.Image.putdata` - * :py:mod:`~PIL.ImageDraw` - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param value: The pixel value. - """ - - if self.readonly: - self._copy() - self.load() - - if self.pyaccess: - return self.pyaccess.putpixel(xy, value) - - if ( - self.mode == "P" - and isinstance(value, (list, tuple)) - and len(value) in [3, 4] - ): - # RGB or RGBA value for a P image - value = self.palette.getcolor(value, self) - return self.im.putpixel(xy, value) - - def remap_palette(self, dest_map, source_palette=None): - """ - Rewrites the image to reorder the palette. - - :param dest_map: A list of indexes into the original palette. - e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` - is the identity transform. - :param source_palette: Bytes or None. - :returns: An :py:class:`~PIL.Image.Image` object. - - """ - from . import ImagePalette - - if self.mode not in ("L", "P"): - raise ValueError("illegal image mode") - - bands = 3 - palette_mode = "RGB" - if source_palette is None: - if self.mode == "P": - self.load() - palette_mode = self.im.getpalettemode() - if palette_mode == "RGBA": - bands = 4 - source_palette = self.im.getpalette(palette_mode, palette_mode) - else: # L-mode - source_palette = bytearray(i // 3 for i in range(768)) - - palette_bytes = b"" - new_positions = [0] * 256 - - # pick only the used colors from the palette - for i, oldPosition in enumerate(dest_map): - palette_bytes += source_palette[ - oldPosition * bands : oldPosition * bands + bands - ] - new_positions[oldPosition] = i - - # replace the palette color id of all pixel with the new id - - # Palette images are [0..255], mapped through a 1 or 3 - # byte/color map. We need to remap the whole image - # from palette 1 to palette 2. New_positions is - # an array of indexes into palette 1. Palette 2 is - # palette 1 with any holes removed. - - # We're going to leverage the convert mechanism to use the - # C code to remap the image from palette 1 to palette 2, - # by forcing the source image into 'L' mode and adding a - # mapping 'L' mode palette, then converting back to 'L' - # sans palette thus converting the image bytes, then - # assigning the optimized RGB palette. - - # perf reference, 9500x4000 gif, w/~135 colors - # 14 sec prepatch, 1 sec postpatch with optimization forced. - - mapping_palette = bytearray(new_positions) - - m_im = self.copy() - m_im.mode = "P" - - m_im.palette = ImagePalette.ImagePalette( - palette_mode, palette=mapping_palette * bands - ) - # possibly set palette dirty, then - # m_im.putpalette(mapping_palette, 'L') # converts to 'P' - # or just force it. - # UNDONE -- this is part of the general issue with palettes - m_im.im.putpalette(palette_mode + ";L", m_im.palette.tobytes()) - - m_im = m_im.convert("L") - - # Internally, we require 256 palette entries. - new_palette_bytes = ( - palette_bytes + ((256 * bands) - len(palette_bytes)) * b"\x00" - ) - m_im.putpalette(new_palette_bytes, palette_mode) - m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) - - if "transparency" in self.info: - try: - m_im.info["transparency"] = dest_map.index(self.info["transparency"]) - except ValueError: - if "transparency" in m_im.info: - del m_im.info["transparency"] - - return m_im - - def _get_safe_box(self, size, resample, box): - """Expands the box so it includes adjacent pixels - that may be used by resampling with the given resampling filter. - """ - filter_support = _filters_support[resample] - 0.5 - scale_x = (box[2] - box[0]) / size[0] - scale_y = (box[3] - box[1]) / size[1] - support_x = filter_support * scale_x - support_y = filter_support * scale_y - - return ( - max(0, int(box[0] - support_x)), - max(0, int(box[1] - support_y)), - min(self.size[0], math.ceil(box[2] + support_x)), - min(self.size[1], math.ceil(box[3] + support_y)), - ) - - def resize(self, size, resample=None, box=None, reducing_gap=None): - """ - Returns a resized copy of this image. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param resample: An optional resampling filter. This can be - one of :py:data:`PIL.Image.Resampling.NEAREST`, - :py:data:`PIL.Image.Resampling.BOX`, - :py:data:`PIL.Image.Resampling.BILINEAR`, - :py:data:`PIL.Image.Resampling.HAMMING`, - :py:data:`PIL.Image.Resampling.BICUBIC` or - :py:data:`PIL.Image.Resampling.LANCZOS`. - If the image has mode "1" or "P", it is always set to - :py:data:`PIL.Image.Resampling.NEAREST`. - If the image mode specifies a number of bits, such as "I;16", then the - default filter is :py:data:`PIL.Image.Resampling.NEAREST`. - Otherwise, the default filter is - :py:data:`PIL.Image.Resampling.BICUBIC`. See: :ref:`concept-filters`. - :param box: An optional 4-tuple of floats providing - the source image region to be scaled. - The values must be within (0, 0, width, height) rectangle. - If omitted or None, the entire source is used. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce`. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is None (no optimization). - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if resample is None: - type_special = ";" in self.mode - resample = Resampling.NEAREST if type_special else Resampling.BICUBIC - elif resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - Resampling.LANCZOS, - Resampling.BOX, - Resampling.HAMMING, - ): - message = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - (Resampling.BOX, "Image.Resampling.BOX"), - (Resampling.HAMMING, "Image.Resampling.HAMMING"), - ) - ] - raise ValueError( - message + " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] - ) - - if reducing_gap is not None and reducing_gap < 1.0: - raise ValueError("reducing_gap must be 1.0 or greater") - - size = tuple(size) - - self.load() - if box is None: - box = (0, 0) + self.size - else: - box = tuple(box) - - if self.size == size and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ("1", "P"): - resample = Resampling.NEAREST - - if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.resize(size, resample, box) - return im.convert(self.mode) - - self.load() - - if reducing_gap is not None and resample != Resampling.NEAREST: - factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 - factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 - if factor_x > 1 or factor_y > 1: - reduce_box = self._get_safe_box(size, resample, box) - factor = (factor_x, factor_y) - if callable(self.reduce): - self = self.reduce(factor, box=reduce_box) - else: - self = Image.reduce(self, factor, box=reduce_box) - box = ( - (box[0] - reduce_box[0]) / factor_x, - (box[1] - reduce_box[1]) / factor_y, - (box[2] - reduce_box[0]) / factor_x, - (box[3] - reduce_box[1]) / factor_y, - ) - - return self._new(self.im.resize(size, resample, box)) - - def reduce(self, factor, box=None): - """ - Returns a copy of the image reduced ``factor`` times. - If the size of the image is not dividable by ``factor``, - the resulting size will be rounded up. - - :param factor: A greater than 0 integer or tuple of two integers - for width and height separately. - :param box: An optional 4-tuple of ints providing - the source image region to be reduced. - The values must be within ``(0, 0, width, height)`` rectangle. - If omitted or ``None``, the entire source is used. - """ - if not isinstance(factor, (list, tuple)): - factor = (factor, factor) - - if box is None: - box = (0, 0) + self.size - else: - box = tuple(box) - - if factor == (1, 1) and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ["LA", "RGBA"]: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.reduce(factor, box) - return im.convert(self.mode) - - self.load() - - return self._new(self.im.reduce(factor, box)) - - def rotate( - self, - angle, - resample=Resampling.NEAREST, - expand=0, - center=None, - translate=None, - fillcolor=None, - ): - """ - Returns a rotated copy of this image. This method returns a - copy of this image, rotated the given number of degrees counter - clockwise around its centre. - - :param angle: In degrees counter clockwise. - :param resample: An optional resampling filter. This can be - one of :py:data:`PIL.Image.Resampling.NEAREST` (use nearest neighbour), - :py:data:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`PIL.Image.Resampling.BICUBIC` - (cubic spline interpolation in a 4x4 environment). - If omitted, or if the image has mode "1" or "P", it is - set to :py:data:`PIL.Image.Resampling.NEAREST`. See :ref:`concept-filters`. - :param expand: Optional expansion flag. If true, expands the output - image to make it large enough to hold the entire rotated image. - If false or omitted, make the output image the same size as the - input image. Note that the expand flag assumes rotation around - the center and no translation. - :param center: Optional center of rotation (a 2-tuple). Origin is - the upper left corner. Default is the center of the image. - :param translate: An optional post-rotate translation (a 2-tuple). - :param fillcolor: An optional color for area outside the rotated image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - angle = angle % 360.0 - - # Fast paths regardless of filter, as long as we're not - # translating or changing the center. - if not (center or translate): - if angle == 0: - return self.copy() - if angle == 180: - return self.transpose(Transpose.ROTATE_180) - if angle in (90, 270) and (expand or self.width == self.height): - return self.transpose( - Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 - ) - - # Calculate the affine matrix. Note that this is the reverse - # transformation (from destination image to source) because we - # want to interpolate the (discrete) destination pixel from - # the local area around the (floating) source pixel. - - # The matrix we actually want (note that it operates from the right): - # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) - # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) - # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) - - # The reverse matrix is thus: - # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) - # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) - # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) - - # In any case, the final translation may be updated at the end to - # compensate for the expand flag. - - w, h = self.size - - if translate is None: - post_trans = (0, 0) - else: - post_trans = translate - if center is None: - # FIXME These should be rounded to ints? - rotn_center = (w / 2.0, h / 2.0) - else: - rotn_center = center - - angle = -math.radians(angle) - matrix = [ - round(math.cos(angle), 15), - round(math.sin(angle), 15), - 0.0, - round(-math.sin(angle), 15), - round(math.cos(angle), 15), - 0.0, - ] - - def transform(x, y, matrix): - (a, b, c, d, e, f) = matrix - return a * x + b * y + c, d * x + e * y + f - - matrix[2], matrix[5] = transform( - -rotn_center[0] - post_trans[0], -rotn_center[1] - post_trans[1], matrix - ) - matrix[2] += rotn_center[0] - matrix[5] += rotn_center[1] - - if expand: - # calculate output size - xx = [] - yy = [] - for x, y in ((0, 0), (w, 0), (w, h), (0, h)): - x, y = transform(x, y, matrix) - xx.append(x) - yy.append(y) - nw = math.ceil(max(xx)) - math.floor(min(xx)) - nh = math.ceil(max(yy)) - math.floor(min(yy)) - - # We multiply a translation matrix from the right. Because of its - # special form, this is the same as taking the image of the - # translation vector as new translation vector. - matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) - w, h = nw, nh - - return self.transform( - (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor - ) - - def save(self, fp, format=None, **params): - """ - Saves this image under the given filename. If no format is - specified, the format to use is determined from the filename - extension, if possible. - - Keyword options can be used to provide additional instructions - to the writer. If a writer doesn't recognise an option, it is - silently ignored. The available options are described in the - :doc:`image format documentation - <../handbook/image-file-formats>` for each writer. - - You can use a file object instead of a filename. In this case, - you must always specify the format. The file object must - implement the ``seek``, ``tell``, and ``write`` - methods, and be opened in binary mode. - - :param fp: A filename (string), pathlib.Path object or file object. - :param format: Optional format override. If omitted, the - format to use is determined from the filename extension. - If a file object was used instead of a filename, this - parameter should always be used. - :param params: Extra parameters to the image writer. - :returns: None - :exception ValueError: If the output format could not be determined - from the file name. Use the format option to solve this. - :exception OSError: If the file could not be written. The file - may have been created, and may contain partial data. - """ - - filename = "" - open_fp = False - if isinstance(fp, Path): - filename = str(fp) - open_fp = True - elif is_path(fp): - filename = fp - open_fp = True - elif fp == sys.stdout: - try: - fp = sys.stdout.buffer - except AttributeError: - pass - if not filename and hasattr(fp, "name") and is_path(fp.name): - # only set the name for metadata purposes - filename = fp.name - - # may mutate self! - self._ensure_mutable() - - save_all = params.pop("save_all", False) - self.encoderinfo = params - self.encoderconfig = () - - preinit() - - ext = os.path.splitext(filename)[1].lower() - - if not format: - if ext not in EXTENSION: - init() - try: - format = EXTENSION[ext] - except KeyError as e: - raise ValueError(f"unknown file extension: {ext}") from e - - if format.upper() not in SAVE: - init() - if save_all: - save_handler = SAVE_ALL[format.upper()] - else: - save_handler = SAVE[format.upper()] - - created = False - if open_fp: - created = not os.path.exists(filename) - if params.get("append", False): - # Open also for reading ("+"), because TIFF save_all - # writer needs to go back and edit the written data. - fp = builtins.open(filename, "r+b") - else: - fp = builtins.open(filename, "w+b") - - try: - save_handler(self, fp, filename) - except Exception: - if open_fp: - fp.close() - if created: - try: - os.remove(filename) - except PermissionError: - pass - raise - if open_fp: - fp.close() - - def seek(self, frame): - """ - Seeks to the given frame in this sequence file. If you seek - beyond the end of the sequence, the method raises an - ``EOFError`` exception. When a sequence file is opened, the - library automatically seeks to frame 0. - - See :py:meth:`~PIL.Image.Image.tell`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :param frame: Frame number, starting at 0. - :exception EOFError: If the call attempts to seek beyond the end - of the sequence. - """ - - # overridden by file handlers - if frame != 0: - raise EOFError - - def show(self, title=None): - """ - Displays this image. This method is mainly intended for debugging purposes. - - This method calls :py:func:`PIL.ImageShow.show` internally. You can use - :py:func:`PIL.ImageShow.register` to override its default behaviour. - - The image is first saved to a temporary file. By default, it will be in - PNG format. - - On Unix, the image is then opened using the **display**, **eog** or - **xv** utility, depending on which one can be found. - - On macOS, the image is opened with the native Preview application. - - On Windows, the image is opened with the standard PNG display utility. - - :param title: Optional title to use for the image window, where possible. - """ - - _show(self, title=title) - - def split(self): - """ - Split this image into individual bands. This method returns a - tuple of individual image bands from an image. For example, - splitting an "RGB" image creates three new images each - containing a copy of one of the original bands (red, green, - blue). - - If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` - method can be more convenient and faster. - - :returns: A tuple containing bands. - """ - - self.load() - if self.im.bands == 1: - ims = [self.copy()] - else: - ims = map(self._new, self.im.split()) - return tuple(ims) - - def getchannel(self, channel): - """ - Returns an image containing a single channel of the source image. - - :param channel: What channel to return. Could be index - (0 for "R" channel of "RGB") or channel name - ("A" for alpha channel of "RGBA"). - :returns: An image in "L" mode. - - .. versionadded:: 4.3.0 - """ - self.load() - - if isinstance(channel, str): - try: - channel = self.getbands().index(channel) - except ValueError as e: - raise ValueError(f'The image has no channel "{channel}"') from e - - return self._new(self.im.getband(channel)) - - def tell(self): - """ - Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :returns: Frame number, starting with 0. - """ - return 0 - - def thumbnail(self, size, resample=Resampling.BICUBIC, reducing_gap=2.0): - """ - Make this image into a thumbnail. This method modifies the - image to contain a thumbnail version of itself, no larger than - the given size. This method calculates an appropriate thumbnail - size to preserve the aspect of the image, calls the - :py:meth:`~PIL.Image.Image.draft` method to configure the file reader - (where applicable), and finally resizes the image. - - Note that this function modifies the :py:class:`~PIL.Image.Image` - object in place. If you need to use the full resolution image as well, - apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original - image. - - :param size: Requested size. - :param resample: Optional resampling filter. This can be one - of :py:data:`PIL.Image.Resampling.NEAREST`, - :py:data:`PIL.Image.Resampling.BOX`, - :py:data:`PIL.Image.Resampling.BILINEAR`, - :py:data:`PIL.Image.Resampling.HAMMING`, - :py:data:`PIL.Image.Resampling.BICUBIC` or - :py:data:`PIL.Image.Resampling.LANCZOS`. - If omitted, it defaults to :py:data:`PIL.Image.Resampling.BICUBIC`. - (was :py:data:`PIL.Image.Resampling.NEAREST` prior to version 2.5.0). - See: :ref:`concept-filters`. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce` or - :py:meth:`~PIL.Image.Image.draft` for JPEG images. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is 2.0 (very close to fair resampling - while still being faster in many cases). - :returns: None - """ - - self.load() - x, y = map(math.floor, size) - if x >= self.width and y >= self.height: - return - - def round_aspect(number, key): - return max(min(math.floor(number), math.ceil(number), key=key), 1) - - # preserve aspect ratio - aspect = self.width / self.height - if x / y >= aspect: - x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) - else: - y = round_aspect( - x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) - ) - size = (x, y) - - box = None - if reducing_gap is not None: - res = self.draft(None, (size[0] * reducing_gap, size[1] * reducing_gap)) - if res is not None: - box = res[1] - - if self.size != size: - im = self.resize(size, resample, box=box, reducing_gap=reducing_gap) - - self.im = im.im - self._size = size - self.mode = self.im.mode - - self.readonly = 0 - self.pyaccess = None - - # FIXME: the different transform methods need further explanation - # instead of bloating the method docs, add a separate chapter. - def transform( - self, - size, - method, - data=None, - resample=Resampling.NEAREST, - fill=1, - fillcolor=None, - ): - """ - Transforms this image. This method creates a new image with the - given size, and the same mode as the original, and copies data - to the new image using the given transform. - - :param size: The output size. - :param method: The transformation method. This is one of - :py:data:`PIL.Image.Transform.EXTENT` (cut out a rectangular subregion), - :py:data:`PIL.Image.Transform.AFFINE` (affine transform), - :py:data:`PIL.Image.Transform.PERSPECTIVE` (perspective transform), - :py:data:`PIL.Image.Transform.QUAD` (map a quadrilateral to a rectangle), or - :py:data:`PIL.Image.Transform.MESH` (map a number of source quadrilaterals - in one operation). - - It may also be an :py:class:`~PIL.Image.ImageTransformHandler` - object:: - - class Example(Image.ImageTransformHandler): - def transform(self, size, data, resample, fill=1): - # Return result - - It may also be an object with a ``method.getdata`` method - that returns a tuple supplying new ``method`` and ``data`` values:: - - class Example: - def getdata(self): - method = Image.Transform.EXTENT - data = (0, 0, 100, 100) - return method, data - :param data: Extra data to the transformation method. - :param resample: Optional resampling filter. It can be one of - :py:data:`PIL.Image.Resampling.NEAREST` (use nearest neighbour), - :py:data:`PIL.Image.Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`PIL.Image.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image - has mode "1" or "P", it is set to :py:data:`PIL.Image.Resampling.NEAREST`. - See: :ref:`concept-filters`. - :param fill: If ``method`` is an - :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of - the arguments passed to it. Otherwise, it is unused. - :param fillcolor: Optional fill color for the area outside the - transform in the output image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: - return ( - self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - .transform(size, method, data, resample, fill, fillcolor) - .convert(self.mode) - ) - - if isinstance(method, ImageTransformHandler): - return method.transform(size, self, resample=resample, fill=fill) - - if hasattr(method, "getdata"): - # compatibility w. old-style transform objects - method, data = method.getdata() - - if data is None: - raise ValueError("missing method data") - - im = new(self.mode, size, fillcolor) - if self.mode == "P" and self.palette: - im.palette = self.palette.copy() - im.info = self.info.copy() - if method == Transform.MESH: - # list of quads - for box, quad in data: - im.__transformer( - box, self, Transform.QUAD, quad, resample, fillcolor is None - ) - else: - im.__transformer( - (0, 0) + size, self, method, data, resample, fillcolor is None - ) - - return im - - def __transformer( - self, box, image, method, data, resample=Resampling.NEAREST, fill=1 - ): - w = box[2] - box[0] - h = box[3] - box[1] - - if method == Transform.AFFINE: - data = data[:6] - - elif method == Transform.EXTENT: - # convert extent to an affine transform - x0, y0, x1, y1 = data - xs = (x1 - x0) / w - ys = (y1 - y0) / h - method = Transform.AFFINE - data = (xs, 0, x0, 0, ys, y0) - - elif method == Transform.PERSPECTIVE: - data = data[:8] - - elif method == Transform.QUAD: - # quadrilateral warp. data specifies the four corners - # given as NW, SW, SE, and NE. - nw = data[:2] - sw = data[2:4] - se = data[4:6] - ne = data[6:8] - x0, y0 = nw - As = 1.0 / w - At = 1.0 / h - data = ( - x0, - (ne[0] - x0) * As, - (sw[0] - x0) * At, - (se[0] - sw[0] - ne[0] + x0) * As * At, - y0, - (ne[1] - y0) * As, - (sw[1] - y0) * At, - (se[1] - sw[1] - ne[1] + y0) * As * At, - ) - - else: - raise ValueError("unknown transformation method") - - if resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - ): - if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): - message = { - Resampling.BOX: "Image.Resampling.BOX", - Resampling.HAMMING: "Image.Resampling.HAMMING", - Resampling.LANCZOS: "Image.Resampling.LANCZOS", - }[resample] + f" ({resample}) cannot be used." - else: - message = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - ) - ] - raise ValueError( - message + " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] - ) - - image.load() - - self.load() - - if image.mode in ("1", "P"): - resample = Resampling.NEAREST - - self.im.transform2(box, image.im, method, data, resample, fill) - - def transpose(self, method): - """ - Transpose image (flip or rotate in 90 degree steps) - - :param method: One of :py:data:`PIL.Image.Transpose.FLIP_LEFT_RIGHT`, - :py:data:`PIL.Image.Transpose.FLIP_TOP_BOTTOM`, - :py:data:`PIL.Image.Transpose.ROTATE_90`, - :py:data:`PIL.Image.Transpose.ROTATE_180`, - :py:data:`PIL.Image.Transpose.ROTATE_270`, - :py:data:`PIL.Image.Transpose.TRANSPOSE` or - :py:data:`PIL.Image.Transpose.TRANSVERSE`. - :returns: Returns a flipped or rotated copy of this image. - """ - - self.load() - return self._new(self.im.transpose(method)) - - def effect_spread(self, distance): - """ - Randomly spread pixels in an image. - - :param distance: Distance to spread pixels. - """ - self.load() - return self._new(self.im.effect_spread(distance)) - - def toqimage(self): - """Returns a QImage copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.toqimage(self) - - def toqpixmap(self): - """Returns a QPixmap copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.toqpixmap(self) - - -# -------------------------------------------------------------------- -# Abstract handlers. - - -class ImagePointHandler: - """ - Used as a mixin by point transforms - (for use with :py:meth:`~PIL.Image.Image.point`) - """ - - pass - - -class ImageTransformHandler: - """ - Used as a mixin by geometry transforms - (for use with :py:meth:`~PIL.Image.Image.transform`) - """ - - pass - - -# -------------------------------------------------------------------- -# Factories - -# -# Debugging - - -def _wedge(): - """Create greyscale wedge (for debugging only)""" - - return Image()._new(core.wedge("L")) - - -def _check_size(size): - """ - Common check to enforce type and sanity check on size tuples - - :param size: Should be a 2 tuple of (width, height) - :returns: True, or raises a ValueError - """ - - if not isinstance(size, (list, tuple)): - raise ValueError("Size must be a tuple") - if len(size) != 2: - raise ValueError("Size must be a tuple of length 2") - if size[0] < 0 or size[1] < 0: - raise ValueError("Width and height must be >= 0") - - return True - - -def new(mode, size, color=0): - """ - Creates a new image with the given mode and size. - - :param mode: The mode to use for the new image. See: - :ref:`concept-modes`. - :param size: A 2-tuple, containing (width, height) in pixels. - :param color: What color to use for the image. Default is black. - If given, this should be a single integer or floating point value - for single-band modes, and a tuple for multi-band modes (one value - per band). When creating RGB images, you can also use color - strings as supported by the ImageColor module. If the color is - None, the image is not initialised. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - if color is None: - # don't initialize - return Image()._new(core.new(mode, size)) - - if isinstance(color, str): - # css3-style specifier - - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - - im = Image() - if mode == "P" and isinstance(color, (list, tuple)) and len(color) in [3, 4]: - # RGB or RGBA value for a P image - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette() - color = im.palette.getcolor(color) - return im._new(core.fill(mode, size, color)) - - -def frombytes(mode, size, data, decoder_name="raw", *args): - """ - Creates a copy of an image memory from pixel data in a buffer. - - In its simplest form, this function takes three arguments - (mode, size, and unpacked pixel data). - - You can also use any pixel decoder supported by PIL. For more - information on available decoders, see the section - :ref:`Writing Your Own File Codec `. - - Note that this function decodes pixel data only, not entire images. - If you have an entire image in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load - it. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A byte buffer containing raw data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw" and args == (): - args = mode - - im = new(mode, size) - im.frombytes(data, decoder_name, args) - return im - - -def frombuffer(mode, size, data, decoder_name="raw", *args): - """ - Creates an image memory referencing pixel data in a byte buffer. - - This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data - in the byte buffer, where possible. This means that changes to the - original buffer object are reflected in this image). Not all modes can - share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". - - Note that this function decodes pixel data only, not entire images. - If you have an entire image file in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. - - In the current version, the default parameters used for the "raw" decoder - differs from that used for :py:func:`~PIL.Image.frombytes`. This is a - bug, and will probably be fixed in a future release. The current release - issues a warning if you do this; to disable the warning, you should provide - the full set of parameters. See below for details. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A bytes or other buffer object containing raw - data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. For the - default encoder ("raw"), it's recommended that you provide the - full set of parameters:: - - frombuffer(mode, size, data, "raw", mode, 0, 1) - - :returns: An :py:class:`~PIL.Image.Image` object. - - .. versionadded:: 1.1.4 - """ - - _check_size(size) - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw": - if args == (): - args = mode, 0, 1 - if args[0] in _MAPMODES: - im = new(mode, (1, 1)) - im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) - if mode == "P": - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) - im.readonly = 1 - return im - - return frombytes(mode, size, data, decoder_name, args) - - -def fromarray(obj, mode=None): - """ - Creates an image memory from an object exporting the array interface - (using the buffer protocol). - - If ``obj`` is not contiguous, then the ``tobytes`` method is called - and :py:func:`~PIL.Image.frombuffer` is used. - - If you have an image in NumPy:: - - from PIL import Image - import numpy as np - im = Image.open("hopper.jpg") - a = np.asarray(im) - - Then this can be used to convert it to a Pillow image:: - - im = Image.fromarray(a) - - :param obj: Object with array interface - :param mode: Optional mode to use when reading ``obj``. Will be determined from - type if ``None``. - - This will not be used to convert the data after reading, but will be used to - change how the data is read:: - - from PIL import Image - import numpy as np - a = np.full((1, 1), 300) - im = Image.fromarray(a, mode="L") - im.getpixel((0, 0)) # 44 - im = Image.fromarray(a, mode="RGB") - im.getpixel((0, 0)) # (44, 1, 0) - - See: :ref:`concept-modes` for general information about modes. - :returns: An image object. - - .. versionadded:: 1.1.6 - """ - arr = obj.__array_interface__ - shape = arr["shape"] - ndim = len(shape) - strides = arr.get("strides", None) - if mode is None: - try: - typekey = (1, 1) + shape[2:], arr["typestr"] - except KeyError as e: - raise TypeError("Cannot handle this data type") from e - try: - mode, rawmode = _fromarray_typemap[typekey] - except KeyError as e: - raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e - else: - rawmode = mode - if mode in ["1", "L", "I", "P", "F"]: - ndmax = 2 - elif mode == "RGB": - ndmax = 3 - else: - ndmax = 4 - if ndim > ndmax: - raise ValueError(f"Too many dimensions: {ndim} > {ndmax}.") - - size = 1 if ndim == 1 else shape[1], shape[0] - if strides is not None: - if hasattr(obj, "tobytes"): - obj = obj.tobytes() - else: - obj = obj.tostring() - - return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) - - -def fromqimage(im): - """Creates an image instance from a QImage image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.fromqimage(im) - - -def fromqpixmap(im): - """Creates an image instance from a QPixmap image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.fromqpixmap(im) - - -_fromarray_typemap = { - # (shape, typestr) => mode, rawmode - # first two members of shape are set to one - ((1, 1), "|b1"): ("1", "1;8"), - ((1, 1), "|u1"): ("L", "L"), - ((1, 1), "|i1"): ("I", "I;8"), - ((1, 1), "u2"): ("I", "I;16B"), - ((1, 1), "i2"): ("I", "I;16BS"), - ((1, 1), "u4"): ("I", "I;32B"), - ((1, 1), "i4"): ("I", "I;32BS"), - ((1, 1), "f4"): ("F", "F;32BF"), - ((1, 1), "f8"): ("F", "F;64BF"), - ((1, 1, 2), "|u1"): ("LA", "LA"), - ((1, 1, 3), "|u1"): ("RGB", "RGB"), - ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), - # shortcuts: - ((1, 1), _ENDIAN + "i4"): ("I", "I"), - ((1, 1), _ENDIAN + "f4"): ("F", "F"), -} - - -def _decompression_bomb_check(size): - if MAX_IMAGE_PIXELS is None: - return - - pixels = size[0] * size[1] - - if pixels > 2 * MAX_IMAGE_PIXELS: - raise DecompressionBombError( - f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " - "pixels, could be decompression bomb DOS attack." - ) - - if pixels > MAX_IMAGE_PIXELS: - warnings.warn( - f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " - "could be decompression bomb DOS attack.", - DecompressionBombWarning, - ) - - -def open(fp, mode="r", formats=None): - """ - Opens and identifies the given image file. - - This is a lazy operation; this function identifies the file, but - the file remains open and the actual image data is not read from - the file until you try to process the data (or call the - :py:meth:`~PIL.Image.Image.load` method). See - :py:func:`~PIL.Image.new`. See :ref:`file-handling`. - - :param fp: A filename (string), pathlib.Path object or a file object. - The file object must implement ``file.read``, - ``file.seek``, and ``file.tell`` methods, - and be opened in binary mode. - :param mode: The mode. If given, this argument must be "r". - :param formats: A list or tuple of formats to attempt to load the file in. - This can be used to restrict the set of formats checked. - Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python3 -m PIL`` or using - the :py:func:`PIL.features.pilinfo` function. - :returns: An :py:class:`~PIL.Image.Image` object. - :exception FileNotFoundError: If the file cannot be found. - :exception PIL.UnidentifiedImageError: If the image cannot be opened and - identified. - :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` - instance is used for ``fp``. - :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. - """ - - if mode != "r": - raise ValueError(f"bad mode {repr(mode)}") - elif isinstance(fp, io.StringIO): - raise ValueError( - "StringIO cannot be used to open an image. " - "Binary data must be used instead." - ) - - if formats is None: - formats = ID - elif not isinstance(formats, (list, tuple)): - raise TypeError("formats must be a list or tuple") - - exclusive_fp = False - filename = "" - if isinstance(fp, Path): - filename = str(fp.resolve()) - elif is_path(fp): - filename = fp - - if filename: - fp = builtins.open(filename, "rb") - exclusive_fp = True - - try: - fp.seek(0) - except (AttributeError, io.UnsupportedOperation): - fp = io.BytesIO(fp.read()) - exclusive_fp = True - - prefix = fp.read(16) - - preinit() - - accept_warnings = [] - - def _open_core(fp, filename, prefix, formats): - for i in formats: - i = i.upper() - if i not in OPEN: - init() - try: - factory, accept = OPEN[i] - result = not accept or accept(prefix) - if type(result) in [str, bytes]: - accept_warnings.append(result) - elif result: - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError, struct.error): - # Leave disabled by default, spams the logs with image - # opening failures that are entirely expected. - # logger.debug("", exc_info=True) - continue - except BaseException: - if exclusive_fp: - fp.close() - raise - return None - - im = _open_core(fp, filename, prefix, formats) - - if im is None: - if init(): - im = _open_core(fp, filename, prefix, formats) - - if im: - im._exclusive_fp = exclusive_fp - return im - - if exclusive_fp: - fp.close() - for message in accept_warnings: - warnings.warn(message) - raise UnidentifiedImageError( - "cannot identify image file %r" % (filename if filename else fp) - ) - - -# -# Image processing. - - -def alpha_composite(im1, im2): - """ - Alpha composite im2 over im1. - - :param im1: The first image. Must have mode RGBA. - :param im2: The second image. Must have mode RGBA, and the same size as - the first image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.alpha_composite(im1.im, im2.im)) - - -def blend(im1, im2, alpha): - """ - Creates a new image by interpolating between two input images, using - a constant alpha:: - - out = image1 * (1.0 - alpha) + image2 * alpha - - :param im1: The first image. - :param im2: The second image. Must have the same mode and size as - the first image. - :param alpha: The interpolation alpha factor. If alpha is 0.0, a - copy of the first image is returned. If alpha is 1.0, a copy of - the second image is returned. There are no restrictions on the - alpha value. If necessary, the result is clipped to fit into - the allowed output range. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.blend(im1.im, im2.im, alpha)) - - -def composite(image1, image2, mask): - """ - Create composite image by blending images using a transparency mask. - - :param image1: The first image. - :param image2: The second image. Must have the same mode and - size as the first image. - :param mask: A mask image. This image can have mode - "1", "L", or "RGBA", and must have the same size as the - other two images. - """ - - image = image2.copy() - image.paste(image1, None, mask) - return image - - -def eval(image, *args): - """ - Applies the function (which should take one argument) to each pixel - in the given image. If the image has more than one band, the same - function is applied to each band. Note that the function is - evaluated once for each possible pixel value, so you cannot use - random components or other generators. - - :param image: The input image. - :param function: A function object, taking one integer argument. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - return image.point(args[0]) - - -def merge(mode, bands): - """ - Merge a set of single band images into a new multiband image. - - :param mode: The mode to use for the output image. See: - :ref:`concept-modes`. - :param bands: A sequence containing one single-band image for - each band in the output image. All bands must have the - same size. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if getmodebands(mode) != len(bands) or "*" in mode: - raise ValueError("wrong number of bands") - for band in bands[1:]: - if band.mode != getmodetype(mode): - raise ValueError("mode mismatch") - if band.size != bands[0].size: - raise ValueError("size mismatch") - for band in bands: - band.load() - return bands[0]._new(core.merge(mode, *[b.im for b in bands])) - - -# -------------------------------------------------------------------- -# Plugin registry - - -def register_open(id, factory, accept=None): - """ - Register an image file plugin. This function should not be used - in application code. - - :param id: An image format identifier. - :param factory: An image file factory method. - :param accept: An optional function that can be used to quickly - reject images having another format. - """ - id = id.upper() - ID.append(id) - OPEN[id] = factory, accept - - -def register_mime(id, mimetype): - """ - Registers an image MIME type. This function should not be used - in application code. - - :param id: An image format identifier. - :param mimetype: The image MIME type for this format. - """ - MIME[id.upper()] = mimetype - - -def register_save(id, driver): - """ - Registers an image save function. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE[id.upper()] = driver - - -def register_save_all(id, driver): - """ - Registers an image function to save all the frames - of a multiframe format. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE_ALL[id.upper()] = driver - - -def register_extension(id, extension): - """ - Registers an image extension. This function should not be - used in application code. - - :param id: An image format identifier. - :param extension: An extension used for this format. - """ - EXTENSION[extension.lower()] = id.upper() - - -def register_extensions(id, extensions): - """ - Registers image extensions. This function should not be - used in application code. - - :param id: An image format identifier. - :param extensions: A list of extensions used for this format. - """ - for extension in extensions: - register_extension(id, extension) - - -def registered_extensions(): - """ - Returns a dictionary containing all file extensions belonging - to registered plugins - """ - if not EXTENSION: - init() - return EXTENSION - - -def register_decoder(name, decoder): - """ - Registers an image decoder. This function should not be - used in application code. - - :param name: The name of the decoder - :param decoder: A callable(mode, args) that returns an - ImageFile.PyDecoder object - - .. versionadded:: 4.1.0 - """ - DECODERS[name] = decoder - - -def register_encoder(name, encoder): - """ - Registers an image encoder. This function should not be - used in application code. - - :param name: The name of the encoder - :param encoder: A callable(mode, args) that returns an - ImageFile.PyEncoder object - - .. versionadded:: 4.1.0 - """ - ENCODERS[name] = encoder - - -# -------------------------------------------------------------------- -# Simple display support. - - -def _show(image, **options): - from . import ImageShow - - ImageShow.show(image, **options) - - -# -------------------------------------------------------------------- -# Effects - - -def effect_mandelbrot(size, extent, quality): - """ - Generate a Mandelbrot set covering the given extent. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param extent: The extent to cover, as a 4-tuple: - (x0, y0, x1, y1). - :param quality: Quality. - """ - return Image()._new(core.effect_mandelbrot(size, extent, quality)) - - -def effect_noise(size, sigma): - """ - Generate Gaussian noise centered around 128. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param sigma: Standard deviation of noise. - """ - return Image()._new(core.effect_noise(size, sigma)) - - -def linear_gradient(mode): - """ - Generate 256x256 linear gradient from black to white, top to bottom. - - :param mode: Input mode. - """ - return Image()._new(core.linear_gradient(mode)) - - -def radial_gradient(mode): - """ - Generate 256x256 radial gradient from black to white, centre to edge. - - :param mode: Input mode. - """ - return Image()._new(core.radial_gradient(mode)) - - -# -------------------------------------------------------------------- -# Resources - - -def _apply_env_variables(env=None): - if env is None: - env = os.environ - - for var_name, setter in [ - ("PILLOW_ALIGNMENT", core.set_alignment), - ("PILLOW_BLOCK_SIZE", core.set_block_size), - ("PILLOW_BLOCKS_MAX", core.set_blocks_max), - ]: - if var_name not in env: - continue - - var = env[var_name].lower() - - units = 1 - for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: - if var.endswith(postfix): - units = mul - var = var[: -len(postfix)] - - try: - var = int(var) * units - except ValueError: - warnings.warn(f"{var_name} is not int") - continue - - try: - setter(var) - except ValueError as e: - warnings.warn(f"{var_name}: {e}") - - -_apply_env_variables() -atexit.register(core.clear_cache) - - -class Exif(MutableMapping): - endian = None - bigtiff = False - - def __init__(self): - self._data = {} - self._ifds = {} - self._info = None - self._loaded_exif = None - - def _fixup(self, value): - try: - if len(value) == 1 and isinstance(value, tuple): - return value[0] - except Exception: - pass - return value - - def _fixup_dict(self, src_dict): - # Helper function - # returns a dict with any single item tuples/lists as individual values - return {k: self._fixup(v) for k, v in src_dict.items()} - - def _get_ifd_dict(self, offset): - try: - # an offset pointer to the location of the nested embedded IFD. - # It should be a long, but may be corrupted. - self.fp.seek(offset) - except (KeyError, TypeError): - pass - else: - from . import TiffImagePlugin - - info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - info.load(self.fp) - return self._fixup_dict(info) - - def _get_head(self): - version = b"\x2B" if self.bigtiff else b"\x2A" - if self.endian == "<": - head = b"II" + version + b"\x00" + o32le(8) - else: - head = b"MM\x00" + version + o32be(8) - if self.bigtiff: - head += o32le(8) if self.endian == "<" else o32be(8) - head += b"\x00\x00\x00\x00" - return head - - def load(self, data): - # Extract EXIF information. This is highly experimental, - # and is likely to be replaced with something better in a future - # version. - - # The EXIF record consists of a TIFF file embedded in a JPEG - # application marker (!). - if data == self._loaded_exif: - return - self._loaded_exif = data - self._data.clear() - self._ifds.clear() - if data and data.startswith(b"Exif\x00\x00"): - data = data[6:] - if not data: - self._info = None - return - - self.fp = io.BytesIO(data) - self.head = self.fp.read(8) - # process dictionary - from . import TiffImagePlugin - - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - self.endian = self._info._endian - self.fp.seek(self._info.next) - self._info.load(self.fp) - - def load_from_fp(self, fp, offset=None): - self._loaded_exif = None - self._data.clear() - self._ifds.clear() - - # process dictionary - from . import TiffImagePlugin - - self.fp = fp - if offset is not None: - self.head = self._get_head() - else: - self.head = self.fp.read(8) - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - if self.endian is None: - self.endian = self._info._endian - if offset is None: - offset = self._info.next - self.fp.seek(offset) - self._info.load(self.fp) - - def _get_merged_dict(self): - merged_dict = dict(self) - - # get EXIF extension - if 0x8769 in self: - ifd = self._get_ifd_dict(self[0x8769]) - if ifd: - merged_dict.update(ifd) - - # GPS - if 0x8825 in self: - merged_dict[0x8825] = self._get_ifd_dict(self[0x8825]) - - return merged_dict - - def tobytes(self, offset=8): - from . import TiffImagePlugin - - head = self._get_head() - ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) - for tag, value in self.items(): - if tag in [0x8769, 0x8225, 0x8825] and not isinstance(value, dict): - value = self.get_ifd(tag) - if ( - tag == 0x8769 - and 0xA005 in value - and not isinstance(value[0xA005], dict) - ): - value = value.copy() - value[0xA005] = self.get_ifd(0xA005) - ifd[tag] = value - return b"Exif\x00\x00" + head + ifd.tobytes(offset) - - def get_ifd(self, tag): - if tag not in self._ifds: - if tag in [0x8769, 0x8825]: - # exif, gpsinfo - if tag in self: - self._ifds[tag] = self._get_ifd_dict(self[tag]) - elif tag in [0xA005, 0x927C]: - # interop, makernote - if 0x8769 not in self._ifds: - self.get_ifd(0x8769) - tag_data = self._ifds[0x8769][tag] - if tag == 0x927C: - # makernote - from .TiffImagePlugin import ImageFileDirectory_v2 - - if tag_data[:8] == b"FUJIFILM": - ifd_offset = i32le(tag_data, 8) - ifd_data = tag_data[ifd_offset:] - - makernote = {} - for i in range(0, struct.unpack(" 4: - (offset,) = struct.unpack("H", tag_data[:2])[0]): - ifd_tag, typ, count, data = struct.unpack( - ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] - ) - if ifd_tag == 0x1101: - # CameraInfo - (offset,) = struct.unpack(">L", data) - self.fp.seek(offset) - - camerainfo = {"ModelID": self.fp.read(4)} - - self.fp.read(4) - # Seconds since 2000 - camerainfo["TimeStamp"] = i32le(self.fp.read(12)) - - self.fp.read(4) - camerainfo["InternalSerialNumber"] = self.fp.read(4) - - self.fp.read(12) - parallax = self.fp.read(4) - handler = ImageFileDirectory_v2._load_dispatch[ - TiffTags.FLOAT - ][1] - camerainfo["Parallax"] = handler( - ImageFileDirectory_v2(), parallax, False - ) - - self.fp.read(4) - camerainfo["Category"] = self.fp.read(2) - - makernote = {0x1101: dict(self._fixup_dict(camerainfo))} - self._ifds[tag] = makernote - else: - # interop - self._ifds[tag] = self._get_ifd_dict(tag_data) - return self._ifds.get(tag, {}) - - def __str__(self): - if self._info is not None: - # Load all keys into self._data - for tag in self._info.keys(): - self[tag] - - return str(self._data) - - def __len__(self): - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return len(keys) - - def __getitem__(self, tag): - if self._info is not None and tag not in self._data and tag in self._info: - self._data[tag] = self._fixup(self._info[tag]) - del self._info[tag] - return self._data[tag] - - def __contains__(self, tag): - return tag in self._data or (self._info is not None and tag in self._info) - - def __setitem__(self, tag, value): - if self._info is not None and tag in self._info: - del self._info[tag] - self._data[tag] = value - - def __delitem__(self, tag): - if self._info is not None and tag in self._info: - del self._info[tag] - else: - del self._data[tag] - - def __iter__(self): - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return iter(keys) diff --git a/waypoint_manager/manager_GUI/PIL/ImageChops.py b/waypoint_manager/manager_GUI/PIL/ImageChops.py deleted file mode 100644 index fec4694..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageChops.py +++ /dev/null @@ -1,329 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard channel operations -# -# History: -# 1996-03-24 fl Created -# 1996-08-13 fl Added logical operations (for "1" images) -# 2000-10-12 fl Added offset method (from Image.py) -# -# Copyright (c) 1997-2000 by Secret Labs AB -# Copyright (c) 1996-2000 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image - - -def constant(image, value): - """Fill a channel with a given grey level. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.new("L", image.size, value) - - -def duplicate(image): - """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return image.copy() - - -def invert(image): - """ - Invert an image (channel). - - .. code-block:: python - - out = MAX - image - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image.load() - return image._new(image.im.chop_invert()) - - -def lighter(image1, image2): - """ - Compares the two images, pixel by pixel, and returns a new image containing - the lighter values. - - .. code-block:: python - - out = max(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_lighter(image2.im)) - - -def darker(image1, image2): - """ - Compares the two images, pixel by pixel, and returns a new image containing - the darker values. - - .. code-block:: python - - out = min(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_darker(image2.im)) - - -def difference(image1, image2): - """ - Returns the absolute value of the pixel-by-pixel difference between the two - images. - - .. code-block:: python - - out = abs(image1 - image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_difference(image2.im)) - - -def multiply(image1, image2): - """ - Superimposes two images on top of each other. - - If you multiply an image with a solid black image, the result is black. If - you multiply with a solid white image, the image is unaffected. - - .. code-block:: python - - out = image1 * image2 / MAX - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_multiply(image2.im)) - - -def screen(image1, image2): - """ - Superimposes two inverted images on top of each other. - - .. code-block:: python - - out = MAX - ((MAX - image1) * (MAX - image2) / MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_screen(image2.im)) - - -def soft_light(image1, image2): - """ - Superimposes two images on top of each other using the Soft Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_soft_light(image2.im)) - - -def hard_light(image1, image2): - """ - Superimposes two images on top of each other using the Hard Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_hard_light(image2.im)) - - -def overlay(image1, image2): - """ - Superimposes two images on top of each other using the Overlay algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_overlay(image2.im)) - - -def add(image1, image2, scale=1.0, offset=0): - """ - Adds two images, dividing the result by scale and adding the - offset. If omitted, scale defaults to 1.0, and offset to 0.0. - - .. code-block:: python - - out = ((image1 + image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add(image2.im, scale, offset)) - - -def subtract(image1, image2, scale=1.0, offset=0): - """ - Subtracts two images, dividing the result by scale and adding the offset. - If omitted, scale defaults to 1.0, and offset to 0.0. - - .. code-block:: python - - out = ((image1 - image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) - - -def add_modulo(image1, image2): - """Add two images, without clipping the result. - - .. code-block:: python - - out = ((image1 + image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add_modulo(image2.im)) - - -def subtract_modulo(image1, image2): - """Subtract two images, without clipping the result. - - .. code-block:: python - - out = ((image1 - image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract_modulo(image2.im)) - - -def logical_and(image1, image2): - """Logical AND between two images. - - Both of the images must have mode "1". If you would like to perform a - logical AND on an image with a mode other than "1", try - :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask - as the second image. - - .. code-block:: python - - out = ((image1 and image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_and(image2.im)) - - -def logical_or(image1, image2): - """Logical OR between two images. - - Both of the images must have mode "1". - - .. code-block:: python - - out = ((image1 or image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_or(image2.im)) - - -def logical_xor(image1, image2): - """Logical XOR between two images. - - Both of the images must have mode "1". - - .. code-block:: python - - out = ((bool(image1) != bool(image2)) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_xor(image2.im)) - - -def blend(image1, image2, alpha): - """Blend images using constant transparency weight. Alias for - :py:func:`PIL.Image.blend`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.blend(image1, image2, alpha) - - -def composite(image1, image2, mask): - """Create composite using transparency mask. Alias for - :py:func:`PIL.Image.composite`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.composite(image1, image2, mask) - - -def offset(image, xoffset, yoffset=None): - """Returns a copy of the image where data has been offset by the given - distances. Data wraps around the edges. If ``yoffset`` is omitted, it - is assumed to be equal to ``xoffset``. - - :param image: Input image. - :param xoffset: The horizontal distance. - :param yoffset: The vertical distance. If omitted, both - distances are set to the same value. - :rtype: :py:class:`~PIL.Image.Image` - """ - - if yoffset is None: - yoffset = xoffset - image.load() - return image._new(image.im.offset(xoffset, yoffset)) diff --git a/waypoint_manager/manager_GUI/PIL/ImageCms.py b/waypoint_manager/manager_GUI/PIL/ImageCms.py deleted file mode 100644 index 605252d..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageCms.py +++ /dev/null @@ -1,1017 +0,0 @@ -# The Python Imaging Library. -# $Id$ - -# Optional color management support, based on Kevin Cazabon's PyCMS -# library. - -# History: - -# 2009-03-08 fl Added to PIL. - -# Copyright (C) 2002-2003 Kevin Cazabon -# Copyright (c) 2009 by Fredrik Lundh -# Copyright (c) 2013 by Eric Soroos - -# See the README file for information on usage and redistribution. See -# below for the original description. - -import sys -from enum import IntEnum - -from PIL import Image - -from ._deprecate import deprecate - -try: - from PIL import _imagingcms -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - _imagingcms = DeferredError(ex) - -DESCRIPTION = """ -pyCMS - - a Python / PIL interface to the littleCMS ICC Color Management System - Copyright (C) 2002-2003 Kevin Cazabon - kevin@cazabon.com - https://www.cazabon.com - - pyCMS home page: https://www.cazabon.com/pyCMS - littleCMS home page: https://www.littlecms.com - (littleCMS is Copyright (C) 1998-2001 Marti Maria) - - Originally released under LGPL. Graciously donated to PIL in - March 2009, for distribution under the standard PIL license - - The pyCMS.py module provides a "clean" interface between Python/PIL and - pyCMSdll, taking care of some of the more complex handling of the direct - pyCMSdll functions, as well as error-checking and making sure that all - relevant data is kept together. - - While it is possible to call pyCMSdll functions directly, it's not highly - recommended. - - Version History: - - 1.0.0 pil Oct 2013 Port to LCMS 2. - - 0.1.0 pil mod March 10, 2009 - - Renamed display profile to proof profile. The proof - profile is the profile of the device that is being - simulated, not the profile of the device which is - actually used to display/print the final simulation - (that'd be the output profile) - also see LCMSAPI.txt - input colorspace -> using 'renderingIntent' -> proof - colorspace -> using 'proofRenderingIntent' -> output - colorspace - - Added LCMS FLAGS support. - Added FLAGS["SOFTPROOFING"] as default flag for - buildProofTransform (otherwise the proof profile/intent - would be ignored). - - 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms - - 0.0.2 alpha Jan 6, 2002 - - Added try/except statements around type() checks of - potential CObjects... Python won't let you use type() - on them, and raises a TypeError (stupid, if you ask - me!) - - Added buildProofTransformFromOpenProfiles() function. - Additional fixes in DLL, see DLL code for details. - - 0.0.1 alpha first public release, Dec. 26, 2002 - - Known to-do list with current version (of Python interface, not pyCMSdll): - - none - -""" - -VERSION = "1.0.0 pil" - -# --------------------------------------------------------------------. - -core = _imagingcms - -# -# intent/direction values - - -class Intent(IntEnum): - PERCEPTUAL = 0 - RELATIVE_COLORIMETRIC = 1 - SATURATION = 2 - ABSOLUTE_COLORIMETRIC = 3 - - -class Direction(IntEnum): - INPUT = 0 - OUTPUT = 1 - PROOF = 2 - - -def __getattr__(name): - for enum, prefix in {Intent: "INTENT_", Direction: "DIRECTION_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -# -# flags - -FLAGS = { - "MATRIXINPUT": 1, - "MATRIXOUTPUT": 2, - "MATRIXONLY": (1 | 2), - "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot - # Don't create prelinearization tables on precalculated transforms - # (internal use): - "NOPRELINEARIZATION": 16, - "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) - "NOTCACHE": 64, # Inhibit 1-pixel cache - "NOTPRECALC": 256, - "NULLTRANSFORM": 512, # Don't transform anyway - "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy - "LOWRESPRECALC": 2048, # Use less memory to minimize resources - "WHITEBLACKCOMPENSATION": 8192, - "BLACKPOINTCOMPENSATION": 8192, - "GAMUTCHECK": 4096, # Out of Gamut alarm - "SOFTPROOFING": 16384, # Do softproofing - "PRESERVEBLACK": 32768, # Black preservation - "NODEFAULTRESOURCEDEF": 16777216, # CRD special - "GRIDPOINTS": lambda n: (n & 0xFF) << 16, # Gridpoints -} - -_MAX_FLAG = 0 -for flag in FLAGS.values(): - if isinstance(flag, int): - _MAX_FLAG = _MAX_FLAG | flag - - -# --------------------------------------------------------------------. -# Experimental PIL-level API -# --------------------------------------------------------------------. - -## -# Profile. - - -class ImageCmsProfile: - def __init__(self, profile): - """ - :param profile: Either a string representing a filename, - a file like object containing a profile or a - low-level profile object - - """ - - if isinstance(profile, str): - if sys.platform == "win32": - profile_bytes_path = profile.encode() - try: - profile_bytes_path.decode("ascii") - except UnicodeDecodeError: - with open(profile, "rb") as f: - self._set(core.profile_frombytes(f.read())) - return - self._set(core.profile_open(profile), profile) - elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) - elif isinstance(profile, _imagingcms.CmsProfile): - self._set(profile) - else: - raise TypeError("Invalid type for Profile") - - def _set(self, profile, filename=None): - self.profile = profile - self.filename = filename - if profile: - self.product_name = None # profile.product_name - self.product_info = None # profile.product_info - else: - self.product_name = None - self.product_info = None - - def tobytes(self): - """ - Returns the profile in a format suitable for embedding in - saved images. - - :returns: a bytes object containing the ICC profile. - """ - - return core.profile_tobytes(self.profile) - - -class ImageCmsTransform(Image.ImagePointHandler): - - """ - Transform. This can be used with the procedural API, or with the standard - :py:func:`~PIL.Image.Image.point` method. - - Will return the output profile in the ``output.info['icc_profile']``. - """ - - def __init__( - self, - input, - output, - input_mode, - output_mode, - intent=Intent.PERCEPTUAL, - proof=None, - proof_intent=Intent.ABSOLUTE_COLORIMETRIC, - flags=0, - ): - if proof is None: - self.transform = core.buildTransform( - input.profile, output.profile, input_mode, output_mode, intent, flags - ) - else: - self.transform = core.buildProofTransform( - input.profile, - output.profile, - proof.profile, - input_mode, - output_mode, - intent, - proof_intent, - flags, - ) - # Note: inputMode and outputMode are for pyCMS compatibility only - self.input_mode = self.inputMode = input_mode - self.output_mode = self.outputMode = output_mode - - self.output_profile = output - - def point(self, im): - return self.apply(im) - - def apply(self, im, imOut=None): - im.load() - if imOut is None: - imOut = Image.new(self.output_mode, im.size, None) - self.transform.apply(im.im.id, imOut.im.id) - imOut.info["icc_profile"] = self.output_profile.tobytes() - return imOut - - def apply_in_place(self, im): - im.load() - if im.mode != self.output_mode: - raise ValueError("mode mismatch") # wrong output mode - self.transform.apply(im.im.id, im.im.id) - im.info["icc_profile"] = self.output_profile.tobytes() - return im - - -def get_display_profile(handle=None): - """ - (experimental) Fetches the profile for the current display device. - - :returns: ``None`` if the profile is not known. - """ - - if sys.platform != "win32": - return None - - from PIL import ImageWin - - if isinstance(handle, ImageWin.HDC): - profile = core.get_display_profile_win32(handle, 1) - else: - profile = core.get_display_profile_win32(handle or 0) - if profile is None: - return None - return ImageCmsProfile(profile) - - -# --------------------------------------------------------------------. -# pyCMS compatible layer -# --------------------------------------------------------------------. - - -class PyCMSError(Exception): - - """(pyCMS) Exception class. - This is used for all errors in the pyCMS API.""" - - pass - - -def profileToProfile( - im, - inputProfile, - outputProfile, - renderingIntent=Intent.PERCEPTUAL, - outputMode=None, - inPlace=False, - flags=0, -): - """ - (pyCMS) Applies an ICC transformation to a given image, mapping from - ``inputProfile`` to ``outputProfile``. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and - ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. - If an error occurs during application of the profiles, - a :exc:`PyCMSError` will be raised. - If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), - a :exc:`PyCMSError` will be raised. - - This function applies an ICC transformation to im from ``inputProfile``'s - color space to ``outputProfile``'s color space using the specified rendering - intent to decide how to handle out-of-gamut colors. - - ``outputMode`` can be used to specify that a color mode conversion is to - be done using these profiles, but the specified profiles must be able - to handle that mode. I.e., if converting im from RGB to CMYK using - profiles, the input profile must handle RGB data, and the output - profile must handle CMYK data. - - :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) - or Image.open(...), etc.) - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this image, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this image, or a profile object - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param outputMode: A valid PIL mode for the output image (i.e. "RGB", - "CMYK", etc.). Note: if rendering the image "inPlace", outputMode - MUST be the same mode as the input, or omitted completely. If - omitted, the outputMode will be the same as the mode of the input - image (im.mode) - :param inPlace: Boolean. If ``True``, the original image is modified in-place, - and ``None`` is returned. If ``False`` (default), a new - :py:class:`~PIL.Image.Image` object is returned with the transform applied. - :param flags: Integer (0-...) specifying additional flags - :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on - the value of ``inPlace`` - :exception PyCMSError: - """ - - if outputMode is None: - outputMode = im.mode - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - raise PyCMSError("renderingIntent must be an integer between 0 and 3") - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - raise PyCMSError(f"flags must be an integer between 0 and {_MAX_FLAG}") - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - transform = ImageCmsTransform( - inputProfile, - outputProfile, - im.mode, - outputMode, - renderingIntent, - flags=flags, - ) - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def getOpenProfile(profileFilename): - """ - (pyCMS) Opens an ICC profile file. - - The PyCMSProfile object can be passed back into pyCMS for use in creating - transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). - - If ``profileFilename`` is not a valid filename for an ICC profile, - a :exc:`PyCMSError` will be raised. - - :param profileFilename: String, as a valid filename path to the ICC profile - you wish to open, or a file-like object. - :returns: A CmsProfile class object. - :exception PyCMSError: - """ - - try: - return ImageCmsProfile(profileFilename) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildTransform( - inputProfile, - outputProfile, - inMode, - outMode, - renderingIntent=Intent.PERCEPTUAL, - flags=0, -): - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``. Use applyTransform to apply the transform to a given - image. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If an error occurs during creation - of the transform, a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile`` using the ``renderingIntent`` to determine what to do - with out-of-gamut colors. It will ONLY work for converting images that - are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, - i.e. "RGB", "RGBA", "CMYK", etc.). - - Building the transform is a fair part of the overhead in - ImageCms.profileToProfile(), so if you're planning on converting multiple - images using the same input/output settings, this can save you time. - Once you have a transform object, it can be used with - ImageCms.applyProfile() to convert images without the need to re-compute - the lookup table for the transform. - - The reason pyCMS returns a class object rather than a handle directly - to the transform is that it needs to keep track of the PIL input/output - modes that the transform is meant for. These attributes are stored in - the ``inMode`` and ``outMode`` attributes of the object (which can be - manually overridden if you really want to, but I don't know of any - time that would be of use, or would even work). - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - raise PyCMSError("renderingIntent must be an integer between 0 and 3") - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - return ImageCmsTransform( - inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildProofTransform( - inputProfile, - outputProfile, - proofProfile, - inMode, - outMode, - renderingIntent=Intent.PERCEPTUAL, - proofRenderingIntent=Intent.ABSOLUTE_COLORIMETRIC, - flags=FLAGS["SOFTPROOFING"], -): - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device. - - If the input, output, or proof profiles specified are not valid - filenames, a :exc:`PyCMSError` will be raised. - - If an error occurs during creation of the transform, - a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device using ``renderingIntent`` and - ``proofRenderingIntent`` to determine what to do with out-of-gamut - colors. This is known as "soft-proofing". It will ONLY work for - converting images that are in ``inMode`` to images that are in outMode - color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). - - Usage of the resulting transform object is exactly the same as with - ImageCms.buildTransform(). - - Proof profiling is generally used when using an output device to get a - good idea of what the final printed/displayed image would look like on - the ``proofProfile`` device when it's quicker and easier to use the - output device for judging color. Generally, this means that the - output device is a monitor, or a dye-sub printer (etc.), and the simulated - device is something more expensive, complicated, or time consuming - (making it difficult to make a real print for color judgement purposes). - - Soft-proofing basically functions by adjusting the colors on the - output device to match the colors of the device being simulated. However, - when the simulated device has a much wider gamut than the output - device, you may obtain marginal results. - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - (monitor, usually) profile you wish to use for this transform, or a - profile object - :param proofProfile: String, as a valid filename path to the ICC proof - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the input->proof (simulated) transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param proofRenderingIntent: Integer (0-3) specifying the rendering intent - you wish to use for proof->output transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - raise PyCMSError("renderingIntent must be an integer between 0 and 3") - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - if not isinstance(proofProfile, ImageCmsProfile): - proofProfile = ImageCmsProfile(proofProfile) - return ImageCmsTransform( - inputProfile, - outputProfile, - inMode, - outMode, - renderingIntent, - proofProfile, - proofRenderingIntent, - flags, - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -buildTransformFromOpenProfiles = buildTransform -buildProofTransformFromOpenProfiles = buildProofTransform - - -def applyTransform(im, transform, inPlace=False): - """ - (pyCMS) Applies a transform to a given image. - - If ``im.mode != transform.inMode``, a :exc:`PyCMSError` is raised. - - If ``inPlace`` is ``True`` and ``transform.inMode != transform.outMode``, a - :exc:`PyCMSError` is raised. - - If ``im.mode``, ``transform.inMode`` or ``transform.outMode`` is not - supported by pyCMSdll or the profiles you used for the transform, a - :exc:`PyCMSError` is raised. - - If an error occurs while the transform is being applied, - a :exc:`PyCMSError` is raised. - - This function applies a pre-calculated transform (from - ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) - to an image. The transform can be used for multiple images, saving - considerable calculation time if doing the same conversion multiple times. - - If you want to modify im in-place instead of receiving a new image as - the return value, set ``inPlace`` to ``True``. This can only be done if - ``transform.inMode`` and ``transform.outMode`` are the same, because we can't - change the mode in-place (the buffer sizes for some modes are - different). The default behavior is to return a new :py:class:`~PIL.Image.Image` - object of the same dimensions in mode ``transform.outMode``. - - :param im: An :py:class:`~PIL.Image.Image` object, and im.mode must be the same - as the ``inMode`` supported by the transform. - :param transform: A valid CmsTransform class object - :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is - returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the - transform applied is returned (and ``im`` is not changed). The default is - ``False``. - :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, - depending on the value of ``inPlace``. The profile will be returned in - the image's ``info['icc_profile']``. - :exception PyCMSError: - """ - - try: - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def createProfile(colorSpace, colorTemp=-1): - """ - (pyCMS) Creates a profile. - - If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, - a :exc:`PyCMSError` is raised. - - If using LAB and ``colorTemp`` is not a positive integer, - a :exc:`PyCMSError` is raised. - - If an error occurs while creating the profile, - a :exc:`PyCMSError` is raised. - - Use this function to create common profiles on-the-fly instead of - having to supply a profile on disk and knowing the path to it. It - returns a normal CmsProfile object that can be passed to - ImageCms.buildTransformFromOpenProfiles() to create a transform to apply - to images. - - :param colorSpace: String, the color space of the profile you wish to - create. - Currently only "LAB", "XYZ", and "sRGB" are supported. - :param colorTemp: Positive integer for the white point for the profile, in - degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 - illuminant if omitted (5000k). colorTemp is ONLY applied to LAB - profiles, and is ignored for XYZ and sRGB. - :returns: A CmsProfile class object - :exception PyCMSError: - """ - - if colorSpace not in ["LAB", "XYZ", "sRGB"]: - raise PyCMSError( - f"Color space not supported for on-the-fly profile creation ({colorSpace})" - ) - - if colorSpace == "LAB": - try: - colorTemp = float(colorTemp) - except (TypeError, ValueError) as e: - raise PyCMSError( - f'Color temperature must be numeric, "{colorTemp}" not valid' - ) from e - - try: - return core.createProfile(colorSpace, colorTemp) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileName(profile): - """ - - (pyCMS) Gets the internal product name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised If an error occurs while trying - to obtain the name tag, a :exc:`PyCMSError` is raised. - - Use this function to obtain the INTERNAL name of the profile (stored - in an ICC tag in the profile itself), usually the one used when the - profile was originally created. Sometimes this tag also contains - additional information supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal name of the profile as stored - in an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # do it in python, not c. - # // name was "%s - %s" (model, manufacturer) || Description , - # // but if the Model and Manufacturer were the same or the model - # // was long, Just the model, in 1.x - model = profile.profile.model - manufacturer = profile.profile.manufacturer - - if not (model or manufacturer): - return (profile.profile.profile_description or "") + "\n" - if not manufacturer or len(model) > 30: - return model + "\n" - return f"{model} - {manufacturer}\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileInfo(profile): - """ - (pyCMS) Gets the internal product information for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the info tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - info tag. This often contains details about the profile, and how it - was created, as supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # add an extra newline to preserve pyCMS compatibility - # Python, not C. the white point bits weren't working well, - # so skipping. - # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint - description = profile.profile.profile_description - cpright = profile.profile.copyright - arr = [] - for elt in (description, cpright): - if elt: - arr.append(elt) - return "\r\n\r\n".join(arr) + "\r\n\r\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileCopyright(profile): - """ - (pyCMS) Gets the copyright for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the copyright tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - copyright tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.copyright or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileManufacturer(profile): - """ - (pyCMS) Gets the manufacturer for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the manufacturer tag, a - :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - manufacturer tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.manufacturer or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileModel(profile): - """ - (pyCMS) Gets the model for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the model tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - model tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.model or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileDescription(profile): - """ - (pyCMS) Gets the description for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the description tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - description tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in an - ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.profile_description or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getDefaultIntent(profile): - """ - (pyCMS) Gets the default intent name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the default intent, a - :exc:`PyCMSError` is raised. - - Use this function to determine the default (and usually best optimized) - rendering intent for this profile. Most profiles support multiple - rendering intents, but are intended mostly for one type of conversion. - If you wish to use a different intent than returned, use - ImageCms.isIntentSupported() to verify it will work first. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: Integer 0-3 specifying the default rendering intent for this - profile. - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return profile.profile.rendering_intent - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def isIntentSupported(profile, intent, direction): - """ - (pyCMS) Checks if a given intent is supported. - - Use this function to verify that you can use your desired - ``intent`` with ``profile``, and that ``profile`` can be used for the - input/output/proof profile as you desire. - - Some profiles are created specifically for one "direction", can cannot - be used for others. Some profiles can only be used for certain - rendering intents, so it's best to either verify this before trying - to create a transform with them (using this function), or catch the - potential :exc:`PyCMSError` that will occur if they don't - support the modes you select. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :param intent: Integer (0-3) specifying the rendering intent you wish to - use with this profile - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param direction: Integer specifying if the profile is to be used for - input, output, or proof - - INPUT = 0 (or use ImageCms.Direction.INPUT) - OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) - PROOF = 2 (or use ImageCms.Direction.PROOF) - - :returns: 1 if the intent/direction are supported, -1 if they are not. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # FIXME: I get different results for the same data w. different - # compilers. Bug in LittleCMS or in the binding? - if profile.profile.is_intent_supported(intent, direction): - return 1 - else: - return -1 - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def versions(): - """ - (pyCMS) Fetches versions. - """ - - return VERSION, core.littlecms_version, sys.version.split()[0], Image.__version__ diff --git a/waypoint_manager/manager_GUI/PIL/ImageColor.py b/waypoint_manager/manager_GUI/PIL/ImageColor.py deleted file mode 100644 index 9cbce41..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageColor.py +++ /dev/null @@ -1,303 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# map CSS3-style colour description strings to RGB -# -# History: -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-15 fl Added RGBA support -# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 -# 2004-07-19 fl Fixed gray/grey spelling issues -# 2009-03-05 fl Fixed rounding error in grayscale calculation -# -# Copyright (c) 2002-2004 by Secret Labs AB -# Copyright (c) 2002-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import re - -from . import Image - - -def getrgb(color): - """ - Convert a color string to an RGB or RGBA tuple. If the string cannot be - parsed, this function raises a :py:exc:`ValueError` exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :return: ``(red, green, blue[, alpha])`` - """ - if len(color) > 100: - raise ValueError("color specifier is too long") - color = color.lower() - - rgb = colormap.get(color, None) - if rgb: - if isinstance(rgb, tuple): - return rgb - colormap[color] = rgb = getrgb(rgb) - return rgb - - # check for known string formats - if re.match("#[a-f0-9]{3}$", color): - return int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16) - - if re.match("#[a-f0-9]{4}$", color): - return ( - int(color[1] * 2, 16), - int(color[2] * 2, 16), - int(color[3] * 2, 16), - int(color[4] * 2, 16), - ) - - if re.match("#[a-f0-9]{6}$", color): - return int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) - - if re.match("#[a-f0-9]{8}$", color): - return ( - int(color[1:3], 16), - int(color[3:5], 16), - int(color[5:7], 16), - int(color[7:9], 16), - ) - - m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)) - - m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) - if m: - return ( - int((int(m.group(1)) * 255) / 100.0 + 0.5), - int((int(m.group(2)) * 255) / 100.0 + 0.5), - int((int(m.group(3)) * 255) / 100.0 + 0.5), - ) - - m = re.match( - r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hls_to_rgb - - rgb = hls_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(3)) / 100.0, - float(m.group(2)) / 100.0, - ) - return ( - int(rgb[0] * 255 + 0.5), - int(rgb[1] * 255 + 0.5), - int(rgb[2] * 255 + 0.5), - ) - - m = re.match( - r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hsv_to_rgb - - rgb = hsv_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(2)) / 100.0, - float(m.group(3)) / 100.0, - ) - return ( - int(rgb[0] * 255 + 0.5), - int(rgb[1] * 255 + 0.5), - int(rgb[2] * 255 + 0.5), - ) - - m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) - raise ValueError(f"unknown color specifier: {repr(color)}") - - -def getcolor(color, mode): - """ - Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a - greyscale value if ``mode`` is not color or a palette image. If the string - cannot be parsed, this function raises a :py:exc:`ValueError` exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :param mode: Convert result to this mode - :return: ``(graylevel[, alpha]) or (red, green, blue[, alpha])`` - """ - # same as getrgb, but converts the result to the given mode - color, alpha = getrgb(color), 255 - if len(color) == 4: - color, alpha = color[:3], color[3] - - if Image.getmodebase(mode) == "L": - r, g, b = color - # ITU-R Recommendation 601-2 for nonlinear RGB - # scaled to 24 bits to match the convert's implementation. - color = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 - if mode[-1] == "A": - return color, alpha - else: - if mode[-1] == "A": - return color + (alpha,) - return color - - -colormap = { - # X11 colour table from https://drafts.csswg.org/css-color-4/, with - # gray/grey spelling issues fixed. This is a superset of HTML 4.0 - # colour names used in CSS 1. - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "black": "#000000", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgrey": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkslategrey": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dimgrey": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "grey": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred": "#cd5c5c", - "indigo": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgreen": "#90ee90", - "lightgray": "#d3d3d3", - "lightgrey": "#d3d3d3", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightslategrey": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370db", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#db7093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "rebeccapurple": "#663399", - "red": "#ff0000", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "slategrey": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "white": "#ffffff", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32", -} diff --git a/waypoint_manager/manager_GUI/PIL/ImageDraw.py b/waypoint_manager/manager_GUI/PIL/ImageDraw.py deleted file mode 100644 index 8970471..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageDraw.py +++ /dev/null @@ -1,1044 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# drawing interface operations -# -# History: -# 1996-04-13 fl Created (experimental) -# 1996-08-07 fl Filled polygons, ellipses. -# 1996-08-13 fl Added text support -# 1998-06-28 fl Handle I and F images -# 1998-12-29 fl Added arc; use arc primitive to draw ellipses -# 1999-01-10 fl Added shape stuff (experimental) -# 1999-02-06 fl Added bitmap support -# 1999-02-11 fl Changed all primitives to take options -# 1999-02-20 fl Fixed backwards compatibility -# 2000-10-12 fl Copy on write, when necessary -# 2001-02-18 fl Use default ink for bitmap/text also in fill mode -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing -# 2002-12-11 fl Refactored low-level drawing API (work in progress) -# 2004-08-26 fl Made Draw() a factory function, added getdraw() support -# 2004-09-04 fl Added width support to line primitive -# 2004-09-10 fl Added font mode handling -# 2006-06-19 fl Added font bearing support (getmask2) -# -# Copyright (c) 1997-2006 by Secret Labs AB -# Copyright (c) 1996-2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import math -import numbers -import warnings - -from . import Image, ImageColor -from ._deprecate import deprecate - -""" -A simple 2D drawing interface for PIL images. -

-Application code should use the Draw factory, instead of -directly. -""" - - -class ImageDraw: - def __init__(self, im, mode=None): - """ - Create a drawing instance. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - im.load() - if im.readonly: - im._copy() # make it writeable - blend = 0 - if mode is None: - mode = im.mode - if mode != im.mode: - if mode == "RGBA" and im.mode == "RGB": - blend = 1 - else: - raise ValueError("mode mismatch") - if mode == "P": - self.palette = im.palette - else: - self.palette = None - self._image = im - self.im = im.im - self.draw = Image.core.draw(self.im, blend) - self.mode = mode - if mode in ("I", "F"): - self.ink = self.draw.draw_ink(1) - else: - self.ink = self.draw.draw_ink(-1) - if mode in ("1", "P", "I", "F"): - # FIXME: fix Fill2 to properly support matte for I+F images - self.fontmode = "1" - else: - self.fontmode = "L" # aliasing is okay for other modes - self.fill = 0 - self.font = None - - def getfont(self): - """ - Get the current default font. - - :returns: An image font.""" - if not self.font: - # FIXME: should add a font repository - from . import ImageFont - - self.font = ImageFont.load_default() - return self.font - - def _getink(self, ink, fill=None): - if ink is None and fill is None: - if self.fill: - fill = self.ink - else: - ink = self.ink - else: - if ink is not None: - if isinstance(ink, str): - ink = ImageColor.getcolor(ink, self.mode) - if self.palette and not isinstance(ink, numbers.Number): - ink = self.palette.getcolor(ink, self._image) - ink = self.draw.draw_ink(ink) - if fill is not None: - if isinstance(fill, str): - fill = ImageColor.getcolor(fill, self.mode) - if self.palette and not isinstance(fill, numbers.Number): - fill = self.palette.getcolor(fill, self._image) - fill = self.draw.draw_ink(fill) - return ink, fill - - def arc(self, xy, start, end, fill=None, width=1): - """Draw an arc.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_arc(xy, start, end, ink, width) - - def bitmap(self, xy, bitmap, fill=None): - """Draw a bitmap.""" - bitmap.load() - ink, fill = self._getink(fill) - if ink is None: - ink = fill - if ink is not None: - self.draw.draw_bitmap(xy, bitmap.im, ink) - - def chord(self, xy, start, end, fill=None, outline=None, width=1): - """Draw a chord.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_chord(xy, start, end, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_chord(xy, start, end, ink, 0, width) - - def ellipse(self, xy, fill=None, outline=None, width=1): - """Draw an ellipse.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_ellipse(xy, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_ellipse(xy, ink, 0, width) - - def line(self, xy, fill=None, width=0, joint=None): - """Draw a line, or a connected sequence of line segments.""" - ink = self._getink(fill)[0] - if ink is not None: - self.draw.draw_lines(xy, ink, width) - if joint == "curve" and width > 4: - if not isinstance(xy[0], (list, tuple)): - xy = [tuple(xy[i : i + 2]) for i in range(0, len(xy), 2)] - for i in range(1, len(xy) - 1): - point = xy[i] - angles = [ - math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) - % 360 - for start, end in ((xy[i - 1], point), (point, xy[i + 1])) - ] - if angles[0] == angles[1]: - # This is a straight line, so no joint is required - continue - - def coord_at_angle(coord, angle): - x, y = coord - angle -= 90 - distance = width / 2 - 1 - return tuple( - p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) - for p, p_d in ( - (x, distance * math.cos(math.radians(angle))), - (y, distance * math.sin(math.radians(angle))), - ) - ) - - flipped = ( - angles[1] > angles[0] and angles[1] - 180 > angles[0] - ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) - coords = [ - (point[0] - width / 2 + 1, point[1] - width / 2 + 1), - (point[0] + width / 2 - 1, point[1] + width / 2 - 1), - ] - if flipped: - start, end = (angles[1] + 90, angles[0] + 90) - else: - start, end = (angles[0] - 90, angles[1] - 90) - self.pieslice(coords, start - 90, end - 90, fill) - - if width > 8: - # Cover potential gaps between the line and the joint - if flipped: - gap_coords = [ - coord_at_angle(point, angles[0] + 90), - point, - coord_at_angle(point, angles[1] + 90), - ] - else: - gap_coords = [ - coord_at_angle(point, angles[0] - 90), - point, - coord_at_angle(point, angles[1] - 90), - ] - self.line(gap_coords, fill, width=3) - - def shape(self, shape, fill=None, outline=None): - """(Experimental) Draw a shape.""" - shape.close() - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_outline(shape, fill, 1) - if ink is not None and ink != fill: - self.draw.draw_outline(shape, ink, 0) - - def pieslice(self, xy, start, end, fill=None, outline=None, width=1): - """Draw a pieslice.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_pieslice(xy, start, end, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_pieslice(xy, start, end, ink, 0, width) - - def point(self, xy, fill=None): - """Draw one or more individual pixels.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_points(xy, ink) - - def polygon(self, xy, fill=None, outline=None, width=1): - """Draw a polygon.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_polygon(xy, fill, 1) - if ink is not None and ink != fill and width != 0: - if width == 1: - self.draw.draw_polygon(xy, ink, 0, width) - else: - # To avoid expanding the polygon outwards, - # use the fill as a mask - mask = Image.new("1", self.im.size) - mask_ink = self._getink(1)[0] - - fill_im = mask.copy() - draw = Draw(fill_im) - draw.draw.draw_polygon(xy, mask_ink, 1) - - ink_im = mask.copy() - draw = Draw(ink_im) - width = width * 2 - 1 - draw.draw.draw_polygon(xy, mask_ink, 0, width) - - mask.paste(ink_im, mask=fill_im) - - im = Image.new(self.mode, self.im.size) - draw = Draw(im) - draw.draw.draw_polygon(xy, ink, 0, width) - self.im.paste(im.im, (0, 0) + im.size, mask.im) - - def regular_polygon( - self, bounding_circle, n_sides, rotation=0, fill=None, outline=None - ): - """Draw a regular polygon.""" - xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) - self.polygon(xy, fill, outline) - - def rectangle(self, xy, fill=None, outline=None, width=1): - """Draw a rectangle.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_rectangle(xy, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_rectangle(xy, ink, 0, width) - - def rounded_rectangle(self, xy, radius=0, fill=None, outline=None, width=1): - """Draw a rounded rectangle.""" - if isinstance(xy[0], (list, tuple)): - (x0, y0), (x1, y1) = xy - else: - x0, y0, x1, y1 = xy - - d = radius * 2 - - full_x = d >= x1 - x0 - if full_x: - # The two left and two right corners are joined - d = x1 - x0 - full_y = d >= y1 - y0 - if full_y: - # The two top and two bottom corners are joined - d = y1 - y0 - if full_x and full_y: - # If all corners are joined, that is a circle - return self.ellipse(xy, fill, outline, width) - - if d == 0: - # If the corners have no curve, that is a rectangle - return self.rectangle(xy, fill, outline, width) - - r = d // 2 - ink, fill = self._getink(outline, fill) - - def draw_corners(pieslice): - if full_x: - # Draw top and bottom halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 180, 360), - ((x0, y1 - d, x0 + d, y1), 0, 180), - ) - elif full_y: - # Draw left and right halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 90, 270), - ((x1 - d, y0, x1, y0 + d), 270, 90), - ) - else: - # Draw four separate corners - parts = ( - ((x1 - d, y0, x1, y0 + d), 270, 360), - ((x1 - d, y1 - d, x1, y1), 0, 90), - ((x0, y1 - d, x0 + d, y1), 90, 180), - ((x0, y0, x0 + d, y0 + d), 180, 270), - ) - for part in parts: - if pieslice: - self.draw.draw_pieslice(*(part + (fill, 1))) - else: - self.draw.draw_arc(*(part + (ink, width))) - - if fill is not None: - draw_corners(True) - - if full_x: - self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill, 1) - else: - self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill, 1) - if not full_x and not full_y: - self.draw.draw_rectangle((x0, y0 + r + 1, x0 + r, y1 - r - 1), fill, 1) - self.draw.draw_rectangle((x1 - r, y0 + r + 1, x1, y1 - r - 1), fill, 1) - if ink is not None and ink != fill and width != 0: - draw_corners(False) - - if not full_x: - self.draw.draw_rectangle( - (x0 + r + 1, y0, x1 - r - 1, y0 + width - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x0 + r + 1, y1 - width + 1, x1 - r - 1, y1), ink, 1 - ) - if not full_y: - self.draw.draw_rectangle( - (x0, y0 + r + 1, x0 + width - 1, y1 - r - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x1 - width + 1, y0 + r + 1, x1, y1 - r - 1), ink, 1 - ) - - def _multiline_check(self, text): - """Draw text.""" - split_character = "\n" if isinstance(text, str) else b"\n" - - return split_character in text - - def _multiline_split(self, text): - split_character = "\n" if isinstance(text, str) else b"\n" - - return text.split(split_character) - - def _multiline_spacing(self, font, spacing, stroke_width): - # this can be replaced with self.textbbox(...)[3] when textsize is removed - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - return ( - self.textsize( - "A", - font=font, - stroke_width=stroke_width, - )[1] - + spacing - ) - - def text( - self, - xy, - text, - fill=None, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - stroke_fill=None, - embedded_color=False, - *args, - **kwargs, - ): - if self._multiline_check(text): - return self.multiline_text( - xy, - text, - fill, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - stroke_fill, - embedded_color, - ) - - if embedded_color and self.mode not in ("RGB", "RGBA"): - raise ValueError("Embedded color supported only in RGB and RGBA modes") - - if font is None: - font = self.getfont() - - def getink(fill): - ink, fill = self._getink(fill) - if ink is None: - return fill - return ink - - def draw_text(ink, stroke_width=0, stroke_offset=None): - mode = self.fontmode - if stroke_width == 0 and embedded_color: - mode = "RGBA" - coord = xy - try: - mask, offset = font.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - *args, - **kwargs, - ) - coord = coord[0] + offset[0], coord[1] + offset[1] - except AttributeError: - try: - mask = font.getmask( - text, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - *args, - **kwargs, - ) - except TypeError: - mask = font.getmask(text) - if stroke_offset: - coord = coord[0] + stroke_offset[0], coord[1] + stroke_offset[1] - if mode == "RGBA": - # font.getmask2(mode="RGBA") returns color in RGB bands and mask in A - # extract mask and set text alpha - color, mask = mask, mask.getband(3) - color.fillband(3, (ink >> 24) & 0xFF) - coord2 = coord[0] + mask.size[0], coord[1] + mask.size[1] - self.im.paste(color, coord + coord2, mask) - else: - self.draw.draw_bitmap(coord, mask, ink) - - ink = getink(fill) - if ink is not None: - stroke_ink = None - if stroke_width: - stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink - - if stroke_ink is not None: - # Draw stroked text - draw_text(stroke_ink, stroke_width) - - # Draw normal text - draw_text(ink, 0) - else: - # Only draw normal text - draw_text(ink) - - def multiline_text( - self, - xy, - text, - fill=None, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - stroke_fill=None, - embedded_color=False, - ): - if direction == "ttb": - raise ValueError("ttb direction is unsupported for multiline text") - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - raise ValueError("anchor must be a 2 character string") - elif anchor[1] in "tb": - raise ValueError("anchor not supported for multiline text") - - widths = [] - max_width = 0 - lines = self._multiline_split(text) - line_spacing = self._multiline_spacing(font, spacing, stroke_width) - for line in lines: - line_width = self.textlength( - line, font, direction=direction, features=features, language=language - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - raise ValueError('align must be "left", "center" or "right"') - - self.text( - (left, top), - line, - fill, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - stroke_fill=stroke_fill, - embedded_color=embedded_color, - ) - top += line_spacing - - def textsize( - self, - text, - font=None, - spacing=4, - direction=None, - features=None, - language=None, - stroke_width=0, - ): - """Get the size of a given string, in pixels.""" - deprecate("textsize", 10, "textbbox or textlength") - if self._multiline_check(text): - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - return self.multiline_textsize( - text, - font, - spacing, - direction, - features, - language, - stroke_width, - ) - - if font is None: - font = self.getfont() - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - return font.getsize( - text, - direction, - features, - language, - stroke_width, - ) - - def multiline_textsize( - self, - text, - font=None, - spacing=4, - direction=None, - features=None, - language=None, - stroke_width=0, - ): - deprecate("multiline_textsize", 10, "multiline_textbbox") - max_width = 0 - lines = self._multiline_split(text) - line_spacing = self._multiline_spacing(font, spacing, stroke_width) - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - for line in lines: - line_width, line_height = self.textsize( - line, - font, - spacing, - direction, - features, - language, - stroke_width, - ) - max_width = max(max_width, line_width) - return max_width, len(lines) * line_spacing - spacing - - def textlength( - self, - text, - font=None, - direction=None, - features=None, - language=None, - embedded_color=False, - ): - """Get the length of a given string, in pixels with 1/64 precision.""" - if self._multiline_check(text): - raise ValueError("can't measure length of multiline text") - if embedded_color and self.mode not in ("RGB", "RGBA"): - raise ValueError("Embedded color supported only in RGB and RGBA modes") - - if font is None: - font = self.getfont() - mode = "RGBA" if embedded_color else self.fontmode - try: - return font.getlength(text, mode, direction, features, language) - except AttributeError: - deprecate("textlength support for fonts without getlength", 10) - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - size = self.textsize( - text, - font, - direction=direction, - features=features, - language=language, - ) - if direction == "ttb": - return size[1] - return size[0] - - def textbbox( - self, - xy, - text, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - embedded_color=False, - ): - """Get the bounding box of a given string, in pixels.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - raise ValueError("Embedded color supported only in RGB and RGBA modes") - - if self._multiline_check(text): - return self.multiline_textbbox( - xy, - text, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - embedded_color, - ) - - if font is None: - font = self.getfont() - mode = "RGBA" if embedded_color else self.fontmode - bbox = font.getbbox( - text, mode, direction, features, language, stroke_width, anchor - ) - return bbox[0] + xy[0], bbox[1] + xy[1], bbox[2] + xy[0], bbox[3] + xy[1] - - def multiline_textbbox( - self, - xy, - text, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - embedded_color=False, - ): - if direction == "ttb": - raise ValueError("ttb direction is unsupported for multiline text") - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - raise ValueError("anchor must be a 2 character string") - elif anchor[1] in "tb": - raise ValueError("anchor not supported for multiline text") - - widths = [] - max_width = 0 - lines = self._multiline_split(text) - line_spacing = self._multiline_spacing(font, spacing, stroke_width) - for line in lines: - line_width = self.textlength( - line, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - bbox = None - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - raise ValueError('align must be "left", "center" or "right"') - - bbox_line = self.textbbox( - (left, top), - line, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - embedded_color=embedded_color, - ) - if bbox is None: - bbox = bbox_line - else: - bbox = ( - min(bbox[0], bbox_line[0]), - min(bbox[1], bbox_line[1]), - max(bbox[2], bbox_line[2]), - max(bbox[3], bbox_line[3]), - ) - - top += line_spacing - - if bbox is None: - return xy[0], xy[1], xy[0], xy[1] - return bbox - - -def Draw(im, mode=None): - """ - A simple 2D drawing interface for PIL images. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - try: - return im.getdraw(mode) - except AttributeError: - return ImageDraw(im, mode) - - -# experimental access to the outline API -try: - Outline = Image.core.outline -except AttributeError: - Outline = None - - -def getdraw(im=None, hints=None): - """ - (Experimental) A more advanced 2D drawing interface for PIL images, - based on the WCK interface. - - :param im: The image to draw in. - :param hints: An optional list of hints. - :returns: A (drawing context, drawing resource factory) tuple. - """ - # FIXME: this needs more work! - # FIXME: come up with a better 'hints' scheme. - handler = None - if not hints or "nicest" in hints: - try: - from . import _imagingagg as handler - except ImportError: - pass - if handler is None: - from . import ImageDraw2 as handler - if im: - im = handler.Draw(im) - return im, handler - - -def floodfill(image, xy, value, border=None, thresh=0): - """ - (experimental) Fills a bounded region with a given color. - - :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). See - :ref:`coordinate-system`. - :param value: Fill color. - :param border: Optional border value. If given, the region consists of - pixels with a color different from the border color. If not given, - the region consists of pixels having the same color as the seed - pixel. - :param thresh: Optional threshold value which specifies a maximum - tolerable difference of a pixel value from the 'background' in - order for it to be replaced. Useful for filling regions of - non-homogeneous, but similar, colors. - """ - # based on an implementation by Eric S. Raymond - # amended by yo1995 @20180806 - pixel = image.load() - x, y = xy - try: - background = pixel[x, y] - if _color_diff(value, background) <= thresh: - return # seed point already has fill color - pixel[x, y] = value - except (ValueError, IndexError): - return # seed point outside image - edge = {(x, y)} - # use a set to keep record of current and previous edge pixels - # to reduce memory consumption - full_edge = set() - while edge: - new_edge = set() - for (x, y) in edge: # 4 adjacent method - for (s, t) in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): - # If already processed, or if a coordinate is negative, skip - if (s, t) in full_edge or s < 0 or t < 0: - continue - try: - p = pixel[s, t] - except (ValueError, IndexError): - pass - else: - full_edge.add((s, t)) - if border is None: - fill = _color_diff(p, background) <= thresh - else: - fill = p != value and p != border - if fill: - pixel[s, t] = value - new_edge.add((s, t)) - full_edge = edge # discard pixels processed - edge = new_edge - - -def _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation): - """ - Generate a list of vertices for a 2D regular polygon. - - :param bounding_circle: The bounding circle is a tuple defined - by a point and radius. The polygon is inscribed in this circle. - (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) - :param n_sides: Number of sides - (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) - :param rotation: Apply an arbitrary rotation to the polygon - (e.g. ``rotation=90``, applies a 90 degree rotation) - :return: List of regular polygon vertices - (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) - - How are the vertices computed? - 1. Compute the following variables - - theta: Angle between the apothem & the nearest polygon vertex - - side_length: Length of each polygon edge - - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) - - polygon_radius: Polygon radius (last element of bounding_circle) - - angles: Location of each polygon vertex in polar grid - (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) - - 2. For each angle in angles, get the polygon vertex at that angle - The vertex is computed using the equation below. - X= xcos(φ) + ysin(φ) - Y= −xsin(φ) + ycos(φ) - - Note: - φ = angle in degrees - x = 0 - y = polygon_radius - - The formula above assumes rotation around the origin. - In our case, we are rotating around the centroid. - To account for this, we use the formula below - X = xcos(φ) + ysin(φ) + centroid_x - Y = −xsin(φ) + ycos(φ) + centroid_y - """ - # 1. Error Handling - # 1.1 Check `n_sides` has an appropriate value - if not isinstance(n_sides, int): - raise TypeError("n_sides should be an int") - if n_sides < 3: - raise ValueError("n_sides should be an int > 2") - - # 1.2 Check `bounding_circle` has an appropriate value - if not isinstance(bounding_circle, (list, tuple)): - raise TypeError("bounding_circle should be a tuple") - - if len(bounding_circle) == 3: - *centroid, polygon_radius = bounding_circle - elif len(bounding_circle) == 2: - centroid, polygon_radius = bounding_circle - else: - raise ValueError( - "bounding_circle should contain 2D coordinates " - "and a radius (e.g. (x, y, r) or ((x, y), r) )" - ) - - if not all(isinstance(i, (int, float)) for i in (*centroid, polygon_radius)): - raise ValueError("bounding_circle should only contain numeric data") - - if not len(centroid) == 2: - raise ValueError( - "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" - ) - - if polygon_radius <= 0: - raise ValueError("bounding_circle radius should be > 0") - - # 1.3 Check `rotation` has an appropriate value - if not isinstance(rotation, (int, float)): - raise ValueError("rotation should be an int or float") - - # 2. Define Helper Functions - def _apply_rotation(point, degrees, centroid): - return ( - round( - point[0] * math.cos(math.radians(360 - degrees)) - - point[1] * math.sin(math.radians(360 - degrees)) - + centroid[0], - 2, - ), - round( - point[1] * math.cos(math.radians(360 - degrees)) - + point[0] * math.sin(math.radians(360 - degrees)) - + centroid[1], - 2, - ), - ) - - def _compute_polygon_vertex(centroid, polygon_radius, angle): - start_point = [polygon_radius, 0] - return _apply_rotation(start_point, angle, centroid) - - def _get_angles(n_sides, rotation): - angles = [] - degrees = 360 / n_sides - # Start with the bottom left polygon vertex - current_angle = (270 - 0.5 * degrees) + rotation - for _ in range(0, n_sides): - angles.append(current_angle) - current_angle += degrees - if current_angle > 360: - current_angle -= 360 - return angles - - # 3. Variable Declarations - angles = _get_angles(n_sides, rotation) - - # 4. Compute Vertices - return [ - _compute_polygon_vertex(centroid, polygon_radius, angle) for angle in angles - ] - - -def _color_diff(color1, color2): - """ - Uses 1-norm distance to calculate difference between two values. - """ - if isinstance(color2, tuple): - return sum(abs(color1[i] - color2[i]) for i in range(0, len(color2))) - else: - return abs(color1 - color2) diff --git a/waypoint_manager/manager_GUI/PIL/ImageDraw2.py b/waypoint_manager/manager_GUI/PIL/ImageDraw2.py deleted file mode 100644 index 2667b77..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageDraw2.py +++ /dev/null @@ -1,209 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WCK-style drawing interface operations -# -# History: -# 2003-12-07 fl created -# 2005-05-15 fl updated; added to PIL as ImageDraw2 -# 2005-05-15 fl added text support -# 2005-05-20 fl added arc/chord/pieslice support -# -# Copyright (c) 2003-2005 by Secret Labs AB -# Copyright (c) 2003-2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -""" -(Experimental) WCK-style drawing interface operations - -.. seealso:: :py:mod:`PIL.ImageDraw` -""" - - -import warnings - -from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath -from ._deprecate import deprecate - - -class Pen: - """Stores an outline color and width.""" - - def __init__(self, color, width=1, opacity=255): - self.color = ImageColor.getrgb(color) - self.width = width - - -class Brush: - """Stores a fill color""" - - def __init__(self, color, opacity=255): - self.color = ImageColor.getrgb(color) - - -class Font: - """Stores a TrueType font and color""" - - def __init__(self, color, file, size=12): - # FIXME: add support for bitmap fonts - self.color = ImageColor.getrgb(color) - self.font = ImageFont.truetype(file, size) - - -class Draw: - """ - (Experimental) WCK-style drawing interface - """ - - def __init__(self, image, size=None, color=None): - if not hasattr(image, "im"): - image = Image.new(image, size, color) - self.draw = ImageDraw.Draw(image) - self.image = image - self.transform = None - - def flush(self): - return self.image - - def render(self, op, xy, pen, brush=None): - # handle color arguments - outline = fill = None - width = 1 - if isinstance(pen, Pen): - outline = pen.color - width = pen.width - elif isinstance(brush, Pen): - outline = brush.color - width = brush.width - if isinstance(brush, Brush): - fill = brush.color - elif isinstance(pen, Brush): - fill = pen.color - # handle transformation - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - # render the item - if op == "line": - self.draw.line(xy, fill=outline, width=width) - else: - getattr(self.draw, op)(xy, fill=fill, outline=outline) - - def settransform(self, offset): - """Sets a transformation offset.""" - (xoffset, yoffset) = offset - self.transform = (1, 0, xoffset, 0, 1, yoffset) - - def arc(self, xy, start, end, *options): - """ - Draws an arc (a portion of a circle outline) between the start and end - angles, inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` - """ - self.render("arc", xy, start, end, *options) - - def chord(self, xy, start, end, *options): - """ - Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points - with a straight line. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` - """ - self.render("chord", xy, start, end, *options) - - def ellipse(self, xy, *options): - """ - Draws an ellipse inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` - """ - self.render("ellipse", xy, *options) - - def line(self, xy, *options): - """ - Draws a line between the coordinates in the ``xy`` list. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` - """ - self.render("line", xy, *options) - - def pieslice(self, xy, start, end, *options): - """ - Same as arc, but also draws straight lines between the end points and the - center of the bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` - """ - self.render("pieslice", xy, start, end, *options) - - def polygon(self, xy, *options): - """ - Draws a polygon. - - The polygon outline consists of straight lines between the given - coordinates, plus a straight line between the last and the first - coordinate. - - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` - """ - self.render("polygon", xy, *options) - - def rectangle(self, xy, *options): - """ - Draws a rectangle. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` - """ - self.render("rectangle", xy, *options) - - def text(self, xy, text, font): - """ - Draws the string at the given position. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` - """ - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - self.draw.text(xy, text, font=font.font, fill=font.color) - - def textsize(self, text, font): - """ - .. deprecated:: 9.2.0 - - Return the size of the given string, in pixels. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textsize` - """ - deprecate("textsize", 10, "textbbox or textlength") - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - return self.draw.textsize(text, font=font.font) - - def textbbox(self, xy, text, font): - """ - Returns bounding box (in pixels) of given text. - - :return: ``(left, top, right, bottom)`` bounding box - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` - """ - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - return self.draw.textbbox(xy, text, font=font.font) - - def textlength(self, text, font): - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` - """ - return self.draw.textlength(text, font=font.font) diff --git a/waypoint_manager/manager_GUI/PIL/ImageEnhance.py b/waypoint_manager/manager_GUI/PIL/ImageEnhance.py deleted file mode 100644 index 3b79d5c..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageEnhance.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image enhancement classes -# -# For a background, see "Image Processing By Interpolation and -# Extrapolation", Paul Haeberli and Douglas Voorhies. Available -# at http://www.graficaobscura.com/interp/index.html -# -# History: -# 1996-03-23 fl Created -# 2009-06-16 fl Fixed mean calculation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFilter, ImageStat - - -class _Enhance: - def enhance(self, factor): - """ - Returns an enhanced image. - - :param factor: A floating point value controlling the enhancement. - Factor 1.0 always returns a copy of the original image, - lower factors mean less color (brightness, contrast, - etc), and higher values more. There are no restrictions - on this value. - :rtype: :py:class:`~PIL.Image.Image` - """ - return Image.blend(self.degenerate, self.image, factor) - - -class Color(_Enhance): - """Adjust image color balance. - - This class can be used to adjust the colour balance of an image, in - a manner similar to the controls on a colour TV set. An enhancement - factor of 0.0 gives a black and white image. A factor of 1.0 gives - the original image. - """ - - def __init__(self, image): - self.image = image - self.intermediate_mode = "L" - if "A" in image.getbands(): - self.intermediate_mode = "LA" - - self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) - - -class Contrast(_Enhance): - """Adjust image contrast. - - This class can be used to control the contrast of an image, similar - to the contrast control on a TV set. An enhancement factor of 0.0 - gives a solid grey image. A factor of 1.0 gives the original image. - """ - - def __init__(self, image): - self.image = image - mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) - self.degenerate = Image.new("L", image.size, mean).convert(image.mode) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Brightness(_Enhance): - """Adjust image brightness. - - This class can be used to control the brightness of an image. An - enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the - original image. - """ - - def __init__(self, image): - self.image = image - self.degenerate = Image.new(image.mode, image.size, 0) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Sharpness(_Enhance): - """Adjust image sharpness. - - This class can be used to adjust the sharpness of an image. An - enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the - original image, and a factor of 2.0 gives a sharpened image. - """ - - def __init__(self, image): - self.image = image - self.degenerate = image.filter(ImageFilter.SMOOTH) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) diff --git a/waypoint_manager/manager_GUI/PIL/ImageFile.py b/waypoint_manager/manager_GUI/PIL/ImageFile.py deleted file mode 100644 index 99b77a3..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageFile.py +++ /dev/null @@ -1,748 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# base class for image file handlers -# -# history: -# 1995-09-09 fl Created -# 1996-03-11 fl Fixed load mechanism. -# 1996-04-15 fl Added pcx/xbm decoders. -# 1996-04-30 fl Added encoders. -# 1996-12-14 fl Added load helpers -# 1997-01-11 fl Use encode_to_file where possible -# 1997-08-27 fl Flush output in _save -# 1998-03-05 fl Use memory mapping for some modes -# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" -# 1999-05-31 fl Added image parser -# 2000-10-12 fl Set readonly flag on memory-mapped images -# 2002-03-20 fl Use better messages for common decoder errors -# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available -# 2003-10-30 fl Added StubImageFile class -# 2004-02-25 fl Made incremental parser more robust -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import io -import itertools -import struct -import sys - -from . import Image -from ._util import is_path - -MAXBLOCK = 65536 - -SAFEBLOCK = 1024 * 1024 - -LOAD_TRUNCATED_IMAGES = False -"""Whether or not to load truncated image files. User code may change this.""" - -ERRORS = { - -1: "image buffer overrun error", - -2: "decoding error", - -3: "unknown error", - -8: "bad configuration", - -9: "out of memory error", -} -""" -Dict of known error codes returned from :meth:`.PyDecoder.decode`, -:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and -:meth:`.PyEncoder.encode_to_file`. -""" - - -# -# -------------------------------------------------------------------- -# Helpers - - -def raise_oserror(error): - try: - message = Image.core.getcodecstatus(error) - except AttributeError: - message = ERRORS.get(error) - if not message: - message = f"decoder error {error}" - raise OSError(message + " when reading image file") - - -def _tilesort(t): - # sort on offset - return t[2] - - -# -# -------------------------------------------------------------------- -# ImageFile base class - - -class ImageFile(Image.Image): - """Base class for image file format handlers.""" - - def __init__(self, fp=None, filename=None): - super().__init__() - - self._min_frame = 0 - - self.custom_mimetype = None - - self.tile = None - """ A list of tile descriptors, or ``None`` """ - - self.readonly = 1 # until we know better - - self.decoderconfig = () - self.decodermaxblock = MAXBLOCK - - if is_path(fp): - # filename - self.fp = open(fp, "rb") - self.filename = fp - self._exclusive_fp = True - else: - # stream - self.fp = fp - self.filename = filename - # can be overridden - self._exclusive_fp = None - - try: - try: - self._open() - except ( - IndexError, # end of data - TypeError, # end of data (ord) - KeyError, # unsupported mode - EOFError, # got header but not the first frame - struct.error, - ) as v: - raise SyntaxError(v) from v - - if not self.mode or self.size[0] <= 0 or self.size[1] <= 0: - raise SyntaxError("not identified by this driver") - except BaseException: - # close the file only if we have opened it this constructor - if self._exclusive_fp: - self.fp.close() - raise - - def get_format_mimetype(self): - if self.custom_mimetype: - return self.custom_mimetype - if self.format is not None: - return Image.MIME.get(self.format.upper()) - - def verify(self): - """Check file integrity""" - - # raise exception if something's wrong. must be called - # directly after open, and closes file when finished. - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def load(self): - """Load image data based on tile list""" - - if self.tile is None: - raise OSError("cannot load this image") - - pixel = Image.Image.load(self) - if not self.tile: - return pixel - - self.map = None - use_mmap = self.filename and len(self.tile) == 1 - # As of pypy 2.1.0, memory mapping was failing here. - use_mmap = use_mmap and not hasattr(sys, "pypy_version_info") - - readonly = 0 - - # look for read/seek overrides - try: - read = self.load_read - # don't use mmap if there are custom read/seek functions - use_mmap = False - except AttributeError: - read = self.fp.read - - try: - seek = self.load_seek - use_mmap = False - except AttributeError: - seek = self.fp.seek - - if use_mmap: - # try memory mapping - decoder_name, extents, offset, args = self.tile[0] - if ( - decoder_name == "raw" - and len(args) >= 3 - and args[0] == self.mode - and args[0] in Image._MAPMODES - ): - try: - # use mmap, if possible - import mmap - - with open(self.filename) as fp: - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, offset, args - ) - readonly = 1 - # After trashing self.im, - # we might need to reload the palette data. - if self.palette: - self.palette.dirty = 1 - except (AttributeError, OSError, ImportError): - self.map = None - - self.load_prepare() - err_code = -3 # initialize to unknown error - if not self.map: - # sort tiles in file order - self.tile.sort(key=_tilesort) - - try: - # FIXME: This is a hack to handle TIFF's JpegTables tag. - prefix = self.tile_prefix - except AttributeError: - prefix = b"" - - # Remove consecutive duplicates that only differ by their offset - self.tile = [ - list(tiles)[-1] - for _, tiles in itertools.groupby( - self.tile, lambda tile: (tile[0], tile[1], tile[3]) - ) - ] - for decoder_name, extents, offset, args in self.tile: - seek(offset) - decoder = Image._getdecoder( - self.mode, decoder_name, args, self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - if decoder.pulls_fd: - decoder.setfd(self.fp) - err_code = decoder.decode(b"")[1] - else: - b = prefix - while True: - try: - s = read(self.decodermaxblock) - except (IndexError, struct.error) as e: - # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - raise OSError("image file is truncated") from e - - if not s: # truncated jpeg - if LOAD_TRUNCATED_IMAGES: - break - else: - raise OSError( - "image file is truncated " - f"({len(b)} bytes not processed)" - ) - - b = b + s - n, err_code = decoder.decode(b) - if n < 0: - break - b = b[n:] - finally: - # Need to cleanup here to prevent leaks - decoder.cleanup() - - self.tile = [] - self.readonly = readonly - - self.load_end() - - if self._exclusive_fp and self._close_exclusive_fp_after_loading: - self.fp.close() - self.fp = None - - if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: - # still raised if decoder fails to return anything - raise_oserror(err_code) - - return Image.Image.load(self) - - def load_prepare(self): - # create image memory if necessary - if not self.im or self.im.mode != self.mode or self.im.size != self.size: - self.im = Image.core.new(self.mode, self.size) - # create palette (optional) - if self.mode == "P": - Image.Image.load(self) - - def load_end(self): - # may be overridden - pass - - # may be defined for contained formats - # def load_seek(self, pos): - # pass - - # may be defined for blocked formats (e.g. PNG) - # def load_read(self, bytes): - # pass - - def _seek_check(self, frame): - if ( - frame < self._min_frame - # Only check upper limit on frames if additional seek operations - # are not required to do so - or ( - not (hasattr(self, "_n_frames") and self._n_frames is None) - and frame >= self.n_frames + self._min_frame - ) - ): - raise EOFError("attempt to seek outside sequence") - - return self.tell() != frame - - -class StubImageFile(ImageFile): - """ - Base class for stub image loaders. - - A stub loader is an image loader that can identify files of a - certain format, but relies on external code to load the file. - """ - - def _open(self): - raise NotImplementedError("StubImageFile subclass must implement _open") - - def load(self): - loader = self._load() - if loader is None: - raise OSError(f"cannot find loader for this {self.format} file") - image = loader.load(self) - assert image is not None - # become the other object (!) - self.__class__ = image.__class__ - self.__dict__ = image.__dict__ - return image.load() - - def _load(self): - """(Hook) Find actual image loader.""" - raise NotImplementedError("StubImageFile subclass must implement _load") - - -class Parser: - """ - Incremental image parser. This class implements the standard - feed/close consumer interface. - """ - - incremental = None - image = None - data = None - decoder = None - offset = 0 - finished = 0 - - def reset(self): - """ - (Consumer) Reset the parser. Note that you can only call this - method immediately after you've created a parser; parser - instances cannot be reused. - """ - assert self.data is None, "cannot reuse parsers" - - def feed(self, data): - """ - (Consumer) Feed data to the parser. - - :param data: A string buffer. - :exception OSError: If the parser failed to parse the image file. - """ - # collect data - - if self.finished: - return - - if self.data is None: - self.data = data - else: - self.data = self.data + data - - # parse what we have - if self.decoder: - - if self.offset > 0: - # skip header - skip = min(len(self.data), self.offset) - self.data = self.data[skip:] - self.offset = self.offset - skip - if self.offset > 0 or not self.data: - return - - n, e = self.decoder.decode(self.data) - - if n < 0: - # end of stream - self.data = None - self.finished = 1 - if e < 0: - # decoding error - self.image = None - raise_oserror(e) - else: - # end of image - return - self.data = self.data[n:] - - elif self.image: - - # if we end up here with no decoder, this file cannot - # be incrementally parsed. wait until we've gotten all - # available data - pass - - else: - - # attempt to open this file - try: - with io.BytesIO(self.data) as fp: - im = Image.open(fp) - except OSError: - # traceback.print_exc() - pass # not enough data - else: - flag = hasattr(im, "load_seek") or hasattr(im, "load_read") - if flag or len(im.tile) != 1: - # custom load code, or multiple tiles - self.decode = None - else: - # initialize decoder - im.load_prepare() - d, e, o, a = im.tile[0] - im.tile = [] - self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) - self.decoder.setimage(im.im, e) - - # calculate decoder offset - self.offset = o - if self.offset <= len(self.data): - self.data = self.data[self.offset :] - self.offset = 0 - - self.image = im - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - """ - (Consumer) Close the stream. - - :returns: An image object. - :exception OSError: If the parser failed to parse the image file either - because it cannot be identified or cannot be - decoded. - """ - # finish decoding - if self.decoder: - # get rid of what's left in the buffers - self.feed(b"") - self.data = self.decoder = None - if not self.finished: - raise OSError("image was incomplete") - if not self.image: - raise OSError("cannot parse this image") - if self.data: - # incremental parsing not possible; reopen the file - # not that we have all data - with io.BytesIO(self.data) as fp: - try: - self.image = Image.open(fp) - finally: - self.image.load() - return self.image - - -# -------------------------------------------------------------------- - - -def _save(im, fp, tile, bufsize=0): - """Helper to save image based on tile list - - :param im: Image object. - :param fp: File object. - :param tile: Tile list. - :param bufsize: Optional buffer size - """ - - im.load() - if not hasattr(im, "encoderconfig"): - im.encoderconfig = () - tile.sort(key=_tilesort) - # FIXME: make MAXBLOCK a configuration parameter - # It would be great if we could have the encoder specify what it needs - # But, it would need at least the image size in most cases. RawEncode is - # a tricky case. - bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - try: - fh = fp.fileno() - fp.flush() - exc = None - except (AttributeError, io.UnsupportedOperation) as e: - exc = e - for e, b, o, a in tile: - if o > 0: - fp.seek(o) - encoder = Image._getencoder(im.mode, e, a, im.encoderconfig) - try: - encoder.setimage(im.im, b) - if encoder.pushes_fd: - encoder.setfd(fp) - l, s = encoder.encode_to_pyfd() - else: - if exc: - # compress to Python file-compatible object - while True: - l, s, d = encoder.encode(bufsize) - fp.write(d) - if s: - break - else: - # slight speedup: compress to real file object - s = encoder.encode_to_file(fh, bufsize) - if s < 0: - raise OSError(f"encoder error {s} when writing image file") from exc - finally: - encoder.cleanup() - if hasattr(fp, "flush"): - fp.flush() - - -def _safe_read(fp, size): - """ - Reads large blocks in a safe way. Unlike fp.read(n), this function - doesn't trust the user. If the requested size is larger than - SAFEBLOCK, the file is read block by block. - - :param fp: File handle. Must implement a read method. - :param size: Number of bytes to read. - :returns: A string containing size bytes of data. - - Raises an OSError if the file is truncated and the read cannot be completed - - """ - if size <= 0: - return b"" - if size <= SAFEBLOCK: - data = fp.read(size) - if len(data) < size: - raise OSError("Truncated File Read") - return data - data = [] - remaining_size = size - while remaining_size > 0: - block = fp.read(min(remaining_size, SAFEBLOCK)) - if not block: - break - data.append(block) - remaining_size -= len(block) - if sum(len(d) for d in data) < size: - raise OSError("Truncated File Read") - return b"".join(data) - - -class PyCodecState: - def __init__(self): - self.xsize = 0 - self.ysize = 0 - self.xoff = 0 - self.yoff = 0 - - def extents(self): - return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize - - -class PyCodec: - def __init__(self, mode, *args): - self.im = None - self.state = PyCodecState() - self.fd = None - self.mode = mode - self.init(args) - - def init(self, args): - """ - Override to perform codec specific initialization - - :param args: Array of args items from the tile entry - :returns: None - """ - self.args = args - - def cleanup(self): - """ - Override to perform codec specific cleanup - - :returns: None - """ - pass - - def setfd(self, fd): - """ - Called from ImageFile to set the Python file-like object - - :param fd: A Python file-like object - :returns: None - """ - self.fd = fd - - def setimage(self, im, extents=None): - """ - Called from ImageFile to set the core output image for the codec - - :param im: A core image object - :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle - for this tile - :returns: None - """ - - # following c code - self.im = im - - if extents: - (x0, y0, x1, y1) = extents - else: - (x0, y0, x1, y1) = (0, 0, 0, 0) - - if x0 == 0 and x1 == 0: - self.state.xsize, self.state.ysize = self.im.size - else: - self.state.xoff = x0 - self.state.yoff = y0 - self.state.xsize = x1 - x0 - self.state.ysize = y1 - y0 - - if self.state.xsize <= 0 or self.state.ysize <= 0: - raise ValueError("Size cannot be negative") - - if ( - self.state.xsize + self.state.xoff > self.im.size[0] - or self.state.ysize + self.state.yoff > self.im.size[1] - ): - raise ValueError("Tile cannot extend outside image") - - -class PyDecoder(PyCodec): - """ - Python implementation of a format decoder. Override this class and - add the decoding logic in the :meth:`decode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pulls_fd = False - - @property - def pulls_fd(self): - return self._pulls_fd - - def decode(self, buffer): - """ - Override to perform the decoding process. - - :param buffer: A bytes object with the data to be decoded. - :returns: A tuple of ``(bytes consumed, errcode)``. - If finished with decoding return -1 for the bytes consumed. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - raise NotImplementedError() - - def set_as_raw(self, data, rawmode=None): - """ - Convenience method to set the internal image from a stream of raw data - - :param data: Bytes to be set - :param rawmode: The rawmode to be used for the decoder. - If not specified, it will default to the mode of the image - :returns: None - """ - - if not rawmode: - rawmode = self.mode - d = Image._getdecoder(self.mode, "raw", rawmode) - d.setimage(self.im, self.state.extents()) - s = d.decode(data) - - if s[0] >= 0: - raise ValueError("not enough image data") - if s[1] != 0: - raise ValueError("cannot decode image data") - - -class PyEncoder(PyCodec): - """ - Python implementation of a format encoder. Override this class and - add the decoding logic in the :meth:`encode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pushes_fd = False - - @property - def pushes_fd(self): - return self._pushes_fd - - def encode(self, bufsize): - """ - Override to perform the encoding process. - - :param bufsize: Buffer size. - :returns: A tuple of ``(bytes encoded, errcode, bytes)``. - If finished with encoding return 1 for the error code. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - raise NotImplementedError() - - def encode_to_pyfd(self): - """ - If ``pushes_fd`` is ``True``, then this method will be used, - and ``encode()`` will only be called once. - - :returns: A tuple of ``(bytes consumed, errcode)``. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - if not self.pushes_fd: - return 0, -8 # bad configuration - bytes_consumed, errcode, data = self.encode(0) - if data: - self.fd.write(data) - return bytes_consumed, errcode - - def encode_to_file(self, fh, bufsize): - """ - :param fh: File handle. - :param bufsize: Buffer size. - - :returns: If finished successfully, return 0. - Otherwise, return an error code. Err codes are from - :data:`.ImageFile.ERRORS`. - """ - errcode = 0 - while errcode == 0: - status, errcode, buf = self.encode(bufsize) - if status > 0: - fh.write(buf[status:]) - return errcode diff --git a/waypoint_manager/manager_GUI/PIL/ImageFilter.py b/waypoint_manager/manager_GUI/PIL/ImageFilter.py deleted file mode 100644 index e10c6fd..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageFilter.py +++ /dev/null @@ -1,538 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard filters -# -# History: -# 1995-11-27 fl Created -# 2002-06-08 fl Added rank and mode filters -# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2002 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -import functools - - -class Filter: - pass - - -class MultibandFilter(Filter): - pass - - -class BuiltinFilter(MultibandFilter): - def filter(self, image): - if image.mode == "P": - raise ValueError("cannot filter palette images") - return image.filter(*self.filterargs) - - -class Kernel(BuiltinFilter): - """ - Create a convolution kernel. The current version only - supports 3x3 and 5x5 integer and floating point kernels. - - In the current version, kernels can only be applied to - "L" and "RGB" images. - - :param size: Kernel size, given as (width, height). In the current - version, this must be (3,3) or (5,5). - :param kernel: A sequence containing kernel weights. - :param scale: Scale factor. If given, the result for each pixel is - divided by this value. The default is the sum of the - kernel weights. - :param offset: Offset. If given, this value is added to the result, - after it has been divided by the scale factor. - """ - - name = "Kernel" - - def __init__(self, size, kernel, scale=None, offset=0): - if scale is None: - # default scale is sum of kernel - scale = functools.reduce(lambda a, b: a + b, kernel) - if size[0] * size[1] != len(kernel): - raise ValueError("not enough coefficients in kernel") - self.filterargs = size, scale, offset, kernel - - -class RankFilter(Filter): - """ - Create a rank filter. The rank filter sorts all pixels in - a window of the given size, and returns the ``rank``'th value. - - :param size: The kernel size, in pixels. - :param rank: What pixel value to pick. Use 0 for a min filter, - ``size * size / 2`` for a median filter, ``size * size - 1`` - for a max filter, etc. - """ - - name = "Rank" - - def __init__(self, size, rank): - self.size = size - self.rank = rank - - def filter(self, image): - if image.mode == "P": - raise ValueError("cannot filter palette images") - image = image.expand(self.size // 2, self.size // 2) - return image.rankfilter(self.size, self.rank) - - -class MedianFilter(RankFilter): - """ - Create a median filter. Picks the median pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Median" - - def __init__(self, size=3): - self.size = size - self.rank = size * size // 2 - - -class MinFilter(RankFilter): - """ - Create a min filter. Picks the lowest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Min" - - def __init__(self, size=3): - self.size = size - self.rank = 0 - - -class MaxFilter(RankFilter): - """ - Create a max filter. Picks the largest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Max" - - def __init__(self, size=3): - self.size = size - self.rank = size * size - 1 - - -class ModeFilter(Filter): - """ - Create a mode filter. Picks the most frequent pixel value in a box with the - given size. Pixel values that occur only once or twice are ignored; if no - pixel value occurs more than twice, the original pixel value is preserved. - - :param size: The kernel size, in pixels. - """ - - name = "Mode" - - def __init__(self, size=3): - self.size = size - - def filter(self, image): - return image.modefilter(self.size) - - -class GaussianBlur(MultibandFilter): - """Blurs the image with a sequence of extended box filters, which - approximates a Gaussian kernel. For details on accuracy see - - - :param radius: Standard deviation of the Gaussian kernel. - """ - - name = "GaussianBlur" - - def __init__(self, radius=2): - self.radius = radius - - def filter(self, image): - return image.gaussian_blur(self.radius) - - -class BoxBlur(MultibandFilter): - """Blurs the image by setting each pixel to the average value of the pixels - in a square box extending radius pixels in each direction. - Supports float radius of arbitrary size. Uses an optimized implementation - which runs in linear time relative to the size of the image - for any radius value. - - :param radius: Size of the box in one direction. Radius 0 does not blur, - returns an identical image. Radius 1 takes 1 pixel - in each direction, i.e. 9 pixels in total. - """ - - name = "BoxBlur" - - def __init__(self, radius): - self.radius = radius - - def filter(self, image): - return image.box_blur(self.radius) - - -class UnsharpMask(MultibandFilter): - """Unsharp mask filter. - - See Wikipedia's entry on `digital unsharp masking`_ for an explanation of - the parameters. - - :param radius: Blur Radius - :param percent: Unsharp strength, in percent - :param threshold: Threshold controls the minimum brightness change that - will be sharpened - - .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking - - """ # noqa: E501 - - name = "UnsharpMask" - - def __init__(self, radius=2, percent=150, threshold=3): - self.radius = radius - self.percent = percent - self.threshold = threshold - - def filter(self, image): - return image.unsharp_mask(self.radius, self.percent, self.threshold) - - -class BLUR(BuiltinFilter): - name = "Blur" - # fmt: off - filterargs = (5, 5), 16, 0, ( - 1, 1, 1, 1, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class CONTOUR(BuiltinFilter): - name = "Contour" - # fmt: off - filterargs = (3, 3), 1, 255, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class DETAIL(BuiltinFilter): - name = "Detail" - # fmt: off - filterargs = (3, 3), 6, 0, ( - 0, -1, 0, - -1, 10, -1, - 0, -1, 0, - ) - # fmt: on - - -class EDGE_ENHANCE(BuiltinFilter): - name = "Edge-enhance" - # fmt: off - filterargs = (3, 3), 2, 0, ( - -1, -1, -1, - -1, 10, -1, - -1, -1, -1, - ) - # fmt: on - - -class EDGE_ENHANCE_MORE(BuiltinFilter): - name = "Edge-enhance More" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 9, -1, - -1, -1, -1, - ) - # fmt: on - - -class EMBOSS(BuiltinFilter): - name = "Emboss" - # fmt: off - filterargs = (3, 3), 1, 128, ( - -1, 0, 0, - 0, 1, 0, - 0, 0, 0, - ) - # fmt: on - - -class FIND_EDGES(BuiltinFilter): - name = "Find Edges" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - # fmt: off - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2, - ) - # fmt: on - - -class SMOOTH(BuiltinFilter): - name = "Smooth" - # fmt: off - filterargs = (3, 3), 13, 0, ( - 1, 1, 1, - 1, 5, 1, - 1, 1, 1, - ) - # fmt: on - - -class SMOOTH_MORE(BuiltinFilter): - name = "Smooth More" - # fmt: off - filterargs = (5, 5), 100, 0, ( - 1, 1, 1, 1, 1, - 1, 5, 5, 5, 1, - 1, 5, 44, 5, 1, - 1, 5, 5, 5, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class Color3DLUT(MultibandFilter): - """Three-dimensional color lookup table. - - Transforms 3-channel pixels using the values of the channels as coordinates - in the 3D lookup table and interpolating the nearest elements. - - This method allows you to apply almost any color transformation - in constant time by using pre-calculated decimated tables. - - .. versionadded:: 5.2.0 - - :param size: Size of the table. One int or tuple of (int, int, int). - Minimal size in any dimension is 2, maximum is 65. - :param table: Flat lookup table. A list of ``channels * size**3`` - float elements or a list of ``size**3`` channels-sized - tuples with floats. Channels are changed first, - then first dimension, then second, then third. - Value 0.0 corresponds lowest value of output, 1.0 highest. - :param channels: Number of channels in the table. Could be 3 or 4. - Default is 3. - :param target_mode: A mode for the result image. Should have not less - than ``channels`` channels. Default is ``None``, - which means that mode wouldn't be changed. - """ - - name = "Color 3D LUT" - - def __init__(self, size, table, channels=3, target_mode=None, **kwargs): - if channels not in (3, 4): - raise ValueError("Only 3 or 4 output channels are supported") - self.size = size = self._check_size(size) - self.channels = channels - self.mode = target_mode - - # Hidden flag `_copy_table=False` could be used to avoid extra copying - # of the table if the table is specially made for the constructor. - copy_table = kwargs.get("_copy_table", True) - items = size[0] * size[1] * size[2] - wrong_size = False - - numpy = None - if hasattr(table, "shape"): - try: - import numpy - except ImportError: # pragma: no cover - pass - - if numpy and isinstance(table, numpy.ndarray): - if copy_table: - table = table.copy() - - if table.shape in [ - (items * channels,), - (items, channels), - (size[2], size[1], size[0], channels), - ]: - table = table.reshape(items * channels) - else: - wrong_size = True - - else: - if copy_table: - table = list(table) - - # Convert to a flat list - if table and isinstance(table[0], (list, tuple)): - table, raw_table = [], table - for pixel in raw_table: - if len(pixel) != channels: - raise ValueError( - "The elements of the table should " - "have a length of {}.".format(channels) - ) - table.extend(pixel) - - if wrong_size or len(table) != items * channels: - raise ValueError( - "The table should have either channels * size**3 float items " - "or size**3 items of channels-sized tuples with floats. " - f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " - f"Actual length: {len(table)}" - ) - self.table = table - - @staticmethod - def _check_size(size): - try: - _, _, _ = size - except ValueError as e: - raise ValueError( - "Size should be either an integer or a tuple of three integers." - ) from e - except TypeError: - size = (size, size, size) - size = [int(x) for x in size] - for size_1d in size: - if not 2 <= size_1d <= 65: - raise ValueError("Size should be in [2, 65] range.") - return size - - @classmethod - def generate(cls, size, callback, channels=3, target_mode=None): - """Generates new LUT using provided callback. - - :param size: Size of the table. Passed to the constructor. - :param callback: Function with three parameters which correspond - three color channels. Will be called ``size**3`` - times with values from 0.0 to 1.0 and should return - a tuple with ``channels`` elements. - :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - size_1d, size_2d, size_3d = cls._check_size(size) - if channels not in (3, 4): - raise ValueError("Only 3 or 4 output channels are supported") - - table = [0] * (size_1d * size_2d * size_3d * channels) - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - table[idx_out : idx_out + channels] = callback( - r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) - ) - idx_out += channels - - return cls( - (size_1d, size_2d, size_3d), - table, - channels=channels, - target_mode=target_mode, - _copy_table=False, - ) - - def transform(self, callback, with_normals=False, channels=None, target_mode=None): - """Transforms the table values using provided callback and returns - a new LUT with altered values. - - :param callback: A function which takes old lookup table values - and returns a new set of values. The number - of arguments which function should take is - ``self.channels`` or ``3 + self.channels`` - if ``with_normals`` flag is set. - Should return a tuple of ``self.channels`` or - ``channels`` elements if it is set. - :param with_normals: If true, ``callback`` will be called with - coordinates in the color cube as the first - three arguments. Otherwise, ``callback`` - will be called only with actual color values. - :param channels: The number of channels in the resulting lookup table. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - if channels not in (None, 3, 4): - raise ValueError("Only 3 or 4 output channels are supported") - ch_in = self.channels - ch_out = channels or ch_in - size_1d, size_2d, size_3d = self.size - - table = [0] * (size_1d * size_2d * size_3d * ch_out) - idx_in = 0 - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - values = self.table[idx_in : idx_in + ch_in] - if with_normals: - values = callback( - r / (size_1d - 1), - g / (size_2d - 1), - b / (size_3d - 1), - *values, - ) - else: - values = callback(*values) - table[idx_out : idx_out + ch_out] = values - idx_in += ch_in - idx_out += ch_out - - return type(self)( - self.size, - table, - channels=ch_out, - target_mode=target_mode or self.mode, - _copy_table=False, - ) - - def __repr__(self): - r = [ - f"{self.__class__.__name__} from {self.table.__class__.__name__}", - "size={:d}x{:d}x{:d}".format(*self.size), - f"channels={self.channels:d}", - ] - if self.mode: - r.append(f"target_mode={self.mode}") - return "<{}>".format(" ".join(r)) - - def filter(self, image): - from . import Image - - return image.color_lut_3d( - self.mode or image.mode, - Image.Resampling.BILINEAR, - self.channels, - self.size[0], - self.size[1], - self.size[2], - self.table, - ) diff --git a/waypoint_manager/manager_GUI/PIL/ImageFont.py b/waypoint_manager/manager_GUI/PIL/ImageFont.py deleted file mode 100644 index a3b711c..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageFont.py +++ /dev/null @@ -1,1164 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIL raster font management -# -# History: -# 1996-08-07 fl created (experimental) -# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 -# 1999-02-06 fl rewrote most font management stuff in C -# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) -# 2001-02-17 fl added freetype support -# 2001-05-09 fl added TransposedFont wrapper class -# 2002-03-04 fl make sure we have a "L" or "1" font -# 2002-12-04 fl skip non-directory entries in the system path -# 2003-04-29 fl add embedded default font -# 2003-09-27 fl added support for truetype charmap encodings -# -# Todo: -# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import base64 -import os -import sys -import warnings -from enum import IntEnum -from io import BytesIO - -from . import Image -from ._deprecate import deprecate -from ._util import is_directory, is_path - - -class Layout(IntEnum): - BASIC = 0 - RAQM = 1 - - -def __getattr__(name): - for enum, prefix in {Layout: "LAYOUT_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -class _ImagingFtNotInstalled: - # module placeholder - def __getattr__(self, id): - raise ImportError("The _imagingft C module is not installed") - - -try: - from . import _imagingft as core -except ImportError: - core = _ImagingFtNotInstalled() - - -_UNSPECIFIED = object() - - -# FIXME: add support for pilfont2 format (see FontFile.py) - -# -------------------------------------------------------------------- -# Font metrics format: -# "PILfont" LF -# fontdescriptor LF -# (optional) key=value... LF -# "DATA" LF -# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) -# -# To place a character, cut out srcbox and paste at dstbox, -# relative to the character position. Then move the character -# position according to dx, dy. -# -------------------------------------------------------------------- - - -class ImageFont: - """PIL font wrapper""" - - def _load_pilfont(self, filename): - - with open(filename, "rb") as fp: - image = None - for ext in (".png", ".gif", ".pbm"): - if image: - image.close() - try: - fullname = os.path.splitext(filename)[0] + ext - image = Image.open(fullname) - except Exception: - pass - else: - if image and image.mode in ("1", "L"): - break - else: - if image: - image.close() - raise OSError("cannot find glyph data file") - - self.file = fullname - - self._load_pilfont_data(fp, image) - image.close() - - def _load_pilfont_data(self, file, image): - - # read PILfont header - if file.readline() != b"PILfont\n": - raise SyntaxError("Not a PILfont file") - file.readline().split(b";") - self.info = [] # FIXME: should be a dictionary - while True: - s = file.readline() - if not s or s == b"DATA\n": - break - self.info.append(s) - - # read PILfont metrics - data = file.read(256 * 20) - - # check image - if image.mode not in ("1", "L"): - raise TypeError("invalid font image mode") - - image.load() - - self.font = Image.core.font(image.im, data) - - def getsize(self, text, *args, **kwargs): - """ - .. deprecated:: 9.2.0 - - Use :py:meth:`.getbbox` or :py:meth:`.getlength` instead. - - Returns width and height (in pixels) of given text. - - :param text: Text to measure. - - :return: (width, height) - """ - deprecate("getsize", 10, "getbbox or getlength") - return self.font.getsize(text) - - def getmask(self, text, mode="", *args, **kwargs): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.font.getmask(text, mode) - - def getbbox(self, text, *args, **kwargs): - """ - Returns bounding box (in pixels) of given text. - - .. versionadded:: 9.2.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :return: ``(left, top, right, bottom)`` bounding box - """ - width, height = self.font.getsize(text) - return 0, 0, width, height - - def getlength(self, text, *args, **kwargs): - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. versionadded:: 9.2.0 - """ - width, height = self.font.getsize(text) - return width - - -## -# Wrapper for FreeType fonts. Application code should use the -# truetype factory function to create font objects. - - -class FreeTypeFont: - """FreeType font wrapper (requires _imagingft service)""" - - def __init__(self, font=None, size=10, index=0, encoding="", layout_engine=None): - # FIXME: use service provider instead - - self.path = font - self.size = size - self.index = index - self.encoding = encoding - - if layout_engine not in (Layout.BASIC, Layout.RAQM): - layout_engine = Layout.BASIC - if core.HAVE_RAQM: - layout_engine = Layout.RAQM - elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: - warnings.warn( - "Raqm layout was requested, but Raqm is not available. " - "Falling back to basic layout." - ) - layout_engine = Layout.BASIC - - self.layout_engine = layout_engine - - def load_from_bytes(f): - self.font_bytes = f.read() - self.font = core.getfont( - "", size, index, encoding, self.font_bytes, layout_engine - ) - - if is_path(font): - if sys.platform == "win32": - font_bytes_path = font if isinstance(font, bytes) else font.encode() - try: - font_bytes_path.decode("ascii") - except UnicodeDecodeError: - # FreeType cannot load fonts with non-ASCII characters on Windows - # So load it into memory first - with open(font, "rb") as f: - load_from_bytes(f) - return - self.font = core.getfont( - font, size, index, encoding, layout_engine=layout_engine - ) - else: - load_from_bytes(font) - - def __getstate__(self): - return [self.path, self.size, self.index, self.encoding, self.layout_engine] - - def __setstate__(self, state): - path, size, index, encoding, layout_engine = state - self.__init__(path, size, index, encoding, layout_engine) - - def _multiline_split(self, text): - split_character = "\n" if isinstance(text, str) else b"\n" - return text.split(split_character) - - def getname(self): - """ - :return: A tuple of the font family (e.g. Helvetica) and the font style - (e.g. Bold) - """ - return self.font.family, self.font.style - - def getmetrics(self): - """ - :return: A tuple of the font ascent (the distance from the baseline to - the highest outline point) and descent (the distance from the - baseline to the lowest outline point, a negative value) - """ - return self.font.ascent, self.font.descent - - def getlength(self, text, mode="", direction=None, features=None, language=None): - """ - Returns length (in pixels with 1/64 precision) of given text when rendered - in font with provided direction, features, and language. - - This is the amount by which following text should be offset. - Text bounding box may extend past the length in some fonts, - e.g. when using italics or accents. - - The result is returned as a float; it is a whole number if using basic layout. - - Note that the sum of two lengths may not equal the length of a concatenated - string due to kerning. If you need to adjust for kerning, include the following - character and subtract its length. - - For example, instead of - - .. code-block:: python - - hello = font.getlength("Hello") - world = font.getlength("World") - hello_world = hello + world # not adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # may fail - - use - - .. code-block:: python - - hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning - world = font.getlength("World") - hello_world = hello + world # adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # True - - or disable kerning with (requires libraqm) - - .. code-block:: python - - hello = draw.textlength("Hello", font, features=["-kern"]) - world = draw.textlength("World", font, features=["-kern"]) - hello_world = hello + world # kerning is disabled, no need to adjust - assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) - - .. versionadded:: 8.0.0 - - :param text: Text to measure. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :return: Width for horizontal, height for vertical text. - """ - return self.font.getlength(text, mode, direction, features, language) / 64 - - def getbbox( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ): - """ - Returns bounding box (in pixels) of given text relative to given anchor - when rendered in font with provided direction, features, and language. - - Use :py:meth:`getlength()` to get the offset of following text with - 1/64 pixel precision. The bounding box includes extra margins for - some fonts, e.g. italics or accents. - - .. versionadded:: 8.0.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :param stroke_width: The width of the text stroke. - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left. - See :ref:`text-anchors` for valid values. - - :return: ``(left, top, right, bottom)`` bounding box - """ - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - left, top = offset[0] - stroke_width, offset[1] - stroke_width - width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width - return left, top, left + width, top + height - - def getsize( - self, - text, - direction=None, - features=None, - language=None, - stroke_width=0, - ): - """ - .. deprecated:: 9.2.0 - - Use :py:meth:`getlength()` to measure the offset of following text with - 1/64 pixel precision. - Use :py:meth:`getbbox()` to get the exact bounding box based on an anchor. - - Returns width and height (in pixels) of given text if rendered in font with - provided direction, features, and language. - - .. note:: For historical reasons this function measures text height from - the ascender line instead of the top, see :ref:`text-anchors`. - If you wish to measure text height from the top, it is recommended - to use the bottom value of :meth:`getbbox` with ``anchor='lt'`` instead. - - :param text: Text to measure. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :return: (width, height) - """ - deprecate("getsize", 10, "getbbox or getlength") - # vertical offset is added for historical reasons - # see https://github.com/python-pillow/Pillow/pull/4910#discussion_r486682929 - size, offset = self.font.getsize(text, "L", direction, features, language) - return ( - size[0] + stroke_width * 2, - size[1] + stroke_width * 2 + offset[1], - ) - - def getsize_multiline( - self, - text, - direction=None, - spacing=4, - features=None, - language=None, - stroke_width=0, - ): - """ - .. deprecated:: 9.2.0 - - Use :py:meth:`.ImageDraw.multiline_textbbox` instead. - - Returns width and height (in pixels) of given text if rendered in font - with provided direction, features, and language, while respecting - newline characters. - - :param text: Text to measure. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param spacing: The vertical gap between lines, defaulting to 4 pixels. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :return: (width, height) - """ - deprecate("getsize_multiline", 10, "ImageDraw.multiline_textbbox") - max_width = 0 - lines = self._multiline_split(text) - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - line_spacing = self.getsize("A", stroke_width=stroke_width)[1] + spacing - for line in lines: - line_width, line_height = self.getsize( - line, direction, features, language, stroke_width - ) - max_width = max(max_width, line_width) - - return max_width, len(lines) * line_spacing - spacing - - def getoffset(self, text): - """ - .. deprecated:: 9.2.0 - - Use :py:meth:`.getbbox` instead. - - Returns the offset of given text. This is the gap between the - starting coordinate and the first marking. Note that this gap is - included in the result of :py:func:`~PIL.ImageFont.FreeTypeFont.getsize`. - - :param text: Text to measure. - - :return: A tuple of the x and y offset - """ - deprecate("getoffset", 10, "getbbox") - return self.font.getsize(text)[1] - - def getmask( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left. - See :ref:`text-anchors` for valid values. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - )[0] - - def getmask2( - self, - text, - mode="", - fill=_UNSPECIFIED, - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - *args, - **kwargs, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param fill: Optional fill function. By default, an internal Pillow function - will be used. - - Deprecated. This parameter will be removed in Pillow 10 - (2023-07-01). - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left. - See :ref:`text-anchors` for valid values. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :return: A tuple of an internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module, and the text offset, the - gap between the starting coordinate and the first marking - """ - if fill is _UNSPECIFIED: - fill = Image.core.fill - else: - deprecate("fill", 10) - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - size = size[0] + stroke_width * 2, size[1] + stroke_width * 2 - offset = offset[0] - stroke_width, offset[1] - stroke_width - Image._decompression_bomb_check(size) - im = fill("RGBA" if mode == "RGBA" else "L", size, 0) - self.font.render( - text, im.id, mode, direction, features, language, stroke_width, ink - ) - return im, offset - - def font_variant( - self, font=None, size=None, index=None, encoding=None, layout_engine=None - ): - """ - Create a copy of this FreeTypeFont object, - using any specified arguments to override the settings. - - Parameters are identical to the parameters used to initialize this - object. - - :return: A FreeTypeFont object. - """ - if font is None: - try: - font = BytesIO(self.font_bytes) - except AttributeError: - font = self.path - return FreeTypeFont( - font=font, - size=self.size if size is None else size, - index=self.index if index is None else index, - encoding=self.encoding if encoding is None else encoding, - layout_engine=layout_engine or self.layout_engine, - ) - - def get_variation_names(self): - """ - :returns: A list of the named styles in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - names = self.font.getvarnames() - except AttributeError as e: - raise NotImplementedError("FreeType 2.9.1 or greater is required") from e - return [name.replace(b"\x00", b"") for name in names] - - def set_variation_by_name(self, name): - """ - :param name: The name of the style. - :exception OSError: If the font is not a variation font. - """ - names = self.get_variation_names() - if not isinstance(name, bytes): - name = name.encode() - index = names.index(name) - - if index == getattr(self, "_last_variation_index", None): - # When the same name is set twice in a row, - # there is an 'unknown freetype error' - # https://savannah.nongnu.org/bugs/?56186 - return - self._last_variation_index = index - - self.font.setvarname(index) - - def get_variation_axes(self): - """ - :returns: A list of the axes in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - axes = self.font.getvaraxes() - except AttributeError as e: - raise NotImplementedError("FreeType 2.9.1 or greater is required") from e - for axis in axes: - axis["name"] = axis["name"].replace(b"\x00", b"") - return axes - - def set_variation_by_axes(self, axes): - """ - :param axes: A list of values for each axis. - :exception OSError: If the font is not a variation font. - """ - try: - self.font.setvaraxes(axes) - except AttributeError as e: - raise NotImplementedError("FreeType 2.9.1 or greater is required") from e - - -class TransposedFont: - """Wrapper for writing rotated or mirrored text""" - - def __init__(self, font, orientation=None): - """ - Wrapper that creates a transposed font from any existing font - object. - - :param font: A font object. - :param orientation: An optional orientation. If given, this should - be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, - Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or - Image.Transpose.ROTATE_270. - """ - self.font = font - self.orientation = orientation # any 'transpose' argument, or None - - def getsize(self, text, *args, **kwargs): - """ - .. deprecated:: 9.2.0 - - Use :py:meth:`.getbbox` or :py:meth:`.getlength` instead. - """ - deprecate("getsize", 10, "getbbox or getlength") - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - w, h = self.font.getsize(text) - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - return h, w - return w, h - - def getmask(self, text, mode="", *args, **kwargs): - im = self.font.getmask(text, mode, *args, **kwargs) - if self.orientation is not None: - return im.transpose(self.orientation) - return im - - def getbbox(self, text, *args, **kwargs): - # TransposedFont doesn't support getmask2, move top-left point to (0, 0) - # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont - left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) - width = right - left - height = bottom - top - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - return 0, 0, height, width - return 0, 0, width, height - - def getlength(self, text, *args, **kwargs): - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - raise ValueError( - "text length is undefined for text rotated by 90 or 270 degrees" - ) - return self.font.getlength(text, *args, **kwargs) - - -def load(filename): - """ - Load a font file. This function loads a font object from the given - bitmap font file, and returns the corresponding font object. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - f = ImageFont() - f._load_pilfont(filename) - return f - - -def truetype(font=None, size=10, index=0, encoding="", layout_engine=None): - """ - Load a TrueType or OpenType font from a file or file-like object, - and create a font object. - This function loads a font object from the given file or file-like - object, and creates a font object for a font of the given size. - - Pillow uses FreeType to open font files. If you are opening many fonts - simultaneously on Windows, be aware that Windows limits the number of files - that can be open in C at once to 512. If you approach that limit, an - ``OSError`` may be thrown, reporting that FreeType "cannot open resource". - - This function requires the _imagingft service. - - :param font: A filename or file-like object containing a TrueType font. - If the file is not found in this filename, the loader may also - search in other directories, such as the :file:`fonts/` - directory on Windows or :file:`/Library/Fonts/`, - :file:`/System/Library/Fonts/` and :file:`~/Library/Fonts/` on - macOS. - - :param size: The requested size, in pixels. - :param index: Which font face to load (default is first available face). - :param encoding: Which font encoding to use (default is Unicode). Possible - encodings include (see the FreeType documentation for more - information): - - * "unic" (Unicode) - * "symb" (Microsoft Symbol) - * "ADOB" (Adobe Standard) - * "ADBE" (Adobe Expert) - * "ADBC" (Adobe Custom) - * "armn" (Apple Roman) - * "sjis" (Shift JIS) - * "gb " (PRC) - * "big5" - * "wans" (Extended Wansung) - * "joha" (Johab) - * "lat1" (Latin-1) - - This specifies the character set to use. It does not alter the - encoding of any text provided in subsequent operations. - :param layout_engine: Which layout engine to use, if available: - :data:`.ImageFont.Layout.BASIC` or :data:`.ImageFont.Layout.RAQM`. - - You can check support for Raqm layout using - :py:func:`PIL.features.check_feature` with ``feature="raqm"``. - - .. versionadded:: 4.2.0 - :return: A font object. - :exception OSError: If the file could not be read. - """ - - def freetype(font): - return FreeTypeFont(font, size, index, encoding, layout_engine) - - try: - return freetype(font) - except OSError: - if not is_path(font): - raise - ttf_filename = os.path.basename(font) - - dirs = [] - if sys.platform == "win32": - # check the windows font repository - # NOTE: must use uppercase WINDIR, to work around bugs in - # 1.5.2's os.environ.get() - windir = os.environ.get("WINDIR") - if windir: - dirs.append(os.path.join(windir, "fonts")) - elif sys.platform in ("linux", "linux2"): - lindirs = os.environ.get("XDG_DATA_DIRS", "") - if not lindirs: - # According to the freedesktop spec, XDG_DATA_DIRS should - # default to /usr/share - lindirs = "/usr/share" - dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] - elif sys.platform == "darwin": - dirs += [ - "/Library/Fonts", - "/System/Library/Fonts", - os.path.expanduser("~/Library/Fonts"), - ] - - ext = os.path.splitext(ttf_filename)[1] - first_font_with_a_different_extension = None - for directory in dirs: - for walkroot, walkdir, walkfilenames in os.walk(directory): - for walkfilename in walkfilenames: - if ext and walkfilename == ttf_filename: - return freetype(os.path.join(walkroot, walkfilename)) - elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: - fontpath = os.path.join(walkroot, walkfilename) - if os.path.splitext(fontpath)[1] == ".ttf": - return freetype(fontpath) - if not ext and first_font_with_a_different_extension is None: - first_font_with_a_different_extension = fontpath - if first_font_with_a_different_extension: - return freetype(first_font_with_a_different_extension) - raise - - -def load_path(filename): - """ - Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a - bitmap font along the Python path. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - for directory in sys.path: - if is_directory(directory): - if not isinstance(filename, str): - filename = filename.decode("utf-8") - try: - return load(os.path.join(directory, filename)) - except OSError: - pass - raise OSError("cannot find font file") - - -def load_default(): - """Load a "better than nothing" default font. - - .. versionadded:: 1.1.4 - - :return: A font object. - """ - f = ImageFont() - f._load_pilfont_data( - # courB08 - BytesIO( - base64.b64decode( - b""" -UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA -BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL -AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA -AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB -ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A -BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB -//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA -AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH -AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA -ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv -AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ -/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 -AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA -AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG -AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA -BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA -AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA -2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF -AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// -+gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA -////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA -BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv -AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA -AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA -AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA -BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// -//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA -AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF -AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB -mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn -AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA -AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 -AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA -Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB -//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA -AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ -AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC -DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ -AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ -+wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 -AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ -///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG -AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA -BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA -Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC -eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG -AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// -+gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA -////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA -BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT -AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A -AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA -Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA -Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// -//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA -AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ -AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA -LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 -AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA -AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 -AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA -AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG -AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA -EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK -AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA -pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG -AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// -+QAGAAIAzgAKANUAEw== -""" - ) - ), - Image.open( - BytesIO( - base64.b64decode( - b""" -iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u -Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 -M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g -LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F -IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA -Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 -NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx -in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 -SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY -AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt -y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG -ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY -lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H -/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 -AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 -c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ -/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw -pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv -oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR -evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA -AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// -Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR -w7IkEbzhVQAAAABJRU5ErkJggg== -""" - ) - ) - ), - ) - return f diff --git a/waypoint_manager/manager_GUI/PIL/ImageGrab.py b/waypoint_manager/manager_GUI/PIL/ImageGrab.py deleted file mode 100644 index 38074cb..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageGrab.py +++ /dev/null @@ -1,135 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# screen grabber -# -# History: -# 2001-04-26 fl created -# 2001-09-17 fl use builtin driver, if present -# 2002-11-19 fl added grabclipboard support -# -# Copyright (c) 2001-2002 by Secret Labs AB -# Copyright (c) 2001-2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import os -import shutil -import subprocess -import sys -import tempfile - -from . import Image - - -def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None): - if xdisplay is None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - args = ["screencapture"] - if bbox: - left, top, right, bottom = bbox - args += ["-R", f"{left},{top},{right-left},{bottom-top}"] - subprocess.call(args + ["-x", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_resized = im.resize((right - left, bottom - top)) - im.close() - return im_resized - return im - elif sys.platform == "win32": - offset, size, data = Image.core.grabscreen_win32( - include_layered_windows, all_screens - ) - im = Image.frombytes( - "RGB", - size, - data, - # RGB, 32-bit line padding, origin lower left corner - "raw", - "BGR", - (size[0] * 3 + 3) & -4, - -1, - ) - if bbox: - x0, y0 = offset - left, top, right, bottom = bbox - im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) - return im - elif shutil.which("gnome-screenshot"): - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - subprocess.call(["gnome-screenshot", "-f", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_cropped = im.crop(bbox) - im.close() - return im_cropped - return im - # use xdisplay=None for default display on non-win32/macOS systems - if not Image.core.HAVE_XCB: - raise OSError("Pillow was built without XCB support") - size, data = Image.core.grabscreen_x11(xdisplay) - im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) - if bbox: - im = im.crop(bbox) - return im - - -def grabclipboard(): - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".jpg") - os.close(fh) - commands = [ - 'set theFile to (open for access POSIX file "' - + filepath - + '" with write permission)', - "try", - " write (the clipboard as JPEG picture) to theFile", - "end try", - "close access theFile", - ] - script = ["osascript"] - for command in commands: - script += ["-e", command] - subprocess.call(script) - - im = None - if os.stat(filepath).st_size != 0: - im = Image.open(filepath) - im.load() - os.unlink(filepath) - return im - elif sys.platform == "win32": - fmt, data = Image.core.grabclipboard_win32() - if fmt == "file": # CF_HDROP - import struct - - o = struct.unpack_from("I", data)[0] - if data[16] != 0: - files = data[o:].decode("utf-16le").split("\0") - else: - files = data[o:].decode("mbcs").split("\0") - return files[: files.index("")] - if isinstance(data, bytes): - import io - - data = io.BytesIO(data) - if fmt == "png": - from . import PngImagePlugin - - return PngImagePlugin.PngImageFile(data) - elif fmt == "DIB": - from . import BmpImagePlugin - - return BmpImagePlugin.DibImageFile(data) - return None - else: - raise NotImplementedError("ImageGrab.grabclipboard() is macOS and Windows only") diff --git a/waypoint_manager/manager_GUI/PIL/ImageMath.py b/waypoint_manager/manager_GUI/PIL/ImageMath.py deleted file mode 100644 index 09d9898..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageMath.py +++ /dev/null @@ -1,259 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# a simple math add-on for the Python Imaging Library -# -# History: -# 1999-02-15 fl Original PIL Plus release -# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 -# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 -# -# Copyright (c) 1999-2005 by Secret Labs AB -# Copyright (c) 2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import builtins - -from . import Image, _imagingmath - - -def _isconstant(v): - return isinstance(v, (int, float)) - - -class _Operand: - """Wraps an image operand, providing standard operators""" - - def __init__(self, im): - self.im = im - - def __fixup(self, im1): - # convert image to suitable mode - if isinstance(im1, _Operand): - # argument was an image. - if im1.im.mode in ("1", "L"): - return im1.im.convert("I") - elif im1.im.mode in ("I", "F"): - return im1.im - else: - raise ValueError(f"unsupported mode: {im1.im.mode}") - else: - # argument was a constant - if _isconstant(im1) and self.im.mode in ("1", "L", "I"): - return Image.new("I", self.im.size, im1) - else: - return Image.new("F", self.im.size, im1) - - def apply(self, op, im1, im2=None, mode=None): - im1 = self.__fixup(im1) - if im2 is None: - # unary operation - out = Image.new(mode or im1.mode, im1.size, None) - im1.load() - try: - op = getattr(_imagingmath, op + "_" + im1.mode) - except AttributeError as e: - raise TypeError(f"bad operand type for '{op}'") from e - _imagingmath.unop(op, out.im.id, im1.im.id) - else: - # binary operation - im2 = self.__fixup(im2) - if im1.mode != im2.mode: - # convert both arguments to floating point - if im1.mode != "F": - im1 = im1.convert("F") - if im2.mode != "F": - im2 = im2.convert("F") - if im1.size != im2.size: - # crop both arguments to a common size - size = (min(im1.size[0], im2.size[0]), min(im1.size[1], im2.size[1])) - if im1.size != size: - im1 = im1.crop((0, 0) + size) - if im2.size != size: - im2 = im2.crop((0, 0) + size) - out = Image.new(mode or im1.mode, im1.size, None) - im1.load() - im2.load() - try: - op = getattr(_imagingmath, op + "_" + im1.mode) - except AttributeError as e: - raise TypeError(f"bad operand type for '{op}'") from e - _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) - return _Operand(out) - - # unary operators - def __bool__(self): - # an image is "true" if it contains at least one non-zero pixel - return self.im.getbbox() is not None - - def __abs__(self): - return self.apply("abs", self) - - def __pos__(self): - return self - - def __neg__(self): - return self.apply("neg", self) - - # binary operators - def __add__(self, other): - return self.apply("add", self, other) - - def __radd__(self, other): - return self.apply("add", other, self) - - def __sub__(self, other): - return self.apply("sub", self, other) - - def __rsub__(self, other): - return self.apply("sub", other, self) - - def __mul__(self, other): - return self.apply("mul", self, other) - - def __rmul__(self, other): - return self.apply("mul", other, self) - - def __truediv__(self, other): - return self.apply("div", self, other) - - def __rtruediv__(self, other): - return self.apply("div", other, self) - - def __mod__(self, other): - return self.apply("mod", self, other) - - def __rmod__(self, other): - return self.apply("mod", other, self) - - def __pow__(self, other): - return self.apply("pow", self, other) - - def __rpow__(self, other): - return self.apply("pow", other, self) - - # bitwise - def __invert__(self): - return self.apply("invert", self) - - def __and__(self, other): - return self.apply("and", self, other) - - def __rand__(self, other): - return self.apply("and", other, self) - - def __or__(self, other): - return self.apply("or", self, other) - - def __ror__(self, other): - return self.apply("or", other, self) - - def __xor__(self, other): - return self.apply("xor", self, other) - - def __rxor__(self, other): - return self.apply("xor", other, self) - - def __lshift__(self, other): - return self.apply("lshift", self, other) - - def __rshift__(self, other): - return self.apply("rshift", self, other) - - # logical - def __eq__(self, other): - return self.apply("eq", self, other) - - def __ne__(self, other): - return self.apply("ne", self, other) - - def __lt__(self, other): - return self.apply("lt", self, other) - - def __le__(self, other): - return self.apply("le", self, other) - - def __gt__(self, other): - return self.apply("gt", self, other) - - def __ge__(self, other): - return self.apply("ge", self, other) - - -# conversions -def imagemath_int(self): - return _Operand(self.im.convert("I")) - - -def imagemath_float(self): - return _Operand(self.im.convert("F")) - - -# logical -def imagemath_equal(self, other): - return self.apply("eq", self, other, mode="I") - - -def imagemath_notequal(self, other): - return self.apply("ne", self, other, mode="I") - - -def imagemath_min(self, other): - return self.apply("min", self, other) - - -def imagemath_max(self, other): - return self.apply("max", self, other) - - -def imagemath_convert(self, mode): - return _Operand(self.im.convert(mode)) - - -ops = {} -for k, v in list(globals().items()): - if k[:10] == "imagemath_": - ops[k[10:]] = v - - -def eval(expression, _dict={}, **kw): - """ - Evaluates an image expression. - - :param expression: A string containing a Python-style expression. - :param options: Values to add to the evaluation context. You - can either use a dictionary, or one or more keyword - arguments. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - # build execution namespace - args = ops.copy() - args.update(_dict) - args.update(kw) - for k, v in list(args.items()): - if hasattr(v, "im"): - args[k] = _Operand(v) - - compiled_code = compile(expression, "", "eval") - - def scan(code): - for const in code.co_consts: - if type(const) == type(compiled_code): - scan(const) - - for name in code.co_names: - if name not in args and name != "abs": - raise ValueError(f"'{name}' not allowed") - - scan(compiled_code) - out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) - try: - return out.im - except AttributeError: - return out diff --git a/waypoint_manager/manager_GUI/PIL/ImageMode.py b/waypoint_manager/manager_GUI/PIL/ImageMode.py deleted file mode 100644 index 0973536..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageMode.py +++ /dev/null @@ -1,91 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard mode descriptors -# -# History: -# 2006-03-20 fl Added -# -# Copyright (c) 2006 by Secret Labs AB. -# Copyright (c) 2006 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import sys - -# mode descriptor cache -_modes = None - - -class ModeDescriptor: - """Wrapper for mode strings.""" - - def __init__(self, mode, bands, basemode, basetype, typestr): - self.mode = mode - self.bands = bands - self.basemode = basemode - self.basetype = basetype - self.typestr = typestr - - def __str__(self): - return self.mode - - -def getmode(mode): - """Gets a mode descriptor for the given mode.""" - global _modes - if not _modes: - # initialize mode cache - modes = {} - endian = "<" if sys.byteorder == "little" else ">" - for m, (basemode, basetype, bands, typestr) in { - # core modes - # Bits need to be extended to bytes - "1": ("L", "L", ("1",), "|b1"), - "L": ("L", "L", ("L",), "|u1"), - "I": ("L", "I", ("I",), endian + "i4"), - "F": ("L", "F", ("F",), endian + "f4"), - "P": ("P", "L", ("P",), "|u1"), - "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), - "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), - "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), - "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), - "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), - # UNDONE - unsigned |u1i1i1 - "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), - "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), - # extra experimental modes - "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), - "BGR;15": ("RGB", "L", ("B", "G", "R"), endian + "u2"), - "BGR;16": ("RGB", "L", ("B", "G", "R"), endian + "u2"), - "BGR;24": ("RGB", "L", ("B", "G", "R"), endian + "u3"), - "BGR;32": ("RGB", "L", ("B", "G", "R"), endian + "u4"), - "LA": ("L", "L", ("L", "A"), "|u1"), - "La": ("L", "L", ("L", "a"), "|u1"), - "PA": ("RGB", "L", ("P", "A"), "|u1"), - }.items(): - modes[m] = ModeDescriptor(m, bands, basemode, basetype, typestr) - # mapping modes - for i16mode, typestr in { - # I;16 == I;16L, and I;32 == I;32L - "I;16": "u2", - "I;16BS": ">i2", - "I;16N": endian + "u2", - "I;16NS": endian + "i2", - "I;32": "u4", - "I;32L": "i4", - "I;32LS": " - -import re - -from . import Image, _imagingmorph - -LUT_SIZE = 1 << 9 - -# fmt: off -ROTATION_MATRIX = [ - 6, 3, 0, - 7, 4, 1, - 8, 5, 2, -] -MIRROR_MATRIX = [ - 2, 1, 0, - 5, 4, 3, - 8, 7, 6, -] -# fmt: on - - -class LutBuilder: - """A class for building a MorphLut from a descriptive language - - The input patterns is a list of a strings sequences like these:: - - 4:(... - .1. - 111)->1 - - (whitespaces including linebreaks are ignored). The option 4 - describes a series of symmetry operations (in this case a - 4-rotation), the pattern is described by: - - - . or X - Ignore - - 1 - Pixel is on - - 0 - Pixel is off - - The result of the operation is described after "->" string. - - The default is to return the current pixel value, which is - returned if no other match is found. - - Operations: - - - 4 - 4 way rotation - - N - Negate - - 1 - Dummy op for no other operation (an op must always be given) - - M - Mirroring - - Example:: - - lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) - lut = lb.build_lut() - - """ - - def __init__(self, patterns=None, op_name=None): - if patterns is not None: - self.patterns = patterns - else: - self.patterns = [] - self.lut = None - if op_name is not None: - known_patterns = { - "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], - "dilation4": ["4:(... .0. .1.)->1"], - "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], - "erosion4": ["4:(... .1. .0.)->0"], - "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], - "edge": [ - "1:(... ... ...)->0", - "4:(.0. .1. ...)->1", - "4:(01. .1. ...)->1", - ], - } - if op_name not in known_patterns: - raise Exception("Unknown pattern " + op_name + "!") - - self.patterns = known_patterns[op_name] - - def add_patterns(self, patterns): - self.patterns += patterns - - def build_default_lut(self): - symbols = [0, 1] - m = 1 << 4 # pos of current pixel - self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) - - def get_lut(self): - return self.lut - - def _string_permute(self, pattern, permutation): - """string_permute takes a pattern and a permutation and returns the - string permuted according to the permutation list. - """ - assert len(permutation) == 9 - return "".join(pattern[p] for p in permutation) - - def _pattern_permute(self, basic_pattern, options, basic_result): - """pattern_permute takes a basic pattern and its result and clones - the pattern according to the modifications described in the $options - parameter. It returns a list of all cloned patterns.""" - patterns = [(basic_pattern, basic_result)] - - # rotations - if "4" in options: - res = patterns[-1][1] - for i in range(4): - patterns.append( - (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) - ) - # mirror - if "M" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) - - # negate - if "N" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - # Swap 0 and 1 - pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") - res = 1 - int(res) - patterns.append((pattern, res)) - - return patterns - - def build_lut(self): - """Compile all patterns into a morphology lut. - - TBD :Build based on (file) morphlut:modify_lut - """ - self.build_default_lut() - patterns = [] - - # Parse and create symmetries of the patterns strings - for p in self.patterns: - m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) - if not m: - raise Exception('Syntax error in pattern "' + p + '"') - options = m.group(1) - pattern = m.group(2) - result = int(m.group(3)) - - # Get rid of spaces - pattern = pattern.replace(" ", "").replace("\n", "") - - patterns += self._pattern_permute(pattern, options, result) - - # compile the patterns into regular expressions for speed - for i, pattern in enumerate(patterns): - p = pattern[0].replace(".", "X").replace("X", "[01]") - p = re.compile(p) - patterns[i] = (p, pattern[1]) - - # Step through table and find patterns that match. - # Note that all the patterns are searched. The last one - # caught overrides - for i in range(LUT_SIZE): - # Build the bit pattern - bitpattern = bin(i)[2:] - bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] - - for p, r in patterns: - if p.match(bitpattern): - self.lut[i] = [0, 1][r] - - return self.lut - - -class MorphOp: - """A class for binary morphological operators""" - - def __init__(self, lut=None, op_name=None, patterns=None): - """Create a binary morphological operator""" - self.lut = lut - if op_name is not None: - self.lut = LutBuilder(op_name=op_name).build_lut() - elif patterns is not None: - self.lut = LutBuilder(patterns=patterns).build_lut() - - def apply(self, image): - """Run a single morphological operation on an image - - Returns a tuple of the number of changed pixels and the - morphed image""" - if self.lut is None: - raise Exception("No operator loaded") - - if image.mode != "L": - raise ValueError("Image mode must be L") - outimage = Image.new(image.mode, image.size, None) - count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id) - return count, outimage - - def match(self, image): - """Get a list of coordinates matching the morphological operation on - an image. - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - if self.lut is None: - raise Exception("No operator loaded") - - if image.mode != "L": - raise ValueError("Image mode must be L") - return _imagingmorph.match(bytes(self.lut), image.im.id) - - def get_on_pixels(self, image): - """Get a list of all turned on pixels in a binary image - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - - if image.mode != "L": - raise ValueError("Image mode must be L") - return _imagingmorph.get_on_pixels(image.im.id) - - def load_lut(self, filename): - """Load an operator from an mrl file""" - with open(filename, "rb") as f: - self.lut = bytearray(f.read()) - - if len(self.lut) != LUT_SIZE: - self.lut = None - raise Exception("Wrong size operator file!") - - def save_lut(self, filename): - """Save an operator to an mrl file""" - if self.lut is None: - raise Exception("No operator loaded") - with open(filename, "wb") as f: - f.write(self.lut) - - def set_lut(self, lut): - """Set the lut from an external source""" - self.lut = lut diff --git a/waypoint_manager/manager_GUI/PIL/ImageOps.py b/waypoint_manager/manager_GUI/PIL/ImageOps.py deleted file mode 100644 index f0d4545..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageOps.py +++ /dev/null @@ -1,610 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard image operations -# -# History: -# 2001-10-20 fl Created -# 2001-10-23 fl Added autocontrast operator -# 2001-12-18 fl Added Kevin's fit operator -# 2004-03-14 fl Fixed potential division by zero in equalize -# 2005-05-05 fl Fixed equalize for low number of values -# -# Copyright (c) 2001-2004 by Secret Labs AB -# Copyright (c) 2001-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import functools -import operator -import re - -from . import Image - -# -# helpers - - -def _border(border): - if isinstance(border, tuple): - if len(border) == 2: - left, top = right, bottom = border - elif len(border) == 4: - left, top, right, bottom = border - else: - left = top = right = bottom = border - return left, top, right, bottom - - -def _color(color, mode): - if isinstance(color, str): - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - return color - - -def _lut(image, lut): - if image.mode == "P": - # FIXME: apply to lookup table, not image data - raise NotImplementedError("mode P support coming soon") - elif image.mode in ("L", "RGB"): - if image.mode == "RGB" and len(lut) == 256: - lut = lut + lut + lut - return image.point(lut) - else: - raise OSError("not supported for this image mode") - - -# -# actions - - -def autocontrast(image, cutoff=0, ignore=None, mask=None, preserve_tone=False): - """ - Maximize (normalize) image contrast. This function calculates a - histogram of the input image (or mask region), removes ``cutoff`` percent of the - lightest and darkest pixels from the histogram, and remaps the image - so that the darkest pixel becomes black (0), and the lightest - becomes white (255). - - :param image: The image to process. - :param cutoff: The percent to cut off from the histogram on the low and - high ends. Either a tuple of (low, high), or a single - number for both. - :param ignore: The background pixel value (use None for no background). - :param mask: Histogram used in contrast operation is computed using pixels - within the mask. If no mask is given the entire image is used - for histogram computation. - :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. - - .. versionadded:: 8.2.0 - - :return: An image. - """ - if preserve_tone: - histogram = image.convert("L").histogram(mask) - else: - histogram = image.histogram(mask) - - lut = [] - for layer in range(0, len(histogram), 256): - h = histogram[layer : layer + 256] - if ignore is not None: - # get rid of outliers - try: - h[ignore] = 0 - except TypeError: - # assume sequence - for ix in ignore: - h[ix] = 0 - if cutoff: - # cut off pixels from both ends of the histogram - if not isinstance(cutoff, tuple): - cutoff = (cutoff, cutoff) - # get number of pixels - n = 0 - for ix in range(256): - n = n + h[ix] - # remove cutoff% pixels from the low end - cut = n * cutoff[0] // 100 - for lo in range(256): - if cut > h[lo]: - cut = cut - h[lo] - h[lo] = 0 - else: - h[lo] -= cut - cut = 0 - if cut <= 0: - break - # remove cutoff% samples from the high end - cut = n * cutoff[1] // 100 - for hi in range(255, -1, -1): - if cut > h[hi]: - cut = cut - h[hi] - h[hi] = 0 - else: - h[hi] -= cut - cut = 0 - if cut <= 0: - break - # find lowest/highest samples after preprocessing - for lo in range(256): - if h[lo]: - break - for hi in range(255, -1, -1): - if h[hi]: - break - if hi <= lo: - # don't bother - lut.extend(list(range(256))) - else: - scale = 255.0 / (hi - lo) - offset = -lo * scale - for ix in range(256): - ix = int(ix * scale + offset) - if ix < 0: - ix = 0 - elif ix > 255: - ix = 255 - lut.append(ix) - return _lut(image, lut) - - -def colorize(image, black, white, mid=None, blackpoint=0, whitepoint=255, midpoint=127): - """ - Colorize grayscale image. - This function calculates a color wedge which maps all black pixels in - the source image to the first color and all white pixels to the - second color. If ``mid`` is specified, it uses three-color mapping. - The ``black`` and ``white`` arguments should be RGB tuples or color names; - optionally you can use three-color mapping by also specifying ``mid``. - Mapping positions for any of the colors can be specified - (e.g. ``blackpoint``), where these parameters are the integer - value corresponding to where the corresponding color should be mapped. - These parameters must have logical order, such that - ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). - - :param image: The image to colorize. - :param black: The color to use for black input pixels. - :param white: The color to use for white input pixels. - :param mid: The color to use for midtone input pixels. - :param blackpoint: an int value [0, 255] for the black mapping. - :param whitepoint: an int value [0, 255] for the white mapping. - :param midpoint: an int value [0, 255] for the midtone mapping. - :return: An image. - """ - - # Initial asserts - assert image.mode == "L" - if mid is None: - assert 0 <= blackpoint <= whitepoint <= 255 - else: - assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 - - # Define colors from arguments - black = _color(black, "RGB") - white = _color(white, "RGB") - if mid is not None: - mid = _color(mid, "RGB") - - # Empty lists for the mapping - red = [] - green = [] - blue = [] - - # Create the low-end values - for i in range(0, blackpoint): - red.append(black[0]) - green.append(black[1]) - blue.append(black[2]) - - # Create the mapping (2-color) - if mid is None: - - range_map = range(0, whitepoint - blackpoint) - - for i in range_map: - red.append(black[0] + i * (white[0] - black[0]) // len(range_map)) - green.append(black[1] + i * (white[1] - black[1]) // len(range_map)) - blue.append(black[2] + i * (white[2] - black[2]) // len(range_map)) - - # Create the mapping (3-color) - else: - - range_map1 = range(0, midpoint - blackpoint) - range_map2 = range(0, whitepoint - midpoint) - - for i in range_map1: - red.append(black[0] + i * (mid[0] - black[0]) // len(range_map1)) - green.append(black[1] + i * (mid[1] - black[1]) // len(range_map1)) - blue.append(black[2] + i * (mid[2] - black[2]) // len(range_map1)) - for i in range_map2: - red.append(mid[0] + i * (white[0] - mid[0]) // len(range_map2)) - green.append(mid[1] + i * (white[1] - mid[1]) // len(range_map2)) - blue.append(mid[2] + i * (white[2] - mid[2]) // len(range_map2)) - - # Create the high-end values - for i in range(0, 256 - whitepoint): - red.append(white[0]) - green.append(white[1]) - blue.append(white[2]) - - # Return converted image - image = image.convert("RGB") - return _lut(image, red + green + blue) - - -def contain(image, size, method=Image.Resampling.BICUBIC): - """ - Returns a resized version of the image, set to the maximum width and height - within the requested size, while maintaining the original aspect ratio. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio > dest_ratio: - new_height = int(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = int(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def pad(image, size, method=Image.Resampling.BICUBIC, color=None, centering=(0.5, 0.5)): - """ - Returns a resized and padded version of the image, expanded to fill the - requested aspect ratio and size. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :param color: The background color of the padded image. - :param centering: Control the position of the original image within the - padded version. - - (0.5, 0.5) will keep the image centered - (0, 0) will keep the image aligned to the top left - (1, 1) will keep the image aligned to the bottom - right - :return: An image. - """ - - resized = contain(image, size, method) - if resized.size == size: - out = resized - else: - out = Image.new(image.mode, size, color) - if resized.width != size[0]: - x = int((size[0] - resized.width) * max(0, min(centering[0], 1))) - out.paste(resized, (x, 0)) - else: - y = int((size[1] - resized.height) * max(0, min(centering[1], 1))) - out.paste(resized, (0, y)) - return out - - -def crop(image, border=0): - """ - Remove border from image. The same amount of pixels are removed - from all four sides. This function works on all image modes. - - .. seealso:: :py:meth:`~PIL.Image.Image.crop` - - :param image: The image to crop. - :param border: The number of pixels to remove. - :return: An image. - """ - left, top, right, bottom = _border(border) - return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) - - -def scale(image, factor, resample=Image.Resampling.BICUBIC): - """ - Returns a rescaled image by a specific factor given in parameter. - A factor greater than 1 expands the image, between 0 and 1 contracts the - image. - - :param image: The image to rescale. - :param factor: The expansion factor, as a float. - :param resample: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - if factor == 1: - return image.copy() - elif factor <= 0: - raise ValueError("the factor must be greater than 0") - else: - size = (round(factor * image.width), round(factor * image.height)) - return image.resize(size, resample) - - -def deform(image, deformer, resample=Image.Resampling.BILINEAR): - """ - Deform the image. - - :param image: The image to deform. - :param deformer: A deformer object. Any object that implements a - ``getmesh`` method can be used. - :param resample: An optional resampling filter. Same values possible as - in the PIL.Image.transform function. - :return: An image. - """ - return image.transform( - image.size, Image.Transform.MESH, deformer.getmesh(image), resample - ) - - -def equalize(image, mask=None): - """ - Equalize the image histogram. This function applies a non-linear - mapping to the input image, in order to create a uniform - distribution of grayscale values in the output image. - - :param image: The image to equalize. - :param mask: An optional mask. If given, only the pixels selected by - the mask are included in the analysis. - :return: An image. - """ - if image.mode == "P": - image = image.convert("RGB") - h = image.histogram(mask) - lut = [] - for b in range(0, len(h), 256): - histo = [_f for _f in h[b : b + 256] if _f] - if len(histo) <= 1: - lut.extend(list(range(256))) - else: - step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 - if not step: - lut.extend(list(range(256))) - else: - n = step // 2 - for i in range(256): - lut.append(n // step) - n = n + h[i + b] - return _lut(image, lut) - - -def expand(image, border=0, fill=0): - """ - Add border to the image - - :param image: The image to expand. - :param border: Border width, in pixels. - :param fill: Pixel fill value (a color value). Default is 0 (black). - :return: An image. - """ - left, top, right, bottom = _border(border) - width = left + image.size[0] + right - height = top + image.size[1] + bottom - color = _color(fill, image.mode) - if image.mode == "P" and image.palette: - image.load() - palette = image.palette.copy() - if isinstance(color, tuple): - color = palette.getcolor(color) - else: - palette = None - out = Image.new(image.mode, (width, height), color) - if palette: - out.putpalette(palette.palette) - out.paste(image, (left, top)) - return out - - -def fit(image, size, method=Image.Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5)): - """ - Returns a resized and cropped version of the image, cropped to the - requested aspect ratio and size. - - This function was contributed by Kevin Cazabon. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :param bleed: Remove a border around the outside of the image from all - four edges. The value is a decimal percentage (use 0.01 for - one percent). The default value is 0 (no border). - Cannot be greater than or equal to 0.5. - :param centering: Control the cropping position. Use (0.5, 0.5) for - center cropping (e.g. if cropping the width, take 50% off - of the left side, and therefore 50% off the right side). - (0.0, 0.0) will crop from the top left corner (i.e. if - cropping the width, take all of the crop off of the right - side, and if cropping the height, take all of it off the - bottom). (1.0, 0.0) will crop from the bottom left - corner, etc. (i.e. if cropping the width, take all of the - crop off the left side, and if cropping the height take - none from the top, and therefore all off the bottom). - :return: An image. - """ - - # by Kevin Cazabon, Feb 17/2000 - # kevin@cazabon.com - # https://www.cazabon.com - - # ensure centering is mutable - centering = list(centering) - - if not 0.0 <= centering[0] <= 1.0: - centering[0] = 0.5 - if not 0.0 <= centering[1] <= 1.0: - centering[1] = 0.5 - - if not 0.0 <= bleed < 0.5: - bleed = 0.0 - - # calculate the area to use for resizing and cropping, subtracting - # the 'bleed' around the edges - - # number of pixels to trim off on Top and Bottom, Left and Right - bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) - - live_size = ( - image.size[0] - bleed_pixels[0] * 2, - image.size[1] - bleed_pixels[1] * 2, - ) - - # calculate the aspect ratio of the live_size - live_size_ratio = live_size[0] / live_size[1] - - # calculate the aspect ratio of the output image - output_ratio = size[0] / size[1] - - # figure out if the sides or top/bottom will be cropped off - if live_size_ratio == output_ratio: - # live_size is already the needed ratio - crop_width = live_size[0] - crop_height = live_size[1] - elif live_size_ratio >= output_ratio: - # live_size is wider than what's needed, crop the sides - crop_width = output_ratio * live_size[1] - crop_height = live_size[1] - else: - # live_size is taller than what's needed, crop the top and bottom - crop_width = live_size[0] - crop_height = live_size[0] / output_ratio - - # make the crop - crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering[0] - crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering[1] - - crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) - - # resize the image and return it - return image.resize(size, method, box=crop) - - -def flip(image): - """ - Flip the image vertically (top to bottom). - - :param image: The image to flip. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) - - -def grayscale(image): - """ - Convert the image to grayscale. - - :param image: The image to convert. - :return: An image. - """ - return image.convert("L") - - -def invert(image): - """ - Invert (negate) the image. - - :param image: The image to invert. - :return: An image. - """ - lut = [] - for i in range(256): - lut.append(255 - i) - return image.point(lut) if image.mode == "1" else _lut(image, lut) - - -def mirror(image): - """ - Flip image horizontally (left to right). - - :param image: The image to mirror. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -def posterize(image, bits): - """ - Reduce the number of bits for each color channel. - - :param image: The image to posterize. - :param bits: The number of bits to keep for each channel (1-8). - :return: An image. - """ - lut = [] - mask = ~(2 ** (8 - bits) - 1) - for i in range(256): - lut.append(i & mask) - return _lut(image, lut) - - -def solarize(image, threshold=128): - """ - Invert all pixel values above a threshold. - - :param image: The image to solarize. - :param threshold: All pixels above this greyscale level are inverted. - :return: An image. - """ - lut = [] - for i in range(256): - if i < threshold: - lut.append(i) - else: - lut.append(255 - i) - return _lut(image, lut) - - -def exif_transpose(image): - """ - If an image has an EXIF Orientation tag, return a new image that is - transposed accordingly. Otherwise, return a copy of the image. - - :param image: The image to transpose. - :return: An image. - """ - exif = image.getexif() - orientation = exif.get(0x0112) - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(orientation) - if method is not None: - transposed_image = image.transpose(method) - transposed_exif = transposed_image.getexif() - if 0x0112 in transposed_exif: - del transposed_exif[0x0112] - if "exif" in transposed_image.info: - transposed_image.info["exif"] = transposed_exif.tobytes() - elif "Raw profile type exif" in transposed_image.info: - transposed_image.info[ - "Raw profile type exif" - ] = transposed_exif.tobytes().hex() - elif "XML:com.adobe.xmp" in transposed_image.info: - transposed_image.info["XML:com.adobe.xmp"] = re.sub( - r'tiff:Orientation="([0-9])"', - "", - transposed_image.info["XML:com.adobe.xmp"], - ) - return transposed_image - return image.copy() diff --git a/waypoint_manager/manager_GUI/PIL/ImagePalette.py b/waypoint_manager/manager_GUI/PIL/ImagePalette.py deleted file mode 100644 index 853147a..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImagePalette.py +++ /dev/null @@ -1,255 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image palette object -# -# History: -# 1996-03-11 fl Rewritten. -# 1997-01-03 fl Up and running. -# 1997-08-23 fl Added load hack -# 2001-04-16 fl Fixed randint shadow bug in random() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import array - -from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile -from ._deprecate import deprecate - - -class ImagePalette: - """ - Color palette for palette mapped images - - :param mode: The mode to use for the palette. See: - :ref:`concept-modes`. Defaults to "RGB" - :param palette: An optional palette. If given, it must be a bytearray, - an array or a list of ints between 0-255. The list must consist of - all channels for one color followed by the next color (e.g. RGBRGBRGB). - Defaults to an empty palette. - """ - - def __init__(self, mode="RGB", palette=None, size=0): - self.mode = mode - self.rawmode = None # if set, palette contains raw data - self.palette = palette or bytearray() - self.dirty = None - if size != 0: - deprecate("The size parameter", 10, None) - if size != len(self.palette): - raise ValueError("wrong palette size") - - @property - def palette(self): - return self._palette - - @palette.setter - def palette(self, palette): - self._palette = palette - - mode_len = len(self.mode) - self.colors = {} - for i in range(0, len(self.palette), mode_len): - color = tuple(self.palette[i : i + mode_len]) - if color in self.colors: - continue - self.colors[color] = i // mode_len - - def copy(self): - new = ImagePalette() - - new.mode = self.mode - new.rawmode = self.rawmode - if self.palette is not None: - new.palette = self.palette[:] - new.dirty = self.dirty - - return new - - def getdata(self): - """ - Get palette contents in format suitable for the low-level - ``im.putpalette`` primitive. - - .. warning:: This method is experimental. - """ - if self.rawmode: - return self.rawmode, self.palette - return self.mode, self.tobytes() - - def tobytes(self): - """Convert palette to bytes. - - .. warning:: This method is experimental. - """ - if self.rawmode: - raise ValueError("palette contains raw palette data") - if isinstance(self.palette, bytes): - return self.palette - arr = array.array("B", self.palette) - return arr.tobytes() - - # Declare tostring as an alias for tobytes - tostring = tobytes - - def getcolor(self, color, image=None): - """Given an rgb tuple, allocate palette entry. - - .. warning:: This method is experimental. - """ - if self.rawmode: - raise ValueError("palette contains raw palette data") - if isinstance(color, tuple): - if self.mode == "RGB": - if len(color) == 4 and color[3] == 255: - color = color[:3] - elif self.mode == "RGBA": - if len(color) == 3: - color += (255,) - try: - return self.colors[color] - except KeyError as e: - # allocate new color slot - if not isinstance(self.palette, bytearray): - self._palette = bytearray(self.palette) - index = len(self.palette) // 3 - special_colors = () - if image: - special_colors = ( - image.info.get("background"), - image.info.get("transparency"), - ) - while index in special_colors: - index += 1 - if index >= 256: - if image: - # Search for an unused index - for i, count in reversed(list(enumerate(image.histogram()))): - if count == 0 and i not in special_colors: - index = i - break - if index >= 256: - raise ValueError("cannot allocate more than 256 colors") from e - self.colors[color] = index - if index * 3 < len(self.palette): - self._palette = ( - self.palette[: index * 3] - + bytes(color) - + self.palette[index * 3 + 3 :] - ) - else: - self._palette += bytes(color) - self.dirty = 1 - return index - else: - raise ValueError(f"unknown color specifier: {repr(color)}") - - def save(self, fp): - """Save palette to text file. - - .. warning:: This method is experimental. - """ - if self.rawmode: - raise ValueError("palette contains raw palette data") - if isinstance(fp, str): - fp = open(fp, "w") - fp.write("# Palette\n") - fp.write(f"# Mode: {self.mode}\n") - for i in range(256): - fp.write(f"{i}") - for j in range(i * len(self.mode), (i + 1) * len(self.mode)): - try: - fp.write(f" {self.palette[j]}") - except IndexError: - fp.write(" 0") - fp.write("\n") - fp.close() - - -# -------------------------------------------------------------------- -# Internal - - -def raw(rawmode, data): - palette = ImagePalette() - palette.rawmode = rawmode - palette.palette = data - palette.dirty = 1 - return palette - - -# -------------------------------------------------------------------- -# Factories - - -def make_linear_lut(black, white): - lut = [] - if black == 0: - for i in range(256): - lut.append(white * i // 255) - else: - raise NotImplementedError # FIXME - return lut - - -def make_gamma_lut(exp): - lut = [] - for i in range(256): - lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) - return lut - - -def negative(mode="RGB"): - palette = list(range(256 * len(mode))) - palette.reverse() - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def random(mode="RGB"): - from random import randint - - palette = [] - for i in range(256 * len(mode)): - palette.append(randint(0, 255)) - return ImagePalette(mode, palette) - - -def sepia(white="#fff0c0"): - bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] - return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) - - -def wedge(mode="RGB"): - palette = list(range(256 * len(mode))) - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def load(filename): - - # FIXME: supports GIMP gradients only - - with open(filename, "rb") as fp: - - for paletteHandler in [ - GimpPaletteFile.GimpPaletteFile, - GimpGradientFile.GimpGradientFile, - PaletteFile.PaletteFile, - ]: - try: - fp.seek(0) - lut = paletteHandler(fp).getpalette() - if lut: - break - except (SyntaxError, ValueError): - # import traceback - # traceback.print_exc() - pass - else: - raise OSError("cannot load palette") - - return lut # data, rawmode diff --git a/waypoint_manager/manager_GUI/PIL/ImagePath.py b/waypoint_manager/manager_GUI/PIL/ImagePath.py deleted file mode 100644 index 3d3538c..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImagePath.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# path interface -# -# History: -# 1996-11-04 fl Created -# 2002-04-14 fl Added documentation stub class -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -from . import Image - -Path = Image.core.path diff --git a/waypoint_manager/manager_GUI/PIL/ImageQt.py b/waypoint_manager/manager_GUI/PIL/ImageQt.py deleted file mode 100644 index a34678c..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageQt.py +++ /dev/null @@ -1,228 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a simple Qt image interface. -# -# history: -# 2006-06-03 fl: created -# 2006-06-04 fl: inherit from QImage instead of wrapping it -# 2006-06-05 fl: removed toimage helper; move string support to ImageQt -# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) -# -# Copyright (c) 2006 by Secret Labs AB -# Copyright (c) 2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import sys -from io import BytesIO - -from . import Image -from ._deprecate import deprecate -from ._util import is_path - -qt_versions = [ - ["6", "PyQt6"], - ["side6", "PySide6"], - ["5", "PyQt5"], - ["side2", "PySide2"], -] - -# If a version has already been imported, attempt it first -qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True) -for qt_version, qt_module in qt_versions: - try: - if qt_module == "PyQt6": - from PyQt6.QtCore import QBuffer, QIODevice - from PyQt6.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PySide6": - from PySide6.QtCore import QBuffer, QIODevice - from PySide6.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PyQt5": - from PyQt5.QtCore import QBuffer, QIODevice - from PyQt5.QtGui import QImage, QPixmap, qRgba - - deprecate("Support for PyQt5", 10, "PyQt6 or PySide6") - elif qt_module == "PySide2": - from PySide2.QtCore import QBuffer, QIODevice - from PySide2.QtGui import QImage, QPixmap, qRgba - - deprecate("Support for PySide2", 10, "PyQt6 or PySide6") - except (ImportError, RuntimeError): - continue - qt_is_installed = True - break -else: - qt_is_installed = False - qt_version = None - - -def rgb(r, g, b, a=255): - """(Internal) Turns an RGB color into a Qt compatible color integer.""" - # use qRgb to pack the colors, and then turn the resulting long - # into a negative integer with the same bitpattern. - return qRgba(r, g, b, a) & 0xFFFFFFFF - - -def fromqimage(im): - """ - :param im: QImage or PIL ImageQt object - """ - buffer = QBuffer() - if qt_version == "6": - try: - qt_openmode = QIODevice.OpenModeFlag - except AttributeError: - qt_openmode = QIODevice.OpenMode - else: - qt_openmode = QIODevice - buffer.open(qt_openmode.ReadWrite) - # preserve alpha channel with png - # otherwise ppm is more friendly with Image.open - if im.hasAlphaChannel(): - im.save(buffer, "png") - else: - im.save(buffer, "ppm") - - b = BytesIO() - b.write(buffer.data()) - buffer.close() - b.seek(0) - - return Image.open(b) - - -def fromqpixmap(im): - return fromqimage(im) - # buffer = QBuffer() - # buffer.open(QIODevice.ReadWrite) - # # im.save(buffer) - # # What if png doesn't support some image features like animation? - # im.save(buffer, 'ppm') - # bytes_io = BytesIO() - # bytes_io.write(buffer.data()) - # buffer.close() - # bytes_io.seek(0) - # return Image.open(bytes_io) - - -def align8to32(bytes, width, mode): - """ - converts each scanline of data from 8 bit to 32 bit aligned - """ - - bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode] - - # calculate bytes per line and the extra padding if needed - bits_per_line = bits_per_pixel * width - full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) - bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) - - extra_padding = -bytes_per_line % 4 - - # already 32 bit aligned by luck - if not extra_padding: - return bytes - - new_data = [] - for i in range(len(bytes) // bytes_per_line): - new_data.append( - bytes[i * bytes_per_line : (i + 1) * bytes_per_line] - + b"\x00" * extra_padding - ) - - return b"".join(new_data) - - -def _toqclass_helper(im): - data = None - colortable = None - exclusive_fp = False - - # handle filename, if given instead of image name - if hasattr(im, "toUtf8"): - # FIXME - is this really the best way to do this? - im = str(im.toUtf8(), "utf-8") - if is_path(im): - im = Image.open(im) - exclusive_fp = True - - qt_format = QImage.Format if qt_version == "6" else QImage - if im.mode == "1": - format = qt_format.Format_Mono - elif im.mode == "L": - format = qt_format.Format_Indexed8 - colortable = [] - for i in range(256): - colortable.append(rgb(i, i, i)) - elif im.mode == "P": - format = qt_format.Format_Indexed8 - colortable = [] - palette = im.getpalette() - for i in range(0, len(palette), 3): - colortable.append(rgb(*palette[i : i + 3])) - elif im.mode == "RGB": - # Populate the 4th channel with 255 - im = im.convert("RGBA") - - data = im.tobytes("raw", "BGRA") - format = qt_format.Format_RGB32 - elif im.mode == "RGBA": - data = im.tobytes("raw", "BGRA") - format = qt_format.Format_ARGB32 - elif im.mode == "I;16" and hasattr(qt_format, "Format_Grayscale16"): # Qt 5.13+ - im = im.point(lambda i: i * 256) - - format = qt_format.Format_Grayscale16 - else: - if exclusive_fp: - im.close() - raise ValueError(f"unsupported image mode {repr(im.mode)}") - - size = im.size - __data = data or align8to32(im.tobytes(), size[0], im.mode) - if exclusive_fp: - im.close() - return {"data": __data, "size": size, "format": format, "colortable": colortable} - - -if qt_is_installed: - - class ImageQt(QImage): - def __init__(self, im): - """ - An PIL image wrapper for Qt. This is a subclass of PyQt's QImage - class. - - :param im: A PIL Image object, or a file name (given either as - Python string or a PyQt string object). - """ - im_data = _toqclass_helper(im) - # must keep a reference, or Qt will crash! - # All QImage constructors that take data operate on an existing - # buffer, so this buffer has to hang on for the life of the image. - # Fixes https://github.com/python-pillow/Pillow/issues/1370 - self.__data = im_data["data"] - super().__init__( - self.__data, - im_data["size"][0], - im_data["size"][1], - im_data["format"], - ) - if im_data["colortable"]: - self.setColorTable(im_data["colortable"]) - - -def toqimage(im): - return ImageQt(im) - - -def toqpixmap(im): - # # This doesn't work. For now using a dumb approach. - # im_data = _toqclass_helper(im) - # result = QPixmap(im_data["size"][0], im_data["size"][1]) - # result.loadFromData(im_data["data"]) - qimage = toqimage(im) - return QPixmap.fromImage(qimage) diff --git a/waypoint_manager/manager_GUI/PIL/ImageSequence.py b/waypoint_manager/manager_GUI/PIL/ImageSequence.py deleted file mode 100644 index 9df910a..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageSequence.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# sequence support classes -# -# history: -# 1997-02-20 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## - - -class Iterator: - """ - This class implements an iterator object that can be used to loop - over an image sequence. - - You can use the ``[]`` operator to access elements by index. This operator - will raise an :py:exc:`IndexError` if you try to access a nonexistent - frame. - - :param im: An image object. - """ - - def __init__(self, im): - if not hasattr(im, "seek"): - raise AttributeError("im must have seek method") - self.im = im - self.position = getattr(self.im, "_min_frame", 0) - - def __getitem__(self, ix): - try: - self.im.seek(ix) - return self.im - except EOFError as e: - raise IndexError from e # end of sequence - - def __iter__(self): - return self - - def __next__(self): - try: - self.im.seek(self.position) - self.position += 1 - return self.im - except EOFError as e: - raise StopIteration from e - - -def all_frames(im, func=None): - """ - Applies a given function to all frames in an image or a list of images. - The frames are returned as a list of separate images. - - :param im: An image, or a list of images. - :param func: The function to apply to all of the image frames. - :returns: A list of images. - """ - if not isinstance(im, list): - im = [im] - - ims = [] - for imSequence in im: - current = imSequence.tell() - - ims += [im_frame.copy() for im_frame in Iterator(imSequence)] - - imSequence.seek(current) - return [func(im) for im in ims] if func else ims diff --git a/waypoint_manager/manager_GUI/PIL/ImageShow.py b/waypoint_manager/manager_GUI/PIL/ImageShow.py deleted file mode 100644 index 9117f57..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageShow.py +++ /dev/null @@ -1,390 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# im.show() drivers -# -# History: -# 2008-04-06 fl Created -# -# Copyright (c) Secret Labs AB 2008. -# -# See the README file for information on usage and redistribution. -# -import os -import shutil -import subprocess -import sys -from shlex import quote - -from PIL import Image - -from ._deprecate import deprecate - -_viewers = [] - - -def register(viewer, order=1): - """ - The :py:func:`register` function is used to register additional viewers:: - - from PIL import ImageShow - ImageShow.register(MyViewer()) # MyViewer will be used as a last resort - ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised - ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised - - :param viewer: The viewer to be registered. - :param order: - Zero or a negative integer to prepend this viewer to the list, - a positive integer to append it. - """ - try: - if issubclass(viewer, Viewer): - viewer = viewer() - except TypeError: - pass # raised if viewer wasn't a class - if order > 0: - _viewers.append(viewer) - else: - _viewers.insert(0, viewer) - - -def show(image, title=None, **options): - r""" - Display a given image. - - :param image: An image object. - :param title: Optional title. Not all viewers can display the title. - :param \**options: Additional viewer options. - :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. - """ - for viewer in _viewers: - if viewer.show(image, title=title, **options): - return True - return False - - -class Viewer: - """Base class for viewers.""" - - # main api - - def show(self, image, **options): - """ - The main function for displaying an image. - Converts the given image to the target format and displays it. - """ - - if not ( - image.mode in ("1", "RGBA") - or (self.format == "PNG" and image.mode in ("I;16", "LA")) - ): - base = Image.getmodebase(image.mode) - if image.mode != base: - image = image.convert(base) - - return self.show_image(image, **options) - - # hook methods - - format = None - """The format to convert the image into.""" - options = {} - """Additional options used to convert the image.""" - - def get_format(self, image): - """Return format name, or ``None`` to save as PGM/PPM.""" - return self.format - - def get_command(self, file, **options): - """ - Returns the command used to display the file. - Not implemented in the base class. - """ - raise NotImplementedError - - def save_image(self, image): - """Save to temporary file and return filename.""" - return image._dump(format=self.get_format(image), **self.options) - - def show_image(self, image, **options): - """Display the given image.""" - return self.show_file(self.save_image(image), **options) - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used - instead. - """ - if path is None: - if "file" in options: - deprecate("The 'file' argument", 10, "'path'") - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - os.system(self.get_command(path, **options)) - return 1 - - -# -------------------------------------------------------------------- - - -class WindowsViewer(Viewer): - """The default viewer on Windows is the default system application for PNG files.""" - - format = "PNG" - options = {"compress_level": 1} - - def get_command(self, file, **options): - return ( - f'start "Pillow" /WAIT "{file}" ' - "&& ping -n 4 127.0.0.1 >NUL " - f'&& del /f "{file}"' - ) - - -if sys.platform == "win32": - register(WindowsViewer) - - -class MacViewer(Viewer): - """The default viewer on macOS using ``Preview.app``.""" - - format = "PNG" - options = {"compress_level": 1} - - def get_command(self, file, **options): - # on darwin open returns immediately resulting in the temp - # file removal while app is opening - command = "open -a Preview.app" - command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" - return command - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used - instead. - """ - if path is None: - if "file" in options: - deprecate("The 'file' argument", 10, "'path'") - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.call(["open", "-a", "Preview.app", path]) - subprocess.Popen( - [ - sys.executable, - "-c", - "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", - path, - ] - ) - return 1 - - -if sys.platform == "darwin": - register(MacViewer) - - -class UnixViewer(Viewer): - format = "PNG" - options = {"compress_level": 1} - - def get_command(self, file, **options): - command = self.get_command_ex(file, **options)[0] - return f"({command} {quote(file)}" - - -class XDGViewer(UnixViewer): - """ - The freedesktop.org ``xdg-open`` command. - """ - - def get_command_ex(self, file, **options): - command = executable = "xdg-open" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used - instead. - """ - if path is None: - if "file" in options: - deprecate("The 'file' argument", 10, "'path'") - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.Popen(["xdg-open", path]) - return 1 - - -class DisplayViewer(UnixViewer): - """ - The ImageMagick ``display`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex(self, file, title=None, **options): - command = executable = "display" - if title: - command += f" -title {quote(title)}" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - deprecate("The 'file' argument", 10, "'path'") - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - args = ["display"] - title = options.get("title") - if title: - args += ["-title", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -class GmDisplayViewer(UnixViewer): - """The GraphicsMagick ``gm display`` command.""" - - def get_command_ex(self, file, **options): - executable = "gm" - command = "gm display" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - deprecate("The 'file' argument", 10, "'path'") - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.Popen(["gm", "display", path]) - return 1 - - -class EogViewer(UnixViewer): - """The GNOME Image Viewer ``eog`` command.""" - - def get_command_ex(self, file, **options): - executable = "eog" - command = "eog -n" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - deprecate("The 'file' argument", 10, "'path'") - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.Popen(["eog", "-n", path]) - return 1 - - -class XVViewer(UnixViewer): - """ - The X Viewer ``xv`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex(self, file, title=None, **options): - # note: xv is pretty outdated. most modern systems have - # imagemagick's display command instead. - command = executable = "xv" - if title: - command += f" -name {quote(title)}" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - deprecate("The 'file' argument", 10, "'path'") - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - args = ["xv"] - title = options.get("title") - if title: - args += ["-name", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -if sys.platform not in ("win32", "darwin"): # unixoids - if shutil.which("xdg-open"): - register(XDGViewer) - if shutil.which("display"): - register(DisplayViewer) - if shutil.which("gm"): - register(GmDisplayViewer) - if shutil.which("eog"): - register(EogViewer) - if shutil.which("xv"): - register(XVViewer) - - -class IPythonViewer(Viewer): - """The viewer for IPython frontends.""" - - def show_image(self, image, **options): - ipython_display(image) - return 1 - - -try: - from IPython.display import display as ipython_display -except ImportError: - pass -else: - register(IPythonViewer) - - -if __name__ == "__main__": - - if len(sys.argv) < 2: - print("Syntax: python3 ImageShow.py imagefile [title]") - sys.exit() - - with Image.open(sys.argv[1]) as im: - print(show(im, *sys.argv[2:])) diff --git a/waypoint_manager/manager_GUI/PIL/ImageStat.py b/waypoint_manager/manager_GUI/PIL/ImageStat.py deleted file mode 100644 index 1baef7d..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageStat.py +++ /dev/null @@ -1,147 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# global image statistics -# -# History: -# 1996-04-05 fl Created -# 1997-05-21 fl Added mask; added rms, var, stddev attributes -# 1997-08-05 fl Added median -# 1998-07-05 hk Fixed integer overflow error -# -# Notes: -# This class shows how to implement delayed evaluation of attributes. -# To get a certain value, simply access the corresponding attribute. -# The __getattr__ dispatcher takes care of the rest. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996-97. -# -# See the README file for information on usage and redistribution. -# - -import functools -import math -import operator - - -class Stat: - def __init__(self, image_or_list, mask=None): - try: - if mask: - self.h = image_or_list.histogram(mask) - else: - self.h = image_or_list.histogram() - except AttributeError: - self.h = image_or_list # assume it to be a histogram list - if not isinstance(self.h, list): - raise TypeError("first argument must be image or list") - self.bands = list(range(len(self.h) // 256)) - - def __getattr__(self, id): - """Calculate missing attribute""" - if id[:4] == "_get": - raise AttributeError(id) - # calculate missing attribute - v = getattr(self, "_get" + id)() - setattr(self, id, v) - return v - - def _getextrema(self): - """Get min/max values for each band in the image""" - - def minmax(histogram): - n = 255 - x = 0 - for i in range(256): - if histogram[i]: - n = min(n, i) - x = max(x, i) - return n, x # returns (255, 0) if there's no data in the histogram - - v = [] - for i in range(0, len(self.h), 256): - v.append(minmax(self.h[i:])) - return v - - def _getcount(self): - """Get total number of pixels in each layer""" - - v = [] - for i in range(0, len(self.h), 256): - v.append(functools.reduce(operator.add, self.h[i : i + 256])) - return v - - def _getsum(self): - """Get sum of all pixels in each layer""" - - v = [] - for i in range(0, len(self.h), 256): - layer_sum = 0.0 - for j in range(256): - layer_sum += j * self.h[i + j] - v.append(layer_sum) - return v - - def _getsum2(self): - """Get squared sum of all pixels in each layer""" - - v = [] - for i in range(0, len(self.h), 256): - sum2 = 0.0 - for j in range(256): - sum2 += (j**2) * float(self.h[i + j]) - v.append(sum2) - return v - - def _getmean(self): - """Get average pixel level for each layer""" - - v = [] - for i in self.bands: - v.append(self.sum[i] / self.count[i]) - return v - - def _getmedian(self): - """Get median pixel level for each layer""" - - v = [] - for i in self.bands: - s = 0 - half = self.count[i] // 2 - b = i * 256 - for j in range(256): - s = s + self.h[b + j] - if s > half: - break - v.append(j) - return v - - def _getrms(self): - """Get RMS for each layer""" - - v = [] - for i in self.bands: - v.append(math.sqrt(self.sum2[i] / self.count[i])) - return v - - def _getvar(self): - """Get variance for each layer""" - - v = [] - for i in self.bands: - n = self.count[i] - v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n) - return v - - def _getstddev(self): - """Get standard deviation for each layer""" - - v = [] - for i in self.bands: - v.append(math.sqrt(self.var[i])) - return v - - -Global = Stat # compatibility diff --git a/waypoint_manager/manager_GUI/PIL/ImageTk.py b/waypoint_manager/manager_GUI/PIL/ImageTk.py deleted file mode 100644 index c2c4d77..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageTk.py +++ /dev/null @@ -1,304 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Tk display interface -# -# History: -# 96-04-08 fl Created -# 96-09-06 fl Added getimage method -# 96-11-01 fl Rewritten, removed image attribute and crop method -# 97-05-09 fl Use PyImagingPaste method instead of image type -# 97-05-12 fl Minor tweaks to match the IFUNC95 interface -# 97-05-17 fl Support the "pilbitmap" booster patch -# 97-06-05 fl Added file= and data= argument to image constructors -# 98-03-09 fl Added width and height methods to Image classes -# 98-07-02 fl Use default mode for "P" images without palette attribute -# 98-07-02 fl Explicitly destroy Tkinter image objects -# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) -# 99-07-26 fl Automatically hook into Tkinter (if possible) -# 99-08-15 fl Hook uses _imagingtk instead of _imaging -# -# Copyright (c) 1997-1999 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import tkinter -from io import BytesIO - -from . import Image -from ._deprecate import deprecate - -# -------------------------------------------------------------------- -# Check for Tkinter interface hooks - -_pilbitmap_ok = None - - -def _pilbitmap_check(): - global _pilbitmap_ok - if _pilbitmap_ok is None: - try: - im = Image.new("1", (1, 1)) - tkinter.BitmapImage(data=f"PIL:{im.im.id}") - _pilbitmap_ok = 1 - except tkinter.TclError: - _pilbitmap_ok = 0 - return _pilbitmap_ok - - -def _get_image_from_kw(kw): - source = None - if "file" in kw: - source = kw.pop("file") - elif "data" in kw: - source = BytesIO(kw.pop("data")) - if source: - return Image.open(source) - - -def _pyimagingtkcall(command, photo, id): - tk = photo.tk - try: - tk.call(command, photo, id) - except tkinter.TclError: - # activate Tkinter hook - # may raise an error if it cannot attach to Tkinter - from . import _imagingtk - - try: - if hasattr(tk, "interp"): - # Required for PyPy, which always has CFFI installed - from cffi import FFI - - ffi = FFI() - - # PyPy is using an FFI CDATA element - # (Pdb) self.tk.interp - # - _imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1) - else: - _imagingtk.tkinit(tk.interpaddr(), 1) - except AttributeError: - _imagingtk.tkinit(id(tk), 0) - tk.call(command, photo, id) - - -# -------------------------------------------------------------------- -# PhotoImage - - -class PhotoImage: - """ - A Tkinter-compatible photo image. This can be used - everywhere Tkinter expects an image object. If the image is an RGBA - image, pixels having alpha 0 are treated as transparent. - - The constructor takes either a PIL image, or a mode and a size. - Alternatively, you can use the ``file`` or ``data`` options to initialize - the photo image object. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. - :param size: If the first argument is a mode string, this defines the size - of the image. - :keyword file: A filename to load the image from (using - ``Image.open(file)``). - :keyword data: An 8-bit string containing image data (as loaded from an - image file). - """ - - def __init__(self, image=None, size=None, **kw): - - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if hasattr(image, "mode") and hasattr(image, "size"): - # got an image instead of a mode - mode = image.mode - if mode == "P": - # palette mapped data - image.load() - try: - mode = image.palette.mode - except AttributeError: - mode = "RGB" # default - size = image.size - kw["width"], kw["height"] = size - else: - mode = image - image = None - - if mode not in ["1", "L", "RGB", "RGBA"]: - mode = Image.getmodebase(mode) - - self.__mode = mode - self.__size = size - self.__photo = tkinter.PhotoImage(**kw) - self.tk = self.__photo.tk - if image: - self.paste(image) - - def __del__(self): - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def __str__(self): - """ - Get the Tkinter photo image identifier. This method is automatically - called by Tkinter whenever a PhotoImage object is passed to a Tkinter - method. - - :return: A Tkinter photo image identifier (a string). - """ - return str(self.__photo) - - def width(self): - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self): - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def paste(self, im, box=None): - """ - Paste a PIL image into the photo image. Note that this can - be very slow if the photo image is displayed. - - :param im: A PIL image. The size must match the target region. If the - mode does not match, the image is converted to the mode of - the bitmap image. - :param box: Deprecated. This parameter will be removed in Pillow 10 - (2023-07-01). - """ - - if box is not None: - deprecate("The box parameter", 10, None) - - # convert to blittable - im.load() - image = im.im - if image.isblock() and im.mode == self.__mode: - block = image - else: - block = image.new_block(self.__mode, im.size) - image.convert2(block, image) # convert directly between buffers - - _pyimagingtkcall("PyImagingPhoto", self.__photo, block.id) - - -# -------------------------------------------------------------------- -# BitmapImage - - -class BitmapImage: - """ - A Tkinter-compatible bitmap image. This can be used everywhere Tkinter - expects an image object. - - The given image must have mode "1". Pixels having value 0 are treated as - transparent. Options, if any, are passed on to Tkinter. The most commonly - used option is ``foreground``, which is used to specify the color for the - non-transparent parts. See the Tkinter documentation for information on - how to specify colours. - - :param image: A PIL image. - """ - - def __init__(self, image=None, **kw): - - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - self.__mode = image.mode - self.__size = image.size - - if _pilbitmap_check(): - # fast way (requires the pilbitmap booster patch) - image.load() - kw["data"] = f"PIL:{image.im.id}" - self.__im = image # must keep a reference - else: - # slow but safe way - kw["data"] = image.tobitmap() - self.__photo = tkinter.BitmapImage(**kw) - - def __del__(self): - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def width(self): - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self): - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def __str__(self): - """ - Get the Tkinter bitmap image identifier. This method is automatically - called by Tkinter whenever a BitmapImage object is passed to a Tkinter - method. - - :return: A Tkinter bitmap image identifier (a string). - """ - return str(self.__photo) - - -def getimage(photo): - """Copies the contents of a PhotoImage to a PIL image memory.""" - im = Image.new("RGBA", (photo.width(), photo.height())) - block = im.im - - _pyimagingtkcall("PyImagingPhotoGet", photo, block.id) - - return im - - -def _show(image, title): - """Helper for the Image.show method.""" - - class UI(tkinter.Label): - def __init__(self, master, im): - if im.mode == "1": - self.image = BitmapImage(im, foreground="white", master=master) - else: - self.image = PhotoImage(im, master=master) - super().__init__(master, image=self.image, bg="black", bd=0) - - if not tkinter._default_root: - raise OSError("tkinter not initialized") - top = tkinter.Toplevel() - if title: - top.title(title) - UI(top, image).pack() diff --git a/waypoint_manager/manager_GUI/PIL/ImageTransform.py b/waypoint_manager/manager_GUI/PIL/ImageTransform.py deleted file mode 100644 index 7881f0d..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageTransform.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# transform wrappers -# -# History: -# 2002-04-08 fl Created -# -# Copyright (c) 2002 by Secret Labs AB -# Copyright (c) 2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image - - -class Transform(Image.ImageTransformHandler): - def __init__(self, data): - self.data = data - - def getdata(self): - return self.method, self.data - - def transform(self, size, image, **options): - # can be overridden - method, data = self.getdata() - return image.transform(size, method, data, **options) - - -class AffineTransform(Transform): - """ - Define an affine image transform. - - This function takes a 6-tuple (a, b, c, d, e, f) which contain the first - two rows from an affine transform matrix. For each pixel (x, y) in the - output image, the new value is taken from a position (a x + b y + c, - d x + e y + f) in the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`~PIL.Image.Image.transform` - - :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows - from an affine transform matrix. - """ - - method = Image.Transform.AFFINE - - -class ExtentTransform(Transform): - """ - Define a transform to extract a subregion from an image. - - Maps a rectangle (defined by two corners) from the image to a rectangle of - the given size. The resulting image will contain data sampled from between - the corners, such that (x0, y0) in the input image will end up at (0,0) in - the output image, and (x1, y1) at size. - - This method can be used to crop, stretch, shrink, or mirror an arbitrary - rectangle in the current image. It is slightly slower than crop, but about - as fast as a corresponding resize operation. - - See :py:meth:`~PIL.Image.Image.transform` - - :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the - input image's coordinate system. See :ref:`coordinate-system`. - """ - - method = Image.Transform.EXTENT - - -class QuadTransform(Transform): - """ - Define a quad image transform. - - Maps a quadrilateral (a region defined by four corners) from the image to a - rectangle of the given size. - - See :py:meth:`~PIL.Image.Image.transform` - - :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the - upper left, lower left, lower right, and upper right corner of the - source quadrilateral. - """ - - method = Image.Transform.QUAD - - -class MeshTransform(Transform): - """ - Define a mesh image transform. A mesh transform consists of one or more - individual quad transforms. - - See :py:meth:`~PIL.Image.Image.transform` - - :param data: A list of (bbox, quad) tuples. - """ - - method = Image.Transform.MESH diff --git a/waypoint_manager/manager_GUI/PIL/ImageWin.py b/waypoint_manager/manager_GUI/PIL/ImageWin.py deleted file mode 100644 index ca9b14c..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImageWin.py +++ /dev/null @@ -1,230 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Windows DIB display interface -# -# History: -# 1996-05-20 fl Created -# 1996-09-20 fl Fixed subregion exposure -# 1997-09-21 fl Added draw primitive (for tzPrint) -# 2003-05-21 fl Added experimental Window/ImageWindow classes -# 2003-09-05 fl Added fromstring/tostring methods -# -# Copyright (c) Secret Labs AB 1997-2003. -# Copyright (c) Fredrik Lundh 1996-2003. -# -# See the README file for information on usage and redistribution. -# - -from . import Image - - -class HDC: - """ - Wraps an HDC integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods. - """ - - def __init__(self, dc): - self.dc = dc - - def __int__(self): - return self.dc - - -class HWND: - """ - Wraps an HWND integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods, instead of a DC. - """ - - def __init__(self, wnd): - self.wnd = wnd - - def __int__(self): - return self.wnd - - -class Dib: - """ - A Windows bitmap with the given mode and size. The mode can be one of "1", - "L", "P", or "RGB". - - If the display requires a palette, this constructor creates a suitable - palette and associates it with the image. For an "L" image, 128 greylevels - are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together - with 20 greylevels. - - To make sure that palettes work properly under Windows, you must call the - ``palette`` method upon certain events from Windows. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. The mode can be one of "1", - "L", "P", or "RGB". - :param size: If the first argument is a mode string, this - defines the size of the image. - """ - - def __init__(self, image, size=None): - if hasattr(image, "mode") and hasattr(image, "size"): - mode = image.mode - size = image.size - else: - mode = image - image = None - if mode not in ["1", "L", "P", "RGB"]: - mode = Image.getmodebase(mode) - self.image = Image.core.display(mode, size) - self.mode = mode - self.size = size - if image: - self.paste(image) - - def expose(self, handle): - """ - Copy the bitmap contents to a device context. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. In PythonWin, you can use - ``CDC.GetHandleAttrib()`` to get a suitable handle. - """ - if isinstance(handle, HWND): - dc = self.image.getdc(handle) - try: - result = self.image.expose(dc) - finally: - self.image.releasedc(handle, dc) - else: - result = self.image.expose(handle) - return result - - def draw(self, handle, dst, src=None): - """ - Same as expose, but allows you to specify where to draw the image, and - what part of it to draw. - - The destination and source areas are given as 4-tuple rectangles. If - the source is omitted, the entire image is copied. If the source and - the destination have different sizes, the image is resized as - necessary. - """ - if not src: - src = (0, 0) + self.size - if isinstance(handle, HWND): - dc = self.image.getdc(handle) - try: - result = self.image.draw(dc, dst, src) - finally: - self.image.releasedc(handle, dc) - else: - result = self.image.draw(handle, dst, src) - return result - - def query_palette(self, handle): - """ - Installs the palette associated with the image in the given device - context. - - This method should be called upon **QUERYNEWPALETTE** and - **PALETTECHANGED** events from Windows. If this method returns a - non-zero value, one or more display palette entries were changed, and - the image should be redrawn. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. - :return: A true value if one or more entries were changed (this - indicates that the image should be redrawn). - """ - if isinstance(handle, HWND): - handle = self.image.getdc(handle) - try: - result = self.image.query_palette(handle) - finally: - self.image.releasedc(handle, handle) - else: - result = self.image.query_palette(handle) - return result - - def paste(self, im, box=None): - """ - Paste a PIL image into the bitmap image. - - :param im: A PIL image. The size must match the target region. - If the mode does not match, the image is converted to the - mode of the bitmap image. - :param box: A 4-tuple defining the left, upper, right, and - lower pixel coordinate. See :ref:`coordinate-system`. If - None is given instead of a tuple, all of the image is - assumed. - """ - im.load() - if self.mode != im.mode: - im = im.convert(self.mode) - if box: - self.image.paste(im.im, box) - else: - self.image.paste(im.im) - - def frombytes(self, buffer): - """ - Load display memory contents from byte data. - - :param buffer: A buffer containing display data (usually - data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) - """ - return self.image.frombytes(buffer) - - def tobytes(self): - """ - Copy display memory contents to bytes object. - - :return: A bytes object containing display data. - """ - return self.image.tobytes() - - -class Window: - """Create a Window with the given title size.""" - - def __init__(self, title="PIL", width=None, height=None): - self.hwnd = Image.core.createwindow( - title, self.__dispatcher, width or 0, height or 0 - ) - - def __dispatcher(self, action, *args): - return getattr(self, "ui_handle_" + action)(*args) - - def ui_handle_clear(self, dc, x0, y0, x1, y1): - pass - - def ui_handle_damage(self, x0, y0, x1, y1): - pass - - def ui_handle_destroy(self): - pass - - def ui_handle_repair(self, dc, x0, y0, x1, y1): - pass - - def ui_handle_resize(self, width, height): - pass - - def mainloop(self): - Image.core.eventloop() - - -class ImageWindow(Window): - """Create an image window which displays the given image.""" - - def __init__(self, image, title="PIL"): - if not isinstance(image, Dib): - image = Dib(image) - self.image = image - width, height = image.size - super().__init__(title, width=width, height=height) - - def ui_handle_repair(self, dc, x0, y0, x1, y1): - self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/waypoint_manager/manager_GUI/PIL/ImtImagePlugin.py b/waypoint_manager/manager_GUI/PIL/ImtImagePlugin.py deleted file mode 100644 index 5790acd..0000000 --- a/waypoint_manager/manager_GUI/PIL/ImtImagePlugin.py +++ /dev/null @@ -1,93 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IM Tools support for PIL -# -# history: -# 1996-05-27 fl Created (read 8-bit images only) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# - - -import re - -from . import Image, ImageFile - -# -# -------------------------------------------------------------------- - -field = re.compile(rb"([a-z]*) ([^ \r\n]*)") - - -## -# Image plugin for IM Tools images. - - -class ImtImageFile(ImageFile.ImageFile): - - format = "IMT" - format_description = "IM Tools" - - def _open(self): - - # Quick rejection: if there's not a LF among the first - # 100 bytes, this is (probably) not a text header. - - if b"\n" not in self.fp.read(100): - raise SyntaxError("not an IM file") - self.fp.seek(0) - - xsize = ysize = 0 - - while True: - - s = self.fp.read(1) - if not s: - break - - if s == b"\x0C": - - # image data begins - self.tile = [ - ("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1)) - ] - - break - - else: - - # read key/value pair - # FIXME: dangerous, may read whole file - s = s + self.fp.readline() - if len(s) == 1 or len(s) > 100: - break - if s[0] == ord(b"*"): - continue # comment - - m = field.match(s) - if not m: - break - k, v = m.group(1, 2) - if k == "width": - xsize = int(v) - self._size = xsize, ysize - elif k == "height": - ysize = int(v) - self._size = xsize, ysize - elif k == "pixel" and v == "n8": - self.mode = "L" - - -# -# -------------------------------------------------------------------- - -Image.register_open(ImtImageFile.format, ImtImageFile) - -# -# no extension registered (".im" is simply too common) diff --git a/waypoint_manager/manager_GUI/PIL/IptcImagePlugin.py b/waypoint_manager/manager_GUI/PIL/IptcImagePlugin.py deleted file mode 100644 index 0bbe506..0000000 --- a/waypoint_manager/manager_GUI/PIL/IptcImagePlugin.py +++ /dev/null @@ -1,230 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IPTC/NAA file handling -# -# history: -# 1995-10-01 fl Created -# 1998-03-09 fl Cleaned up and added to PIL -# 2002-06-18 fl Added getiptcinfo helper -# -# Copyright (c) Secret Labs AB 1997-2002. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# -import os -import tempfile - -from . import Image, ImageFile -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 - -COMPRESSION = {1: "raw", 5: "jpeg"} - -PAD = o8(0) * 4 - - -# -# Helpers - - -def i(c): - return i32((PAD + c)[-4:]) - - -def dump(c): - for i in c: - print("%02x" % i8(i), end=" ") - print() - - -## -# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields -# from TIFF and JPEG files, use the getiptcinfo function. - - -class IptcImageFile(ImageFile.ImageFile): - - format = "IPTC" - format_description = "IPTC/NAA" - - def getint(self, key): - return i(self.info[key]) - - def field(self): - # - # get a IPTC field header - s = self.fp.read(5) - if not len(s): - return None, 0 - - tag = s[1], s[2] - - # syntax - if s[0] != 0x1C or tag[0] < 1 or tag[0] > 9: - raise SyntaxError("invalid IPTC/NAA file") - - # field size - size = s[3] - if size > 132: - raise OSError("illegal field length in IPTC/NAA file") - elif size == 128: - size = 0 - elif size > 128: - size = i(self.fp.read(size - 128)) - else: - size = i16(s, 3) - - return tag, size - - def _open(self): - - # load descriptive fields - while True: - offset = self.fp.tell() - tag, size = self.field() - if not tag or tag == (8, 10): - break - if size: - tagdata = self.fp.read(size) - else: - tagdata = None - if tag in self.info: - if isinstance(self.info[tag], list): - self.info[tag].append(tagdata) - else: - self.info[tag] = [self.info[tag], tagdata] - else: - self.info[tag] = tagdata - - # mode - layers = i8(self.info[(3, 60)][0]) - component = i8(self.info[(3, 60)][1]) - if (3, 65) in self.info: - id = i8(self.info[(3, 65)][0]) - 1 - else: - id = 0 - if layers == 1 and not component: - self.mode = "L" - elif layers == 3 and component: - self.mode = "RGB"[id] - elif layers == 4 and component: - self.mode = "CMYK"[id] - - # size - self._size = self.getint((3, 20)), self.getint((3, 30)) - - # compression - try: - compression = COMPRESSION[self.getint((3, 120))] - except KeyError as e: - raise OSError("Unknown IPTC image compression") from e - - # tile - if tag == (8, 10): - self.tile = [ - ("iptc", (compression, offset), (0, 0, self.size[0], self.size[1])) - ] - - def load(self): - - if len(self.tile) != 1 or self.tile[0][0] != "iptc": - return ImageFile.ImageFile.load(self) - - type, tile, box = self.tile[0] - - encoding, offset = tile - - self.fp.seek(offset) - - # Copy image data to temporary file - o_fd, outfile = tempfile.mkstemp(text=False) - o = os.fdopen(o_fd) - if encoding == "raw": - # To simplify access to the extracted file, - # prepend a PPM header - o.write("P5\n%d %d\n255\n" % self.size) - while True: - type, size = self.field() - if type != (8, 10): - break - while size > 0: - s = self.fp.read(min(size, 8192)) - if not s: - break - o.write(s) - size -= len(s) - o.close() - - try: - with Image.open(outfile) as _im: - _im.load() - self.im = _im.im - finally: - try: - os.unlink(outfile) - except OSError: - pass - - -Image.register_open(IptcImageFile.format, IptcImageFile) - -Image.register_extension(IptcImageFile.format, ".iim") - - -def getiptcinfo(im): - """ - Get IPTC information from TIFF, JPEG, or IPTC file. - - :param im: An image containing IPTC data. - :returns: A dictionary containing IPTC information, or None if - no IPTC information block was found. - """ - import io - - from . import JpegImagePlugin, TiffImagePlugin - - data = None - - if isinstance(im, IptcImageFile): - # return info dictionary right away - return im.info - - elif isinstance(im, JpegImagePlugin.JpegImageFile): - # extract the IPTC/NAA resource - photoshop = im.info.get("photoshop") - if photoshop: - data = photoshop.get(0x0404) - - elif isinstance(im, TiffImagePlugin.TiffImageFile): - # get raw data from the IPTC/NAA tag (PhotoShop tags the data - # as 4-byte integers, so we cannot use the get method...) - try: - data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] - except (AttributeError, KeyError): - pass - - if data is None: - return None # no properties - - # create an IptcImagePlugin object without initializing it - class FakeImage: - pass - - im = FakeImage() - im.__class__ = IptcImageFile - - # parse the IPTC information chunk - im.info = {} - im.fp = io.BytesIO(data) - - try: - im._open() - except (IndexError, KeyError): - pass # expected failure - - return im.info diff --git a/waypoint_manager/manager_GUI/PIL/Jpeg2KImagePlugin.py b/waypoint_manager/manager_GUI/PIL/Jpeg2KImagePlugin.py deleted file mode 100644 index c67d8d6..0000000 --- a/waypoint_manager/manager_GUI/PIL/Jpeg2KImagePlugin.py +++ /dev/null @@ -1,362 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# JPEG2000 file handling -# -# History: -# 2014-03-12 ajh Created -# 2021-06-30 rogermb Extract dpi information from the 'resc' header box -# -# Copyright (c) 2014 Coriolis Systems Limited -# Copyright (c) 2014 Alastair Houghton -# -# See the README file for information on usage and redistribution. -# -import io -import os -import struct - -from . import Image, ImageFile - - -class BoxReader: - """ - A small helper class to read fields stored in JPEG2000 header boxes - and to easily step into and read sub-boxes. - """ - - def __init__(self, fp, length=-1): - self.fp = fp - self.has_length = length >= 0 - self.length = length - self.remaining_in_box = -1 - - def _can_read(self, num_bytes): - if self.has_length and self.fp.tell() + num_bytes > self.length: - # Outside box: ensure we don't read past the known file length - return False - if self.remaining_in_box >= 0: - # Inside box contents: ensure read does not go past box boundaries - return num_bytes <= self.remaining_in_box - else: - return True # No length known, just read - - def _read_bytes(self, num_bytes): - if not self._can_read(num_bytes): - raise SyntaxError("Not enough data in header") - - data = self.fp.read(num_bytes) - if len(data) < num_bytes: - raise OSError( - f"Expected to read {num_bytes} bytes but only got {len(data)}." - ) - - if self.remaining_in_box > 0: - self.remaining_in_box -= num_bytes - return data - - def read_fields(self, field_format): - size = struct.calcsize(field_format) - data = self._read_bytes(size) - return struct.unpack(field_format, data) - - def read_boxes(self): - size = self.remaining_in_box - data = self._read_bytes(size) - return BoxReader(io.BytesIO(data), size) - - def has_next_box(self): - if self.has_length: - return self.fp.tell() + self.remaining_in_box < self.length - else: - return True - - def next_box_type(self): - # Skip the rest of the box if it has not been read - if self.remaining_in_box > 0: - self.fp.seek(self.remaining_in_box, os.SEEK_CUR) - self.remaining_in_box = -1 - - # Read the length and type of the next box - lbox, tbox = self.read_fields(">I4s") - if lbox == 1: - lbox = self.read_fields(">Q")[0] - hlen = 16 - else: - hlen = 8 - - if lbox < hlen or not self._can_read(lbox - hlen): - raise SyntaxError("Invalid header length") - - self.remaining_in_box = lbox - hlen - return tbox - - -def _parse_codestream(fp): - """Parse the JPEG 2000 codestream to extract the size and component - count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" - - hdr = fp.read(2) - lsiz = struct.unpack(">H", hdr)[0] - siz = hdr + fp.read(lsiz - 2) - lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( - ">HHIIIIIIIIH", siz - ) - ssiz = [None] * csiz - xrsiz = [None] * csiz - yrsiz = [None] * csiz - for i in range(csiz): - ssiz[i], xrsiz[i], yrsiz[i] = struct.unpack_from(">BBB", siz, 36 + 3 * i) - - size = (xsiz - xosiz, ysiz - yosiz) - if csiz == 1: - if (yrsiz[0] & 0x7F) > 8: - mode = "I;16" - else: - mode = "L" - elif csiz == 2: - mode = "LA" - elif csiz == 3: - mode = "RGB" - elif csiz == 4: - mode = "RGBA" - else: - mode = None - - return size, mode - - -def _res_to_dpi(num, denom, exp): - """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, - calculated as (num / denom) * 10^exp and stored in dots per meter, - to floating-point dots per inch.""" - if denom != 0: - return (254 * num * (10**exp)) / (10000 * denom) - - -def _parse_jp2_header(fp): - """Parse the JP2 header box to extract size, component count, - color space information, and optionally DPI information, - returning a (size, mode, mimetype, dpi) tuple.""" - - # Find the JP2 header box - reader = BoxReader(fp) - header = None - mimetype = None - while reader.has_next_box(): - tbox = reader.next_box_type() - - if tbox == b"jp2h": - header = reader.read_boxes() - break - elif tbox == b"ftyp": - if reader.read_fields(">4s")[0] == b"jpx ": - mimetype = "image/jpx" - - size = None - mode = None - bpc = None - nc = None - dpi = None # 2-tuple of DPI info, or None - - while header.has_next_box(): - tbox = header.next_box_type() - - if tbox == b"ihdr": - height, width, nc, bpc = header.read_fields(">IIHB") - size = (width, height) - if nc == 1 and (bpc & 0x7F) > 8: - mode = "I;16" - elif nc == 1: - mode = "L" - elif nc == 2: - mode = "LA" - elif nc == 3: - mode = "RGB" - elif nc == 4: - mode = "RGBA" - elif tbox == b"res ": - res = header.read_boxes() - while res.has_next_box(): - tres = res.next_box_type() - if tres == b"resc": - vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") - hres = _res_to_dpi(hrcn, hrcd, hrce) - vres = _res_to_dpi(vrcn, vrcd, vrce) - if hres is not None and vres is not None: - dpi = (hres, vres) - break - - if size is None or mode is None: - raise SyntaxError("Malformed JP2 header") - - return size, mode, mimetype, dpi - - -## -# Image plugin for JPEG2000 images. - - -class Jpeg2KImageFile(ImageFile.ImageFile): - format = "JPEG2000" - format_description = "JPEG 2000 (ISO 15444)" - - def _open(self): - sig = self.fp.read(4) - if sig == b"\xff\x4f\xff\x51": - self.codec = "j2k" - self._size, self.mode = _parse_codestream(self.fp) - else: - sig = sig + self.fp.read(8) - - if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": - self.codec = "jp2" - header = _parse_jp2_header(self.fp) - self._size, self.mode, self.custom_mimetype, dpi = header - if dpi is not None: - self.info["dpi"] = dpi - else: - raise SyntaxError("not a JPEG 2000 file") - - if self.size is None or self.mode is None: - raise SyntaxError("unable to determine size/mode") - - self._reduce = 0 - self.layers = 0 - - fd = -1 - length = -1 - - try: - fd = self.fp.fileno() - length = os.fstat(fd).st_size - except Exception: - fd = -1 - try: - pos = self.fp.tell() - self.fp.seek(0, io.SEEK_END) - length = self.fp.tell() - self.fp.seek(pos) - except Exception: - length = -1 - - self.tile = [ - ( - "jpeg2k", - (0, 0) + self.size, - 0, - (self.codec, self._reduce, self.layers, fd, length), - ) - ] - - @property - def reduce(self): - # https://github.com/python-pillow/Pillow/issues/4343 found that the - # new Image 'reduce' method was shadowed by this plugin's 'reduce' - # property. This attempts to allow for both scenarios - return self._reduce or super().reduce - - @reduce.setter - def reduce(self, value): - self._reduce = value - - def load(self): - if self.tile and self._reduce: - power = 1 << self._reduce - adjust = power >> 1 - self._size = ( - int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power), - ) - - # Update the reduce and layers settings - t = self.tile[0] - t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) - self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] - - return ImageFile.ImageFile.load(self) - - -def _accept(prefix): - return ( - prefix[:4] == b"\xff\x4f\xff\x51" - or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ) - - -# ------------------------------------------------------------ -# Save support - - -def _save(im, fp, filename): - # Get the keyword arguments - info = im.encoderinfo - - if filename.endswith(".j2k") or info.get("no_jp2", False): - kind = "j2k" - else: - kind = "jp2" - - offset = info.get("offset", None) - tile_offset = info.get("tile_offset", None) - tile_size = info.get("tile_size", None) - quality_mode = info.get("quality_mode", "rates") - quality_layers = info.get("quality_layers", None) - if quality_layers is not None and not ( - isinstance(quality_layers, (list, tuple)) - and all( - [ - isinstance(quality_layer, (int, float)) - for quality_layer in quality_layers - ] - ) - ): - raise ValueError("quality_layers must be a sequence of numbers") - - num_resolutions = info.get("num_resolutions", 0) - cblk_size = info.get("codeblock_size", None) - precinct_size = info.get("precinct_size", None) - irreversible = info.get("irreversible", False) - progression = info.get("progression", "LRCP") - cinema_mode = info.get("cinema_mode", "no") - mct = info.get("mct", 0) - fd = -1 - - if hasattr(fp, "fileno"): - try: - fd = fp.fileno() - except Exception: - fd = -1 - - im.encoderconfig = ( - offset, - tile_offset, - tile_size, - quality_mode, - quality_layers, - num_resolutions, - cblk_size, - precinct_size, - irreversible, - progression, - cinema_mode, - mct, - fd, - ) - - ImageFile._save(im, fp, [("jpeg2k", (0, 0) + im.size, 0, kind)]) - - -# ------------------------------------------------------------ -# Registry stuff - - -Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) -Image.register_save(Jpeg2KImageFile.format, _save) - -Image.register_extensions( - Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] -) - -Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/waypoint_manager/manager_GUI/PIL/JpegImagePlugin.py b/waypoint_manager/manager_GUI/PIL/JpegImagePlugin.py deleted file mode 100644 index 4efe628..0000000 --- a/waypoint_manager/manager_GUI/PIL/JpegImagePlugin.py +++ /dev/null @@ -1,827 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# JPEG (JFIF) file handling -# -# See "Digital Compression and Coding of Continuous-Tone Still Images, -# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) -# -# History: -# 1995-09-09 fl Created -# 1995-09-13 fl Added full parser -# 1996-03-25 fl Added hack to use the IJG command line utilities -# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug -# 1996-05-28 fl Added draft support, JFIF version (0.1) -# 1996-12-30 fl Added encoder options, added progression property (0.2) -# 1997-08-27 fl Save mode 1 images as BW (0.3) -# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) -# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) -# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) -# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) -# 2003-04-25 fl Added experimental EXIF decoder (0.5) -# 2003-06-06 fl Added experimental EXIF GPSinfo decoder -# 2003-09-13 fl Extract COM markers -# 2009-09-06 fl Added icc_profile support (from Florian Hoech) -# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) -# 2009-03-08 fl Added subsampling support (from Justin Huff). -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -import array -import io -import math -import os -import struct -import subprocess -import sys -import tempfile -import warnings - -from . import Image, ImageFile, TiffImagePlugin -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._deprecate import deprecate -from .JpegPresets import presets - -# -# Parser - - -def Skip(self, marker): - n = i16(self.fp.read(2)) - 2 - ImageFile._safe_read(self.fp, n) - - -def APP(self, marker): - # - # Application marker. Store these in the APP dictionary. - # Also look for well-known application markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - app = "APP%d" % (marker & 15) - - self.app[app] = s # compatibility - self.applist.append((app, s)) - - if marker == 0xFFE0 and s[:4] == b"JFIF": - # extract JFIF information - self.info["jfif"] = version = i16(s, 5) # version - self.info["jfif_version"] = divmod(version, 256) - # extract JFIF properties - try: - jfif_unit = s[7] - jfif_density = i16(s, 8), i16(s, 10) - except Exception: - pass - else: - if jfif_unit == 1: - self.info["dpi"] = jfif_density - self.info["jfif_unit"] = jfif_unit - self.info["jfif_density"] = jfif_density - elif marker == 0xFFE1 and s[:5] == b"Exif\0": - if "exif" not in self.info: - # extract EXIF information (incomplete) - self.info["exif"] = s # FIXME: value will change - elif marker == 0xFFE2 and s[:5] == b"FPXR\0": - # extract FlashPix information (incomplete) - self.info["flashpix"] = s # FIXME: value will change - elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": - # Since an ICC profile can be larger than the maximum size of - # a JPEG marker (64K), we need provisions to split it into - # multiple markers. The format defined by the ICC specifies - # one or more APP2 markers containing the following data: - # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) - # Marker sequence number 1, 2, etc (1 byte) - # Number of markers Total of APP2's used (1 byte) - # Profile data (remainder of APP2 data) - # Decoders should use the marker sequence numbers to - # reassemble the profile, rather than assuming that the APP2 - # markers appear in the correct sequence. - self.icclist.append(s) - elif marker == 0xFFED and s[:14] == b"Photoshop 3.0\x00": - # parse the image resource block - offset = 14 - photoshop = self.info.setdefault("photoshop", {}) - while s[offset : offset + 4] == b"8BIM": - try: - offset += 4 - # resource code - code = i16(s, offset) - offset += 2 - # resource name (usually empty) - name_len = s[offset] - # name = s[offset+1:offset+1+name_len] - offset += 1 + name_len - offset += offset & 1 # align - # resource data block - size = i32(s, offset) - offset += 4 - data = s[offset : offset + size] - if code == 0x03ED: # ResolutionInfo - data = { - "XResolution": i32(data, 0) / 65536, - "DisplayedUnitsX": i16(data, 4), - "YResolution": i32(data, 8) / 65536, - "DisplayedUnitsY": i16(data, 12), - } - photoshop[code] = data - offset += size - offset += offset & 1 # align - except struct.error: - break # insufficient data - - elif marker == 0xFFEE and s[:5] == b"Adobe": - self.info["adobe"] = i16(s, 5) - # extract Adobe custom properties - try: - adobe_transform = s[11] - except IndexError: - pass - else: - self.info["adobe_transform"] = adobe_transform - elif marker == 0xFFE2 and s[:4] == b"MPF\0": - # extract MPO information - self.info["mp"] = s[4:] - # offset is current location minus buffer size - # plus constant header size - self.info["mpoffset"] = self.fp.tell() - n + 4 - - # If DPI isn't in JPEG header, fetch from EXIF - if "dpi" not in self.info and "exif" in self.info: - try: - exif = self.getexif() - resolution_unit = exif[0x0128] - x_resolution = exif[0x011A] - try: - dpi = float(x_resolution[0]) / x_resolution[1] - except TypeError: - dpi = x_resolution - if math.isnan(dpi): - raise ValueError - if resolution_unit == 3: # cm - # 1 dpcm = 2.54 dpi - dpi *= 2.54 - self.info["dpi"] = dpi, dpi - except (TypeError, KeyError, SyntaxError, ValueError, ZeroDivisionError): - # SyntaxError for invalid/unreadable EXIF - # KeyError for dpi not included - # ZeroDivisionError for invalid dpi rational value - # ValueError or TypeError for dpi being an invalid float - self.info["dpi"] = 72, 72 - - -def COM(self, marker): - # - # Comment marker. Store these in the APP dictionary. - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - self.info["comment"] = s - self.app["COM"] = s # compatibility - self.applist.append(("COM", s)) - - -def SOF(self, marker): - # - # Start of frame marker. Defines the size and mode of the - # image. JPEG is colour blind, so we use some simple - # heuristics to map the number of layers to an appropriate - # mode. Note that this could be made a bit brighter, by - # looking for JFIF and Adobe APP markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - self._size = i16(s, 3), i16(s, 1) - - self.bits = s[0] - if self.bits != 8: - raise SyntaxError(f"cannot handle {self.bits}-bit layers") - - self.layers = s[5] - if self.layers == 1: - self.mode = "L" - elif self.layers == 3: - self.mode = "RGB" - elif self.layers == 4: - self.mode = "CMYK" - else: - raise SyntaxError(f"cannot handle {self.layers}-layer images") - - if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: - self.info["progressive"] = self.info["progression"] = 1 - - if self.icclist: - # fixup icc profile - self.icclist.sort() # sort by sequence number - if self.icclist[0][13] == len(self.icclist): - profile = [] - for p in self.icclist: - profile.append(p[14:]) - icc_profile = b"".join(profile) - else: - icc_profile = None # wrong number of fragments - self.info["icc_profile"] = icc_profile - self.icclist = [] - - for i in range(6, len(s), 3): - t = s[i : i + 3] - # 4-tuples: id, vsamp, hsamp, qtable - self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) - - -def DQT(self, marker): - # - # Define quantization table. Note that there might be more - # than one table in each marker. - - # FIXME: The quantization tables can be used to estimate the - # compression quality. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - while len(s): - v = s[0] - precision = 1 if (v // 16 == 0) else 2 # in bytes - qt_length = 1 + precision * 64 - if len(s) < qt_length: - raise SyntaxError("bad quantization table marker") - data = array.array("B" if precision == 1 else "H", s[1:qt_length]) - if sys.byteorder == "little" and precision > 1: - data.byteswap() # the values are always big-endian - self.quantization[v & 15] = [data[i] for i in zigzag_index] - s = s[qt_length:] - - -# -# JPEG marker table - -MARKER = { - 0xFFC0: ("SOF0", "Baseline DCT", SOF), - 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), - 0xFFC2: ("SOF2", "Progressive DCT", SOF), - 0xFFC3: ("SOF3", "Spatial lossless", SOF), - 0xFFC4: ("DHT", "Define Huffman table", Skip), - 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), - 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), - 0xFFC7: ("SOF7", "Differential spatial", SOF), - 0xFFC8: ("JPG", "Extension", None), - 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), - 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), - 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), - 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), - 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), - 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), - 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), - 0xFFD0: ("RST0", "Restart 0", None), - 0xFFD1: ("RST1", "Restart 1", None), - 0xFFD2: ("RST2", "Restart 2", None), - 0xFFD3: ("RST3", "Restart 3", None), - 0xFFD4: ("RST4", "Restart 4", None), - 0xFFD5: ("RST5", "Restart 5", None), - 0xFFD6: ("RST6", "Restart 6", None), - 0xFFD7: ("RST7", "Restart 7", None), - 0xFFD8: ("SOI", "Start of image", None), - 0xFFD9: ("EOI", "End of image", None), - 0xFFDA: ("SOS", "Start of scan", Skip), - 0xFFDB: ("DQT", "Define quantization table", DQT), - 0xFFDC: ("DNL", "Define number of lines", Skip), - 0xFFDD: ("DRI", "Define restart interval", Skip), - 0xFFDE: ("DHP", "Define hierarchical progression", SOF), - 0xFFDF: ("EXP", "Expand reference component", Skip), - 0xFFE0: ("APP0", "Application segment 0", APP), - 0xFFE1: ("APP1", "Application segment 1", APP), - 0xFFE2: ("APP2", "Application segment 2", APP), - 0xFFE3: ("APP3", "Application segment 3", APP), - 0xFFE4: ("APP4", "Application segment 4", APP), - 0xFFE5: ("APP5", "Application segment 5", APP), - 0xFFE6: ("APP6", "Application segment 6", APP), - 0xFFE7: ("APP7", "Application segment 7", APP), - 0xFFE8: ("APP8", "Application segment 8", APP), - 0xFFE9: ("APP9", "Application segment 9", APP), - 0xFFEA: ("APP10", "Application segment 10", APP), - 0xFFEB: ("APP11", "Application segment 11", APP), - 0xFFEC: ("APP12", "Application segment 12", APP), - 0xFFED: ("APP13", "Application segment 13", APP), - 0xFFEE: ("APP14", "Application segment 14", APP), - 0xFFEF: ("APP15", "Application segment 15", APP), - 0xFFF0: ("JPG0", "Extension 0", None), - 0xFFF1: ("JPG1", "Extension 1", None), - 0xFFF2: ("JPG2", "Extension 2", None), - 0xFFF3: ("JPG3", "Extension 3", None), - 0xFFF4: ("JPG4", "Extension 4", None), - 0xFFF5: ("JPG5", "Extension 5", None), - 0xFFF6: ("JPG6", "Extension 6", None), - 0xFFF7: ("JPG7", "Extension 7", None), - 0xFFF8: ("JPG8", "Extension 8", None), - 0xFFF9: ("JPG9", "Extension 9", None), - 0xFFFA: ("JPG10", "Extension 10", None), - 0xFFFB: ("JPG11", "Extension 11", None), - 0xFFFC: ("JPG12", "Extension 12", None), - 0xFFFD: ("JPG13", "Extension 13", None), - 0xFFFE: ("COM", "Comment", COM), -} - - -def _accept(prefix): - # Magic number was taken from https://en.wikipedia.org/wiki/JPEG - return prefix[:3] == b"\xFF\xD8\xFF" - - -## -# Image plugin for JPEG and JFIF images. - - -class JpegImageFile(ImageFile.ImageFile): - - format = "JPEG" - format_description = "JPEG (ISO 10918)" - - def _open(self): - - s = self.fp.read(3) - - if not _accept(s): - raise SyntaxError("not a JPEG file") - s = b"\xFF" - - # Create attributes - self.bits = self.layers = 0 - - # JPEG specifics (internal) - self.layer = [] - self.huffman_dc = {} - self.huffman_ac = {} - self.quantization = {} - self.app = {} # compatibility - self.applist = [] - self.icclist = [] - - while True: - - i = s[0] - if i == 0xFF: - s = s + self.fp.read(1) - i = i16(s) - else: - # Skip non-0xFF junk - s = self.fp.read(1) - continue - - if i in MARKER: - name, description, handler = MARKER[i] - if handler is not None: - handler(self, i) - if i == 0xFFDA: # start of scan - rawmode = self.mode - if self.mode == "CMYK": - rawmode = "CMYK;I" # assume adobe conventions - self.tile = [("jpeg", (0, 0) + self.size, 0, (rawmode, ""))] - # self.__offset = self.fp.tell() - break - s = self.fp.read(1) - elif i == 0 or i == 0xFFFF: - # padded marker or junk; move on - s = b"\xff" - elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) - s = self.fp.read(1) - else: - raise SyntaxError("no marker found") - - def load_read(self, read_bytes): - """ - internal: read more image data - For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker - so libjpeg can finish decoding - """ - s = self.fp.read(read_bytes) - - if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): - # Premature EOF. - # Pretend file is finished adding EOI marker - self._ended = True - return b"\xFF\xD9" - - return s - - def draft(self, mode, size): - - if len(self.tile) != 1: - return - - # Protect from second call - if self.decoderconfig: - return - - d, e, o, a = self.tile[0] - scale = 1 - original_size = self.size - - if a[0] == "RGB" and mode in ["L", "YCbCr"]: - self.mode = mode - a = mode, "" - - if size: - scale = min(self.size[0] // size[0], self.size[1] // size[1]) - for s in [8, 4, 2, 1]: - if scale >= s: - break - e = ( - e[0], - e[1], - (e[2] - e[0] + s - 1) // s + e[0], - (e[3] - e[1] + s - 1) // s + e[1], - ) - self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) - scale = s - - self.tile = [(d, e, o, a)] - self.decoderconfig = (scale, 0) - - box = (0, 0, original_size[0] / scale, original_size[1] / scale) - return self.mode, box - - def load_djpeg(self): - - # ALTERNATIVE: handle JPEGs via the IJG command line utilities - - f, path = tempfile.mkstemp() - os.close(f) - if os.path.exists(self.filename): - subprocess.check_call(["djpeg", "-outfile", path, self.filename]) - else: - raise ValueError("Invalid Filename") - - try: - with Image.open(path) as _im: - _im.load() - self.im = _im.im - finally: - try: - os.unlink(path) - except OSError: - pass - - self.mode = self.im.mode - self._size = self.im.size - - self.tile = [] - - def _getexif(self): - return _getexif(self) - - def _getmp(self): - return _getmp(self) - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - - for segment, content in self.applist: - if segment == "APP1": - marker, xmp_tags = content.rsplit(b"\x00", 1) - if marker == b"http://ns.adobe.com/xap/1.0/": - return self._getxmp(xmp_tags) - return {} - - -def _getexif(self): - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - -def _getmp(self): - # Extract MP information. This method was inspired by the "highly - # experimental" _getexif version that's been in use for years now, - # itself based on the ImageFileDirectory class in the TIFF plugin. - - # The MP record essentially consists of a TIFF file embedded in a JPEG - # application marker. - try: - data = self.info["mp"] - except KeyError: - return None - file_contents = io.BytesIO(data) - head = file_contents.read(8) - endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<" - # process dictionary - try: - info = TiffImagePlugin.ImageFileDirectory_v2(head) - file_contents.seek(info.next) - info.load(file_contents) - mp = dict(info) - except Exception as e: - raise SyntaxError("malformed MP Index (unreadable directory)") from e - # it's an error not to have a number of images - try: - quant = mp[0xB001] - except KeyError as e: - raise SyntaxError("malformed MP Index (no number of images)") from e - # get MP entries - mpentries = [] - try: - rawmpentries = mp[0xB002] - for entrynum in range(0, quant): - unpackedentry = struct.unpack_from( - f"{endianness}LLLHH", rawmpentries, entrynum * 16 - ) - labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") - mpentry = dict(zip(labels, unpackedentry)) - mpentryattr = { - "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), - "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), - "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), - "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, - "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, - "MPType": mpentry["Attribute"] & 0x00FFFFFF, - } - if mpentryattr["ImageDataFormat"] == 0: - mpentryattr["ImageDataFormat"] = "JPEG" - else: - raise SyntaxError("unsupported picture format in MPO") - mptypemap = { - 0x000000: "Undefined", - 0x010001: "Large Thumbnail (VGA Equivalent)", - 0x010002: "Large Thumbnail (Full HD Equivalent)", - 0x020001: "Multi-Frame Image (Panorama)", - 0x020002: "Multi-Frame Image: (Disparity)", - 0x020003: "Multi-Frame Image: (Multi-Angle)", - 0x030000: "Baseline MP Primary Image", - } - mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") - mpentry["Attribute"] = mpentryattr - mpentries.append(mpentry) - mp[0xB002] = mpentries - except KeyError as e: - raise SyntaxError("malformed MP Index (bad MP Entry)") from e - # Next we should try and parse the individual image unique ID list; - # we don't because I've never seen this actually used in a real MPO - # file and so can't test it. - return mp - - -# -------------------------------------------------------------------- -# stuff to save JPEG files - -RAWMODE = { - "1": "L", - "L": "L", - "RGB": "RGB", - "RGBX": "RGB", - "CMYK": "CMYK;I", # assume adobe conventions - "YCbCr": "YCbCr", -} - -# fmt: off -zigzag_index = ( - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63, -) - -samplings = { - (1, 1, 1, 1, 1, 1): 0, - (2, 1, 1, 1, 1, 1): 1, - (2, 2, 1, 1, 1, 1): 2, -} -# fmt: on - - -def convert_dict_qtables(qtables): - deprecate("convert_dict_qtables", 10, action="Conversion is no longer needed") - return qtables - - -def get_sampling(im): - # There's no subsampling when images have only 1 layer - # (grayscale images) or when they are CMYK (4 layers), - # so set subsampling to the default value. - # - # NOTE: currently Pillow can't encode JPEG to YCCK format. - # If YCCK support is added in the future, subsampling code will have - # to be updated (here and in JpegEncode.c) to deal with 4 layers. - if not hasattr(im, "layers") or im.layers in (1, 4): - return -1 - sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] - return samplings.get(sampling, -1) - - -def _save(im, fp, filename): - if im.width == 0 or im.height == 0: - raise ValueError("cannot write empty image as JPEG") - - try: - rawmode = RAWMODE[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as JPEG") from e - - info = im.encoderinfo - - dpi = [round(x) for x in info.get("dpi", (0, 0))] - - quality = info.get("quality", -1) - subsampling = info.get("subsampling", -1) - qtables = info.get("qtables") - - if quality == "keep": - quality = -1 - subsampling = "keep" - qtables = "keep" - elif quality in presets: - preset = presets[quality] - quality = -1 - subsampling = preset.get("subsampling", -1) - qtables = preset.get("quantization") - elif not isinstance(quality, int): - raise ValueError("Invalid quality setting") - else: - if subsampling in presets: - subsampling = presets[subsampling].get("subsampling", -1) - if isinstance(qtables, str) and qtables in presets: - qtables = presets[qtables].get("quantization") - - if subsampling == "4:4:4": - subsampling = 0 - elif subsampling == "4:2:2": - subsampling = 1 - elif subsampling == "4:2:0": - subsampling = 2 - elif subsampling == "4:1:1": - # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. - # Set 4:2:0 if someone is still using that value. - subsampling = 2 - elif subsampling == "keep": - if im.format != "JPEG": - raise ValueError("Cannot use 'keep' when original image is not a JPEG") - subsampling = get_sampling(im) - - def validate_qtables(qtables): - if qtables is None: - return qtables - if isinstance(qtables, str): - try: - lines = [ - int(num) - for line in qtables.splitlines() - for num in line.split("#", 1)[0].split() - ] - except ValueError as e: - raise ValueError("Invalid quantization table") from e - else: - qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] - if isinstance(qtables, (tuple, list, dict)): - if isinstance(qtables, dict): - qtables = [ - qtables[key] for key in range(len(qtables)) if key in qtables - ] - elif isinstance(qtables, tuple): - qtables = list(qtables) - if not (0 < len(qtables) < 5): - raise ValueError("None or too many quantization tables") - for idx, table in enumerate(qtables): - try: - if len(table) != 64: - raise TypeError - table = array.array("H", table) - except TypeError as e: - raise ValueError("Invalid quantization table") from e - else: - qtables[idx] = list(table) - return qtables - - if qtables == "keep": - if im.format != "JPEG": - raise ValueError("Cannot use 'keep' when original image is not a JPEG") - qtables = getattr(im, "quantization", None) - qtables = validate_qtables(qtables) - - extra = b"" - - icc_profile = info.get("icc_profile") - if icc_profile: - ICC_OVERHEAD_LEN = 14 - MAX_BYTES_IN_MARKER = 65533 - MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN - markers = [] - while icc_profile: - markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) - icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] - i = 1 - for marker in markers: - size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker)) - extra += ( - b"\xFF\xE2" - + size - + b"ICC_PROFILE\0" - + o8(i) - + o8(len(markers)) - + marker - ) - i += 1 - - # "progressive" is the official name, but older documentation - # says "progression" - # FIXME: issue a warning if the wrong form is used (post-1.1.7) - progressive = info.get("progressive", False) or info.get("progression", False) - - optimize = info.get("optimize", False) - - exif = info.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - - # get keyword arguments - im.encoderconfig = ( - quality, - progressive, - info.get("smooth", 0), - optimize, - info.get("streamtype", 0), - dpi[0], - dpi[1], - subsampling, - qtables, - extra, - exif, - ) - - # if we optimize, libjpeg needs a buffer big enough to hold the whole image - # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is - # channels*size, this is a value that's been used in a django patch. - # https://github.com/matthewwithanm/django-imagekit/issues/50 - bufsize = 0 - if optimize or progressive: - # CMYK can be bigger - if im.mode == "CMYK": - bufsize = 4 * im.size[0] * im.size[1] - # keep sets quality to -1, but the actual value may be high. - elif quality >= 95 or quality == -1: - bufsize = 2 * im.size[0] * im.size[1] - else: - bufsize = im.size[0] * im.size[1] - - # The EXIF info needs to be written as one block, + APP1, + one spare byte. - # Ensure that our buffer is big enough. Same with the icc_profile block. - bufsize = max(ImageFile.MAXBLOCK, bufsize, len(exif) + 5, len(extra) + 1) - - ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize) - - -def _save_cjpeg(im, fp, filename): - # ALTERNATIVE: handle JPEGs via the IJG command line utilities. - tempfile = im._dump() - subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) - try: - os.unlink(tempfile) - except OSError: - pass - - -## -# Factory for making JPEG and MPO instances -def jpeg_factory(fp=None, filename=None): - im = JpegImageFile(fp, filename) - try: - mpheader = im._getmp() - if mpheader[45057] > 1: - # It's actually an MPO - from .MpoImagePlugin import MpoImageFile - - # Don't reload everything, just convert it. - im = MpoImageFile.adopt(im, mpheader) - except (TypeError, IndexError): - # It is really a JPEG - pass - except SyntaxError: - warnings.warn( - "Image appears to be a malformed MPO file, it will be " - "interpreted as a base JPEG file" - ) - return im - - -# --------------------------------------------------------------------- -# Registry stuff - -Image.register_open(JpegImageFile.format, jpeg_factory, _accept) -Image.register_save(JpegImageFile.format, _save) - -Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) - -Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/waypoint_manager/manager_GUI/PIL/JpegPresets.py b/waypoint_manager/manager_GUI/PIL/JpegPresets.py deleted file mode 100644 index a678e24..0000000 --- a/waypoint_manager/manager_GUI/PIL/JpegPresets.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -JPEG quality settings equivalent to the Photoshop settings. -Can be used when saving JPEG files. - -The following presets are available by default: -``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, -``low``, ``medium``, ``high``, ``maximum``. -More presets can be added to the :py:data:`presets` dict if needed. - -To apply the preset, specify:: - - quality="preset_name" - -To apply only the quantization table:: - - qtables="preset_name" - -To apply only the subsampling setting:: - - subsampling="preset_name" - -Example:: - - im.save("image_name.jpg", quality="web_high") - -Subsampling ------------ - -Subsampling is the practice of encoding images by implementing less resolution -for chroma information than for luma information. -(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) - -Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and -4:2:0. - -You can get the subsampling of a JPEG with the -:func:`.JpegImagePlugin.get_sampling` function. - -In JPEG compressed data a JPEG marker is used instead of an EXIF tag. -(ref.: https://exiv2.org/tags.html) - - -Quantization tables -------------------- - -They are values use by the DCT (Discrete cosine transform) to remove -*unnecessary* information from the image (the lossy part of the compression). -(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, -https://en.wikipedia.org/wiki/JPEG#Quantization) - -You can get the quantization tables of a JPEG with:: - - im.quantization - -This will return a dict with a number of lists. You can pass this dict -directly as the qtables argument when saving a JPEG. - -The quantization table format in presets is a list with sublists. These formats -are interchangeable. - -Libjpeg ref.: -https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html - -""" - -# fmt: off -presets = { - 'web_low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [20, 16, 25, 39, 50, 46, 62, 68, - 16, 18, 23, 38, 38, 53, 65, 68, - 25, 23, 31, 38, 53, 65, 68, 68, - 39, 38, 38, 53, 65, 68, 68, 68, - 50, 38, 53, 65, 68, 68, 68, 68, - 46, 53, 65, 68, 68, 68, 68, 68, - 62, 65, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68], - [21, 25, 32, 38, 54, 68, 68, 68, - 25, 28, 24, 38, 54, 68, 68, 68, - 32, 24, 32, 43, 66, 68, 68, 68, - 38, 38, 43, 53, 68, 68, 68, 68, - 54, 54, 66, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68] - ]}, - 'web_medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [16, 11, 11, 16, 23, 27, 31, 30, - 11, 12, 12, 15, 20, 23, 23, 30, - 11, 12, 13, 16, 23, 26, 35, 47, - 16, 15, 16, 23, 26, 37, 47, 64, - 23, 20, 23, 26, 39, 51, 64, 64, - 27, 23, 26, 37, 51, 64, 64, 64, - 31, 23, 35, 47, 64, 64, 64, 64, - 30, 30, 47, 64, 64, 64, 64, 64], - [17, 15, 17, 21, 20, 26, 38, 48, - 15, 19, 18, 17, 20, 26, 35, 43, - 17, 18, 20, 22, 26, 30, 46, 53, - 21, 17, 22, 28, 30, 39, 53, 64, - 20, 20, 26, 30, 39, 48, 64, 64, - 26, 26, 30, 39, 48, 63, 64, 64, - 38, 35, 46, 53, 64, 64, 64, 64, - 48, 43, 53, 64, 64, 64, 64, 64] - ]}, - 'web_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 14, 19, - 6, 6, 6, 11, 12, 15, 19, 28, - 9, 8, 10, 12, 16, 20, 27, 31, - 11, 10, 12, 15, 20, 27, 31, 31, - 12, 12, 14, 19, 27, 31, 31, 31, - 16, 12, 19, 28, 31, 31, 31, 31], - [7, 7, 13, 24, 26, 31, 31, 31, - 7, 12, 16, 21, 31, 31, 31, 31, - 13, 16, 17, 31, 31, 31, 31, 31, - 24, 21, 31, 31, 31, 31, 31, 31, - 26, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31] - ]}, - 'web_very_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 11, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 11, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'web_maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 2, 2, 3, - 1, 1, 1, 1, 2, 2, 3, 3, - 1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 2, 2, 3, 3, 3, 3], - [1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 1, 2, 3, 3, 3, 3, - 1, 1, 1, 3, 3, 3, 3, 3, - 2, 2, 3, 3, 3, 3, 3, 3, - 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3] - ]}, - 'low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [18, 14, 14, 21, 30, 35, 34, 17, - 14, 16, 16, 19, 26, 23, 12, 12, - 14, 16, 17, 21, 23, 12, 12, 12, - 21, 19, 21, 23, 12, 12, 12, 12, - 30, 26, 23, 12, 12, 12, 12, 12, - 35, 23, 12, 12, 12, 12, 12, 12, - 34, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [20, 19, 22, 27, 20, 20, 17, 17, - 19, 25, 23, 14, 14, 12, 12, 12, - 22, 23, 14, 14, 12, 12, 12, 12, - 27, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [12, 8, 8, 12, 17, 21, 24, 17, - 8, 9, 9, 11, 15, 19, 12, 12, - 8, 9, 10, 12, 19, 12, 12, 12, - 12, 11, 12, 21, 12, 12, 12, 12, - 17, 15, 19, 12, 12, 12, 12, 12, - 21, 19, 12, 12, 12, 12, 12, 12, - 24, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [13, 11, 13, 16, 20, 20, 17, 17, - 11, 14, 14, 14, 14, 12, 12, 12, - 13, 14, 14, 14, 12, 12, 12, 12, - 16, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 12, 12, - 6, 6, 6, 11, 12, 12, 12, 12, - 9, 8, 10, 12, 12, 12, 12, 12, - 11, 10, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 16, 12, 12, 12, 12, 12, 12, 12], - [7, 7, 13, 24, 20, 20, 17, 17, - 7, 12, 16, 14, 14, 12, 12, 12, - 13, 16, 14, 14, 12, 12, 12, 12, - 24, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 10, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 10, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, -} -# fmt: on diff --git a/waypoint_manager/manager_GUI/PIL/McIdasImagePlugin.py b/waypoint_manager/manager_GUI/PIL/McIdasImagePlugin.py deleted file mode 100644 index cd047fe..0000000 --- a/waypoint_manager/manager_GUI/PIL/McIdasImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Basic McIdas support for PIL -# -# History: -# 1997-05-05 fl Created (8-bit images only) -# 2009-03-08 fl Added 16/32-bit support. -# -# Thanks to Richard Jones and Craig Swank for specs and samples. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -import struct - -from . import Image, ImageFile - - -def _accept(s): - return s[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" - - -## -# Image plugin for McIdas area images. - - -class McIdasImageFile(ImageFile.ImageFile): - - format = "MCIDAS" - format_description = "McIdas area file" - - def _open(self): - - # parse area file directory - s = self.fp.read(256) - if not _accept(s) or len(s) != 256: - raise SyntaxError("not an McIdas area file") - - self.area_descriptor_raw = s - self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) - - # get mode - if w[11] == 1: - mode = rawmode = "L" - elif w[11] == 2: - # FIXME: add memory map support - mode = "I" - rawmode = "I;16B" - elif w[11] == 4: - # FIXME: add memory map support - mode = "I" - rawmode = "I;32B" - else: - raise SyntaxError("unsupported McIdas format") - - self.mode = mode - self._size = w[10], w[9] - - offset = w[34] + w[15] - stride = w[15] + w[10] * w[11] * w[14] - - self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] - - -# -------------------------------------------------------------------- -# registry - -Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) - -# no default extension diff --git a/waypoint_manager/manager_GUI/PIL/MicImagePlugin.py b/waypoint_manager/manager_GUI/PIL/MicImagePlugin.py deleted file mode 100644 index d4f6c90..0000000 --- a/waypoint_manager/manager_GUI/PIL/MicImagePlugin.py +++ /dev/null @@ -1,97 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Microsoft Image Composer support for PIL -# -# Notes: -# uses TiffImagePlugin.py to read the actual image streams -# -# History: -# 97-01-20 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - - -import olefile - -from . import Image, TiffImagePlugin - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for Microsoft's Image Composer file format. - - -class MicImageFile(TiffImagePlugin.TiffImageFile): - - format = "MIC" - format_description = "Microsoft Image Composer" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # read the OLE directory and see if this is a likely - # to be a Microsoft Image Composer file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - raise SyntaxError("not an MIC file; invalid OLE file") from e - - # find ACI subfiles with Image members (maybe not the - # best way to identify MIC files, but what the... ;-) - - self.images = [] - for path in self.ole.listdir(): - if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image": - self.images.append(path) - - # if we didn't find any images, this is probably not - # an MIC file. - if not self.images: - raise SyntaxError("not an MIC file; no image entries") - - self.frame = None - self._n_frames = len(self.images) - self.is_animated = self._n_frames > 1 - - if len(self.images) > 1: - self._category = Image.CONTAINER - - self.seek(0) - - def seek(self, frame): - if not self._seek_check(frame): - return - try: - filename = self.images[frame] - except IndexError as e: - raise EOFError("no such frame") from e - - self.fp = self.ole.openstream(filename) - - TiffImagePlugin.TiffImageFile._open(self) - - self.frame = frame - - def tell(self): - return self.frame - - -# -# -------------------------------------------------------------------- - -Image.register_open(MicImageFile.format, MicImageFile, _accept) - -Image.register_extension(MicImageFile.format, ".mic") diff --git a/waypoint_manager/manager_GUI/PIL/MpegImagePlugin.py b/waypoint_manager/manager_GUI/PIL/MpegImagePlugin.py deleted file mode 100644 index a358dfd..0000000 --- a/waypoint_manager/manager_GUI/PIL/MpegImagePlugin.py +++ /dev/null @@ -1,83 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPEG file handling -# -# History: -# 95-09-09 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile -from ._binary import i8 - -# -# Bitstream parser - - -class BitStream: - def __init__(self, fp): - self.fp = fp - self.bits = 0 - self.bitbuffer = 0 - - def next(self): - return i8(self.fp.read(1)) - - def peek(self, bits): - while self.bits < bits: - c = self.next() - if c < 0: - self.bits = 0 - continue - self.bitbuffer = (self.bitbuffer << 8) + c - self.bits += 8 - return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 - - def skip(self, bits): - while self.bits < bits: - self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) - self.bits += 8 - self.bits = self.bits - bits - - def read(self, bits): - v = self.peek(bits) - self.bits = self.bits - bits - return v - - -## -# Image plugin for MPEG streams. This plugin can identify a stream, -# but it cannot read it. - - -class MpegImageFile(ImageFile.ImageFile): - - format = "MPEG" - format_description = "MPEG" - - def _open(self): - - s = BitStream(self.fp) - - if s.read(32) != 0x1B3: - raise SyntaxError("not an MPEG file") - - self.mode = "RGB" - self._size = s.read(12), s.read(12) - - -# -------------------------------------------------------------------- -# Registry stuff - -Image.register_open(MpegImageFile.format, MpegImageFile) - -Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) - -Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/waypoint_manager/manager_GUI/PIL/MpoImagePlugin.py b/waypoint_manager/manager_GUI/PIL/MpoImagePlugin.py deleted file mode 100644 index 27c3095..0000000 --- a/waypoint_manager/manager_GUI/PIL/MpoImagePlugin.py +++ /dev/null @@ -1,130 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPO file handling -# -# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the -# Camera & Imaging Products Association) -# -# The multi-picture object combines multiple JPEG images (with a modified EXIF -# data format) into a single file. While it can theoretically be used much like -# a GIF animation, it is commonly used to represent 3D photographs and is (as -# of this writing) the most commonly used format by 3D cameras. -# -# History: -# 2014-03-13 Feneric Created -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile, JpegImagePlugin -from ._binary import i16be as i16 - -# def _accept(prefix): -# return JpegImagePlugin._accept(prefix) - - -def _save(im, fp, filename): - # Note that we can only save the current frame at present - return JpegImagePlugin._save(im, fp, filename) - - -## -# Image plugin for MPO images. - - -class MpoImageFile(JpegImagePlugin.JpegImageFile): - - format = "MPO" - format_description = "MPO (CIPA DC-007)" - _close_exclusive_fp_after_loading = False - - def _open(self): - self.fp.seek(0) # prep the fp in order to pass the JPEG test - JpegImagePlugin.JpegImageFile._open(self) - self._after_jpeg_open() - - def _after_jpeg_open(self, mpheader=None): - self._initial_size = self.size - self.mpinfo = mpheader if mpheader is not None else self._getmp() - self.n_frames = self.mpinfo[0xB001] - self.__mpoffsets = [ - mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] - ] - self.__mpoffsets[0] = 0 - # Note that the following assertion will only be invalid if something - # gets broken within JpegImagePlugin. - assert self.n_frames == len(self.__mpoffsets) - del self.info["mpoffset"] # no longer needed - self.is_animated = self.n_frames > 1 - self._fp = self.fp # FIXME: hack - self._fp.seek(self.__mpoffsets[0]) # get ready to read first frame - self.__frame = 0 - self.offset = 0 - # for now we can only handle reading and individual frame extraction - self.readonly = 1 - - def load_seek(self, pos): - self._fp.seek(pos) - - def seek(self, frame): - if not self._seek_check(frame): - return - self.fp = self._fp - self.offset = self.__mpoffsets[frame] - - self.fp.seek(self.offset + 2) # skip SOI marker - segment = self.fp.read(2) - if not segment: - raise ValueError("No data found for frame") - self._size = self._initial_size - if i16(segment) == 0xFFE1: # APP1 - n = i16(self.fp.read(2)) - 2 - self.info["exif"] = ImageFile._safe_read(self.fp, n) - self._reload_exif() - - mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"] - if mptype.startswith("Large Thumbnail"): - exif = self.getexif().get_ifd(0x8769) - if 40962 in exif and 40963 in exif: - self._size = (exif[40962], exif[40963]) - elif "exif" in self.info: - del self.info["exif"] - self._reload_exif() - - self.tile = [("jpeg", (0, 0) + self.size, self.offset, (self.mode, ""))] - self.__frame = frame - - def tell(self): - return self.__frame - - @staticmethod - def adopt(jpeg_instance, mpheader=None): - """ - Transform the instance of JpegImageFile into - an instance of MpoImageFile. - After the call, the JpegImageFile is extended - to be an MpoImageFile. - - This is essentially useful when opening a JPEG - file that reveals itself as an MPO, to avoid - double call to _open. - """ - jpeg_instance.__class__ = MpoImageFile - jpeg_instance._after_jpeg_open(mpheader) - return jpeg_instance - - -# --------------------------------------------------------------------- -# Registry stuff - -# Note that since MPO shares a factory with JPEG, we do not need to do a -# separate registration for it here. -# Image.register_open(MpoImageFile.format, -# JpegImagePlugin.jpeg_factory, _accept) -Image.register_save(MpoImageFile.format, _save) - -Image.register_extension(MpoImageFile.format, ".mpo") - -Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/waypoint_manager/manager_GUI/PIL/MspImagePlugin.py b/waypoint_manager/manager_GUI/PIL/MspImagePlugin.py deleted file mode 100644 index c4d7ddb..0000000 --- a/waypoint_manager/manager_GUI/PIL/MspImagePlugin.py +++ /dev/null @@ -1,194 +0,0 @@ -# -# The Python Imaging Library. -# -# MSP file handling -# -# This is the format used by the Paint program in Windows 1 and 2. -# -# History: -# 95-09-05 fl Created -# 97-01-03 fl Read/write MSP images -# 17-02-21 es Fixed RLE interpretation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-97. -# Copyright (c) Eric Soroos 2017. -# -# See the README file for information on usage and redistribution. -# -# More info on this format: https://archive.org/details/gg243631 -# Page 313: -# Figure 205. Windows Paint Version 1: "DanM" Format -# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 -# -# See also: https://www.fileformat.info/format/mspaint/egff.htm - -import io -import struct - -from . import Image, ImageFile -from ._binary import i16le as i16 -from ._binary import o16le as o16 - -# -# read MSP files - - -def _accept(prefix): - return prefix[:4] in [b"DanM", b"LinS"] - - -## -# Image plugin for Windows MSP images. This plugin supports both -# uncompressed (Windows 1.0). - - -class MspImageFile(ImageFile.ImageFile): - - format = "MSP" - format_description = "Windows Paint" - - def _open(self): - - # Header - s = self.fp.read(32) - if not _accept(s): - raise SyntaxError("not an MSP file") - - # Header checksum - checksum = 0 - for i in range(0, 32, 2): - checksum = checksum ^ i16(s, i) - if checksum != 0: - raise SyntaxError("bad MSP checksum") - - self.mode = "1" - self._size = i16(s, 4), i16(s, 6) - - if s[:4] == b"DanM": - self.tile = [("raw", (0, 0) + self.size, 32, ("1", 0, 1))] - else: - self.tile = [("MSP", (0, 0) + self.size, 32, None)] - - -class MspDecoder(ImageFile.PyDecoder): - # The algo for the MSP decoder is from - # https://www.fileformat.info/format/mspaint/egff.htm - # cc-by-attribution -- That page references is taken from the - # Encyclopedia of Graphics File Formats and is licensed by - # O'Reilly under the Creative Common/Attribution license - # - # For RLE encoded files, the 32byte header is followed by a scan - # line map, encoded as one 16bit word of encoded byte length per - # line. - # - # NOTE: the encoded length of the line can be 0. This was not - # handled in the previous version of this encoder, and there's no - # mention of how to handle it in the documentation. From the few - # examples I've seen, I've assumed that it is a fill of the - # background color, in this case, white. - # - # - # Pseudocode of the decoder: - # Read a BYTE value as the RunType - # If the RunType value is zero - # Read next byte as the RunCount - # Read the next byte as the RunValue - # Write the RunValue byte RunCount times - # If the RunType value is non-zero - # Use this value as the RunCount - # Read and write the next RunCount bytes literally - # - # e.g.: - # 0x00 03 ff 05 00 01 02 03 04 - # would yield the bytes: - # 0xff ff ff 00 01 02 03 04 - # - # which are then interpreted as a bit packed mode '1' image - - _pulls_fd = True - - def decode(self, buffer): - - img = io.BytesIO() - blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) - try: - self.fd.seek(32) - rowmap = struct.unpack_from( - f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) - ) - except struct.error as e: - raise OSError("Truncated MSP file in row map") from e - - for x, rowlen in enumerate(rowmap): - try: - if rowlen == 0: - img.write(blank_line) - continue - row = self.fd.read(rowlen) - if len(row) != rowlen: - raise OSError( - "Truncated MSP file, expected %d bytes on row %s", (rowlen, x) - ) - idx = 0 - while idx < rowlen: - runtype = row[idx] - idx += 1 - if runtype == 0: - (runcount, runval) = struct.unpack_from("Bc", row, idx) - img.write(runval * runcount) - idx += 2 - else: - runcount = runtype - img.write(row[idx : idx + runcount]) - idx += runcount - - except struct.error as e: - raise OSError(f"Corrupted MSP file in row {x}") from e - - self.set_as_raw(img.getvalue(), ("1", 0, 1)) - - return -1, 0 - - -Image.register_decoder("MSP", MspDecoder) - - -# -# write MSP files (uncompressed only) - - -def _save(im, fp, filename): - - if im.mode != "1": - raise OSError(f"cannot write mode {im.mode} as MSP") - - # create MSP header - header = [0] * 16 - - header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 - header[2], header[3] = im.size - header[4], header[5] = 1, 1 - header[6], header[7] = 1, 1 - header[8], header[9] = im.size - - checksum = 0 - for h in header: - checksum = checksum ^ h - header[12] = checksum # FIXME: is this the right field? - - # header - for h in header: - fp.write(o16(h)) - - # image body - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 32, ("1", 0, 1))]) - - -# -# registry - -Image.register_open(MspImageFile.format, MspImageFile, _accept) -Image.register_save(MspImageFile.format, _save) - -Image.register_extension(MspImageFile.format, ".msp") diff --git a/waypoint_manager/manager_GUI/PIL/PSDraw.py b/waypoint_manager/manager_GUI/PIL/PSDraw.py deleted file mode 100644 index 743c35f..0000000 --- a/waypoint_manager/manager_GUI/PIL/PSDraw.py +++ /dev/null @@ -1,235 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Simple PostScript graphics interface -# -# History: -# 1996-04-20 fl Created -# 1999-01-10 fl Added gsave/grestore to image method -# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) -# -# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import sys - -from . import EpsImagePlugin - -## -# Simple PostScript graphics interface. - - -class PSDraw: - """ - Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` or ``sys.stdout`` is assumed. - """ - - def __init__(self, fp=None): - if not fp: - try: - fp = sys.stdout.buffer - except AttributeError: - fp = sys.stdout - self.fp = fp - - def begin_document(self, id=None): - """Set up printing of a document. (Write PostScript DSC header.)""" - # FIXME: incomplete - self.fp.write( - b"%!PS-Adobe-3.0\n" - b"save\n" - b"/showpage { } def\n" - b"%%EndComments\n" - b"%%BeginDocument\n" - ) - # self.fp.write(ERROR_PS) # debugging! - self.fp.write(EDROFF_PS) - self.fp.write(VDI_PS) - self.fp.write(b"%%EndProlog\n") - self.isofont = {} - - def end_document(self): - """Ends printing. (Write PostScript DSC footer.)""" - self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") - if hasattr(self.fp, "flush"): - self.fp.flush() - - def setfont(self, font, size): - """ - Selects which font to use. - - :param font: A PostScript font name - :param size: Size in points. - """ - font = bytes(font, "UTF-8") - if font not in self.isofont: - # reencode font - self.fp.write(b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font, font)) - self.isofont[font] = 1 - # rough - self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font)) - - def line(self, xy0, xy1): - """ - Draws a line between the two points. Coordinates are given in - PostScript point coordinates (72 points per inch, (0, 0) is the lower - left corner of the page). - """ - self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) - - def rectangle(self, box): - """ - Draws a rectangle. - - :param box: A 4-tuple of integers whose order and function is currently - undocumented. - - Hint: the tuple is passed into this format string: - - .. code-block:: python - - %d %d M %d %d 0 Vr\n - """ - self.fp.write(b"%d %d M %d %d 0 Vr\n" % box) - - def text(self, xy, text): - """ - Draws text at the given position. You must use - :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. - """ - text = bytes(text, "UTF-8") - text = b"\\(".join(text.split(b"(")) - text = b"\\)".join(text.split(b")")) - xy += (text,) - self.fp.write(b"%d %d M (%s) S\n" % xy) - - def image(self, box, im, dpi=None): - """Draw a PIL image, centered in the given box.""" - # default resolution depends on mode - if not dpi: - if im.mode == "1": - dpi = 200 # fax - else: - dpi = 100 # greyscale - # image size (on paper) - x = im.size[0] * 72 / dpi - y = im.size[1] * 72 / dpi - # max allowed size - xmax = float(box[2] - box[0]) - ymax = float(box[3] - box[1]) - if x > xmax: - y = y * xmax / x - x = xmax - if y > ymax: - x = x * ymax / y - y = ymax - dx = (xmax - x) / 2 + box[0] - dy = (ymax - y) / 2 + box[1] - self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) - if (x, y) != im.size: - # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) - sx = x / im.size[0] - sy = y / im.size[1] - self.fp.write(b"%f %f scale\n" % (sx, sy)) - EpsImagePlugin._save(im, self.fp, None, 0) - self.fp.write(b"\ngrestore\n") - - -# -------------------------------------------------------------------- -# PostScript driver - -# -# EDROFF.PS -- PostScript driver for Edroff 2 -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - - -EDROFF_PS = b"""\ -/S { show } bind def -/P { moveto show } bind def -/M { moveto } bind def -/X { 0 rmoveto } bind def -/Y { 0 exch rmoveto } bind def -/E { findfont - dup maxlength dict begin - { - 1 index /FID ne { def } { pop pop } ifelse - } forall - /Encoding exch def - dup /FontName exch def - currentdict end definefont pop -} bind def -/F { findfont exch scalefont dup setfont - [ exch /setfont cvx ] cvx bind def -} bind def -""" - -# -# VDI.PS -- PostScript driver for VDI meta commands -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - -VDI_PS = b"""\ -/Vm { moveto } bind def -/Va { newpath arcn stroke } bind def -/Vl { moveto lineto stroke } bind def -/Vc { newpath 0 360 arc closepath } bind def -/Vr { exch dup 0 rlineto - exch dup neg 0 exch rlineto - exch neg 0 rlineto - 0 exch rlineto - 100 div setgray fill 0 setgray } bind def -/Tm matrix def -/Ve { Tm currentmatrix pop - translate scale newpath 0 0 .5 0 360 arc closepath - Tm setmatrix -} bind def -/Vf { currentgray exch setgray fill setgray } bind def -""" - -# -# ERROR.PS -- Error handler -# -# History: -# 89-11-21 fl: created (pslist 1.10) -# - -ERROR_PS = b"""\ -/landscape false def -/errorBUF 200 string def -/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def -errordict begin /handleerror { - initmatrix /Courier findfont 10 scalefont setfont - newpath 72 720 moveto $error begin /newerror false def - (PostScript Error) show errorNL errorNL - (Error: ) show - /errorname load errorBUF cvs show errorNL errorNL - (Command: ) show - /command load dup type /stringtype ne { errorBUF cvs } if show - errorNL errorNL - (VMstatus: ) show - vmstatus errorBUF cvs show ( bytes available, ) show - errorBUF cvs show ( bytes used at level ) show - errorBUF cvs show errorNL errorNL - (Operand stargck: ) show errorNL /ostargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall errorNL - (Execution stargck: ) show errorNL /estargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall - end showpage -} def end -""" diff --git a/waypoint_manager/manager_GUI/PIL/PaletteFile.py b/waypoint_manager/manager_GUI/PIL/PaletteFile.py deleted file mode 100644 index ee9dca8..0000000 --- a/waypoint_manager/manager_GUI/PIL/PaletteFile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read simple, teragon-style palette files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -from ._binary import o8 - - -class PaletteFile: - """File handler for Teragon-style palette files.""" - - rawmode = "RGB" - - def __init__(self, fp): - - self.palette = [(i, i, i) for i in range(256)] - - while True: - - s = fp.readline() - - if not s: - break - if s[:1] == b"#": - continue - if len(s) > 100: - raise SyntaxError("bad palette file") - - v = [int(x) for x in s.split()] - try: - [i, r, g, b] = v - except ValueError: - [i, r] = v - g = b = r - - if 0 <= i <= 255: - self.palette[i] = o8(r) + o8(g) + o8(b) - - self.palette = b"".join(self.palette) - - def getpalette(self): - - return self.palette, self.rawmode diff --git a/waypoint_manager/manager_GUI/PIL/PalmImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PalmImagePlugin.py deleted file mode 100644 index 700f10e..0000000 --- a/waypoint_manager/manager_GUI/PIL/PalmImagePlugin.py +++ /dev/null @@ -1,227 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# - -## -# Image plugin for Palm pixmap images (output only). -## - -from . import Image, ImageFile -from ._binary import o8 -from ._binary import o16be as o16b - -# fmt: off -_Palm8BitColormapValues = ( - (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), - (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), - (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), - (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), - (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), - (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), - (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), - (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), - (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), - (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), - (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), - (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), - (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), - (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), - (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), - (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), - (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), - (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), - (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), - (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), - (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), - (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), - (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), - (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), - (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), - (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), - (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), - (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), - (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), - (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), - (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), - (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), - (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), - (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), - (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), - (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), - (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), - (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), - (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), - (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), - (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), - (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), - (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), - (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), - (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), - (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), - (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), - (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), - (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), - (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), - (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), - (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), - (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), - (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), - (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), - (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), - (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), - (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) -# fmt: on - - -# so build a prototype image to be used for palette resampling -def build_prototype_image(): - image = Image.new("L", (1, len(_Palm8BitColormapValues))) - image.putdata(list(range(len(_Palm8BitColormapValues)))) - palettedata = () - for colormapValue in _Palm8BitColormapValues: - palettedata += colormapValue - palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) - image.putpalette(palettedata) - return image - - -Palm8BitColormapImage = build_prototype_image() - -# OK, we now have in Palm8BitColormapImage, -# a "P"-mode image with the right palette -# -# -------------------------------------------------------------------- - -_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} - -_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} - - -# -# -------------------------------------------------------------------- - -## -# (Internal) Image save plugin for the Palm format. - - -def _save(im, fp, filename): - - if im.mode == "P": - - # we assume this is a color Palm image with the standard colormap, - # unless the "info" dict has a "custom-colormap" field - - rawmode = "P" - bpp = 8 - version = 1 - - elif im.mode == "L": - if im.encoderinfo.get("bpp") in (1, 2, 4): - # this is 8-bit grayscale, so we shift it to get the high-order bits, - # and invert it because - # Palm does greyscale from white (0) to black (1) - bpp = im.encoderinfo["bpp"] - im = im.point( - lambda x, shift=8 - bpp, maxval=(1 << bpp) - 1: maxval - (x >> shift) - ) - elif im.info.get("bpp") in (1, 2, 4): - # here we assume that even though the inherent mode is 8-bit grayscale, - # only the lower bpp bits are significant. - # We invert them to match the Palm. - bpp = im.info["bpp"] - im = im.point(lambda x, maxval=(1 << bpp) - 1: maxval - (x & maxval)) - else: - raise OSError(f"cannot write mode {im.mode} as Palm") - - # we ignore the palette here - im.mode = "P" - rawmode = "P;" + str(bpp) - version = 1 - - elif im.mode == "1": - - # monochrome -- write it inverted, as is the Palm standard - rawmode = "1;I" - bpp = 1 - version = 0 - - else: - - raise OSError(f"cannot write mode {im.mode} as Palm") - - # - # make sure image data is available - im.load() - - # write header - - cols = im.size[0] - rows = im.size[1] - - rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 - transparent_index = 0 - compression_type = _COMPRESSION_TYPES["none"] - - flags = 0 - if im.mode == "P" and "custom-colormap" in im.info: - flags = flags & _FLAGS["custom-colormap"] - colormapsize = 4 * 256 + 2 - colormapmode = im.palette.mode - colormap = im.getdata().getpalette() - else: - colormapsize = 0 - - if "offset" in im.info: - offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 - else: - offset = 0 - - fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) - fp.write(o8(bpp)) - fp.write(o8(version)) - fp.write(o16b(offset)) - fp.write(o8(transparent_index)) - fp.write(o8(compression_type)) - fp.write(o16b(0)) # reserved by Palm - - # now write colormap if necessary - - if colormapsize > 0: - fp.write(o16b(256)) - for i in range(256): - fp.write(o8(i)) - if colormapmode == "RGB": - fp.write( - o8(colormap[3 * i]) - + o8(colormap[3 * i + 1]) - + o8(colormap[3 * i + 2]) - ) - elif colormapmode == "RGBA": - fp.write( - o8(colormap[4 * i]) - + o8(colormap[4 * i + 1]) - + o8(colormap[4 * i + 2]) - ) - - # now convert data to raw form - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))]) - - if hasattr(fp, "flush"): - fp.flush() - - -# -# -------------------------------------------------------------------- - -Image.register_save("Palm", _save) - -Image.register_extension("Palm", ".palm") - -Image.register_mime("Palm", "image/palm") diff --git a/waypoint_manager/manager_GUI/PIL/PcdImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PcdImagePlugin.py deleted file mode 100644 index 38caf5c..0000000 --- a/waypoint_manager/manager_GUI/PIL/PcdImagePlugin.py +++ /dev/null @@ -1,63 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCD file handling -# -# History: -# 96-05-10 fl Created -# 96-05-27 fl Added draft mode (128x192, 256x384) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile - -## -# Image plugin for PhotoCD images. This plugin only reads the 768x512 -# image from the file; higher resolutions are encoded in a proprietary -# encoding. - - -class PcdImageFile(ImageFile.ImageFile): - - format = "PCD" - format_description = "Kodak PhotoCD" - - def _open(self): - - # rough - self.fp.seek(2048) - s = self.fp.read(2048) - - if s[:4] != b"PCD_": - raise SyntaxError("not a PCD file") - - orientation = s[1538] & 3 - self.tile_post_rotate = None - if orientation == 1: - self.tile_post_rotate = 90 - elif orientation == 3: - self.tile_post_rotate = -90 - - self.mode = "RGB" - self._size = 768, 512 # FIXME: not correct for rotated images! - self.tile = [("pcd", (0, 0) + self.size, 96 * 2048, None)] - - def load_end(self): - if self.tile_post_rotate: - # Handle rotated PCDs - self.im = self.im.rotate(self.tile_post_rotate) - self._size = self.im.size - - -# -# registry - -Image.register_open(PcdImageFile.format, PcdImageFile) - -Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/waypoint_manager/manager_GUI/PIL/PcfFontFile.py b/waypoint_manager/manager_GUI/PIL/PcfFontFile.py deleted file mode 100644 index 442ac70..0000000 --- a/waypoint_manager/manager_GUI/PIL/PcfFontFile.py +++ /dev/null @@ -1,246 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library -# $Id$ -# -# portable compiled font file parser -# -# history: -# 1997-08-19 fl created -# 2003-09-13 fl fixed loading of unicode fonts -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import io - -from . import FontFile, Image -from ._binary import i8 -from ._binary import i16be as b16 -from ._binary import i16le as l16 -from ._binary import i32be as b32 -from ._binary import i32le as l32 - -# -------------------------------------------------------------------- -# declarations - -PCF_MAGIC = 0x70636601 # "\x01fcp" - -PCF_PROPERTIES = 1 << 0 -PCF_ACCELERATORS = 1 << 1 -PCF_METRICS = 1 << 2 -PCF_BITMAPS = 1 << 3 -PCF_INK_METRICS = 1 << 4 -PCF_BDF_ENCODINGS = 1 << 5 -PCF_SWIDTHS = 1 << 6 -PCF_GLYPH_NAMES = 1 << 7 -PCF_BDF_ACCELERATORS = 1 << 8 - -BYTES_PER_ROW = [ - lambda bits: ((bits + 7) >> 3), - lambda bits: ((bits + 15) >> 3) & ~1, - lambda bits: ((bits + 31) >> 3) & ~3, - lambda bits: ((bits + 63) >> 3) & ~7, -] - - -def sz(s, o): - return s[o : s.index(b"\0", o)] - - -class PcfFontFile(FontFile.FontFile): - """Font file plugin for the X11 PCF format.""" - - name = "name" - - def __init__(self, fp, charset_encoding="iso8859-1"): - - self.charset_encoding = charset_encoding - - magic = l32(fp.read(4)) - if magic != PCF_MAGIC: - raise SyntaxError("not a PCF file") - - super().__init__() - - count = l32(fp.read(4)) - self.toc = {} - for i in range(count): - type = l32(fp.read(4)) - self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) - - self.fp = fp - - self.info = self._load_properties() - - metrics = self._load_metrics() - bitmaps = self._load_bitmaps(metrics) - encoding = self._load_encoding() - - # - # create glyph structure - - for ch, ix in enumerate(encoding): - if ix is not None: - x, y, l, r, w, a, d, f = metrics[ix] - glyph = (w, 0), (l, d - y, x + l, d), (0, 0, x, y), bitmaps[ix] - self.glyph[ch] = glyph - - def _getformat(self, tag): - - format, size, offset = self.toc[tag] - - fp = self.fp - fp.seek(offset) - - format = l32(fp.read(4)) - - if format & 4: - i16, i32 = b16, b32 - else: - i16, i32 = l16, l32 - - return fp, format, i16, i32 - - def _load_properties(self): - - # - # font properties - - properties = {} - - fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) - - nprops = i32(fp.read(4)) - - # read property description - p = [] - for i in range(nprops): - p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4)))) - if nprops & 3: - fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad - - data = fp.read(i32(fp.read(4))) - - for k, s, v in p: - k = sz(data, k) - if s: - v = sz(data, v) - properties[k] = v - - return properties - - def _load_metrics(self): - - # - # font metrics - - metrics = [] - - fp, format, i16, i32 = self._getformat(PCF_METRICS) - - append = metrics.append - - if (format & 0xFF00) == 0x100: - - # "compressed" metrics - for i in range(i16(fp.read(2))): - left = i8(fp.read(1)) - 128 - right = i8(fp.read(1)) - 128 - width = i8(fp.read(1)) - 128 - ascent = i8(fp.read(1)) - 128 - descent = i8(fp.read(1)) - 128 - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, 0)) - - else: - - # "jumbo" metrics - for i in range(i32(fp.read(4))): - left = i16(fp.read(2)) - right = i16(fp.read(2)) - width = i16(fp.read(2)) - ascent = i16(fp.read(2)) - descent = i16(fp.read(2)) - attributes = i16(fp.read(2)) - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, attributes)) - - return metrics - - def _load_bitmaps(self, metrics): - - # - # bitmap data - - bitmaps = [] - - fp, format, i16, i32 = self._getformat(PCF_BITMAPS) - - nbitmaps = i32(fp.read(4)) - - if nbitmaps != len(metrics): - raise OSError("Wrong number of bitmaps") - - offsets = [] - for i in range(nbitmaps): - offsets.append(i32(fp.read(4))) - - bitmap_sizes = [] - for i in range(4): - bitmap_sizes.append(i32(fp.read(4))) - - # byteorder = format & 4 # non-zero => MSB - bitorder = format & 8 # non-zero => MSB - padindex = format & 3 - - bitmapsize = bitmap_sizes[padindex] - offsets.append(bitmapsize) - - data = fp.read(bitmapsize) - - pad = BYTES_PER_ROW[padindex] - mode = "1;R" - if bitorder: - mode = "1" - - for i in range(nbitmaps): - x, y, l, r, w, a, d, f = metrics[i] - b, e = offsets[i], offsets[i + 1] - bitmaps.append(Image.frombytes("1", (x, y), data[b:e], "raw", mode, pad(x))) - - return bitmaps - - def _load_encoding(self): - fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) - - first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) - first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) - - i16(fp.read(2)) # default - - nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) - - # map character code to bitmap index - encoding = [None] * min(256, nencoding) - - encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] - - for i in range(first_col, len(encoding)): - try: - encoding_offset = encoding_offsets[ - ord(bytearray([i]).decode(self.charset_encoding)) - ] - if encoding_offset != 0xFFFF: - encoding[i] = encoding_offset - except UnicodeDecodeError: - # character is not supported in selected encoding - pass - - return encoding diff --git a/waypoint_manager/manager_GUI/PIL/PcxImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PcxImagePlugin.py deleted file mode 100644 index 841c18a..0000000 --- a/waypoint_manager/manager_GUI/PIL/PcxImagePlugin.py +++ /dev/null @@ -1,220 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCX file handling -# -# This format was originally used by ZSoft's popular PaintBrush -# program for the IBM PC. It is also supported by many MS-DOS and -# Windows applications, including the Windows PaintBrush program in -# Windows 3. -# -# history: -# 1995-09-01 fl Created -# 1996-05-20 fl Fixed RGB support -# 1997-01-03 fl Fixed 2-bit and 4-bit support -# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) -# 1999-02-07 fl Added write support -# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust -# 2002-07-30 fl Seek from to current position, not beginning of file -# 2003-06-03 fl Extract DPI settings (info["dpi"]) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import io -import logging - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -logger = logging.getLogger(__name__) - - -def _accept(prefix): - return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] - - -## -# Image plugin for Paintbrush images. - - -class PcxImageFile(ImageFile.ImageFile): - - format = "PCX" - format_description = "Paintbrush" - - def _open(self): - - # header - s = self.fp.read(128) - if not _accept(s): - raise SyntaxError("not a PCX file") - - # image - bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 - if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: - raise SyntaxError("bad PCX image size") - logger.debug("BBox: %s %s %s %s", *bbox) - - # format - version = s[1] - bits = s[3] - planes = s[65] - provided_stride = i16(s, 66) - logger.debug( - "PCX version %s, bits %s, planes %s, stride %s", - version, - bits, - planes, - provided_stride, - ) - - self.info["dpi"] = i16(s, 12), i16(s, 14) - - if bits == 1 and planes == 1: - mode = rawmode = "1" - - elif bits == 1 and planes in (2, 4): - mode = "P" - rawmode = "P;%dL" % planes - self.palette = ImagePalette.raw("RGB", s[16:64]) - - elif version == 5 and bits == 8 and planes == 1: - mode = rawmode = "L" - # FIXME: hey, this doesn't work with the incremental loader !!! - self.fp.seek(-769, io.SEEK_END) - s = self.fp.read(769) - if len(s) == 769 and s[0] == 12: - # check if the palette is linear greyscale - for i in range(256): - if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: - mode = rawmode = "P" - break - if mode == "P": - self.palette = ImagePalette.raw("RGB", s[1:]) - self.fp.seek(128) - - elif version == 5 and bits == 8 and planes == 3: - mode = "RGB" - rawmode = "RGB;L" - - else: - raise OSError("unknown PCX mode") - - self.mode = mode - self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - - # Don't trust the passed in stride. - # Calculate the approximate position for ourselves. - # CVE-2020-35653 - stride = (self._size[0] * bits + 7) // 8 - - # While the specification states that this must be even, - # not all images follow this - if provided_stride != stride: - stride += stride % 2 - - bbox = (0, 0) + self.size - logger.debug("size: %sx%s", *self.size) - - self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] - - -# -------------------------------------------------------------------- -# save PCX files - - -SAVE = { - # mode: (version, bits, planes, raw mode) - "1": (2, 1, 1, "1"), - "L": (5, 8, 1, "L"), - "P": (5, 8, 1, "P"), - "RGB": (5, 8, 3, "RGB;L"), -} - - -def _save(im, fp, filename): - - try: - version, bits, planes, rawmode = SAVE[im.mode] - except KeyError as e: - raise ValueError(f"Cannot save {im.mode} images as PCX") from e - - # bytes per plane - stride = (im.size[0] * bits + 7) // 8 - # stride should be even - stride += stride % 2 - # Stride needs to be kept in sync with the PcxEncode.c version. - # Ideally it should be passed in in the state, but the bytes value - # gets overwritten. - - logger.debug( - "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", - im.size[0], - bits, - stride, - ) - - # under windows, we could determine the current screen size with - # "Image.core.display_mode()[1]", but I think that's overkill... - - screen = im.size - - dpi = 100, 100 - - # PCX header - fp.write( - o8(10) - + o8(version) - + o8(1) - + o8(bits) - + o16(0) - + o16(0) - + o16(im.size[0] - 1) - + o16(im.size[1] - 1) - + o16(dpi[0]) - + o16(dpi[1]) - + b"\0" * 24 - + b"\xFF" * 24 - + b"\0" - + o8(planes) - + o16(stride) - + o16(1) - + o16(screen[0]) - + o16(screen[1]) - + b"\0" * 54 - ) - - assert fp.tell() == 128 - - ImageFile._save(im, fp, [("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))]) - - if im.mode == "P": - # colour palette - fp.write(o8(12)) - palette = im.im.getpalette("RGB", "RGB") - palette += b"\x00" * (768 - len(palette)) - fp.write(palette) # 768 bytes - elif im.mode == "L": - # greyscale palette - fp.write(o8(12)) - for i in range(256): - fp.write(o8(i) * 3) - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PcxImageFile.format, PcxImageFile, _accept) -Image.register_save(PcxImageFile.format, _save) - -Image.register_extension(PcxImageFile.format, ".pcx") - -Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/waypoint_manager/manager_GUI/PIL/PdfImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PdfImagePlugin.py deleted file mode 100644 index 2109a6f..0000000 --- a/waypoint_manager/manager_GUI/PIL/PdfImagePlugin.py +++ /dev/null @@ -1,239 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PDF (Acrobat) file handling -# -# History: -# 1996-07-16 fl Created -# 1997-01-18 fl Fixed header -# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. -# 2004-02-24 fl Fixes for 1 and P images. -# -# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996-1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -# Image plugin for PDF images (output only). -## - -import io -import os -import time - -from . import Image, ImageFile, ImageSequence, PdfParser, __version__ - -# -# -------------------------------------------------------------------- - -# object ids: -# 1. catalogue -# 2. pages -# 3. image -# 4. page -# 5. page contents - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -## -# (Internal) Image save plugin for the PDF format. - - -def _save(im, fp, filename, save_all=False): - is_appending = im.encoderinfo.get("append", False) - if is_appending: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") - else: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") - - resolution = im.encoderinfo.get("resolution", 72.0) - - info = { - "title": None - if is_appending - else os.path.splitext(os.path.basename(filename))[0], - "author": None, - "subject": None, - "keywords": None, - "creator": None, - "producer": None, - "creationDate": None if is_appending else time.gmtime(), - "modDate": None if is_appending else time.gmtime(), - } - for k, default in info.items(): - v = im.encoderinfo.get(k) if k in im.encoderinfo else default - if v: - existing_pdf.info[k[0].upper() + k[1:]] = v - - # - # make sure image data is available - im.load() - - existing_pdf.start_writing() - existing_pdf.write_header() - existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") - - # - # pages - ims = [im] - if save_all: - append_images = im.encoderinfo.get("append_images", []) - for append_im in append_images: - append_im.encoderinfo = im.encoderinfo.copy() - ims.append(append_im) - number_of_pages = 0 - image_refs = [] - page_refs = [] - contents_refs = [] - for im in ims: - im_number_of_pages = 1 - if save_all: - try: - im_number_of_pages = im.n_frames - except AttributeError: - # Image format does not have n_frames. - # It is a single frame image - pass - number_of_pages += im_number_of_pages - for i in range(im_number_of_pages): - image_refs.append(existing_pdf.next_object_id(0)) - page_refs.append(existing_pdf.next_object_id(0)) - contents_refs.append(existing_pdf.next_object_id(0)) - existing_pdf.pages.append(page_refs[-1]) - - # - # catalog and list of pages - existing_pdf.write_catalog() - - page_number = 0 - for im_sequence in ims: - im_pages = ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] - for im in im_pages: - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode - # (packbits) or LZWDecode (tiff/lzw compression). Note that - # PDF 1.2 also supports Flatedecode (zip compression). - - bits = 8 - params = None - decode = None - - if im.mode == "1": - filter = "DCTDecode" - colorspace = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "L": - filter = "DCTDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - colorspace = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "P": - filter = "ASCIIHexDecode" - palette = im.getpalette() - colorspace = [ - PdfParser.PdfName("Indexed"), - PdfParser.PdfName("DeviceRGB"), - 255, - PdfParser.PdfBinary(palette), - ] - procset = "ImageI" # indexed color - elif im.mode == "RGB": - filter = "DCTDecode" - colorspace = PdfParser.PdfName("DeviceRGB") - procset = "ImageC" # color images - elif im.mode == "CMYK": - filter = "DCTDecode" - colorspace = PdfParser.PdfName("DeviceCMYK") - procset = "ImageC" # color images - decode = [1, 0, 1, 0, 1, 0, 1, 0] - else: - raise ValueError(f"cannot save mode {im.mode}") - - # - # image - - op = io.BytesIO() - - if filter == "ASCIIHexDecode": - ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)]) - elif filter == "DCTDecode": - Image.SAVE["JPEG"](im, op, filename) - elif filter == "FlateDecode": - ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)]) - elif filter == "RunLengthDecode": - ImageFile._save(im, op, [("packbits", (0, 0) + im.size, 0, im.mode)]) - else: - raise ValueError(f"unsupported PDF filter ({filter})") - - # - # Get image characteristics - - width, height = im.size - - existing_pdf.write_obj( - image_refs[page_number], - stream=op.getvalue(), - Type=PdfParser.PdfName("XObject"), - Subtype=PdfParser.PdfName("Image"), - Width=width, # * 72.0 / resolution, - Height=height, # * 72.0 / resolution, - Filter=PdfParser.PdfName(filter), - BitsPerComponent=bits, - Decode=decode, - DecodeParams=params, - ColorSpace=colorspace, - ) - - # - # page - - existing_pdf.write_page( - page_refs[page_number], - Resources=PdfParser.PdfDict( - ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], - XObject=PdfParser.PdfDict(image=image_refs[page_number]), - ), - MediaBox=[ - 0, - 0, - width * 72.0 / resolution, - height * 72.0 / resolution, - ], - Contents=contents_refs[page_number], - ) - - # - # page contents - - page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( - width * 72.0 / resolution, - height * 72.0 / resolution, - ) - - existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) - - page_number += 1 - - # - # trailer - existing_pdf.write_xref_and_trailer() - if hasattr(fp, "flush"): - fp.flush() - existing_pdf.close() - - -# -# -------------------------------------------------------------------- - - -Image.register_save("PDF", _save) -Image.register_save_all("PDF", _save_all) - -Image.register_extension("PDF", ".pdf") - -Image.register_mime("PDF", "application/pdf") diff --git a/waypoint_manager/manager_GUI/PIL/PdfParser.py b/waypoint_manager/manager_GUI/PIL/PdfParser.py deleted file mode 100644 index fd5cc5a..0000000 --- a/waypoint_manager/manager_GUI/PIL/PdfParser.py +++ /dev/null @@ -1,998 +0,0 @@ -import calendar -import codecs -import collections -import mmap -import os -import re -import time -import zlib - - -# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set -# on page 656 -def encode_text(s): - return codecs.BOM_UTF16_BE + s.encode("utf_16_be") - - -PDFDocEncoding = { - 0x16: "\u0017", - 0x18: "\u02D8", - 0x19: "\u02C7", - 0x1A: "\u02C6", - 0x1B: "\u02D9", - 0x1C: "\u02DD", - 0x1D: "\u02DB", - 0x1E: "\u02DA", - 0x1F: "\u02DC", - 0x80: "\u2022", - 0x81: "\u2020", - 0x82: "\u2021", - 0x83: "\u2026", - 0x84: "\u2014", - 0x85: "\u2013", - 0x86: "\u0192", - 0x87: "\u2044", - 0x88: "\u2039", - 0x89: "\u203A", - 0x8A: "\u2212", - 0x8B: "\u2030", - 0x8C: "\u201E", - 0x8D: "\u201C", - 0x8E: "\u201D", - 0x8F: "\u2018", - 0x90: "\u2019", - 0x91: "\u201A", - 0x92: "\u2122", - 0x93: "\uFB01", - 0x94: "\uFB02", - 0x95: "\u0141", - 0x96: "\u0152", - 0x97: "\u0160", - 0x98: "\u0178", - 0x99: "\u017D", - 0x9A: "\u0131", - 0x9B: "\u0142", - 0x9C: "\u0153", - 0x9D: "\u0161", - 0x9E: "\u017E", - 0xA0: "\u20AC", -} - - -def decode_text(b): - if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: - return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") - else: - return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) - - -class PdfFormatError(RuntimeError): - """An error that probably indicates a syntactic or semantic error in the - PDF file structure""" - - pass - - -def check_format_condition(condition, error_message): - if not condition: - raise PdfFormatError(error_message) - - -class IndirectReference( - collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"]) -): - def __str__(self): - return "%s %s R" % self - - def __bytes__(self): - return self.__str__().encode("us-ascii") - - def __eq__(self, other): - return ( - other.__class__ is self.__class__ - and other.object_id == self.object_id - and other.generation == self.generation - ) - - def __ne__(self, other): - return not (self == other) - - def __hash__(self): - return hash((self.object_id, self.generation)) - - -class IndirectObjectDef(IndirectReference): - def __str__(self): - return "%s %s obj" % self - - -class XrefTable: - def __init__(self): - self.existing_entries = {} # object ID => (offset, generation) - self.new_entries = {} # object ID => (offset, generation) - self.deleted_entries = {0: 65536} # object ID => generation - self.reading_finished = False - - def __setitem__(self, key, value): - if self.reading_finished: - self.new_entries[key] = value - else: - self.existing_entries[key] = value - if key in self.deleted_entries: - del self.deleted_entries[key] - - def __getitem__(self, key): - try: - return self.new_entries[key] - except KeyError: - return self.existing_entries[key] - - def __delitem__(self, key): - if key in self.new_entries: - generation = self.new_entries[key][1] + 1 - del self.new_entries[key] - self.deleted_entries[key] = generation - elif key in self.existing_entries: - generation = self.existing_entries[key][1] + 1 - self.deleted_entries[key] = generation - elif key in self.deleted_entries: - generation = self.deleted_entries[key] - else: - raise IndexError( - "object ID " + str(key) + " cannot be deleted because it doesn't exist" - ) - - def __contains__(self, key): - return key in self.existing_entries or key in self.new_entries - - def __len__(self): - return len( - set(self.existing_entries.keys()) - | set(self.new_entries.keys()) - | set(self.deleted_entries.keys()) - ) - - def keys(self): - return ( - set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) - ) | set(self.new_entries.keys()) - - def write(self, f): - keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) - deleted_keys = sorted(set(self.deleted_entries.keys())) - startxref = f.tell() - f.write(b"xref\n") - while keys: - # find a contiguous sequence of object IDs - prev = None - for index, key in enumerate(keys): - if prev is None or prev + 1 == key: - prev = key - else: - contiguous_keys = keys[:index] - keys = keys[index:] - break - else: - contiguous_keys = keys - keys = None - f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) - for object_id in contiguous_keys: - if object_id in self.new_entries: - f.write(b"%010d %05d n \n" % self.new_entries[object_id]) - else: - this_deleted_object_id = deleted_keys.pop(0) - check_format_condition( - object_id == this_deleted_object_id, - f"expected the next deleted object ID to be {object_id}, " - f"instead found {this_deleted_object_id}", - ) - try: - next_in_linked_list = deleted_keys[0] - except IndexError: - next_in_linked_list = 0 - f.write( - b"%010d %05d f \n" - % (next_in_linked_list, self.deleted_entries[object_id]) - ) - return startxref - - -class PdfName: - def __init__(self, name): - if isinstance(name, PdfName): - self.name = name.name - elif isinstance(name, bytes): - self.name = name - else: - self.name = name.encode("us-ascii") - - def name_as_str(self): - return self.name.decode("us-ascii") - - def __eq__(self, other): - return ( - isinstance(other, PdfName) and other.name == self.name - ) or other == self.name - - def __hash__(self): - return hash(self.name) - - def __repr__(self): - return f"PdfName({repr(self.name)})" - - @classmethod - def from_pdf_stream(cls, data): - return cls(PdfParser.interpret_name(data)) - - allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} - - def __bytes__(self): - result = bytearray(b"/") - for b in self.name: - if b in self.allowed_chars: - result.append(b) - else: - result.extend(b"#%02X" % b) - return bytes(result) - - -class PdfArray(list): - def __bytes__(self): - return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" - - -class PdfDict(collections.UserDict): - def __setattr__(self, key, value): - if key == "data": - collections.UserDict.__setattr__(self, key, value) - else: - self[key.encode("us-ascii")] = value - - def __getattr__(self, key): - try: - value = self[key.encode("us-ascii")] - except KeyError as e: - raise AttributeError(key) from e - if isinstance(value, bytes): - value = decode_text(value) - if key.endswith("Date"): - if value.startswith("D:"): - value = value[2:] - - relationship = "Z" - if len(value) > 17: - relationship = value[14] - offset = int(value[15:17]) * 60 - if len(value) > 20: - offset += int(value[18:20]) - - format = "%Y%m%d%H%M%S"[: len(value) - 2] - value = time.strptime(value[: len(format) + 2], format) - if relationship in ["+", "-"]: - offset *= 60 - if relationship == "+": - offset *= -1 - value = time.gmtime(calendar.timegm(value) + offset) - return value - - def __bytes__(self): - out = bytearray(b"<<") - for key, value in self.items(): - if value is None: - continue - value = pdf_repr(value) - out.extend(b"\n") - out.extend(bytes(PdfName(key))) - out.extend(b" ") - out.extend(value) - out.extend(b"\n>>") - return bytes(out) - - -class PdfBinary: - def __init__(self, data): - self.data = data - - def __bytes__(self): - return b"<%s>" % b"".join(b"%02X" % b for b in self.data) - - -class PdfStream: - def __init__(self, dictionary, buf): - self.dictionary = dictionary - self.buf = buf - - def decode(self): - try: - filter = self.dictionary.Filter - except AttributeError: - return self.buf - if filter == b"FlateDecode": - try: - expected_length = self.dictionary.DL - except AttributeError: - expected_length = self.dictionary.Length - return zlib.decompress(self.buf, bufsize=int(expected_length)) - else: - raise NotImplementedError( - f"stream filter {repr(self.dictionary.Filter)} unknown/unsupported" - ) - - -def pdf_repr(x): - if x is True: - return b"true" - elif x is False: - return b"false" - elif x is None: - return b"null" - elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): - return bytes(x) - elif isinstance(x, int): - return str(x).encode("us-ascii") - elif isinstance(x, float): - return str(x).encode("us-ascii") - elif isinstance(x, time.struct_time): - return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" - elif isinstance(x, dict): - return bytes(PdfDict(x)) - elif isinstance(x, list): - return bytes(PdfArray(x)) - elif isinstance(x, str): - return pdf_repr(encode_text(x)) - elif isinstance(x, bytes): - # XXX escape more chars? handle binary garbage - x = x.replace(b"\\", b"\\\\") - x = x.replace(b"(", b"\\(") - x = x.replace(b")", b"\\)") - return b"(" + x + b")" - else: - return bytes(x) - - -class PdfParser: - """Based on - https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf - Supports PDF up to 1.4 - """ - - def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): - if buf and f: - raise RuntimeError("specify buf or f or filename, but not both buf and f") - self.filename = filename - self.buf = buf - self.f = f - self.start_offset = start_offset - self.should_close_buf = False - self.should_close_file = False - if filename is not None and f is None: - self.f = f = open(filename, mode) - self.should_close_file = True - if f is not None: - self.buf = buf = self.get_buf_from_file(f) - self.should_close_buf = True - if not filename and hasattr(f, "name"): - self.filename = f.name - self.cached_objects = {} - if buf: - self.read_pdf_info() - else: - self.file_size_total = self.file_size_this = 0 - self.root = PdfDict() - self.root_ref = None - self.info = PdfDict() - self.info_ref = None - self.page_tree_root = {} - self.pages = [] - self.orig_pages = [] - self.pages_ref = None - self.last_xref_section_offset = None - self.trailer_dict = {} - self.xref_table = XrefTable() - self.xref_table.reading_finished = True - if f: - self.seek_end() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() - return False # do not suppress exceptions - - def start_writing(self): - self.close_buf() - self.seek_end() - - def close_buf(self): - try: - self.buf.close() - except AttributeError: - pass - self.buf = None - - def close(self): - if self.should_close_buf: - self.close_buf() - if self.f is not None and self.should_close_file: - self.f.close() - self.f = None - - def seek_end(self): - self.f.seek(0, os.SEEK_END) - - def write_header(self): - self.f.write(b"%PDF-1.4\n") - - def write_comment(self, s): - self.f.write(f"% {s}\n".encode()) - - def write_catalog(self): - self.del_root() - self.root_ref = self.next_object_id(self.f.tell()) - self.pages_ref = self.next_object_id(0) - self.rewrite_pages() - self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) - self.write_obj( - self.pages_ref, - Type=PdfName(b"Pages"), - Count=len(self.pages), - Kids=self.pages, - ) - return self.root_ref - - def rewrite_pages(self): - pages_tree_nodes_to_delete = [] - for i, page_ref in enumerate(self.orig_pages): - page_info = self.cached_objects[page_ref] - del self.xref_table[page_ref.object_id] - pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) - if page_ref not in self.pages: - # the page has been deleted - continue - # make dict keys into strings for passing to write_page - stringified_page_info = {} - for key, value in page_info.items(): - # key should be a PdfName - stringified_page_info[key.name_as_str()] = value - stringified_page_info["Parent"] = self.pages_ref - new_page_ref = self.write_page(None, **stringified_page_info) - for j, cur_page_ref in enumerate(self.pages): - if cur_page_ref == page_ref: - # replace the page reference with the new one - self.pages[j] = new_page_ref - # delete redundant Pages tree nodes from xref table - for pages_tree_node_ref in pages_tree_nodes_to_delete: - while pages_tree_node_ref: - pages_tree_node = self.cached_objects[pages_tree_node_ref] - if pages_tree_node_ref.object_id in self.xref_table: - del self.xref_table[pages_tree_node_ref.object_id] - pages_tree_node_ref = pages_tree_node.get(b"Parent", None) - self.orig_pages = [] - - def write_xref_and_trailer(self, new_root_ref=None): - if new_root_ref: - self.del_root() - self.root_ref = new_root_ref - if self.info: - self.info_ref = self.write_obj(None, self.info) - start_xref = self.xref_table.write(self.f) - num_entries = len(self.xref_table) - trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} - if self.last_xref_section_offset is not None: - trailer_dict[b"Prev"] = self.last_xref_section_offset - if self.info: - trailer_dict[b"Info"] = self.info_ref - self.last_xref_section_offset = start_xref - self.f.write( - b"trailer\n" - + bytes(PdfDict(trailer_dict)) - + b"\nstartxref\n%d\n%%%%EOF" % start_xref - ) - - def write_page(self, ref, *objs, **dict_obj): - if isinstance(ref, int): - ref = self.pages[ref] - if "Type" not in dict_obj: - dict_obj["Type"] = PdfName(b"Page") - if "Parent" not in dict_obj: - dict_obj["Parent"] = self.pages_ref - return self.write_obj(ref, *objs, **dict_obj) - - def write_obj(self, ref, *objs, **dict_obj): - f = self.f - if ref is None: - ref = self.next_object_id(f.tell()) - else: - self.xref_table[ref.object_id] = (f.tell(), ref.generation) - f.write(bytes(IndirectObjectDef(*ref))) - stream = dict_obj.pop("stream", None) - if stream is not None: - dict_obj["Length"] = len(stream) - if dict_obj: - f.write(pdf_repr(dict_obj)) - for obj in objs: - f.write(pdf_repr(obj)) - if stream is not None: - f.write(b"stream\n") - f.write(stream) - f.write(b"\nendstream\n") - f.write(b"endobj\n") - return ref - - def del_root(self): - if self.root_ref is None: - return - del self.xref_table[self.root_ref.object_id] - del self.xref_table[self.root[b"Pages"].object_id] - - @staticmethod - def get_buf_from_file(f): - if hasattr(f, "getbuffer"): - return f.getbuffer() - elif hasattr(f, "getvalue"): - return f.getvalue() - else: - try: - return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - except ValueError: # cannot mmap an empty file - return b"" - - def read_pdf_info(self): - self.file_size_total = len(self.buf) - self.file_size_this = self.file_size_total - self.start_offset - self.read_trailer() - self.root_ref = self.trailer_dict[b"Root"] - self.info_ref = self.trailer_dict.get(b"Info", None) - self.root = PdfDict(self.read_indirect(self.root_ref)) - if self.info_ref is None: - self.info = PdfDict() - else: - self.info = PdfDict(self.read_indirect(self.info_ref)) - check_format_condition(b"Type" in self.root, "/Type missing in Root") - check_format_condition( - self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" - ) - check_format_condition(b"Pages" in self.root, "/Pages missing in Root") - check_format_condition( - isinstance(self.root[b"Pages"], IndirectReference), - "/Pages in Root is not an indirect reference", - ) - self.pages_ref = self.root[b"Pages"] - self.page_tree_root = self.read_indirect(self.pages_ref) - self.pages = self.linearize_page_tree(self.page_tree_root) - # save the original list of page references - # in case the user modifies, adds or deletes some pages - # and we need to rewrite the pages and their list - self.orig_pages = self.pages[:] - - def next_object_id(self, offset=None): - try: - # TODO: support reuse of deleted objects - reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) - except ValueError: - reference = IndirectReference(1, 0) - if offset is not None: - self.xref_table[reference.object_id] = (offset, 0) - return reference - - delimiter = rb"[][()<>{}/%]" - delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" - whitespace = rb"[\000\011\012\014\015\040]" - whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" - whitespace_optional = whitespace + b"*" - whitespace_mandatory = whitespace + b"+" - # No "\012" aka "\n" or "\015" aka "\r": - whitespace_optional_no_nl = rb"[\000\011\014\040]*" - newline_only = rb"[\r\n]+" - newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl - re_trailer_end = re.compile( - whitespace_mandatory - + rb"trailer" - + whitespace_optional - + rb"<<(.*>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional - + rb"$", - re.DOTALL, - ) - re_trailer_prev = re.compile( - whitespace_optional - + rb"trailer" - + whitespace_optional - + rb"<<(.*?>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional, - re.DOTALL, - ) - - def read_trailer(self): - search_start_offset = len(self.buf) - 16384 - if search_start_offset < self.start_offset: - search_start_offset = self.start_offset - m = self.re_trailer_end.search(self.buf, search_start_offset) - check_format_condition(m, "trailer end not found") - # make sure we found the LAST trailer - last_match = m - while m: - last_match = m - m = self.re_trailer_end.search(self.buf, m.start() + 16) - if not m: - m = last_match - trailer_data = m.group(1) - self.last_xref_section_offset = int(m.group(2)) - self.trailer_dict = self.interpret_trailer(trailer_data) - self.xref_table = XrefTable() - self.read_xref_table(xref_section_offset=self.last_xref_section_offset) - if b"Prev" in self.trailer_dict: - self.read_prev_trailer(self.trailer_dict[b"Prev"]) - - def read_prev_trailer(self, xref_section_offset): - trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) - m = self.re_trailer_prev.search( - self.buf[trailer_offset : trailer_offset + 16384] - ) - check_format_condition(m, "previous trailer not found") - trailer_data = m.group(1) - check_format_condition( - int(m.group(2)) == xref_section_offset, - "xref section offset in previous trailer doesn't match what was expected", - ) - trailer_dict = self.interpret_trailer(trailer_data) - if b"Prev" in trailer_dict: - self.read_prev_trailer(trailer_dict[b"Prev"]) - - re_whitespace_optional = re.compile(whitespace_optional) - re_name = re.compile( - whitespace_optional - + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" - + delimiter_or_ws - + rb")" - ) - re_dict_start = re.compile(whitespace_optional + rb"<<") - re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) - - @classmethod - def interpret_trailer(cls, trailer_data): - trailer = {} - offset = 0 - while True: - m = cls.re_name.match(trailer_data, offset) - if not m: - m = cls.re_dict_end.match(trailer_data, offset) - check_format_condition( - m and m.end() == len(trailer_data), - "name not found in trailer, remaining data: " - + repr(trailer_data[offset:]), - ) - break - key = cls.interpret_name(m.group(1)) - value, offset = cls.get_value(trailer_data, m.end()) - trailer[key] = value - check_format_condition( - b"Size" in trailer and isinstance(trailer[b"Size"], int), - "/Size not in trailer or not an integer", - ) - check_format_condition( - b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), - "/Root not in trailer or not an indirect reference", - ) - return trailer - - re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") - - @classmethod - def interpret_name(cls, raw, as_text=False): - name = b"" - for m in cls.re_hashes_in_name.finditer(raw): - if m.group(3): - name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) - else: - name += m.group(1) - if as_text: - return name.decode("utf-8") - else: - return bytes(name) - - re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") - re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") - re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") - re_int = re.compile( - whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" - ) - re_real = re.compile( - whitespace_optional - + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" - + delimiter_or_ws - + rb")" - ) - re_array_start = re.compile(whitespace_optional + rb"\[") - re_array_end = re.compile(whitespace_optional + rb"]") - re_string_hex = re.compile( - whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" - ) - re_string_lit = re.compile(whitespace_optional + rb"\(") - re_indirect_reference = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"R(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_start = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"obj(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_end = re.compile( - whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" - ) - re_comment = re.compile( - rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" - ) - re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") - re_stream_end = re.compile( - whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" - ) - - @classmethod - def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): - if max_nesting == 0: - return None, None - m = cls.re_comment.match(data, offset) - if m: - offset = m.end() - m = cls.re_indirect_def_start.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object definition: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object definition: generation must be non-negative", - ) - check_format_condition( - expect_indirect is None - or expect_indirect - == IndirectReference(int(m.group(1)), int(m.group(2))), - "indirect object definition different than expected", - ) - object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting - 1) - if offset is None: - return object, None - m = cls.re_indirect_def_end.match(data, offset) - check_format_condition(m, "indirect object definition end not found") - return object, m.end() - check_format_condition( - not expect_indirect, "indirect object definition not found" - ) - m = cls.re_indirect_reference.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object reference: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object reference: generation must be non-negative", - ) - return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() - m = cls.re_dict_start.match(data, offset) - if m: - offset = m.end() - result = {} - m = cls.re_dict_end.match(data, offset) - while not m: - key, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - if offset is None: - return result, None - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result[key] = value - if offset is None: - return result, None - m = cls.re_dict_end.match(data, offset) - offset = m.end() - m = cls.re_stream_start.match(data, offset) - if m: - try: - stream_len = int(result[b"Length"]) - except (TypeError, KeyError, ValueError) as e: - raise PdfFormatError( - "bad or missing Length in stream dict (%r)" - % result.get(b"Length", None) - ) from e - stream_data = data[m.end() : m.end() + stream_len] - m = cls.re_stream_end.match(data, m.end() + stream_len) - check_format_condition(m, "stream end not found") - offset = m.end() - result = PdfStream(PdfDict(result), stream_data) - else: - result = PdfDict(result) - return result, offset - m = cls.re_array_start.match(data, offset) - if m: - offset = m.end() - result = [] - m = cls.re_array_end.match(data, offset) - while not m: - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result.append(value) - if offset is None: - return result, None - m = cls.re_array_end.match(data, offset) - return result, m.end() - m = cls.re_null.match(data, offset) - if m: - return None, m.end() - m = cls.re_true.match(data, offset) - if m: - return True, m.end() - m = cls.re_false.match(data, offset) - if m: - return False, m.end() - m = cls.re_name.match(data, offset) - if m: - return PdfName(cls.interpret_name(m.group(1))), m.end() - m = cls.re_int.match(data, offset) - if m: - return int(m.group(1)), m.end() - m = cls.re_real.match(data, offset) - if m: - # XXX Decimal instead of float??? - return float(m.group(1)), m.end() - m = cls.re_string_hex.match(data, offset) - if m: - # filter out whitespace - hex_string = bytearray( - b for b in m.group(1) if b in b"0123456789abcdefABCDEF" - ) - if len(hex_string) % 2 == 1: - # append a 0 if the length is not even - yes, at the end - hex_string.append(ord(b"0")) - return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() - m = cls.re_string_lit.match(data, offset) - if m: - return cls.get_literal_string(data, m.end()) - # return None, offset # fallback (only for debugging) - raise PdfFormatError("unrecognized object: " + repr(data[offset : offset + 32])) - - re_lit_str_token = re.compile( - rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" - ) - escaped_chars = { - b"n": b"\n", - b"r": b"\r", - b"t": b"\t", - b"b": b"\b", - b"f": b"\f", - b"(": b"(", - b")": b")", - b"\\": b"\\", - ord(b"n"): b"\n", - ord(b"r"): b"\r", - ord(b"t"): b"\t", - ord(b"b"): b"\b", - ord(b"f"): b"\f", - ord(b"("): b"(", - ord(b")"): b")", - ord(b"\\"): b"\\", - } - - @classmethod - def get_literal_string(cls, data, offset): - nesting_depth = 0 - result = bytearray() - for m in cls.re_lit_str_token.finditer(data, offset): - result.extend(data[offset : m.start()]) - if m.group(1): - result.extend(cls.escaped_chars[m.group(1)[1]]) - elif m.group(2): - result.append(int(m.group(2)[1:], 8)) - elif m.group(3): - pass - elif m.group(5): - result.extend(b"\n") - elif m.group(6): - result.extend(b"(") - nesting_depth += 1 - elif m.group(7): - if nesting_depth == 0: - return bytes(result), m.end() - result.extend(b")") - nesting_depth -= 1 - offset = m.end() - raise PdfFormatError("unfinished literal string") - - re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) - re_xref_subsection_start = re.compile( - whitespace_optional - + rb"([0-9]+)" - + whitespace_mandatory - + rb"([0-9]+)" - + whitespace_optional - + newline_only - ) - re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") - - def read_xref_table(self, xref_section_offset): - subsection_found = False - m = self.re_xref_section_start.match( - self.buf, xref_section_offset + self.start_offset - ) - check_format_condition(m, "xref section start not found") - offset = m.end() - while True: - m = self.re_xref_subsection_start.match(self.buf, offset) - if not m: - check_format_condition( - subsection_found, "xref subsection start not found" - ) - break - subsection_found = True - offset = m.end() - first_object = int(m.group(1)) - num_objects = int(m.group(2)) - for i in range(first_object, first_object + num_objects): - m = self.re_xref_entry.match(self.buf, offset) - check_format_condition(m, "xref entry not found") - offset = m.end() - is_free = m.group(3) == b"f" - generation = int(m.group(2)) - if not is_free: - new_entry = (int(m.group(1)), generation) - check_format_condition( - i not in self.xref_table or self.xref_table[i] == new_entry, - "xref entry duplicated (and not identical)", - ) - self.xref_table[i] = new_entry - return offset - - def read_indirect(self, ref, max_nesting=-1): - offset, generation = self.xref_table[ref[0]] - check_format_condition( - generation == ref[1], - f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " - f"table, instead found generation {generation} at offset {offset}", - ) - value = self.get_value( - self.buf, - offset + self.start_offset, - expect_indirect=IndirectReference(*ref), - max_nesting=max_nesting, - )[0] - self.cached_objects[ref] = value - return value - - def linearize_page_tree(self, node=None): - if node is None: - node = self.page_tree_root - check_format_condition( - node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" - ) - pages = [] - for kid in node[b"Kids"]: - kid_object = self.read_indirect(kid) - if kid_object[b"Type"] == b"Page": - pages.append(kid) - else: - pages.extend(self.linearize_page_tree(node=kid_object)) - return pages diff --git a/waypoint_manager/manager_GUI/PIL/PixarImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PixarImagePlugin.py deleted file mode 100644 index c4860b6..0000000 --- a/waypoint_manager/manager_GUI/PIL/PixarImagePlugin.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIXAR raster support for PIL -# -# history: -# 97-01-29 fl Created -# -# notes: -# This is incomplete; it is based on a few samples created with -# Photoshop 2.5 and 3.0, and a summary description provided by -# Greg Coats . Hopefully, "L" and -# "RGBA" support will be added in future versions. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile -from ._binary import i16le as i16 - -# -# helpers - - -def _accept(prefix): - return prefix[:4] == b"\200\350\000\000" - - -## -# Image plugin for PIXAR raster images. - - -class PixarImageFile(ImageFile.ImageFile): - - format = "PIXAR" - format_description = "PIXAR raster image" - - def _open(self): - - # assuming a 4-byte magic label - s = self.fp.read(4) - if not _accept(s): - raise SyntaxError("not a PIXAR file") - - # read rest of header - s = s + self.fp.read(508) - - self._size = i16(s, 418), i16(s, 416) - - # get channel/depth descriptions - mode = i16(s, 424), i16(s, 426) - - if mode == (14, 2): - self.mode = "RGB" - # FIXME: to be continued... - - # create tile descriptor (assuming "dumped") - self.tile = [("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1))] - - -# -# -------------------------------------------------------------------- - -Image.register_open(PixarImageFile.format, PixarImageFile, _accept) - -Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/waypoint_manager/manager_GUI/PIL/PngImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PngImagePlugin.py deleted file mode 100644 index c0b3647..0000000 --- a/waypoint_manager/manager_GUI/PIL/PngImagePlugin.py +++ /dev/null @@ -1,1432 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PNG support code -# -# See "PNG (Portable Network Graphics) Specification, version 1.0; -# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). -# -# history: -# 1996-05-06 fl Created (couldn't resist it) -# 1996-12-14 fl Upgraded, added read and verify support (0.2) -# 1996-12-15 fl Separate PNG stream parser -# 1996-12-29 fl Added write support, added getchunks -# 1996-12-30 fl Eliminated circular references in decoder (0.3) -# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) -# 2001-02-08 fl Added transparency support (from Zircon) (0.5) -# 2001-04-16 fl Don't close data source in "open" method (0.6) -# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) -# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) -# 2004-09-20 fl Added PngInfo chunk container -# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) -# 2008-08-13 fl Added tRNS support for RGB images -# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) -# 2009-03-08 fl Added zTXT support (from Lowell Alleman) -# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) -# -# Copyright (c) 1997-2009 by Secret Labs AB -# Copyright (c) 1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import itertools -import logging -import re -import struct -import warnings -import zlib -from enum import IntEnum - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._binary import o32be as o32 -from ._deprecate import deprecate - -logger = logging.getLogger(__name__) - -is_cid = re.compile(rb"\w\w\w\w").match - - -_MAGIC = b"\211PNG\r\n\032\n" - - -_MODES = { - # supported bits/color combinations, and corresponding modes/rawmodes - # Greyscale - (1, 0): ("1", "1"), - (2, 0): ("L", "L;2"), - (4, 0): ("L", "L;4"), - (8, 0): ("L", "L"), - (16, 0): ("I", "I;16B"), - # Truecolour - (8, 2): ("RGB", "RGB"), - (16, 2): ("RGB", "RGB;16B"), - # Indexed-colour - (1, 3): ("P", "P;1"), - (2, 3): ("P", "P;2"), - (4, 3): ("P", "P;4"), - (8, 3): ("P", "P"), - # Greyscale with alpha - (8, 4): ("LA", "LA"), - (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available - # Truecolour with alpha - (8, 6): ("RGBA", "RGBA"), - (16, 6): ("RGBA", "RGBA;16B"), -} - - -_simple_palette = re.compile(b"^\xff*\x00\xff*$") - -MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK -""" -Maximum decompressed size for a iTXt or zTXt chunk. -Eliminates decompression bombs where compressed chunks can expand 1000x. -See :ref:`Text in PNG File Format`. -""" -MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK -""" -Set the maximum total text chunk size. -See :ref:`Text in PNG File Format`. -""" - - -# APNG frame disposal modes -class Disposal(IntEnum): - OP_NONE = 0 - """ - No disposal is done on this frame before rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_BACKGROUND = 1 - """ - This frame’s modified region is cleared to fully transparent black before rendering - the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_PREVIOUS = 2 - """ - This frame’s modified region is reverted to the previous frame’s contents before - rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - - -# APNG frame blend modes -class Blend(IntEnum): - OP_SOURCE = 0 - """ - All color components of this frame, including alpha, overwrite the previous output - image contents. - See :ref:`Saving APNG sequences`. - """ - OP_OVER = 1 - """ - This frame should be alpha composited with the previous output image contents. - See :ref:`Saving APNG sequences`. - """ - - -def __getattr__(name): - for enum, prefix in {Disposal: "APNG_DISPOSE_", Blend: "APNG_BLEND_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -def _safe_zlib_decompress(s): - dobj = zlib.decompressobj() - plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) - if dobj.unconsumed_tail: - raise ValueError("Decompressed Data Too Large") - return plaintext - - -def _crc32(data, seed=0): - return zlib.crc32(data, seed) & 0xFFFFFFFF - - -# -------------------------------------------------------------------- -# Support classes. Suitable for PNG and related formats like MNG etc. - - -class ChunkStream: - def __init__(self, fp): - - self.fp = fp - self.queue = [] - - def read(self): - """Fetch a new chunk. Returns header information.""" - cid = None - - if self.queue: - cid, pos, length = self.queue.pop() - self.fp.seek(pos) - else: - s = self.fp.read(8) - cid = s[4:] - pos = self.fp.tell() - length = i32(s) - - if not is_cid(cid): - if not ImageFile.LOAD_TRUNCATED_IMAGES: - raise SyntaxError(f"broken PNG file (chunk {repr(cid)})") - - return cid, pos, length - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - self.queue = self.crc = self.fp = None - - def push(self, cid, pos, length): - - self.queue.append((cid, pos, length)) - - def call(self, cid, pos, length): - """Call the appropriate chunk handler""" - - logger.debug("STREAM %r %s %s", cid, pos, length) - return getattr(self, "chunk_" + cid.decode("ascii"))(pos, length) - - def crc(self, cid, data): - """Read and verify checksum""" - - # Skip CRC checks for ancillary chunks if allowed to load truncated - # images - # 5th byte of first char is 1 [specs, section 5.4] - if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): - self.crc_skip(cid, data) - return - - try: - crc1 = _crc32(data, _crc32(cid)) - crc2 = i32(self.fp.read(4)) - if crc1 != crc2: - raise SyntaxError( - f"broken PNG file (bad header checksum in {repr(cid)})" - ) - except struct.error as e: - raise SyntaxError( - f"broken PNG file (incomplete checksum in {repr(cid)})" - ) from e - - def crc_skip(self, cid, data): - """Read checksum. Used if the C module is not present""" - - self.fp.read(4) - - def verify(self, endchunk=b"IEND"): - - # Simple approach; just calculate checksum for all remaining - # blocks. Must be called directly after open. - - cids = [] - - while True: - try: - cid, pos, length = self.read() - except struct.error as e: - raise OSError("truncated PNG file") from e - - if cid == endchunk: - break - self.crc(cid, ImageFile._safe_read(self.fp, length)) - cids.append(cid) - - return cids - - -class iTXt(str): - """ - Subclass of string to allow iTXt chunks to look like strings while - keeping their extra information - - """ - - @staticmethod - def __new__(cls, text, lang=None, tkey=None): - """ - :param cls: the class to use when creating the instance - :param text: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - """ - - self = str.__new__(cls, text) - self.lang = lang - self.tkey = tkey - return self - - -class PngInfo: - """ - PNG chunk container (for use with save(pnginfo=)) - - """ - - def __init__(self): - self.chunks = [] - - def add(self, cid, data, after_idat=False): - """Appends an arbitrary chunk. Use with caution. - - :param cid: a byte string, 4 bytes long. - :param data: a byte string of the encoded data - :param after_idat: for use with private chunks. Whether the chunk - should be written after IDAT - - """ - - chunk = [cid, data] - if after_idat: - chunk.append(True) - self.chunks.append(tuple(chunk)) - - def add_itxt(self, key, value, lang="", tkey="", zip=False): - """Appends an iTXt chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - :param zip: compression flag - - """ - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - if not isinstance(value, bytes): - value = value.encode("utf-8", "strict") - if not isinstance(lang, bytes): - lang = lang.encode("utf-8", "strict") - if not isinstance(tkey, bytes): - tkey = tkey.encode("utf-8", "strict") - - if zip: - self.add( - b"iTXt", - key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), - ) - else: - self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) - - def add_text(self, key, value, zip=False): - """Appends a text chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key, text or an - :py:class:`PIL.PngImagePlugin.iTXt` instance - :param zip: compression flag - - """ - if isinstance(value, iTXt): - return self.add_itxt(key, value, value.lang, value.tkey, zip=zip) - - # The tEXt chunk stores latin-1 text - if not isinstance(value, bytes): - try: - value = value.encode("latin-1", "strict") - except UnicodeError: - return self.add_itxt(key, value, zip=zip) - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - - if zip: - self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) - else: - self.add(b"tEXt", key + b"\0" + value) - - -# -------------------------------------------------------------------- -# PNG image stream (IHDR/IEND) - - -class PngStream(ChunkStream): - def __init__(self, fp): - super().__init__(fp) - - # local copies of Image attributes - self.im_info = {} - self.im_text = {} - self.im_size = (0, 0) - self.im_mode = None - self.im_tile = None - self.im_palette = None - self.im_custom_mimetype = None - self.im_n_frames = None - self._seq_num = None - self.rewind_state = None - - self.text_memory = 0 - - def check_text_memory(self, chunklen): - self.text_memory += chunklen - if self.text_memory > MAX_TEXT_MEMORY: - raise ValueError( - "Too much memory used in text chunks: " - f"{self.text_memory}>MAX_TEXT_MEMORY" - ) - - def save_rewind(self): - self.rewind_state = { - "info": self.im_info.copy(), - "tile": self.im_tile, - "seq_num": self._seq_num, - } - - def rewind(self): - self.im_info = self.rewind_state["info"] - self.im_tile = self.rewind_state["tile"] - self._seq_num = self.rewind_state["seq_num"] - - def chunk_iCCP(self, pos, length): - - # ICC profile - s = ImageFile._safe_read(self.fp, length) - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - i = s.find(b"\0") - logger.debug("iCCP profile name %r", s[:i]) - logger.debug("Compression method %s", s[i]) - comp_method = s[i] - if comp_method != 0: - raise SyntaxError(f"Unknown compression method {comp_method} in iCCP chunk") - try: - icc_profile = _safe_zlib_decompress(s[i + 2 :]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - icc_profile = None - else: - raise - except zlib.error: - icc_profile = None # FIXME - self.im_info["icc_profile"] = icc_profile - return s - - def chunk_IHDR(self, pos, length): - - # image header - s = ImageFile._safe_read(self.fp, length) - if length < 13: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - raise ValueError("Truncated IHDR chunk") - self.im_size = i32(s, 0), i32(s, 4) - try: - self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] - except Exception: - pass - if s[12]: - self.im_info["interlace"] = 1 - if s[11]: - raise SyntaxError("unknown filter category") - return s - - def chunk_IDAT(self, pos, length): - - # image data - if "bbox" in self.im_info: - tile = [("zip", self.im_info["bbox"], pos, self.im_rawmode)] - else: - if self.im_n_frames is not None: - self.im_info["default_image"] = True - tile = [("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] - self.im_tile = tile - self.im_idat = length - raise EOFError - - def chunk_IEND(self, pos, length): - - # end of PNG image - raise EOFError - - def chunk_PLTE(self, pos, length): - - # palette - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - self.im_palette = "RGB", s - return s - - def chunk_tRNS(self, pos, length): - - # transparency - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - if _simple_palette.match(s): - # tRNS contains only one full-transparent entry, - # other entries are full opaque - i = s.find(b"\0") - if i >= 0: - self.im_info["transparency"] = i - else: - # otherwise, we have a byte string with one alpha value - # for each palette entry - self.im_info["transparency"] = s - elif self.im_mode in ("1", "L", "I"): - self.im_info["transparency"] = i16(s) - elif self.im_mode == "RGB": - self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) - return s - - def chunk_gAMA(self, pos, length): - # gamma setting - s = ImageFile._safe_read(self.fp, length) - self.im_info["gamma"] = i32(s) / 100000.0 - return s - - def chunk_cHRM(self, pos, length): - # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 - # WP x,y, Red x,y, Green x,y Blue x,y - - s = ImageFile._safe_read(self.fp, length) - raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) - self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) - return s - - def chunk_sRGB(self, pos, length): - # srgb rendering intent, 1 byte - # 0 perceptual - # 1 relative colorimetric - # 2 saturation - # 3 absolute colorimetric - - s = ImageFile._safe_read(self.fp, length) - self.im_info["srgb"] = s[0] - return s - - def chunk_pHYs(self, pos, length): - - # pixels per unit - s = ImageFile._safe_read(self.fp, length) - if length < 9: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - raise ValueError("Truncated pHYs chunk") - px, py = i32(s, 0), i32(s, 4) - unit = s[8] - if unit == 1: # meter - dpi = px * 0.0254, py * 0.0254 - self.im_info["dpi"] = dpi - elif unit == 0: - self.im_info["aspect"] = px, py - return s - - def chunk_tEXt(self, pos, length): - - # text - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - # fallback for broken tEXt tags - k = s - v = b"" - if k: - k = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k] = v if k == "exif" else v_str - self.im_text[k] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_zTXt(self, pos, length): - - # compressed text - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - k = s - v = b"" - if v: - comp_method = v[0] - else: - comp_method = 0 - if comp_method != 0: - raise SyntaxError(f"Unknown compression method {comp_method} in zTXt chunk") - try: - v = _safe_zlib_decompress(v[1:]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - v = b"" - else: - raise - except zlib.error: - v = b"" - - if k: - k = k.decode("latin-1", "strict") - v = v.decode("latin-1", "replace") - - self.im_info[k] = self.im_text[k] = v - self.check_text_memory(len(v)) - - return s - - def chunk_iTXt(self, pos, length): - - # international text - r = s = ImageFile._safe_read(self.fp, length) - try: - k, r = r.split(b"\0", 1) - except ValueError: - return s - if len(r) < 2: - return s - cf, cm, r = r[0], r[1], r[2:] - try: - lang, tk, v = r.split(b"\0", 2) - except ValueError: - return s - if cf != 0: - if cm == 0: - try: - v = _safe_zlib_decompress(v) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - else: - raise - except zlib.error: - return s - else: - return s - try: - k = k.decode("latin-1", "strict") - lang = lang.decode("utf-8", "strict") - tk = tk.decode("utf-8", "strict") - v = v.decode("utf-8", "strict") - except UnicodeError: - return s - - self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) - self.check_text_memory(len(v)) - - return s - - def chunk_eXIf(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - self.im_info["exif"] = b"Exif\x00\x00" + s - return s - - # APNG chunks - def chunk_acTL(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - if length < 8: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - raise ValueError("APNG contains truncated acTL chunk") - if self.im_n_frames is not None: - self.im_n_frames = None - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - n_frames = i32(s) - if n_frames == 0 or n_frames > 0x80000000: - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - self.im_n_frames = n_frames - self.im_info["loop"] = i32(s, 4) - self.im_custom_mimetype = "image/apng" - return s - - def chunk_fcTL(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - if length < 26: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - raise ValueError("APNG contains truncated fcTL chunk") - seq = i32(s) - if (self._seq_num is None and seq != 0) or ( - self._seq_num is not None and self._seq_num != seq - 1 - ): - raise SyntaxError("APNG contains frame sequence errors") - self._seq_num = seq - width, height = i32(s, 4), i32(s, 8) - px, py = i32(s, 12), i32(s, 16) - im_w, im_h = self.im_size - if px + width > im_w or py + height > im_h: - raise SyntaxError("APNG contains invalid frames") - self.im_info["bbox"] = (px, py, px + width, py + height) - delay_num, delay_den = i16(s, 20), i16(s, 22) - if delay_den == 0: - delay_den = 100 - self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 - self.im_info["disposal"] = s[24] - self.im_info["blend"] = s[25] - return s - - def chunk_fdAT(self, pos, length): - if length < 4: - if ImageFile.LOAD_TRUNCATED_IMAGES: - s = ImageFile._safe_read(self.fp, length) - return s - raise ValueError("APNG contains truncated fDAT chunk") - s = ImageFile._safe_read(self.fp, 4) - seq = i32(s) - if self._seq_num != seq - 1: - raise SyntaxError("APNG contains frame sequence errors") - self._seq_num = seq - return self.chunk_IDAT(pos + 4, length - 4) - - -# -------------------------------------------------------------------- -# PNG reader - - -def _accept(prefix): - return prefix[:8] == _MAGIC - - -## -# Image plugin for PNG images. - - -class PngImageFile(ImageFile.ImageFile): - - format = "PNG" - format_description = "Portable network graphics" - - def _open(self): - - if not _accept(self.fp.read(8)): - raise SyntaxError("not a PNG file") - self._fp = self.fp - self.__frame = 0 - - # - # Parse headers up to the first IDAT or fDAT chunk - - self.private_chunks = [] - self.png = PngStream(self.fp) - - while True: - - # - # get next chunk - - cid, pos, length = self.png.read() - - try: - s = self.png.call(cid, pos, length) - except EOFError: - break - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s)) - - self.png.crc(cid, s) - - # - # Copy relevant attributes from the PngStream. An alternative - # would be to let the PngStream class modify these attributes - # directly, but that introduces circular references which are - # difficult to break if things go wrong in the decoder... - # (believe me, I've tried ;-) - - self.mode = self.png.im_mode - self._size = self.png.im_size - self.info = self.png.im_info - self._text = None - self.tile = self.png.im_tile - self.custom_mimetype = self.png.im_custom_mimetype - self.n_frames = self.png.im_n_frames or 1 - self.default_image = self.info.get("default_image", False) - - if self.png.im_palette: - rawmode, data = self.png.im_palette - self.palette = ImagePalette.raw(rawmode, data) - - if cid == b"fdAT": - self.__prepare_idat = length - 4 - else: - self.__prepare_idat = length # used by load_prepare() - - if self.png.im_n_frames is not None: - self._close_exclusive_fp_after_loading = False - self.png.save_rewind() - self.__rewind_idat = self.__prepare_idat - self.__rewind = self._fp.tell() - if self.default_image: - # IDAT chunk contains default image and not first animation frame - self.n_frames += 1 - self._seek(0) - self.is_animated = self.n_frames > 1 - - @property - def text(self): - # experimental - if self._text is None: - # iTxt, tEXt and zTXt chunks may appear at the end of the file - # So load the file to ensure that they are read - if self.is_animated: - frame = self.__frame - # for APNG, seek to the final frame before loading - self.seek(self.n_frames - 1) - self.load() - if self.is_animated: - self.seek(frame) - return self._text - - def verify(self): - """Verify PNG file""" - - if self.fp is None: - raise RuntimeError("verify must be called directly after open") - - # back up to beginning of IDAT block - self.fp.seek(self.tile[0][2] - 8) - - self.png.verify() - self.png.close() - - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0, True) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - raise EOFError("no more images in APNG file") from e - - def _seek(self, frame, rewind=False): - if frame == 0: - if rewind: - self._fp.seek(self.__rewind) - self.png.rewind() - self.__prepare_idat = self.__rewind_idat - self.im = None - if self.pyaccess: - self.pyaccess = None - self.info = self.png.im_info - self.tile = self.png.im_tile - self.fp = self._fp - self._prev_im = None - self.dispose = None - self.default_image = self.info.get("default_image", False) - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - self.__frame = 0 - else: - if frame != self.__frame + 1: - raise ValueError(f"cannot seek to frame {frame}") - - # ensure previous frame was loaded - self.load() - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - self._prev_im = self.im.copy() - - self.fp = self._fp - - # advance to the next frame - if self.__prepare_idat: - ImageFile._safe_read(self.fp, self.__prepare_idat) - self.__prepare_idat = 0 - frame_start = False - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - raise EOFError("No more images in APNG file") - if cid == b"fcTL": - if frame_start: - # there must be at least one fdAT chunk between fcTL chunks - raise SyntaxError("APNG missing frame data") - frame_start = True - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - if frame_start: - self.__prepare_idat = length - break - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - ImageFile._safe_read(self.fp, length) - - self.__frame = frame - self.tile = self.png.im_tile - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - - if not self.tile: - raise EOFError - - # setup frame disposal (actual disposal done when needed in the next _seek()) - if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose_op = Disposal.OP_BACKGROUND - - if self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose = self._prev_im.copy() - self.dispose = self._crop(self.dispose, self.dispose_extent) - elif self.dispose_op == Disposal.OP_BACKGROUND: - self.dispose = Image.core.fill(self.mode, self.size) - self.dispose = self._crop(self.dispose, self.dispose_extent) - else: - self.dispose = None - - def tell(self): - return self.__frame - - def load_prepare(self): - """internal: prepare to read PNG file""" - - if self.info.get("interlace"): - self.decoderconfig = self.decoderconfig + (1,) - - self.__idat = self.__prepare_idat # used by load_read() - ImageFile.ImageFile.load_prepare(self) - - def load_read(self, read_bytes): - """internal: read more image data""" - - while self.__idat == 0: - # end of chunk, skip forward to next one - - self.fp.read(4) # CRC - - cid, pos, length = self.png.read() - - if cid not in [b"IDAT", b"DDAT", b"fdAT"]: - self.png.push(cid, pos, length) - return b"" - - if cid == b"fdAT": - try: - self.png.call(cid, pos, length) - except EOFError: - pass - self.__idat = length - 4 # sequence_num has already been read - else: - self.__idat = length # empty chunks are allowed - - # read more data from this chunk - if read_bytes <= 0: - read_bytes = self.__idat - else: - read_bytes = min(read_bytes, self.__idat) - - self.__idat = self.__idat - read_bytes - - return self.fp.read(read_bytes) - - def load_end(self): - """internal: finished reading image data""" - if self.__idat != 0: - self.fp.read(self.__idat) - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - break - elif cid == b"fcTL" and self.is_animated: - # start of the next frame, stop reading - self.__prepare_idat = 0 - self.png.push(cid, pos, length) - break - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s, True)) - self._text = self.png.im_text - if not self.is_animated: - self.png.close() - self.png = None - else: - if self._prev_im and self.blend_op == Blend.OP_OVER: - updated = self._crop(self.im, self.dispose_extent) - self._prev_im.paste( - updated, self.dispose_extent, updated.convert("RGBA") - ) - self.im = self._prev_im - if self.pyaccess: - self.pyaccess = None - - def _getexif(self): - if "exif" not in self.info: - self.load() - if "exif" not in self.info and "Raw profile type exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def getexif(self): - if "exif" not in self.info: - self.load() - - return super().getexif() - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - return ( - self._getxmp(self.info["XML:com.adobe.xmp"]) - if "XML:com.adobe.xmp" in self.info - else {} - ) - - -# -------------------------------------------------------------------- -# PNG writer - -_OUTMODES = { - # supported PIL modes, and corresponding rawmodes/bits/color combinations - "1": ("1", b"\x01\x00"), - "L;1": ("L;1", b"\x01\x00"), - "L;2": ("L;2", b"\x02\x00"), - "L;4": ("L;4", b"\x04\x00"), - "L": ("L", b"\x08\x00"), - "LA": ("LA", b"\x08\x04"), - "I": ("I;16B", b"\x10\x00"), - "I;16": ("I;16B", b"\x10\x00"), - "P;1": ("P;1", b"\x01\x03"), - "P;2": ("P;2", b"\x02\x03"), - "P;4": ("P;4", b"\x04\x03"), - "P": ("P", b"\x08\x03"), - "RGB": ("RGB", b"\x08\x02"), - "RGBA": ("RGBA", b"\x08\x06"), -} - - -def putchunk(fp, cid, *data): - """Write a PNG chunk (including CRC field)""" - - data = b"".join(data) - - fp.write(o32(len(data)) + cid) - fp.write(data) - crc = _crc32(data, _crc32(cid)) - fp.write(o32(crc)) - - -class _idat: - # wrap output from the encoder in IDAT chunks - - def __init__(self, fp, chunk): - self.fp = fp - self.chunk = chunk - - def write(self, data): - self.chunk(self.fp, b"IDAT", data) - - -class _fdat: - # wrap encoder output in fdAT chunks - - def __init__(self, fp, chunk, seq_num): - self.fp = fp - self.chunk = chunk - self.seq_num = seq_num - - def write(self, data): - self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) - self.seq_num += 1 - - -def _write_multiple_frames(im, fp, chunk, rawmode): - default_image = im.encoderinfo.get("default_image", im.info.get("default_image")) - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) - disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) - blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) - - if default_image: - chain = itertools.chain(im.encoderinfo.get("append_images", [])) - else: - chain = itertools.chain([im], im.encoderinfo.get("append_images", [])) - - im_frames = [] - frame_count = 0 - for im_seq in chain: - for im_frame in ImageSequence.Iterator(im_seq): - im_frame = im_frame.copy() - if im_frame.mode != im.mode: - if im.mode == "P": - im_frame = im_frame.convert(im.mode, palette=im.palette) - else: - im_frame = im_frame.convert(im.mode) - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - if isinstance(blend, (list, tuple)): - encoderinfo["blend"] = blend[frame_count] - frame_count += 1 - - if im_frames: - previous = im_frames[-1] - prev_disposal = previous["encoderinfo"].get("disposal") - prev_blend = previous["encoderinfo"].get("blend") - if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: - prev_disposal = Disposal.OP_BACKGROUND - - if prev_disposal == Disposal.OP_BACKGROUND: - base_im = previous["im"] - dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) - bbox = previous["bbox"] - if bbox: - dispose = dispose.crop(bbox) - else: - bbox = (0, 0) + im.size - base_im.paste(dispose, bbox) - elif prev_disposal == Disposal.OP_PREVIOUS: - base_im = im_frames[-2]["im"] - else: - base_im = previous["im"] - delta = ImageChops.subtract_modulo( - im_frame.convert("RGB"), base_im.convert("RGB") - ) - bbox = delta.getbbox() - if ( - not bbox - and prev_disposal == encoderinfo.get("disposal") - and prev_blend == encoderinfo.get("blend") - ): - if isinstance(duration, (list, tuple)): - previous["encoderinfo"]["duration"] += encoderinfo["duration"] - continue - else: - bbox = None - im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) - - # animation control - chunk( - fp, - b"acTL", - o32(len(im_frames)), # 0: num_frames - o32(loop), # 4: num_plays - ) - - # default image IDAT (if it exists) - if default_image: - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - seq_num = 0 - for frame, frame_data in enumerate(im_frames): - im_frame = frame_data["im"] - if not frame_data["bbox"]: - bbox = (0, 0) + im_frame.size - else: - bbox = frame_data["bbox"] - im_frame = im_frame.crop(bbox) - size = im_frame.size - encoderinfo = frame_data["encoderinfo"] - frame_duration = int(round(encoderinfo.get("duration", duration))) - frame_disposal = encoderinfo.get("disposal", disposal) - frame_blend = encoderinfo.get("blend", blend) - # frame control - chunk( - fp, - b"fcTL", - o32(seq_num), # sequence_number - o32(size[0]), # width - o32(size[1]), # height - o32(bbox[0]), # x_offset - o32(bbox[1]), # y_offset - o16(frame_duration), # delay_numerator - o16(1000), # delay_denominator - o8(frame_disposal), # dispose_op - o8(frame_blend), # blend_op - ) - seq_num += 1 - # frame data - if frame == 0 and not default_image: - # first frame must be in IDAT chunks for backwards compatibility - ImageFile._save( - im_frame, - _idat(fp, chunk), - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - else: - fdat_chunks = _fdat(fp, chunk, seq_num) - ImageFile._save( - im_frame, - fdat_chunks, - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - seq_num = fdat_chunks.seq_num - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -def _save(im, fp, filename, chunk=putchunk, save_all=False): - # save an image to disk (called by the save method) - - mode = im.mode - - if mode == "P": - - # - # attempt to minimize storage requirements for palette images - if "bits" in im.encoderinfo: - # number of bits specified by user - colors = min(1 << im.encoderinfo["bits"], 256) - else: - # check palette contents - if im.palette: - colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) - else: - colors = 256 - - if colors <= 16: - if colors <= 2: - bits = 1 - elif colors <= 4: - bits = 2 - else: - bits = 4 - mode = f"{mode};{bits}" - - # encoder options - im.encoderconfig = ( - im.encoderinfo.get("optimize", False), - im.encoderinfo.get("compress_level", -1), - im.encoderinfo.get("compress_type", -1), - im.encoderinfo.get("dictionary", b""), - ) - - # get the corresponding PNG mode - try: - rawmode, mode = _OUTMODES[mode] - except KeyError as e: - raise OSError(f"cannot write mode {mode} as PNG") from e - - # - # write minimal PNG file - - fp.write(_MAGIC) - - chunk( - fp, - b"IHDR", - o32(im.size[0]), # 0: size - o32(im.size[1]), - mode, # 8: depth/type - b"\0", # 10: compression - b"\0", # 11: filter category - b"\0", # 12: interlace flag - ) - - chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] - - icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - # ICC profile - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - name = b"ICC Profile" - data = name + b"\0\0" + zlib.compress(icc) - chunk(fp, b"iCCP", data) - - # You must either have sRGB or iCCP. - # Disallow sRGB chunks when an iCCP-chunk has been emitted. - chunks.remove(b"sRGB") - - info = im.encoderinfo.get("pnginfo") - if info: - chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - elif cid in chunks_multiple_allowed: - chunk(fp, cid, data) - elif cid[1:2].islower(): - # Private chunk - after_idat = info_chunk[2:3] - if not after_idat: - chunk(fp, cid, data) - - if im.mode == "P": - palette_byte_number = colors * 3 - palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] - while len(palette_bytes) < palette_byte_number: - palette_bytes += b"\0" - chunk(fp, b"PLTE", palette_bytes) - - transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) - - if transparency or transparency == 0: - if im.mode == "P": - # limit to actual palette size - alpha_bytes = colors - if isinstance(transparency, bytes): - chunk(fp, b"tRNS", transparency[:alpha_bytes]) - else: - transparency = max(0, min(255, transparency)) - alpha = b"\xFF" * transparency + b"\0" - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - elif im.mode in ("1", "L", "I"): - transparency = max(0, min(65535, transparency)) - chunk(fp, b"tRNS", o16(transparency)) - elif im.mode == "RGB": - red, green, blue = transparency - chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) - else: - if "transparency" in im.encoderinfo: - # don't bother with transparency if it's an RGBA - # and it's in the info dict. It's probably just stale. - raise OSError("cannot use transparency for this mode") - else: - if im.mode == "P" and im.im.getpalettemode() == "RGBA": - alpha = im.im.getpalette("RGBA", "A") - alpha_bytes = colors - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - - dpi = im.encoderinfo.get("dpi") - if dpi: - chunk( - fp, - b"pHYs", - o32(int(dpi[0] / 0.0254 + 0.5)), - o32(int(dpi[1] / 0.0254 + 0.5)), - b"\x01", - ) - - if info: - chunks = [b"bKGD", b"hIST"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - - exif = im.encoderinfo.get("exif", im.info.get("exif")) - if exif: - if isinstance(exif, Image.Exif): - exif = exif.tobytes(8) - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - chunk(fp, b"eXIf", exif) - - if save_all: - _write_multiple_frames(im, fp, chunk, rawmode) - else: - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - if info: - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid[1:2].islower(): - # Private chunk - after_idat = info_chunk[2:3] - if after_idat: - chunk(fp, cid, data) - - chunk(fp, b"IEND", b"") - - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- -# PNG chunk converter - - -def getchunks(im, **params): - """Return a list of PNG chunks representing this image.""" - - class collector: - data = [] - - def write(self, data): - pass - - def append(self, chunk): - self.data.append(chunk) - - def append(fp, cid, *data): - data = b"".join(data) - crc = o32(_crc32(data, _crc32(cid))) - fp.append((cid, data, crc)) - - fp = collector() - - try: - im.encoderinfo = params - _save(im, fp, None, append) - finally: - del im.encoderinfo - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(PngImageFile.format, PngImageFile, _accept) -Image.register_save(PngImageFile.format, _save) -Image.register_save_all(PngImageFile.format, _save_all) - -Image.register_extensions(PngImageFile.format, [".png", ".apng"]) - -Image.register_mime(PngImageFile.format, "image/png") diff --git a/waypoint_manager/manager_GUI/PIL/PpmImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PpmImagePlugin.py deleted file mode 100644 index 392771d..0000000 --- a/waypoint_manager/manager_GUI/PIL/PpmImagePlugin.py +++ /dev/null @@ -1,342 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PPM support for PIL -# -# History: -# 96-03-24 fl Created -# 98-03-06 fl Write RGBA images (as RGB, that is) -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" - -MODES = { - # standard - b"P1": "1", - b"P2": "L", - b"P3": "RGB", - b"P4": "1", - b"P5": "L", - b"P6": "RGB", - # extensions - b"P0CMYK": "CMYK", - # PIL extensions (for test purposes only) - b"PyP": "P", - b"PyRGBA": "RGBA", - b"PyCMYK": "CMYK", -} - - -def _accept(prefix): - return prefix[0:1] == b"P" and prefix[1] in b"0123456y" - - -## -# Image plugin for PBM, PGM, and PPM images. - - -class PpmImageFile(ImageFile.ImageFile): - - format = "PPM" - format_description = "Pbmplus image" - - def _read_magic(self): - magic = b"" - # read until whitespace or longest available magic number - for _ in range(6): - c = self.fp.read(1) - if not c or c in b_whitespace: - break - magic += c - return magic - - def _read_token(self): - token = b"" - while len(token) <= 10: # read until next whitespace or limit of 10 characters - c = self.fp.read(1) - if not c: - break - elif c in b_whitespace: # token ended - if not token: - # skip whitespace at start - continue - break - elif c == b"#": - # ignores rest of the line; stops at CR, LF or EOF - while self.fp.read(1) not in b"\r\n": - pass - continue - token += c - if not token: - # Token was not even 1 byte - raise ValueError("Reached EOF while reading header") - elif len(token) > 10: - raise ValueError(f"Token too long in file header: {token.decode()}") - return token - - def _open(self): - magic_number = self._read_magic() - try: - mode = MODES[magic_number] - except KeyError: - raise SyntaxError("not a PPM file") - - if magic_number in (b"P1", b"P4"): - self.custom_mimetype = "image/x-portable-bitmap" - elif magic_number in (b"P2", b"P5"): - self.custom_mimetype = "image/x-portable-graymap" - elif magic_number in (b"P3", b"P6"): - self.custom_mimetype = "image/x-portable-pixmap" - - maxval = None - decoder_name = "raw" - if magic_number in (b"P1", b"P2", b"P3"): - decoder_name = "ppm_plain" - for ix in range(3): - token = int(self._read_token()) - if ix == 0: # token is the x size - xsize = token - elif ix == 1: # token is the y size - ysize = token - if mode == "1": - self.mode = "1" - rawmode = "1;I" - break - else: - self.mode = rawmode = mode - elif ix == 2: # token is maxval - maxval = token - if not 0 < maxval < 65536: - raise ValueError( - "maxval must be greater than 0 and less than 65536" - ) - if maxval > 255 and mode == "L": - self.mode = "I" - - if decoder_name != "ppm_plain": - # If maxval matches a bit depth, use the raw decoder directly - if maxval == 65535 and mode == "L": - rawmode = "I;16B" - elif maxval != 255: - decoder_name = "ppm" - - args = (rawmode, 0, 1) if decoder_name == "raw" else (rawmode, maxval) - self._size = xsize, ysize - self.tile = [(decoder_name, (0, 0, xsize, ysize), self.fp.tell(), args)] - - -# -# -------------------------------------------------------------------- - - -class PpmPlainDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def _read_block(self): - return self.fd.read(ImageFile.SAFEBLOCK) - - def _find_comment_end(self, block, start=0): - a = block.find(b"\n", start) - b = block.find(b"\r", start) - return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) - - def _ignore_comments(self, block): - if self._comment_spans: - # Finish current comment - while block: - comment_end = self._find_comment_end(block) - if comment_end != -1: - # Comment ends in this block - # Delete tail of comment - block = block[comment_end + 1 :] - break - else: - # Comment spans whole block - # So read the next block, looking for the end - block = self._read_block() - - # Search for any further comments - self._comment_spans = False - while True: - comment_start = block.find(b"#") - if comment_start == -1: - # No comment found - break - comment_end = self._find_comment_end(block, comment_start) - if comment_end != -1: - # Comment ends in this block - # Delete comment - block = block[:comment_start] + block[comment_end + 1 :] - else: - # Comment continues to next block(s) - block = block[:comment_start] - self._comment_spans = True - break - return block - - def _decode_bitonal(self): - """ - This is a separate method because in the plain PBM format, all data tokens are - exactly one byte, so the inter-token whitespace is optional. - """ - data = bytearray() - total_bytes = self.state.xsize * self.state.ysize - - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - # eof - break - - block = self._ignore_comments(block) - - tokens = b"".join(block.split()) - for token in tokens: - if token not in (48, 49): - raise ValueError(f"Invalid token for this mode: {bytes([token])}") - data = (data + tokens)[:total_bytes] - invert = bytes.maketrans(b"01", b"\xFF\x00") - return data.translate(invert) - - def _decode_blocks(self, maxval): - data = bytearray() - max_len = 10 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count - - half_token = False - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - if half_token: - block = bytearray(b" ") # flush half_token - else: - # eof - break - - block = self._ignore_comments(block) - - if half_token: - block = half_token + block # stitch half_token to new block - - tokens = block.split() - - if block and not block[-1:].isspace(): # block might split token - half_token = tokens.pop() # save half token for later - if len(half_token) > max_len: # prevent buildup of half_token - raise ValueError( - f"Token too long found in data: {half_token[:max_len + 1]}" - ) - - for token in tokens: - if len(token) > max_len: - raise ValueError( - f"Token too long found in data: {token[:max_len + 1]}" - ) - value = int(token) - if value > maxval: - raise ValueError(f"Channel value too large for this mode: {value}") - value = round(value / maxval * out_max) - data += o32(value) if self.mode == "I" else o8(value) - if len(data) == total_bytes: # finished! - break - return data - - def decode(self, buffer): - self._comment_spans = False - if self.mode == "1": - data = self._decode_bitonal() - rawmode = "1;8" - else: - maxval = self.args[-1] - data = self._decode_blocks(maxval) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -class PpmDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - data = bytearray() - maxval = self.args[-1] - in_byte_count = 1 if maxval < 256 else 2 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - while len(data) < self.state.xsize * self.state.ysize * bands * out_byte_count: - pixels = self.fd.read(in_byte_count * bands) - if len(pixels) < in_byte_count * bands: - # eof - break - for b in range(bands): - value = ( - pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) - ) - value = min(out_max, round(value / maxval * out_max)) - data += o32(value) if self.mode == "I" else o8(value) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -# -# -------------------------------------------------------------------- - - -def _save(im, fp, filename): - if im.mode == "1": - rawmode, head = "1;I", b"P4" - elif im.mode == "L": - rawmode, head = "L", b"P5" - elif im.mode == "I": - rawmode, head = "I;16B", b"P5" - elif im.mode in ("RGB", "RGBA"): - rawmode, head = "RGB", b"P6" - else: - raise OSError(f"cannot write mode {im.mode} as PPM") - fp.write(head + b"\n%d %d\n" % im.size) - if head == b"P6": - fp.write(b"255\n") - elif head == b"P5": - if rawmode == "L": - fp.write(b"255\n") - else: - fp.write(b"65535\n") - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) - - # ALTERNATIVE: save via builtin debug function - # im._dump(filename) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(PpmImageFile.format, PpmImageFile, _accept) -Image.register_save(PpmImageFile.format, _save) - -Image.register_decoder("ppm", PpmDecoder) -Image.register_decoder("ppm_plain", PpmPlainDecoder) - -Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm"]) - -Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/waypoint_manager/manager_GUI/PIL/PsdImagePlugin.py b/waypoint_manager/manager_GUI/PIL/PsdImagePlugin.py deleted file mode 100644 index 04c2e4f..0000000 --- a/waypoint_manager/manager_GUI/PIL/PsdImagePlugin.py +++ /dev/null @@ -1,302 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Adobe PSD 2.5/3.0 file handling -# -# History: -# 1995-09-01 fl Created -# 1997-01-03 fl Read most PSD images -# 1997-01-18 fl Fixed P and CMYK support -# 2001-10-21 fl Added seek/tell support (for layers) -# -# Copyright (c) 1997-2001 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import io - -from . import Image, ImageFile, ImagePalette -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import si16be as si16 - -MODES = { - # (photoshop mode, bits) -> (pil mode, required channels) - (0, 1): ("1", 1), - (0, 8): ("L", 1), - (1, 8): ("L", 1), - (2, 8): ("P", 1), - (3, 8): ("RGB", 3), - (4, 8): ("CMYK", 4), - (7, 8): ("L", 1), # FIXME: multilayer - (8, 8): ("L", 1), # duotone - (9, 8): ("LAB", 3), -} - - -# --------------------------------------------------------------------. -# read PSD images - - -def _accept(prefix): - return prefix[:4] == b"8BPS" - - -## -# Image plugin for Photoshop images. - - -class PsdImageFile(ImageFile.ImageFile): - - format = "PSD" - format_description = "Adobe Photoshop" - _close_exclusive_fp_after_loading = False - - def _open(self): - - read = self.fp.read - - # - # header - - s = read(26) - if not _accept(s) or i16(s, 4) != 1: - raise SyntaxError("not a PSD file") - - psd_bits = i16(s, 22) - psd_channels = i16(s, 12) - psd_mode = i16(s, 24) - - mode, channels = MODES[(psd_mode, psd_bits)] - - if channels > psd_channels: - raise OSError("not enough channels") - - self.mode = mode - self._size = i32(s, 18), i32(s, 14) - - # - # color mode data - - size = i32(read(4)) - if size: - data = read(size) - if mode == "P" and size == 768: - self.palette = ImagePalette.raw("RGB;L", data) - - # - # image resources - - self.resources = [] - - size = i32(read(4)) - if size: - # load resources - end = self.fp.tell() + size - while self.fp.tell() < end: - read(4) # signature - id = i16(read(2)) - name = read(i8(read(1))) - if not (len(name) & 1): - read(1) # padding - data = read(i32(read(4))) - if len(data) & 1: - read(1) # padding - self.resources.append((id, name, data)) - if id == 1039: # ICC profile - self.info["icc_profile"] = data - - # - # layer and mask information - - self.layers = [] - - size = i32(read(4)) - if size: - end = self.fp.tell() + size - size = i32(read(4)) - if size: - _layer_data = io.BytesIO(ImageFile._safe_read(self.fp, size)) - self.layers = _layerinfo(_layer_data, size) - self.fp.seek(end) - self.n_frames = len(self.layers) - self.is_animated = self.n_frames > 1 - - # - # image descriptor - - self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) - - # keep the file open - self._fp = self.fp - self.frame = 1 - self._min_frame = 1 - - def seek(self, layer): - if not self._seek_check(layer): - return - - # seek to given layer (1..max) - try: - name, mode, bbox, tile = self.layers[layer - 1] - self.mode = mode - self.tile = tile - self.frame = layer - self.fp = self._fp - return name, bbox - except IndexError as e: - raise EOFError("no such layer") from e - - def tell(self): - # return layer number (0=image, 1..max=layers) - return self.frame - - -def _layerinfo(fp, ct_bytes): - # read layerinfo block - layers = [] - - def read(size): - return ImageFile._safe_read(fp, size) - - ct = si16(read(2)) - - # sanity check - if ct_bytes < (abs(ct) * 20): - raise SyntaxError("Layer block too short for number of layers requested") - - for _ in range(abs(ct)): - - # bounding box - y0 = i32(read(4)) - x0 = i32(read(4)) - y1 = i32(read(4)) - x1 = i32(read(4)) - - # image info - mode = [] - ct_types = i16(read(2)) - types = list(range(ct_types)) - if len(types) > 4: - continue - - for _ in types: - type = i16(read(2)) - - if type == 65535: - m = "A" - else: - m = "RGBA"[type] - - mode.append(m) - read(4) # size - - # figure out the image mode - mode.sort() - if mode == ["R"]: - mode = "L" - elif mode == ["B", "G", "R"]: - mode = "RGB" - elif mode == ["A", "B", "G", "R"]: - mode = "RGBA" - else: - mode = None # unknown - - # skip over blend flags and extra information - read(12) # filler - name = "" - size = i32(read(4)) # length of the extra data field - if size: - data_end = fp.tell() + size - - length = i32(read(4)) - if length: - fp.seek(length - 16, io.SEEK_CUR) - - length = i32(read(4)) - if length: - fp.seek(length, io.SEEK_CUR) - - length = i8(read(1)) - if length: - # Don't know the proper encoding, - # Latin-1 should be a good guess - name = read(length).decode("latin-1", "replace") - - fp.seek(data_end) - layers.append((name, mode, (x0, y0, x1, y1))) - - # get tiles - i = 0 - for name, mode, bbox in layers: - tile = [] - for m in mode: - t = _maketile(fp, m, bbox, 1) - if t: - tile.extend(t) - layers[i] = name, mode, bbox, tile - i += 1 - - return layers - - -def _maketile(file, mode, bbox, channels): - - tile = None - read = file.read - - compression = i16(read(2)) - - xsize = bbox[2] - bbox[0] - ysize = bbox[3] - bbox[1] - - offset = file.tell() - - if compression == 0: - # - # raw compression - tile = [] - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tile.append(("raw", bbox, offset, layer)) - offset = offset + xsize * ysize - - elif compression == 1: - # - # packbits compression - i = 0 - tile = [] - bytecount = read(channels * ysize * 2) - offset = file.tell() - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tile.append(("packbits", bbox, offset, layer)) - for y in range(ysize): - offset = offset + i16(bytecount, i) - i += 2 - - file.seek(offset) - - if offset & 1: - read(1) # padding - - return tile - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PsdImageFile.format, PsdImageFile, _accept) - -Image.register_extension(PsdImageFile.format, ".psd") - -Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/waypoint_manager/manager_GUI/PIL/PyAccess.py b/waypoint_manager/manager_GUI/PIL/PyAccess.py deleted file mode 100644 index 2a48c53..0000000 --- a/waypoint_manager/manager_GUI/PIL/PyAccess.py +++ /dev/null @@ -1,353 +0,0 @@ -# -# The Python Imaging Library -# Pillow fork -# -# Python implementation of the PixelAccess Object -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# Copyright (c) 2013 Eric Soroos -# -# See the README file for information on usage and redistribution -# - -# Notes: -# -# * Implements the pixel access object following Access. -# * Does not implement the line functions, as they don't appear to be used -# * Taking only the tuple form, which is used from python. -# * Fill.c uses the integer form, but it's still going to use the old -# Access.c implementation. -# - -import logging -import sys - -try: - from cffi import FFI - - defs = """ - struct Pixel_RGBA { - unsigned char r,g,b,a; - }; - struct Pixel_I16 { - unsigned char l,r; - }; - """ - ffi = FFI() - ffi.cdef(defs) -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - FFI = ffi = DeferredError(ex) - -logger = logging.getLogger(__name__) - - -class PyAccess: - def __init__(self, img, readonly=False): - vals = dict(img.im.unsafe_ptrs) - self.readonly = readonly - self.image8 = ffi.cast("unsigned char **", vals["image8"]) - self.image32 = ffi.cast("int **", vals["image32"]) - self.image = ffi.cast("unsigned char **", vals["image"]) - self.xsize, self.ysize = img.im.size - self._img = img - - # Keep pointer to im object to prevent dereferencing. - self._im = img.im - if self._im.mode == "P": - self._palette = img.palette - - # Debugging is polluting test traces, only useful here - # when hacking on PyAccess - # logger.debug("%s", vals) - self._post_init() - - def _post_init(self): - pass - - def __setitem__(self, xy, color): - """ - Modifies the pixel at x,y. The color is given as a single - numerical value for single band images, and a tuple for - multi-band images - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param color: The pixel value. - """ - if self.readonly: - raise ValueError("Attempt to putpixel a read only image") - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - - if ( - self._im.mode == "P" - and isinstance(color, (list, tuple)) - and len(color) in [3, 4] - ): - # RGB or RGBA value for a P image - color = self._palette.getcolor(color, self._img) - - return self.set_pixel(x, y, color) - - def __getitem__(self, xy): - """ - Returns the pixel at x,y. The pixel is returned as a single - value for single band images or a tuple for multiple band - images - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: a pixel value for single band images, a tuple of - pixel values for multiband images. - """ - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - return self.get_pixel(x, y) - - putpixel = __setitem__ - getpixel = __getitem__ - - def check_xy(self, xy): - (x, y) = xy - if not (0 <= x < self.xsize and 0 <= y < self.ysize): - raise ValueError("pixel location out of range") - return xy - - -class _PyAccess32_2(PyAccess): - """PA, LA, stored in first and last bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.r, pixel.a - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.a = min(color[1], 255) - - -class _PyAccess32_3(PyAccess): - """RGB and friends, stored in the first three bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.r, pixel.g, pixel.b - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.g = min(color[1], 255) - pixel.b = min(color[2], 255) - pixel.a = 255 - - -class _PyAccess32_4(PyAccess): - """RGBA etc, all 4 bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.r, pixel.g, pixel.b, pixel.a - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.g = min(color[1], 255) - pixel.b = min(color[2], 255) - pixel.a = min(color[3], 255) - - -class _PyAccess8(PyAccess): - """1, L, P, 8 bit images stored as uint8""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image8 - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # integer - self.pixels[y][x] = min(color, 255) - except TypeError: - # tuple - self.pixels[y][x] = min(color[0], 255) - - -class _PyAccessI16_N(PyAccess): - """I;16 access, native bitendian without conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("unsigned short **", self.image) - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # integer - self.pixels[y][x] = min(color, 65535) - except TypeError: - # tuple - self.pixels[y][x] = min(color[0], 65535) - - -class _PyAccessI16_L(PyAccess): - """I;16L access, with conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_I16 **", self.image) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.l + pixel.r * 256 - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - try: - color = min(color, 65535) - except TypeError: - color = min(color[0], 65535) - - pixel.l = color & 0xFF # noqa: E741 - pixel.r = color >> 8 - - -class _PyAccessI16_B(PyAccess): - """I;16B access, with conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_I16 **", self.image) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.l * 256 + pixel.r - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - try: - color = min(color, 65535) - except Exception: - color = min(color[0], 65535) - - pixel.l = color >> 8 # noqa: E741 - pixel.r = color & 0xFF - - -class _PyAccessI32_N(PyAccess): - """Signed Int32 access, native endian""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image32 - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - self.pixels[y][x] = color - - -class _PyAccessI32_Swap(PyAccess): - """I;32L/B access, with byteswapping conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image32 - - def reverse(self, i): - orig = ffi.new("int *", i) - chars = ffi.cast("unsigned char *", orig) - chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], chars[1], chars[0] - return ffi.cast("int *", chars)[0] - - def get_pixel(self, x, y): - return self.reverse(self.pixels[y][x]) - - def set_pixel(self, x, y, color): - self.pixels[y][x] = self.reverse(color) - - -class _PyAccessF(PyAccess): - """32 bit float access""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("float **", self.image32) - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # not a tuple - self.pixels[y][x] = color - except TypeError: - # tuple - self.pixels[y][x] = color[0] - - -mode_map = { - "1": _PyAccess8, - "L": _PyAccess8, - "P": _PyAccess8, - "LA": _PyAccess32_2, - "La": _PyAccess32_2, - "PA": _PyAccess32_2, - "RGB": _PyAccess32_3, - "LAB": _PyAccess32_3, - "HSV": _PyAccess32_3, - "YCbCr": _PyAccess32_3, - "RGBA": _PyAccess32_4, - "RGBa": _PyAccess32_4, - "RGBX": _PyAccess32_4, - "CMYK": _PyAccess32_4, - "F": _PyAccessF, - "I": _PyAccessI32_N, -} - -if sys.byteorder == "little": - mode_map["I;16"] = _PyAccessI16_N - mode_map["I;16L"] = _PyAccessI16_N - mode_map["I;16B"] = _PyAccessI16_B - - mode_map["I;32L"] = _PyAccessI32_N - mode_map["I;32B"] = _PyAccessI32_Swap -else: - mode_map["I;16"] = _PyAccessI16_L - mode_map["I;16L"] = _PyAccessI16_L - mode_map["I;16B"] = _PyAccessI16_N - - mode_map["I;32L"] = _PyAccessI32_Swap - mode_map["I;32B"] = _PyAccessI32_N - - -def new(img, readonly=False): - access_type = mode_map.get(img.mode, None) - if not access_type: - logger.debug("PyAccess Not Implemented: %s", img.mode) - return None - return access_type(img, readonly) diff --git a/waypoint_manager/manager_GUI/PIL/SgiImagePlugin.py b/waypoint_manager/manager_GUI/PIL/SgiImagePlugin.py deleted file mode 100644 index f0207bb..0000000 --- a/waypoint_manager/manager_GUI/PIL/SgiImagePlugin.py +++ /dev/null @@ -1,230 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# SGI image file handling -# -# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. -# -# -# -# History: -# 2017-22-07 mb Add RLE decompression -# 2016-16-10 mb Add save method without compression -# 1995-09-10 fl Created -# -# Copyright (c) 2016 by Mickael Bonfill. -# Copyright (c) 2008 by Karsten Hiddemann. -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1995 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -import os -import struct - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 - - -def _accept(prefix): - return len(prefix) >= 2 and i16(prefix) == 474 - - -MODES = { - (1, 1, 1): "L", - (1, 2, 1): "L", - (2, 1, 1): "L;16B", - (2, 2, 1): "L;16B", - (1, 3, 3): "RGB", - (2, 3, 3): "RGB;16B", - (1, 3, 4): "RGBA", - (2, 3, 4): "RGBA;16B", -} - - -## -# Image plugin for SGI images. -class SgiImageFile(ImageFile.ImageFile): - - format = "SGI" - format_description = "SGI Image File Format" - - def _open(self): - - # HEAD - headlen = 512 - s = self.fp.read(headlen) - - if not _accept(s): - raise ValueError("Not an SGI image file") - - # compression : verbatim or RLE - compression = s[2] - - # bpc : 1 or 2 bytes (8bits or 16bits) - bpc = s[3] - - # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) - dimension = i16(s, 4) - - # xsize : width - xsize = i16(s, 6) - - # ysize : height - ysize = i16(s, 8) - - # zsize : channels count - zsize = i16(s, 10) - - # layout - layout = bpc, dimension, zsize - - # determine mode from bits/zsize - rawmode = "" - try: - rawmode = MODES[layout] - except KeyError: - pass - - if rawmode == "": - raise ValueError("Unsupported SGI image mode") - - self._size = xsize, ysize - self.mode = rawmode.split(";")[0] - if self.mode == "RGB": - self.custom_mimetype = "image/rgb" - - # orientation -1 : scanlines begins at the bottom-left corner - orientation = -1 - - # decoder info - if compression == 0: - pagesize = xsize * ysize * bpc - if bpc == 2: - self.tile = [ - ("SGI16", (0, 0) + self.size, headlen, (self.mode, 0, orientation)) - ] - else: - self.tile = [] - offset = headlen - for layer in self.mode: - self.tile.append( - ("raw", (0, 0) + self.size, offset, (layer, 0, orientation)) - ) - offset += pagesize - elif compression == 1: - self.tile = [ - ("sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc)) - ] - - -def _save(im, fp, filename): - if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "L": - raise ValueError("Unsupported SGI image mode") - - # Get the keyword arguments - info = im.encoderinfo - - # Byte-per-pixel precision, 1 = 8bits per pixel - bpc = info.get("bpc", 1) - - if bpc not in (1, 2): - raise ValueError("Unsupported number of bytes per pixel") - - # Flip the image, since the origin of SGI file is the bottom-left corner - orientation = -1 - # Define the file as SGI File Format - magic_number = 474 - # Run-Length Encoding Compression - Unsupported at this time - rle = 0 - - # Number of dimensions (x,y,z) - dim = 3 - # X Dimension = width / Y Dimension = height - x, y = im.size - if im.mode == "L" and y == 1: - dim = 1 - elif im.mode == "L": - dim = 2 - # Z Dimension: Number of channels - z = len(im.mode) - - if dim == 1 or dim == 2: - z = 1 - - # assert we've got the right number of bands. - if len(im.getbands()) != z: - raise ValueError( - f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" - ) - - # Minimum Byte value - pinmin = 0 - # Maximum Byte value (255 = 8bits per pixel) - pinmax = 255 - # Image name (79 characters max, truncated below in write) - img_name = os.path.splitext(os.path.basename(filename))[0] - img_name = img_name.encode("ascii", "ignore") - # Standard representation of pixel in the file - colormap = 0 - fp.write(struct.pack(">h", magic_number)) - fp.write(o8(rle)) - fp.write(o8(bpc)) - fp.write(struct.pack(">H", dim)) - fp.write(struct.pack(">H", x)) - fp.write(struct.pack(">H", y)) - fp.write(struct.pack(">H", z)) - fp.write(struct.pack(">l", pinmin)) - fp.write(struct.pack(">l", pinmax)) - fp.write(struct.pack("4s", b"")) # dummy - fp.write(struct.pack("79s", img_name)) # truncates to 79 chars - fp.write(struct.pack("s", b"")) # force null byte after img_name - fp.write(struct.pack(">l", colormap)) - fp.write(struct.pack("404s", b"")) # dummy - - rawmode = "L" - if bpc == 2: - rawmode = "L;16B" - - for channel in im.split(): - fp.write(channel.tobytes("raw", rawmode, 0, orientation)) - - if hasattr(fp, "flush"): - fp.flush() - - -class SGI16Decoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - rawmode, stride, orientation = self.args - pagesize = self.state.xsize * self.state.ysize - zsize = len(self.mode) - self.fd.seek(512) - - for band in range(zsize): - channel = Image.new("L", (self.state.xsize, self.state.ysize)) - channel.frombytes( - self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation - ) - self.im.putband(channel.im, band) - - return -1, 0 - - -# -# registry - - -Image.register_decoder("SGI16", SGI16Decoder) -Image.register_open(SgiImageFile.format, SgiImageFile, _accept) -Image.register_save(SgiImageFile.format, _save) -Image.register_mime(SgiImageFile.format, "image/sgi") - -Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) - -# End of file diff --git a/waypoint_manager/manager_GUI/PIL/SpiderImagePlugin.py b/waypoint_manager/manager_GUI/PIL/SpiderImagePlugin.py deleted file mode 100644 index acafc32..0000000 --- a/waypoint_manager/manager_GUI/PIL/SpiderImagePlugin.py +++ /dev/null @@ -1,313 +0,0 @@ -# -# The Python Imaging Library. -# -# SPIDER image file handling -# -# History: -# 2004-08-02 Created BB -# 2006-03-02 added save method -# 2006-03-13 added support for stack images -# -# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. -# Copyright (c) 2004 by William Baxter. -# Copyright (c) 2004 by Secret Labs AB. -# Copyright (c) 2004 by Fredrik Lundh. -# - -## -# Image plugin for the Spider image format. This format is used -# by the SPIDER software, in processing image data from electron -# microscopy and tomography. -## - -# -# SpiderImagePlugin.py -# -# The Spider image format is used by SPIDER software, in processing -# image data from electron microscopy and tomography. -# -# Spider home page: -# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html -# -# Details about the Spider image format: -# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html -# -import os -import struct -import sys - -from PIL import Image, ImageFile - - -def isInt(f): - try: - i = int(f) - if f - i == 0: - return 1 - else: - return 0 - except (ValueError, OverflowError): - return 0 - - -iforms = [1, 3, -11, -12, -21, -22] - - -# There is no magic number to identify Spider files, so just check a -# series of header locations to see if they have reasonable values. -# Returns no. of bytes in the header, if it is a valid Spider header, -# otherwise returns 0 - - -def isSpiderHeader(t): - h = (99,) + t # add 1 value so can use spider header index start=1 - # header values 1,2,5,12,13,22,23 should be integers - for i in [1, 2, 5, 12, 13, 22, 23]: - if not isInt(h[i]): - return 0 - # check iform - iform = int(h[5]) - if iform not in iforms: - return 0 - # check other header values - labrec = int(h[13]) # no. records in file header - labbyt = int(h[22]) # total no. of bytes in header - lenbyt = int(h[23]) # record length in bytes - if labbyt != (labrec * lenbyt): - return 0 - # looks like a valid header - return labbyt - - -def isSpiderImage(filename): - with open(filename, "rb") as fp: - f = fp.read(92) # read 23 * 4 bytes - t = struct.unpack(">23f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - t = struct.unpack("<23f", f) # little-endian - hdrlen = isSpiderHeader(t) - return hdrlen - - -class SpiderImageFile(ImageFile.ImageFile): - - format = "SPIDER" - format_description = "Spider 2D image" - _close_exclusive_fp_after_loading = False - - def _open(self): - # check header - n = 27 * 4 # read 27 float values - f = self.fp.read(n) - - try: - self.bigendian = 1 - t = struct.unpack(">27f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - self.bigendian = 0 - t = struct.unpack("<27f", f) # little-endian - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - raise SyntaxError("not a valid Spider file") - except struct.error as e: - raise SyntaxError("not a valid Spider file") from e - - h = (99,) + t # add 1 value : spider header index starts at 1 - iform = int(h[5]) - if iform != 1: - raise SyntaxError("not a Spider 2D image") - - self._size = int(h[12]), int(h[2]) # size in pixels (width, height) - self.istack = int(h[24]) - self.imgnumber = int(h[27]) - - if self.istack == 0 and self.imgnumber == 0: - # stk=0, img=0: a regular 2D image - offset = hdrlen - self._nimages = 1 - elif self.istack > 0 and self.imgnumber == 0: - # stk>0, img=0: Opening the stack for the first time - self.imgbytes = int(h[12]) * int(h[2]) * 4 - self.hdrlen = hdrlen - self._nimages = int(h[26]) - # Point to the first image in the stack - offset = hdrlen * 2 - self.imgnumber = 1 - elif self.istack == 0 and self.imgnumber > 0: - # stk=0, img>0: an image within the stack - offset = hdrlen + self.stkoffset - self.istack = 2 # So Image knows it's still a stack - else: - raise SyntaxError("inconsistent stack header values") - - if self.bigendian: - self.rawmode = "F;32BF" - else: - self.rawmode = "F;32F" - self.mode = "F" - - self.tile = [("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] - self._fp = self.fp # FIXME: hack - - @property - def n_frames(self): - return self._nimages - - @property - def is_animated(self): - return self._nimages > 1 - - # 1st image index is zero (although SPIDER imgnumber starts at 1) - def tell(self): - if self.imgnumber < 1: - return 0 - else: - return self.imgnumber - 1 - - def seek(self, frame): - if self.istack == 0: - raise EOFError("attempt to seek in a non-stack file") - if not self._seek_check(frame): - return - self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) - self.fp = self._fp - self.fp.seek(self.stkoffset) - self._open() - - # returns a byte image after rescaling to 0..255 - def convert2byte(self, depth=255): - (minimum, maximum) = self.getextrema() - m = 1 - if maximum != minimum: - m = depth / (maximum - minimum) - b = -m * minimum - return self.point(lambda i, m=m, b=b: i * m + b).convert("L") - - # returns a ImageTk.PhotoImage object, after rescaling to 0..255 - def tkPhotoImage(self): - from PIL import ImageTk - - return ImageTk.PhotoImage(self.convert2byte(), palette=256) - - -# -------------------------------------------------------------------- -# Image series - -# given a list of filenames, return a list of images -def loadImageSeries(filelist=None): - """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" - if filelist is None or len(filelist) < 1: - return - - imglist = [] - for img in filelist: - if not os.path.exists(img): - print(f"unable to find {img}") - continue - try: - with Image.open(img) as im: - im = im.convert2byte() - except Exception: - if not isSpiderImage(img): - print(img + " is not a Spider image file") - continue - im.info["filename"] = img - imglist.append(im) - return imglist - - -# -------------------------------------------------------------------- -# For saving images in Spider format - - -def makeSpiderHeader(im): - nsam, nrow = im.size - lenbyt = nsam * 4 # There are labrec records in the header - labrec = int(1024 / lenbyt) - if 1024 % lenbyt != 0: - labrec += 1 - labbyt = labrec * lenbyt - nvalues = int(labbyt / 4) - if nvalues < 23: - return [] - - hdr = [] - for i in range(nvalues): - hdr.append(0.0) - - # NB these are Fortran indices - hdr[1] = 1.0 # nslice (=1 for an image) - hdr[2] = float(nrow) # number of rows per slice - hdr[3] = float(nrow) # number of records in the image - hdr[5] = 1.0 # iform for 2D image - hdr[12] = float(nsam) # number of pixels per line - hdr[13] = float(labrec) # number of records in file header - hdr[22] = float(labbyt) # total number of bytes in header - hdr[23] = float(lenbyt) # record length in bytes - - # adjust for Fortran indexing - hdr = hdr[1:] - hdr.append(0.0) - # pack binary data into a string - return [struct.pack("f", v) for v in hdr] - - -def _save(im, fp, filename): - if im.mode[0] != "F": - im = im.convert("F") - - hdr = makeSpiderHeader(im) - if len(hdr) < 256: - raise OSError("Error creating Spider header") - - # write the SPIDER header - fp.writelines(hdr) - - rawmode = "F;32NF" # 32-bit native floating point - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) - - -def _save_spider(im, fp, filename): - # get the filename extension and register it with Image - ext = os.path.splitext(filename)[1] - Image.register_extension(SpiderImageFile.format, ext) - _save(im, fp, filename) - - -# -------------------------------------------------------------------- - - -Image.register_open(SpiderImageFile.format, SpiderImageFile) -Image.register_save(SpiderImageFile.format, _save_spider) - -if __name__ == "__main__": - - if len(sys.argv) < 2: - print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") - sys.exit() - - filename = sys.argv[1] - if not isSpiderImage(filename): - print("input image must be in Spider format") - sys.exit() - - with Image.open(filename) as im: - print("image: " + str(im)) - print("format: " + str(im.format)) - print("size: " + str(im.size)) - print("mode: " + str(im.mode)) - print("max, min: ", end=" ") - print(im.getextrema()) - - if len(sys.argv) > 2: - outfile = sys.argv[2] - - # perform some image operation - im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - print( - f"saving a flipped version of {os.path.basename(filename)} " - f"as {outfile} " - ) - im.save(outfile, SpiderImageFile.format) diff --git a/waypoint_manager/manager_GUI/PIL/SunImagePlugin.py b/waypoint_manager/manager_GUI/PIL/SunImagePlugin.py deleted file mode 100644 index c03759a..0000000 --- a/waypoint_manager/manager_GUI/PIL/SunImagePlugin.py +++ /dev/null @@ -1,136 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Sun image file handling -# -# History: -# 1995-09-10 fl Created -# 1996-05-28 fl Fixed 32-bit alignment -# 1998-12-29 fl Import ImagePalette module -# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995-1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile, ImagePalette -from ._binary import i32be as i32 - - -def _accept(prefix): - return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 - - -## -# Image plugin for Sun raster files. - - -class SunImageFile(ImageFile.ImageFile): - - format = "SUN" - format_description = "Sun Raster File" - - def _open(self): - - # The Sun Raster file header is 32 bytes in length - # and has the following format: - - # typedef struct _SunRaster - # { - # DWORD MagicNumber; /* Magic (identification) number */ - # DWORD Width; /* Width of image in pixels */ - # DWORD Height; /* Height of image in pixels */ - # DWORD Depth; /* Number of bits per pixel */ - # DWORD Length; /* Size of image data in bytes */ - # DWORD Type; /* Type of raster file */ - # DWORD ColorMapType; /* Type of color map */ - # DWORD ColorMapLength; /* Size of the color map in bytes */ - # } SUNRASTER; - - # HEAD - s = self.fp.read(32) - if not _accept(s): - raise SyntaxError("not an SUN raster file") - - offset = 32 - - self._size = i32(s, 4), i32(s, 8) - - depth = i32(s, 12) - # data_length = i32(s, 16) # unreliable, ignore. - file_type = i32(s, 20) - palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary - palette_length = i32(s, 28) - - if depth == 1: - self.mode, rawmode = "1", "1;I" - elif depth == 4: - self.mode, rawmode = "L", "L;4" - elif depth == 8: - self.mode = rawmode = "L" - elif depth == 24: - if file_type == 3: - self.mode, rawmode = "RGB", "RGB" - else: - self.mode, rawmode = "RGB", "BGR" - elif depth == 32: - if file_type == 3: - self.mode, rawmode = "RGB", "RGBX" - else: - self.mode, rawmode = "RGB", "BGRX" - else: - raise SyntaxError("Unsupported Mode/Bit Depth") - - if palette_length: - if palette_length > 1024: - raise SyntaxError("Unsupported Color Palette Length") - - if palette_type != 1: - raise SyntaxError("Unsupported Palette Type") - - offset = offset + palette_length - self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) - if self.mode == "L": - self.mode = "P" - rawmode = rawmode.replace("L", "P") - - # 16 bit boundaries on stride - stride = ((self.size[0] * depth + 15) // 16) * 2 - - # file type: Type is the version (or flavor) of the bitmap - # file. The following values are typically found in the Type - # field: - # 0000h Old - # 0001h Standard - # 0002h Byte-encoded - # 0003h RGB format - # 0004h TIFF format - # 0005h IFF format - # FFFFh Experimental - - # Old and standard are the same, except for the length tag. - # byte-encoded is run-length-encoded - # RGB looks similar to standard, but RGB byte order - # TIFF and IFF mean that they were converted from T/IFF - # Experimental means that it's something else. - # (https://www.fileformat.info/format/sunraster/egff.htm) - - if file_type in (0, 1, 3, 4, 5): - self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride))] - elif file_type == 2: - self.tile = [("sun_rle", (0, 0) + self.size, offset, rawmode)] - else: - raise SyntaxError("Unsupported Sun Raster file type") - - -# -# registry - - -Image.register_open(SunImageFile.format, SunImageFile, _accept) - -Image.register_extension(SunImageFile.format, ".ras") diff --git a/waypoint_manager/manager_GUI/PIL/TarIO.py b/waypoint_manager/manager_GUI/PIL/TarIO.py deleted file mode 100644 index d108362..0000000 --- a/waypoint_manager/manager_GUI/PIL/TarIO.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# read files from within a tar file -# -# History: -# 95-06-18 fl Created -# 96-05-28 fl Open files in binary mode -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-96. -# -# See the README file for information on usage and redistribution. -# - -import io - -from . import ContainerIO - - -class TarIO(ContainerIO.ContainerIO): - """A file object that provides read access to a given member of a TAR file.""" - - def __init__(self, tarfile, file): - """ - Create file object. - - :param tarfile: Name of TAR file. - :param file: Name of member file. - """ - self.fh = open(tarfile, "rb") - - while True: - - s = self.fh.read(512) - if len(s) != 512: - raise OSError("unexpected end of tar file") - - name = s[:100].decode("utf-8") - i = name.find("\0") - if i == 0: - raise OSError("cannot find subfile") - if i > 0: - name = name[:i] - - size = int(s[124:135], 8) - - if file == name: - break - - self.fh.seek((size + 511) & (~511), io.SEEK_CUR) - - # Open region - super().__init__(self.fh, self.fh.tell(), size) - - # Context manager support - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - self.fh.close() diff --git a/waypoint_manager/manager_GUI/PIL/TgaImagePlugin.py b/waypoint_manager/manager_GUI/PIL/TgaImagePlugin.py deleted file mode 100644 index 59b89e9..0000000 --- a/waypoint_manager/manager_GUI/PIL/TgaImagePlugin.py +++ /dev/null @@ -1,253 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TGA file handling -# -# History: -# 95-09-01 fl created (reads 24-bit files only) -# 97-01-04 fl support more TGA versions, including compressed images -# 98-07-04 fl fixed orientation and alpha layer bugs -# 98-09-11 fl fixed orientation for runlength decoder -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# - - -import warnings - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -# -# -------------------------------------------------------------------- -# Read RGA file - - -MODES = { - # map imagetype/depth to rawmode - (1, 8): "P", - (3, 1): "1", - (3, 8): "L", - (3, 16): "LA", - (2, 16): "BGR;5", - (2, 24): "BGR", - (2, 32): "BGRA", -} - - -## -# Image plugin for Targa files. - - -class TgaImageFile(ImageFile.ImageFile): - - format = "TGA" - format_description = "Targa" - - def _open(self): - - # process header - s = self.fp.read(18) - - id_len = s[0] - - colormaptype = s[1] - imagetype = s[2] - - depth = s[16] - - flags = s[17] - - self._size = i16(s, 12), i16(s, 14) - - # validate header fields - if ( - colormaptype not in (0, 1) - or self.size[0] <= 0 - or self.size[1] <= 0 - or depth not in (1, 8, 16, 24, 32) - ): - raise SyntaxError("not a TGA file") - - # image mode - if imagetype in (3, 11): - self.mode = "L" - if depth == 1: - self.mode = "1" # ??? - elif depth == 16: - self.mode = "LA" - elif imagetype in (1, 9): - self.mode = "P" - elif imagetype in (2, 10): - self.mode = "RGB" - if depth == 32: - self.mode = "RGBA" - else: - raise SyntaxError("unknown TGA mode") - - # orientation - orientation = flags & 0x30 - self._flip_horizontally = orientation in [0x10, 0x30] - if orientation in [0x20, 0x30]: - orientation = 1 - elif orientation in [0, 0x10]: - orientation = -1 - else: - raise SyntaxError("unknown TGA orientation") - - self.info["orientation"] = orientation - - if imagetype & 8: - self.info["compression"] = "tga_rle" - - if id_len: - self.info["id_section"] = self.fp.read(id_len) - - if colormaptype: - # read palette - start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] - if mapdepth == 16: - self.palette = ImagePalette.raw( - "BGR;15", b"\0" * 2 * start + self.fp.read(2 * size) - ) - elif mapdepth == 24: - self.palette = ImagePalette.raw( - "BGR", b"\0" * 3 * start + self.fp.read(3 * size) - ) - elif mapdepth == 32: - self.palette = ImagePalette.raw( - "BGRA", b"\0" * 4 * start + self.fp.read(4 * size) - ) - - # setup tile descriptor - try: - rawmode = MODES[(imagetype & 7, depth)] - if imagetype & 8: - # compressed - self.tile = [ - ( - "tga_rle", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, orientation, depth), - ) - ] - else: - self.tile = [ - ( - "raw", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, 0, orientation), - ) - ] - except KeyError: - pass # cannot decode - - def load_end(self): - if self._flip_horizontally: - self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -# -# -------------------------------------------------------------------- -# Write TGA file - - -SAVE = { - "1": ("1", 1, 0, 3), - "L": ("L", 8, 0, 3), - "LA": ("LA", 16, 0, 3), - "P": ("P", 8, 1, 1), - "RGB": ("BGR", 24, 0, 2), - "RGBA": ("BGRA", 32, 0, 2), -} - - -def _save(im, fp, filename): - - try: - rawmode, bits, colormaptype, imagetype = SAVE[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as TGA") from e - - if "rle" in im.encoderinfo: - rle = im.encoderinfo["rle"] - else: - compression = im.encoderinfo.get("compression", im.info.get("compression")) - rle = compression == "tga_rle" - if rle: - imagetype += 8 - - id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) - id_len = len(id_section) - if id_len > 255: - id_len = 255 - id_section = id_section[:255] - warnings.warn("id_section has been trimmed to 255 characters") - - if colormaptype: - colormapfirst, colormaplength, colormapentry = 0, 256, 24 - else: - colormapfirst, colormaplength, colormapentry = 0, 0, 0 - - if im.mode in ("LA", "RGBA"): - flags = 8 - else: - flags = 0 - - orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) - if orientation > 0: - flags = flags | 0x20 - - fp.write( - o8(id_len) - + o8(colormaptype) - + o8(imagetype) - + o16(colormapfirst) - + o16(colormaplength) - + o8(colormapentry) - + o16(0) - + o16(0) - + o16(im.size[0]) - + o16(im.size[1]) - + o8(bits) - + o8(flags) - ) - - if id_section: - fp.write(id_section) - - if colormaptype: - fp.write(im.im.getpalette("RGB", "BGR")) - - if rle: - ImageFile._save( - im, fp, [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))] - ) - else: - ImageFile._save( - im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))] - ) - - # write targa version 2 footer - fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(TgaImageFile.format, TgaImageFile) -Image.register_save(TgaImageFile.format, _save) - -Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) - -Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/waypoint_manager/manager_GUI/PIL/TiffImagePlugin.py b/waypoint_manager/manager_GUI/PIL/TiffImagePlugin.py deleted file mode 100644 index 0dd4934..0000000 --- a/waypoint_manager/manager_GUI/PIL/TiffImagePlugin.py +++ /dev/null @@ -1,2114 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF file handling -# -# TIFF is a flexible, if somewhat aged, image file format originally -# defined by Aldus. Although TIFF supports a wide variety of pixel -# layouts and compression methods, the name doesn't really stand for -# "thousands of incompatible file formats," it just feels that way. -# -# To read TIFF data from a stream, the stream must be seekable. For -# progressive decoding, make sure to use TIFF files where the tag -# directory is placed first in the file. -# -# History: -# 1995-09-01 fl Created -# 1996-05-04 fl Handle JPEGTABLES tag -# 1996-05-18 fl Fixed COLORMAP support -# 1997-01-05 fl Fixed PREDICTOR support -# 1997-08-27 fl Added support for rational tags (from Perry Stoll) -# 1998-01-10 fl Fixed seek/tell (from Jan Blom) -# 1998-07-15 fl Use private names for internal variables -# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) -# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) -# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) -# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) -# 2001-12-18 fl Added workaround for broken Matrox library -# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) -# 2003-05-19 fl Check FILLORDER tag -# 2003-09-26 fl Added RGBa support -# 2004-02-24 fl Added DPI support; fixed rational write support -# 2005-02-07 fl Added workaround for broken Corel Draw 10 files -# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) -# -# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -import io -import itertools -import logging -import math -import os -import struct -import warnings -from collections.abc import MutableMapping -from fractions import Fraction -from numbers import Number, Rational - -from . import Image, ImageFile, ImageOps, ImagePalette, TiffTags -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from .TiffTags import TYPES - -logger = logging.getLogger(__name__) - -# Set these to true to force use of libtiff for reading or writing. -READ_LIBTIFF = False -WRITE_LIBTIFF = False -IFD_LEGACY_API = True -STRIP_SIZE = 65536 - -II = b"II" # little-endian (Intel style) -MM = b"MM" # big-endian (Motorola style) - -# -# -------------------------------------------------------------------- -# Read TIFF files - -# a few tag names, just to make the code below a bit more readable -IMAGEWIDTH = 256 -IMAGELENGTH = 257 -BITSPERSAMPLE = 258 -COMPRESSION = 259 -PHOTOMETRIC_INTERPRETATION = 262 -FILLORDER = 266 -IMAGEDESCRIPTION = 270 -STRIPOFFSETS = 273 -SAMPLESPERPIXEL = 277 -ROWSPERSTRIP = 278 -STRIPBYTECOUNTS = 279 -X_RESOLUTION = 282 -Y_RESOLUTION = 283 -PLANAR_CONFIGURATION = 284 -RESOLUTION_UNIT = 296 -TRANSFERFUNCTION = 301 -SOFTWARE = 305 -DATE_TIME = 306 -ARTIST = 315 -PREDICTOR = 317 -COLORMAP = 320 -TILEWIDTH = 322 -TILELENGTH = 323 -TILEOFFSETS = 324 -TILEBYTECOUNTS = 325 -SUBIFD = 330 -EXTRASAMPLES = 338 -SAMPLEFORMAT = 339 -JPEGTABLES = 347 -YCBCRSUBSAMPLING = 530 -REFERENCEBLACKWHITE = 532 -COPYRIGHT = 33432 -IPTC_NAA_CHUNK = 33723 # newsphoto properties -PHOTOSHOP_CHUNK = 34377 # photoshop properties -ICCPROFILE = 34675 -EXIFIFD = 34665 -XMP = 700 -JPEGQUALITY = 65537 # pseudo-tag by libtiff - -# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java -IMAGEJ_META_DATA_BYTE_COUNTS = 50838 -IMAGEJ_META_DATA = 50839 - -COMPRESSION_INFO = { - # Compression => pil compression name - 1: "raw", - 2: "tiff_ccitt", - 3: "group3", - 4: "group4", - 5: "tiff_lzw", - 6: "tiff_jpeg", # obsolete - 7: "jpeg", - 8: "tiff_adobe_deflate", - 32771: "tiff_raw_16", # 16-bit padding - 32773: "packbits", - 32809: "tiff_thunderscan", - 32946: "tiff_deflate", - 34676: "tiff_sgilog", - 34677: "tiff_sgilog24", - 34925: "lzma", - 50000: "zstd", - 50001: "webp", -} - -COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} - -OPEN_INFO = { - # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, - # ExtraSamples) => mode, rawmode - (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (II, 1, (1,), 1, (1,), ()): ("1", "1"), - (MM, 1, (1,), 1, (1,), ()): ("1", "1"), - (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (II, 1, (1,), 1, (8,), ()): ("L", "L"), - (MM, 1, (1,), 1, (8,), ()): ("L", "L"), - (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), - (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), - (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), - (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), - (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), - (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), - (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), - (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), - (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), - (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), - (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), - (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (II, 3, (1,), 1, (8,), ()): ("P", "P"), - (MM, 3, (1,), 1, (8,), ()): ("P", "P"), - (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), - # JPEG compressed images handled by LibTiff and auto-converted to RGBX - # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel - (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), - (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), -} - -PREFIXES = [ - b"MM\x00\x2A", # Valid TIFF header with big-endian byte order - b"II\x2A\x00", # Valid TIFF header with little-endian byte order - b"MM\x2A\x00", # Invalid TIFF header, assume big-endian - b"II\x00\x2A", # Invalid TIFF header, assume little-endian - b"MM\x00\x2B", # BigTIFF with big-endian byte order - b"II\x2B\x00", # BigTIFF with little-endian byte order -] - - -def _accept(prefix): - return prefix[:4] in PREFIXES - - -def _limit_rational(val, max_val): - inv = abs(val) > 1 - n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) - return n_d[::-1] if inv else n_d - - -def _limit_signed_rational(val, max_val, min_val): - frac = Fraction(val) - n_d = frac.numerator, frac.denominator - - if min(n_d) < min_val: - n_d = _limit_rational(val, abs(min_val)) - - if max(n_d) > max_val: - val = Fraction(*n_d) - n_d = _limit_rational(val, max_val) - - return n_d - - -## -# Wrapper for TIFF IFDs. - -_load_dispatch = {} -_write_dispatch = {} - - -class IFDRational(Rational): - """Implements a rational class where 0/0 is a legal value to match - the in the wild use of exif rationals. - - e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used - """ - - """ If the denominator is 0, store this as a float('nan'), otherwise store - as a fractions.Fraction(). Delegate as appropriate - - """ - - __slots__ = ("_numerator", "_denominator", "_val") - - def __init__(self, value, denominator=1): - """ - :param value: either an integer numerator, a - float/rational/other number, or an IFDRational - :param denominator: Optional integer denominator - """ - if isinstance(value, IFDRational): - self._numerator = value.numerator - self._denominator = value.denominator - self._val = value._val - return - - if isinstance(value, Fraction): - self._numerator = value.numerator - self._denominator = value.denominator - else: - self._numerator = value - self._denominator = denominator - - if denominator == 0: - self._val = float("nan") - elif denominator == 1: - self._val = Fraction(value) - else: - self._val = Fraction(value, denominator) - - @property - def numerator(self): - return self._numerator - - @property - def denominator(self): - return self._denominator - - def limit_rational(self, max_denominator): - """ - - :param max_denominator: Integer, the maximum denominator value - :returns: Tuple of (numerator, denominator) - """ - - if self.denominator == 0: - return self.numerator, self.denominator - - f = self._val.limit_denominator(max_denominator) - return f.numerator, f.denominator - - def __repr__(self): - return str(float(self._val)) - - def __hash__(self): - return self._val.__hash__() - - def __eq__(self, other): - val = self._val - if isinstance(other, IFDRational): - other = other._val - if isinstance(other, float): - val = float(val) - return val == other - - def __getstate__(self): - return [self._val, self._numerator, self._denominator] - - def __setstate__(self, state): - IFDRational.__init__(self, 0) - _val, _numerator, _denominator = state - self._val = _val - self._numerator = _numerator - self._denominator = _denominator - - def _delegate(op): - def delegate(self, *args): - return getattr(self._val, op)(*args) - - return delegate - - """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', - 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', - 'mod','rmod', 'pow','rpow', 'pos', 'neg', - 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', - 'ceil', 'floor', 'round'] - print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) - """ - - __add__ = _delegate("__add__") - __radd__ = _delegate("__radd__") - __sub__ = _delegate("__sub__") - __rsub__ = _delegate("__rsub__") - __mul__ = _delegate("__mul__") - __rmul__ = _delegate("__rmul__") - __truediv__ = _delegate("__truediv__") - __rtruediv__ = _delegate("__rtruediv__") - __floordiv__ = _delegate("__floordiv__") - __rfloordiv__ = _delegate("__rfloordiv__") - __mod__ = _delegate("__mod__") - __rmod__ = _delegate("__rmod__") - __pow__ = _delegate("__pow__") - __rpow__ = _delegate("__rpow__") - __pos__ = _delegate("__pos__") - __neg__ = _delegate("__neg__") - __abs__ = _delegate("__abs__") - __trunc__ = _delegate("__trunc__") - __lt__ = _delegate("__lt__") - __gt__ = _delegate("__gt__") - __le__ = _delegate("__le__") - __ge__ = _delegate("__ge__") - __bool__ = _delegate("__bool__") - __ceil__ = _delegate("__ceil__") - __floor__ = _delegate("__floor__") - __round__ = _delegate("__round__") - - -class ImageFileDirectory_v2(MutableMapping): - """This class represents a TIFF tag directory. To speed things up, we - don't decode tags unless they're asked for. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v2() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - 'Some Data' - - Individual values are returned as the strings or numbers, sequences are - returned as tuples of the values. - - The tiff metadata type of each item is stored in a dictionary of - tag types in - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types - are read from a tiff file, guessed from the type added, or added - manually. - - Data Structures: - - * ``self.tagtype = {}`` - - * Key: numerical TIFF tag number - * Value: integer corresponding to the data type from - :py:data:`.TiffTags.TYPES` - - .. versionadded:: 3.0.0 - - 'Internal' data structures: - - * ``self._tags_v2 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data, as tuple for multiple values - - * ``self._tagdata = {}`` - - * Key: numerical TIFF tag number - * Value: undecoded byte string from file - - * ``self._tags_v1 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data in the v1 format - - Tags will be found in the private attributes ``self._tagdata``, and in - ``self._tags_v2`` once decoded. - - ``self.legacy_api`` is a value for internal use, and shouldn't be changed - from outside code. In cooperation with - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api`` - is true, then decoded tags will be populated into both ``_tags_v1`` and - ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF - save routine. Tags should be read from ``_tags_v1`` if - ``legacy_api == true``. - - """ - - def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None, group=None): - """Initialize an ImageFileDirectory. - - To construct an ImageFileDirectory from a real file, pass the 8-byte - magic header to the constructor. To only set the endianness, pass it - as the 'prefix' keyword argument. - - :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets - endianness. - :param prefix: Override the endianness of the file. - """ - if not _accept(ifh): - raise SyntaxError(f"not a TIFF file (header {repr(ifh)} not valid)") - self._prefix = prefix if prefix is not None else ifh[:2] - if self._prefix == MM: - self._endian = ">" - elif self._prefix == II: - self._endian = "<" - else: - raise SyntaxError("not a TIFF IFD") - self._bigtiff = ifh[2] == 43 - self.group = group - self.tagtype = {} - """ Dictionary of tag types """ - self.reset() - (self.next,) = ( - self._unpack("Q", ifh[8:]) if self._bigtiff else self._unpack("L", ifh[4:]) - ) - self._legacy_api = False - - prefix = property(lambda self: self._prefix) - offset = property(lambda self: self._offset) - legacy_api = property(lambda self: self._legacy_api) - - @legacy_api.setter - def legacy_api(self, value): - raise Exception("Not allowing setting of legacy api") - - def reset(self): - self._tags_v1 = {} # will remain empty if legacy_api is false - self._tags_v2 = {} # main tag storage - self._tagdata = {} - self.tagtype = {} # added 2008-06-05 by Florian Hoech - self._next = None - self._offset = None - - def __str__(self): - return str(dict(self)) - - def named(self): - """ - :returns: dict of name|key: value - - Returns the complete tag dictionary, with named tags where possible. - """ - return { - TiffTags.lookup(code, self.group).name: value - for code, value in self.items() - } - - def __len__(self): - return len(set(self._tagdata) | set(self._tags_v2)) - - def __getitem__(self, tag): - if tag not in self._tags_v2: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - self[tag] = handler(self, data, self.legacy_api) # check type - val = self._tags_v2[tag] - if self.legacy_api and not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - def __contains__(self, tag): - return tag in self._tags_v2 or tag in self._tagdata - - def __setitem__(self, tag, value): - self._setitem(tag, value, self.legacy_api) - - def _setitem(self, tag, value, legacy_api): - basetypes = (Number, bytes, str) - - info = TiffTags.lookup(tag, self.group) - values = [value] if isinstance(value, basetypes) else value - - if tag not in self.tagtype: - if info.type: - self.tagtype[tag] = info.type - else: - self.tagtype[tag] = TiffTags.UNDEFINED - if all(isinstance(v, IFDRational) for v in values): - self.tagtype[tag] = ( - TiffTags.RATIONAL - if all(v >= 0 for v in values) - else TiffTags.SIGNED_RATIONAL - ) - elif all(isinstance(v, int) for v in values): - if all(0 <= v < 2**16 for v in values): - self.tagtype[tag] = TiffTags.SHORT - elif all(-(2**15) < v < 2**15 for v in values): - self.tagtype[tag] = TiffTags.SIGNED_SHORT - else: - self.tagtype[tag] = ( - TiffTags.LONG - if all(v >= 0 for v in values) - else TiffTags.SIGNED_LONG - ) - elif all(isinstance(v, float) for v in values): - self.tagtype[tag] = TiffTags.DOUBLE - elif all(isinstance(v, str) for v in values): - self.tagtype[tag] = TiffTags.ASCII - elif all(isinstance(v, bytes) for v in values): - self.tagtype[tag] = TiffTags.BYTE - - if self.tagtype[tag] == TiffTags.UNDEFINED: - values = [ - v.encode("ascii", "replace") if isinstance(v, str) else v - for v in values - ] - elif self.tagtype[tag] == TiffTags.RATIONAL: - values = [float(v) if isinstance(v, int) else v for v in values] - - is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) - if not is_ifd: - values = tuple(info.cvt_enum(value) for value in values) - - dest = self._tags_v1 if legacy_api else self._tags_v2 - - # Three branches: - # Spec'd length == 1, Actual length 1, store as element - # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. - # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. - # Don't mess with the legacy api, since it's frozen. - if not is_ifd and ( - (info.length == 1) - or self.tagtype[tag] == TiffTags.BYTE - or (info.length is None and len(values) == 1 and not legacy_api) - ): - # Don't mess with the legacy api, since it's frozen. - if legacy_api and self.tagtype[tag] in [ - TiffTags.RATIONAL, - TiffTags.SIGNED_RATIONAL, - ]: # rationals - values = (values,) - try: - (dest[tag],) = values - except ValueError: - # We've got a builtin tag with 1 expected entry - warnings.warn( - f"Metadata Warning, tag {tag} had too many entries: " - f"{len(values)}, expected 1" - ) - dest[tag] = values[0] - - else: - # Spec'd length > 1 or undefined - # Unspec'd, and length > 1 - dest[tag] = values - - def __delitem__(self, tag): - self._tags_v2.pop(tag, None) - self._tags_v1.pop(tag, None) - self._tagdata.pop(tag, None) - - def __iter__(self): - return iter(set(self._tagdata) | set(self._tags_v2)) - - def _unpack(self, fmt, data): - return struct.unpack(self._endian + fmt, data) - - def _pack(self, fmt, *values): - return struct.pack(self._endian + fmt, *values) - - def _register_loader(idx, size): - def decorator(func): - from .TiffTags import TYPES - - if func.__name__.startswith("load_"): - TYPES[idx] = func.__name__[5:].replace("_", " ") - _load_dispatch[idx] = size, func # noqa: F821 - return func - - return decorator - - def _register_writer(idx): - def decorator(func): - _write_dispatch[idx] = func # noqa: F821 - return func - - return decorator - - def _register_basic(idx_fmt_name): - from .TiffTags import TYPES - - idx, fmt, name = idx_fmt_name - TYPES[idx] = name - size = struct.calcsize("=" + fmt) - _load_dispatch[idx] = ( # noqa: F821 - size, - lambda self, data, legacy_api=True: ( - self._unpack(f"{len(data) // size}{fmt}", data) - ), - ) - _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 - b"".join(self._pack(fmt, value) for value in values) - ) - - list( - map( - _register_basic, - [ - (TiffTags.SHORT, "H", "short"), - (TiffTags.LONG, "L", "long"), - (TiffTags.SIGNED_BYTE, "b", "signed byte"), - (TiffTags.SIGNED_SHORT, "h", "signed short"), - (TiffTags.SIGNED_LONG, "l", "signed long"), - (TiffTags.FLOAT, "f", "float"), - (TiffTags.DOUBLE, "d", "double"), - (TiffTags.IFD, "L", "long"), - (TiffTags.LONG8, "Q", "long8"), - ], - ) - ) - - @_register_loader(1, 1) # Basic type, except for the legacy API. - def load_byte(self, data, legacy_api=True): - return data - - @_register_writer(1) # Basic type, except for the legacy API. - def write_byte(self, data): - return data - - @_register_loader(2, 1) - def load_string(self, data, legacy_api=True): - if data.endswith(b"\0"): - data = data[:-1] - return data.decode("latin-1", "replace") - - @_register_writer(2) - def write_string(self, value): - # remerge of https://github.com/python-pillow/Pillow/pull/1416 - return b"" + value.encode("ascii", "replace") + b"\0" - - @_register_loader(5, 8) - def load_rational(self, data, legacy_api=True): - vals = self._unpack(f"{len(data) // 4}L", data) - - def combine(a, b): - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(5) - def write_rational(self, *values): - return b"".join( - self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values - ) - - @_register_loader(7, 1) - def load_undefined(self, data, legacy_api=True): - return data - - @_register_writer(7) - def write_undefined(self, value): - return value - - @_register_loader(10, 8) - def load_signed_rational(self, data, legacy_api=True): - vals = self._unpack(f"{len(data) // 4}l", data) - - def combine(a, b): - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(10) - def write_signed_rational(self, *values): - return b"".join( - self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31))) - for frac in values - ) - - def _ensure_read(self, fp, size): - ret = fp.read(size) - if len(ret) != size: - raise OSError( - "Corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(ret)}. " - ) - return ret - - def load(self, fp): - - self.reset() - self._offset = fp.tell() - - try: - tag_count = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("H", self._ensure_read(fp, 2)) - )[0] - for i in range(tag_count): - tag, typ, count, data = ( - self._unpack("HHQ8s", self._ensure_read(fp, 20)) - if self._bigtiff - else self._unpack("HHL4s", self._ensure_read(fp, 12)) - ) - - tagname = TiffTags.lookup(tag, self.group).name - typname = TYPES.get(typ, "unknown") - msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" - - try: - unit_size, handler = self._load_dispatch[typ] - except KeyError: - logger.debug(msg + f" - unsupported type {typ}") - continue # ignore unsupported type - size = count * unit_size - if size > (8 if self._bigtiff else 4): - here = fp.tell() - (offset,) = self._unpack("Q" if self._bigtiff else "L", data) - msg += f" Tag Location: {here} - Data Location: {offset}" - fp.seek(offset) - data = ImageFile._safe_read(fp, size) - fp.seek(here) - else: - data = data[:size] - - if len(data) != size: - warnings.warn( - "Possibly corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(data)}." - f" Skipping tag {tag}" - ) - logger.debug(msg) - continue - - if not data: - logger.debug(msg) - continue - - self._tagdata[tag] = data - self.tagtype[tag] = typ - - msg += " - value: " + ( - "" % size if size > 32 else repr(data) - ) - logger.debug(msg) - - (self.next,) = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("L", self._ensure_read(fp, 4)) - ) - except OSError as msg: - warnings.warn(str(msg)) - return - - def tobytes(self, offset=0): - # FIXME What about tagdata? - result = self._pack("H", len(self._tags_v2)) - - entries = [] - offset = offset + len(result) + len(self._tags_v2) * 12 + 4 - stripoffsets = None - - # pass 1: convert tags to binary format - # always write tags in ascending order - for tag, value in sorted(self._tags_v2.items()): - if tag == STRIPOFFSETS: - stripoffsets = len(entries) - typ = self.tagtype.get(tag) - logger.debug(f"Tag {tag}, Type: {typ}, Value: {repr(value)}") - is_ifd = typ == TiffTags.LONG and isinstance(value, dict) - if is_ifd: - if self._endian == "<": - ifh = b"II\x2A\x00\x08\x00\x00\x00" - else: - ifh = b"MM\x00\x2A\x00\x00\x00\x08" - ifd = ImageFileDirectory_v2(ifh, group=tag) - values = self._tags_v2[tag] - for ifd_tag, ifd_value in values.items(): - ifd[ifd_tag] = ifd_value - data = ifd.tobytes(offset) - else: - values = value if isinstance(value, tuple) else (value,) - data = self._write_dispatch[typ](self, *values) - - tagname = TiffTags.lookup(tag, self.group).name - typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") - msg = f"save: {tagname} ({tag}) - type: {typname} ({typ})" - msg += " - value: " + ( - "" % len(data) if len(data) >= 16 else str(values) - ) - logger.debug(msg) - - # count is sum of lengths for string and arbitrary data - if is_ifd: - count = 1 - elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: - count = len(data) - else: - count = len(values) - # figure out if data fits into the entry - if len(data) <= 4: - entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) - else: - entries.append((tag, typ, count, self._pack("L", offset), data)) - offset += (len(data) + 1) // 2 * 2 # pad to word - - # update strip offset data to point beyond auxiliary data - if stripoffsets is not None: - tag, typ, count, value, data = entries[stripoffsets] - if data: - raise NotImplementedError("multistrip support not yet implemented") - value = self._pack("L", self._unpack("L", value)[0] + offset) - entries[stripoffsets] = tag, typ, count, value, data - - # pass 2: write entries to file - for tag, typ, count, value, data in entries: - logger.debug(f"{tag} {typ} {count} {repr(value)} {repr(data)}") - result += self._pack("HHL4s", tag, typ, count, value) - - # -- overwrite here for multi-page -- - result += b"\0\0\0\0" # end of entries - - # pass 3: write auxiliary data to file - for tag, typ, count, value, data in entries: - result += data - if len(data) & 1: - result += b"\0" - - return result - - def save(self, fp): - - if fp.tell() == 0: # skip TIFF header on subsequent pages - # tiff header -- PIL always starts the first IFD at offset 8 - fp.write(self._prefix + self._pack("HL", 42, 8)) - - offset = fp.tell() - result = self.tobytes(offset) - fp.write(result) - return offset + len(result) - - -ImageFileDirectory_v2._load_dispatch = _load_dispatch -ImageFileDirectory_v2._write_dispatch = _write_dispatch -for idx, name in TYPES.items(): - name = name.replace(" ", "_") - setattr(ImageFileDirectory_v2, "load_" + name, _load_dispatch[idx][1]) - setattr(ImageFileDirectory_v2, "write_" + name, _write_dispatch[idx]) -del _load_dispatch, _write_dispatch, idx, name - - -# Legacy ImageFileDirectory support. -class ImageFileDirectory_v1(ImageFileDirectory_v2): - """This class represents the **legacy** interface to a TIFF tag directory. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v1() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - ('Some Data',) - - Also contains a dictionary of tag types as read from the tiff image file, - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. - - Values are returned as a tuple. - - .. deprecated:: 3.0.0 - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._legacy_api = True - - tags = property(lambda self: self._tags_v1) - tagdata = property(lambda self: self._tagdata) - - # defined in ImageFileDirectory_v2 - tagtype: dict - """Dictionary of tag types""" - - @classmethod - def from_v2(cls, original): - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - - """ - - ifd = cls(prefix=original.prefix) - ifd._tagdata = original._tagdata - ifd.tagtype = original.tagtype - ifd.next = original.next # an indicator for multipage tiffs - return ifd - - def to_v2(self): - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - - """ - - ifd = ImageFileDirectory_v2(prefix=self.prefix) - ifd._tagdata = dict(self._tagdata) - ifd.tagtype = dict(self.tagtype) - ifd._tags_v2 = dict(self._tags_v2) - return ifd - - def __contains__(self, tag): - return tag in self._tags_v1 or tag in self._tagdata - - def __len__(self): - return len(set(self._tagdata) | set(self._tags_v1)) - - def __iter__(self): - return iter(set(self._tagdata) | set(self._tags_v1)) - - def __setitem__(self, tag, value): - for legacy_api in (False, True): - self._setitem(tag, value, legacy_api) - - def __getitem__(self, tag): - if tag not in self._tags_v1: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - for legacy in (False, True): - self._setitem(tag, handler(self, data, legacy), legacy) - val = self._tags_v1[tag] - if not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - -# undone -- switch this pointer when IFD_LEGACY_API == False -ImageFileDirectory = ImageFileDirectory_v1 - - -## -# Image plugin for TIFF files. - - -class TiffImageFile(ImageFile.ImageFile): - - format = "TIFF" - format_description = "Adobe TIFF" - _close_exclusive_fp_after_loading = False - - def __init__(self, fp=None, filename=None): - self.tag_v2 = None - """ Image file directory (tag dictionary) """ - - self.tag = None - """ Legacy tag entries """ - - super().__init__(fp, filename) - - def _open(self): - """Open the first image in a TIFF file""" - - # Header - ifh = self.fp.read(8) - if ifh[2] == 43: - ifh += self.fp.read(8) - - self.tag_v2 = ImageFileDirectory_v2(ifh) - - # legacy IFD entries will be filled in later - self.ifd = None - - # setup frame pointers - self.__first = self.__next = self.tag_v2.next - self.__frame = -1 - self._fp = self.fp - self._frame_pos = [] - self._n_frames = None - - logger.debug("*** TiffImageFile._open ***") - logger.debug(f"- __first: {self.__first}") - logger.debug(f"- ifh: {repr(ifh)}") # Use repr to avoid str(bytes) - - # and load the first frame - self._seek(0) - - @property - def n_frames(self): - if self._n_frames is None: - current = self.tell() - self._seek(len(self._frame_pos)) - while self._n_frames is None: - self._seek(self.tell() + 1) - self.seek(current) - return self._n_frames - - def seek(self, frame): - """Select a given frame as current image""" - if not self._seek_check(frame): - return - self._seek(frame) - # Create a new core image object on second and - # subsequent frames in the image. Image may be - # different size/mode. - Image._decompression_bomb_check(self.size) - self.im = Image.core.new(self.mode, self.size) - - def _seek(self, frame): - self.fp = self._fp - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - while len(self._frame_pos) <= frame: - if not self.__next: - raise EOFError("no more images in TIFF file") - logger.debug( - f"Seeking to frame {frame}, on frame {self.__frame}, " - f"__next {self.__next}, location: {self.fp.tell()}" - ) - self.fp.seek(self.__next) - self._frame_pos.append(self.__next) - logger.debug("Loading tags, location: %s" % self.fp.tell()) - self.tag_v2.load(self.fp) - if self.tag_v2.next in self._frame_pos: - # This IFD has already been processed - # Declare this to be the end of the image - self.__next = 0 - else: - self.__next = self.tag_v2.next - if self.__next == 0: - self._n_frames = frame + 1 - if len(self._frame_pos) == 1: - self.is_animated = self.__next != 0 - self.__frame += 1 - self.fp.seek(self._frame_pos[frame]) - self.tag_v2.load(self.fp) - self._reload_exif() - # fill the legacy tag/ifd entries - self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) - self.__frame = frame - self._setup() - - def tell(self): - """Return the current frame number""" - return self.__frame - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - return self._getxmp(self.tag_v2[700]) if 700 in self.tag_v2 else {} - - def get_photoshop_blocks(self): - """ - Returns a dictionary of Photoshop "Image Resource Blocks". - The keys are the image resource ID. For more information, see - https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 - - :returns: Photoshop "Image Resource Blocks" in a dictionary. - """ - blocks = {} - val = self.tag_v2.get(0x8649) - if val: - while val[:4] == b"8BIM": - id = i16(val[4:6]) - n = math.ceil((val[6] + 1) / 2) * 2 - size = i32(val[6 + n : 10 + n]) - data = val[10 + n : 10 + n + size] - blocks[id] = {"data": data} - - val = val[math.ceil((10 + n + size) / 2) * 2 :] - return blocks - - def load(self): - if self.tile and self.use_load_libtiff: - return self._load_libtiff() - return super().load() - - def load_end(self): - if self._tile_orientation: - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(self._tile_orientation) - if method is not None: - self.im = self.im.transpose(method) - self._size = self.im.size - - # allow closing if we're on the first frame, there's no next - # This is the ImageFile.load path only, libtiff specific below. - if not self.is_animated: - self._close_exclusive_fp_after_loading = True - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - # load IFD data from fp before it is closed - exif = self.getexif() - for key in TiffTags.TAGS_V2_GROUPS.keys(): - if key not in exif: - continue - exif.get_ifd(key) - - def _load_libtiff(self): - """Overload method triggered when we detect a compressed tiff - Calls out to libtiff""" - - Image.Image.load(self) - - self.load_prepare() - - if not len(self.tile) == 1: - raise OSError("Not exactly one tile") - - # (self._compression, (extents tuple), - # 0, (rawmode, self._compression, fp)) - extents = self.tile[0][1] - args = list(self.tile[0][3]) - - # To be nice on memory footprint, if there's a - # file descriptor, use that instead of reading - # into a string in python. - # libtiff closes the file descriptor, so pass in a dup. - try: - fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno()) - # flush the file descriptor, prevents error on pypy 2.4+ - # should also eliminate the need for fp.tell - # in _seek - if hasattr(self.fp, "flush"): - self.fp.flush() - except OSError: - # io.BytesIO have a fileno, but returns an OSError if - # it doesn't use a file descriptor. - fp = False - - if fp: - args[2] = fp - - decoder = Image._getdecoder( - self.mode, "libtiff", tuple(args), self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - except ValueError as e: - raise OSError("Couldn't set the image") from e - - close_self_fp = self._exclusive_fp and not self.is_animated - if hasattr(self.fp, "getvalue"): - # We've got a stringio like thing passed in. Yay for all in memory. - # The decoder needs the entire file in one shot, so there's not - # a lot we can do here other than give it the entire file. - # unless we could do something like get the address of the - # underlying string for stringio. - # - # Rearranging for supporting byteio items, since they have a fileno - # that returns an OSError if there's no underlying fp. Easier to - # deal with here by reordering. - logger.debug("have getvalue. just sending in a string from getvalue") - n, err = decoder.decode(self.fp.getvalue()) - elif fp: - # we've got a actual file on disk, pass in the fp. - logger.debug("have fileno, calling fileno version of the decoder.") - if not close_self_fp: - self.fp.seek(0) - # 4 bytes, otherwise the trace might error out - n, err = decoder.decode(b"fpfp") - else: - # we have something else. - logger.debug("don't have fileno or getvalue. just reading") - self.fp.seek(0) - # UNDONE -- so much for that buffer size thing. - n, err = decoder.decode(self.fp.read()) - - if fp: - try: - os.close(fp) - except OSError: - pass - - self.tile = [] - self.readonly = 0 - - self.load_end() - - # libtiff closed the fp in a, we need to close self.fp, if possible - if close_self_fp: - self.fp.close() - self.fp = None # might be shared - - if err < 0: - raise OSError(err) - - return Image.Image.load(self) - - def _setup(self): - """Setup this image object based on current tags""" - - if 0xBC01 in self.tag_v2: - raise OSError("Windows Media Photo files not yet supported") - - # extract relevant tags - self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] - self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) - - # photometric is a required tag, but not everyone is reading - # the specification - photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) - - # old style jpeg compression images most certainly are YCbCr - if self._compression == "tiff_jpeg": - photo = 6 - - fillorder = self.tag_v2.get(FILLORDER, 1) - - logger.debug("*** Summary ***") - logger.debug(f"- compression: {self._compression}") - logger.debug(f"- photometric_interpretation: {photo}") - logger.debug(f"- planar_configuration: {self._planar_configuration}") - logger.debug(f"- fill_order: {fillorder}") - logger.debug(f"- YCbCr subsampling: {self.tag.get(530)}") - - # size - xsize = int(self.tag_v2.get(IMAGEWIDTH)) - ysize = int(self.tag_v2.get(IMAGELENGTH)) - self._size = xsize, ysize - - logger.debug(f"- size: {self.size}") - - sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) - if len(sample_format) > 1 and max(sample_format) == min(sample_format) == 1: - # SAMPLEFORMAT is properly per band, so an RGB image will - # be (1,1,1). But, we don't support per band pixel types, - # and anything more than one band is a uint8. So, just - # take the first element. Revisit this if adding support - # for more exotic images. - sample_format = (1,) - - bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) - extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) - if photo in (2, 6, 8): # RGB, YCbCr, LAB - bps_count = 3 - elif photo == 5: # CMYK - bps_count = 4 - else: - bps_count = 1 - bps_count += len(extra_tuple) - bps_actual_count = len(bps_tuple) - samples_per_pixel = self.tag_v2.get( - SAMPLESPERPIXEL, - 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, - ) - if samples_per_pixel < bps_actual_count: - # If a file has more values in bps_tuple than expected, - # remove the excess. - bps_tuple = bps_tuple[:samples_per_pixel] - elif samples_per_pixel > bps_actual_count and bps_actual_count == 1: - # If a file has only one value in bps_tuple, when it should have more, - # presume it is the same number of bits for all of the samples. - bps_tuple = bps_tuple * samples_per_pixel - - if len(bps_tuple) != samples_per_pixel: - raise SyntaxError("unknown data organization") - - # mode: check photometric interpretation and bits per pixel - key = ( - self.tag_v2.prefix, - photo, - sample_format, - fillorder, - bps_tuple, - extra_tuple, - ) - logger.debug(f"format key: {key}") - try: - self.mode, rawmode = OPEN_INFO[key] - except KeyError as e: - logger.debug("- unsupported format") - raise SyntaxError("unknown pixel mode") from e - - logger.debug(f"- raw mode: {rawmode}") - logger.debug(f"- pil mode: {self.mode}") - - self.info["compression"] = self._compression - - xres = self.tag_v2.get(X_RESOLUTION, 1) - yres = self.tag_v2.get(Y_RESOLUTION, 1) - - if xres and yres: - resunit = self.tag_v2.get(RESOLUTION_UNIT) - if resunit == 2: # dots per inch - self.info["dpi"] = (xres, yres) - elif resunit == 3: # dots per centimeter. convert to dpi - self.info["dpi"] = (xres * 2.54, yres * 2.54) - elif resunit is None: # used to default to 1, but now 2) - self.info["dpi"] = (xres, yres) - # For backward compatibility, - # we also preserve the old behavior - self.info["resolution"] = xres, yres - else: # No absolute unit of measurement - self.info["resolution"] = xres, yres - - # build tile descriptors - x = y = layer = 0 - self.tile = [] - self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" - if self.use_load_libtiff: - # Decoder expects entire file as one tile. - # There's a buffer size limit in load (64k) - # so large g4 images will fail if we use that - # function. - # - # Setup the one tile for the whole image, then - # use the _load_libtiff function. - - # libtiff handles the fillmode for us, so 1;IR should - # actually be 1;I. Including the R double reverses the - # bits, so stripes of the image are reversed. See - # https://github.com/python-pillow/Pillow/issues/279 - if fillorder == 2: - # Replace fillorder with fillorder=1 - key = key[:3] + (1,) + key[4:] - logger.debug(f"format key: {key}") - # this should always work, since all the - # fillorder==2 modes have a corresponding - # fillorder=1 mode - self.mode, rawmode = OPEN_INFO[key] - # libtiff always returns the bytes in native order. - # we're expecting image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if rawmode == "I;16": - rawmode = "I;16N" - if ";16B" in rawmode: - rawmode = rawmode.replace(";16B", ";16N") - if ";16L" in rawmode: - rawmode = rawmode.replace(";16L", ";16N") - - # YCbCr images with new jpeg compression with pixels in one plane - # unpacked straight into RGB values - if ( - photo == 6 - and self._compression == "jpeg" - and self._planar_configuration == 1 - ): - rawmode = "RGB" - - # Offset in the tile tuple is 0, we go from 0,0 to - # w,h, and we only do this once -- eds - a = (rawmode, self._compression, False, self.tag_v2.offset) - self.tile.append(("libtiff", (0, 0, xsize, ysize), 0, a)) - - elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: - # striped image - if STRIPOFFSETS in self.tag_v2: - offsets = self.tag_v2[STRIPOFFSETS] - h = self.tag_v2.get(ROWSPERSTRIP, ysize) - w = self.size[0] - else: - # tiled image - offsets = self.tag_v2[TILEOFFSETS] - w = self.tag_v2.get(322) - h = self.tag_v2.get(323) - - for offset in offsets: - if x + w > xsize: - stride = w * sum(bps_tuple) / 8 # bytes per line - else: - stride = 0 - - tile_rawmode = rawmode - if self._planar_configuration == 2: - # each band on it's own layer - tile_rawmode = rawmode[layer] - # adjust stride width accordingly - stride /= bps_count - - a = (tile_rawmode, int(stride), 1) - self.tile.append( - ( - self._compression, - (x, y, min(x + w, xsize), min(y + h, ysize)), - offset, - a, - ) - ) - x = x + w - if x >= self.size[0]: - x, y = 0, y + h - if y >= self.size[1]: - x = y = 0 - layer += 1 - else: - logger.debug("- unsupported data organization") - raise SyntaxError("unknown data organization") - - # Fix up info. - if ICCPROFILE in self.tag_v2: - self.info["icc_profile"] = self.tag_v2[ICCPROFILE] - - # fixup palette descriptor - - if self.mode in ["P", "PA"]: - palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] - self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) - - self._tile_orientation = self.tag_v2.get(0x0112) - - -# -# -------------------------------------------------------------------- -# Write TIFF files - -# little endian is default except for image modes with -# explicit big endian byte-order - -SAVE_INFO = { - # mode => rawmode, byteorder, photometrics, - # sampleformat, bitspersample, extra - "1": ("1", II, 1, 1, (1,), None), - "L": ("L", II, 1, 1, (8,), None), - "LA": ("LA", II, 1, 1, (8, 8), 2), - "P": ("P", II, 3, 1, (8,), None), - "PA": ("PA", II, 3, 1, (8, 8), 2), - "I": ("I;32S", II, 1, 2, (32,), None), - "I;16": ("I;16", II, 1, 1, (16,), None), - "I;16S": ("I;16S", II, 1, 2, (16,), None), - "F": ("F;32F", II, 1, 3, (32,), None), - "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), - "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), - "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), - "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), - "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), - "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), - "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), - "I;16B": ("I;16B", MM, 1, 1, (16,), None), - "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), - "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), -} - - -def _save(im, fp, filename): - - try: - rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as TIFF") from e - - ifd = ImageFileDirectory_v2(prefix=prefix) - - encoderinfo = im.encoderinfo - encoderconfig = im.encoderconfig - try: - compression = encoderinfo["compression"] - except KeyError: - compression = im.info.get("compression") - if isinstance(compression, int): - # compression value may be from BMP. Ignore it - compression = None - if compression is None: - compression = "raw" - elif compression == "tiff_jpeg": - # OJPEG is obsolete, so use new-style JPEG compression instead - compression = "jpeg" - elif compression == "tiff_deflate": - compression = "tiff_adobe_deflate" - - libtiff = WRITE_LIBTIFF or compression != "raw" - - # required for color libtiff images - ifd[PLANAR_CONFIGURATION] = 1 - - ifd[IMAGEWIDTH] = im.size[0] - ifd[IMAGELENGTH] = im.size[1] - - # write any arbitrary tags passed in as an ImageFileDirectory - if "tiffinfo" in encoderinfo: - info = encoderinfo["tiffinfo"] - elif "exif" in encoderinfo: - info = encoderinfo["exif"] - if isinstance(info, bytes): - exif = Image.Exif() - exif.load(info) - info = exif - else: - info = {} - logger.debug("Tiffinfo Keys: %s" % list(info)) - if isinstance(info, ImageFileDirectory_v1): - info = info.to_v2() - for key in info: - if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS.keys(): - ifd[key] = info.get_ifd(key) - else: - ifd[key] = info.get(key) - try: - ifd.tagtype[key] = info.tagtype[key] - except Exception: - pass # might not be an IFD. Might not have populated type - - # additions written by Greg Couch, gregc@cgl.ucsf.edu - # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com - if hasattr(im, "tag_v2"): - # preserve tags from original TIFF image file - for key in ( - RESOLUTION_UNIT, - X_RESOLUTION, - Y_RESOLUTION, - IPTC_NAA_CHUNK, - PHOTOSHOP_CHUNK, - XMP, - ): - if key in im.tag_v2: - ifd[key] = im.tag_v2[key] - ifd.tagtype[key] = im.tag_v2.tagtype[key] - - # preserve ICC profile (should also work when saving other formats - # which support profiles as TIFF) -- 2008-06-06 Florian Hoech - icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - ifd[ICCPROFILE] = icc - - for key, name in [ - (IMAGEDESCRIPTION, "description"), - (X_RESOLUTION, "resolution"), - (Y_RESOLUTION, "resolution"), - (X_RESOLUTION, "x_resolution"), - (Y_RESOLUTION, "y_resolution"), - (RESOLUTION_UNIT, "resolution_unit"), - (SOFTWARE, "software"), - (DATE_TIME, "date_time"), - (ARTIST, "artist"), - (COPYRIGHT, "copyright"), - ]: - if name in encoderinfo: - ifd[key] = encoderinfo[name] - - dpi = encoderinfo.get("dpi") - if dpi: - ifd[RESOLUTION_UNIT] = 2 - ifd[X_RESOLUTION] = dpi[0] - ifd[Y_RESOLUTION] = dpi[1] - - if bits != (1,): - ifd[BITSPERSAMPLE] = bits - if len(bits) != 1: - ifd[SAMPLESPERPIXEL] = len(bits) - if extra is not None: - ifd[EXTRASAMPLES] = extra - if format != 1: - ifd[SAMPLEFORMAT] = format - - if PHOTOMETRIC_INTERPRETATION not in ifd: - ifd[PHOTOMETRIC_INTERPRETATION] = photo - elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: - if im.mode == "1": - inverted_im = im.copy() - px = inverted_im.load() - for y in range(inverted_im.height): - for x in range(inverted_im.width): - px[x, y] = 0 if px[x, y] == 255 else 255 - im = inverted_im - else: - im = ImageOps.invert(im) - - if im.mode in ["P", "PA"]: - lut = im.im.getpalette("RGB", "RGB;L") - colormap = [] - colors = len(lut) // 3 - for i in range(3): - colormap += [v * 256 for v in lut[colors * i : colors * (i + 1)]] - colormap += [0] * (256 - colors) - ifd[COLORMAP] = colormap - # data orientation - stride = len(bits) * ((im.size[0] * bits[0] + 7) // 8) - # aim for given strip size (64 KB by default) when using libtiff writer - if libtiff: - rows_per_strip = 1 if stride == 0 else min(STRIP_SIZE // stride, im.size[1]) - # JPEG encoder expects multiple of 8 rows - if compression == "jpeg": - rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, im.size[1]) - else: - rows_per_strip = im.size[1] - if rows_per_strip == 0: - rows_per_strip = 1 - strip_byte_counts = 1 if stride == 0 else stride * rows_per_strip - strips_per_image = (im.size[1] + rows_per_strip - 1) // rows_per_strip - ifd[ROWSPERSTRIP] = rows_per_strip - if strip_byte_counts >= 2**16: - ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG - ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( - stride * im.size[1] - strip_byte_counts * (strips_per_image - 1), - ) - ifd[STRIPOFFSETS] = tuple( - range(0, strip_byte_counts * strips_per_image, strip_byte_counts) - ) # this is adjusted by IFD writer - # no compression by default: - ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) - - if im.mode == "YCbCr": - for tag, value in { - YCBCRSUBSAMPLING: (1, 1), - REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), - }.items(): - ifd.setdefault(tag, value) - - blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] - if libtiff: - if "quality" in encoderinfo: - quality = encoderinfo["quality"] - if not isinstance(quality, int) or quality < 0 or quality > 100: - raise ValueError("Invalid quality setting") - if compression != "jpeg": - raise ValueError( - "quality setting only supported for 'jpeg' compression" - ) - ifd[JPEGQUALITY] = quality - - logger.debug("Saving using libtiff encoder") - logger.debug("Items: %s" % sorted(ifd.items())) - _fp = 0 - if hasattr(fp, "fileno"): - try: - fp.seek(0) - _fp = os.dup(fp.fileno()) - except io.UnsupportedOperation: - pass - - # optional types for non core tags - types = {} - # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library - # based on the data in the strip. - # The other tags expect arrays with a certain length (fixed or depending on - # BITSPERSAMPLE, etc), passing arrays with a different length will result in - # segfaults. Block these tags until we add extra validation. - # SUBIFD may also cause a segfault. - blocklist += [ - REFERENCEBLACKWHITE, - STRIPBYTECOUNTS, - STRIPOFFSETS, - TRANSFERFUNCTION, - SUBIFD, - ] - - # bits per sample is a single short in the tiff directory, not a list. - atts = {BITSPERSAMPLE: bits[0]} - # Merge the ones that we have with (optional) more bits from - # the original file, e.g x,y resolution so that we can - # save(load('')) == original file. - legacy_ifd = {} - if hasattr(im, "tag"): - legacy_ifd = im.tag.to_v2() - - # SAMPLEFORMAT is determined by the image format and should not be copied - # from legacy_ifd. - supplied_tags = {**getattr(im, "tag_v2", {}), **legacy_ifd} - if SAMPLEFORMAT in supplied_tags: - del supplied_tags[SAMPLEFORMAT] - - for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): - # Libtiff can only process certain core items without adding - # them to the custom dictionary. - # Custom items are supported for int, float, unicode, string and byte - # values. Other types and tuples require a tagtype. - if tag not in TiffTags.LIBTIFF_CORE: - if not Image.core.libtiff_support_custom_tags: - continue - - if tag in ifd.tagtype: - types[tag] = ifd.tagtype[tag] - elif not (isinstance(value, (int, float, str, bytes))): - continue - else: - type = TiffTags.lookup(tag).type - if type: - types[tag] = type - if tag not in atts and tag not in blocklist: - if isinstance(value, str): - atts[tag] = value.encode("ascii", "replace") + b"\0" - elif isinstance(value, IFDRational): - atts[tag] = float(value) - else: - atts[tag] = value - - if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: - atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] - - logger.debug("Converted items: %s" % sorted(atts.items())) - - # libtiff always expects the bytes in native order. - # we're storing image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if im.mode in ("I;16B", "I;16"): - rawmode = "I;16N" - - # Pass tags as sorted list so that the tags are set in a fixed order. - # This is required by libtiff for some tags. For example, the JPEGQUALITY - # pseudo tag requires that the COMPRESS tag was already set. - tags = list(atts.items()) - tags.sort() - a = (rawmode, compression, _fp, filename, tags, types) - e = Image._getencoder(im.mode, "libtiff", a, encoderconfig) - e.setimage(im.im, (0, 0) + im.size) - while True: - # undone, change to self.decodermaxblock: - l, s, d = e.encode(16 * 1024) - if not _fp: - fp.write(d) - if s: - break - if s < 0: - raise OSError(f"encoder error {s} when writing image file") - - else: - for tag in blocklist: - del ifd[tag] - offset = ifd.save(fp) - - ImageFile._save( - im, fp, [("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))] - ) - - # -- helper for multi-page save -- - if "_debug_multipage" in encoderinfo: - # just to access o32 and o16 (using correct byte order) - im._debug_multipage = ifd - - -class AppendingTiffWriter: - fieldSizes = [ - 0, # None - 1, # byte - 1, # ascii - 2, # short - 4, # long - 8, # rational - 1, # sbyte - 1, # undefined - 2, # sshort - 4, # slong - 8, # srational - 4, # float - 8, # double - ] - - # StripOffsets = 273 - # FreeOffsets = 288 - # TileOffsets = 324 - # JPEGQTables = 519 - # JPEGDCTables = 520 - # JPEGACTables = 521 - Tags = {273, 288, 324, 519, 520, 521} - - def __init__(self, fn, new=False): - if hasattr(fn, "read"): - self.f = fn - self.close_fp = False - else: - self.name = fn - self.close_fp = True - try: - self.f = open(fn, "w+b" if new else "r+b") - except OSError: - self.f = open(fn, "w+b") - self.beginning = self.f.tell() - self.setup() - - def setup(self): - # Reset everything. - self.f.seek(self.beginning, os.SEEK_SET) - - self.whereToWriteNewIFDOffset = None - self.offsetOfNewPage = 0 - - self.IIMM = iimm = self.f.read(4) - if not iimm: - # empty file - first page - self.isFirst = True - return - - self.isFirst = False - if iimm == b"II\x2a\x00": - self.setEndian("<") - elif iimm == b"MM\x00\x2a": - self.setEndian(">") - else: - raise RuntimeError("Invalid TIFF file header") - - self.skipIFDs() - self.goToEnd() - - def finalize(self): - if self.isFirst: - return - - # fix offsets - self.f.seek(self.offsetOfNewPage) - - iimm = self.f.read(4) - if not iimm: - # raise RuntimeError("nothing written into new page") - # Make it easy to finish a frame without committing to a new one. - return - - if iimm != self.IIMM: - raise RuntimeError("IIMM of new page doesn't match IIMM of first page") - - ifd_offset = self.readLong() - ifd_offset += self.offsetOfNewPage - self.f.seek(self.whereToWriteNewIFDOffset) - self.writeLong(ifd_offset) - self.f.seek(ifd_offset) - self.fixIFD() - - def newFrame(self): - # Call this to finish a frame. - self.finalize() - self.setup() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - if self.close_fp: - self.close() - return False - - def tell(self): - return self.f.tell() - self.offsetOfNewPage - - def seek(self, offset, whence=io.SEEK_SET): - if whence == os.SEEK_SET: - offset += self.offsetOfNewPage - - self.f.seek(offset, whence) - return self.tell() - - def goToEnd(self): - self.f.seek(0, os.SEEK_END) - pos = self.f.tell() - - # pad to 16 byte boundary - pad_bytes = 16 - pos % 16 - if 0 < pad_bytes < 16: - self.f.write(bytes(pad_bytes)) - self.offsetOfNewPage = self.f.tell() - - def setEndian(self, endian): - self.endian = endian - self.longFmt = self.endian + "L" - self.shortFmt = self.endian + "H" - self.tagFormat = self.endian + "HHL" - - def skipIFDs(self): - while True: - ifd_offset = self.readLong() - if ifd_offset == 0: - self.whereToWriteNewIFDOffset = self.f.tell() - 4 - break - - self.f.seek(ifd_offset) - num_tags = self.readShort() - self.f.seek(num_tags * 12, os.SEEK_CUR) - - def write(self, data): - return self.f.write(data) - - def readShort(self): - (value,) = struct.unpack(self.shortFmt, self.f.read(2)) - return value - - def readLong(self): - (value,) = struct.unpack(self.longFmt, self.f.read(4)) - return value - - def rewriteLastShortToLong(self, value): - self.f.seek(-2, os.SEEK_CUR) - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - if bytes_written is not None and bytes_written != 4: - raise RuntimeError(f"wrote only {bytes_written} bytes but wanted 4") - - def rewriteLastShort(self, value): - self.f.seek(-2, os.SEEK_CUR) - bytes_written = self.f.write(struct.pack(self.shortFmt, value)) - if bytes_written is not None and bytes_written != 2: - raise RuntimeError(f"wrote only {bytes_written} bytes but wanted 2") - - def rewriteLastLong(self, value): - self.f.seek(-4, os.SEEK_CUR) - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - if bytes_written is not None and bytes_written != 4: - raise RuntimeError(f"wrote only {bytes_written} bytes but wanted 4") - - def writeShort(self, value): - bytes_written = self.f.write(struct.pack(self.shortFmt, value)) - if bytes_written is not None and bytes_written != 2: - raise RuntimeError(f"wrote only {bytes_written} bytes but wanted 2") - - def writeLong(self, value): - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - if bytes_written is not None and bytes_written != 4: - raise RuntimeError(f"wrote only {bytes_written} bytes but wanted 4") - - def close(self): - self.finalize() - self.f.close() - - def fixIFD(self): - num_tags = self.readShort() - - for i in range(num_tags): - tag, field_type, count = struct.unpack(self.tagFormat, self.f.read(8)) - - field_size = self.fieldSizes[field_type] - total_size = field_size * count - is_local = total_size <= 4 - if not is_local: - offset = self.readLong() - offset += self.offsetOfNewPage - self.rewriteLastLong(offset) - - if tag in self.Tags: - cur_pos = self.f.tell() - - if is_local: - self.fixOffsets( - count, isShort=(field_size == 2), isLong=(field_size == 4) - ) - self.f.seek(cur_pos + 4) - else: - self.f.seek(offset) - self.fixOffsets( - count, isShort=(field_size == 2), isLong=(field_size == 4) - ) - self.f.seek(cur_pos) - - offset = cur_pos = None - - elif is_local: - # skip the locally stored value that is not an offset - self.f.seek(4, os.SEEK_CUR) - - def fixOffsets(self, count, isShort=False, isLong=False): - if not isShort and not isLong: - raise RuntimeError("offset is neither short nor long") - - for i in range(count): - offset = self.readShort() if isShort else self.readLong() - offset += self.offsetOfNewPage - if isShort and offset >= 65536: - # offset is now too large - we must convert shorts to longs - if count != 1: - raise RuntimeError("not implemented") # XXX TODO - - # simple case - the offset is just one and therefore it is - # local (not referenced with another offset) - self.rewriteLastShortToLong(offset) - self.f.seek(-10, os.SEEK_CUR) - self.writeShort(TiffTags.LONG) # rewrite the type to LONG - self.f.seek(8, os.SEEK_CUR) - elif isShort: - self.rewriteLastShort(offset) - else: - self.rewriteLastLong(offset) - - -def _save_all(im, fp, filename): - encoderinfo = im.encoderinfo.copy() - encoderconfig = im.encoderconfig - append_images = list(encoderinfo.get("append_images", [])) - if not hasattr(im, "n_frames") and not append_images: - return _save(im, fp, filename) - - cur_idx = im.tell() - try: - with AppendingTiffWriter(fp) as tf: - for ims in [im] + append_images: - ims.encoderinfo = encoderinfo - ims.encoderconfig = encoderconfig - if not hasattr(ims, "n_frames"): - nfr = 1 - else: - nfr = ims.n_frames - - for idx in range(nfr): - ims.seek(idx) - ims.load() - _save(ims, tf, filename) - tf.newFrame() - finally: - im.seek(cur_idx) - - -# -# -------------------------------------------------------------------- -# Register - -Image.register_open(TiffImageFile.format, TiffImageFile, _accept) -Image.register_save(TiffImageFile.format, _save) -Image.register_save_all(TiffImageFile.format, _save_all) - -Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) - -Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/waypoint_manager/manager_GUI/PIL/TiffTags.py b/waypoint_manager/manager_GUI/PIL/TiffTags.py deleted file mode 100644 index e3094b4..0000000 --- a/waypoint_manager/manager_GUI/PIL/TiffTags.py +++ /dev/null @@ -1,526 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF tags -# -# This module provides clear-text names for various well-known -# TIFF tags. the TIFF codec works just fine without it. -# -# Copyright (c) Secret Labs AB 1999. -# -# See the README file for information on usage and redistribution. -# - -## -# This module provides constants and clear-text names for various -# well-known TIFF tags. -## - -from collections import namedtuple - - -class TagInfo(namedtuple("_TagInfo", "value name type length enum")): - __slots__ = [] - - def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): - return super().__new__(cls, value, name, type, length, enum or {}) - - def cvt_enum(self, value): - # Using get will call hash(value), which can be expensive - # for some types (e.g. Fraction). Since self.enum is rarely - # used, it's usually better to test it first. - return self.enum.get(value, value) if self.enum else value - - -def lookup(tag, group=None): - """ - :param tag: Integer tag number - :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in - - .. versionadded:: 8.3.0 - - :returns: Taginfo namedtuple, From the ``TAGS_V2`` info if possible, - otherwise just populating the value and name from ``TAGS``. - If the tag is not recognized, "unknown" is returned for the name - - """ - - if group is not None: - info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None - else: - info = TAGS_V2.get(tag) - return info or TagInfo(tag, TAGS.get(tag, "unknown")) - - -## -# Map tag numbers to tag info. -# -# id: (Name, Type, Length, enum_values) -# -# The length here differs from the length in the tiff spec. For -# numbers, the tiff spec is for the number of fields returned. We -# agree here. For string-like types, the tiff spec uses the length of -# field in bytes. In Pillow, we are using the number of expected -# fields, in general 1 for string-like types. - - -BYTE = 1 -ASCII = 2 -SHORT = 3 -LONG = 4 -RATIONAL = 5 -SIGNED_BYTE = 6 -UNDEFINED = 7 -SIGNED_SHORT = 8 -SIGNED_LONG = 9 -SIGNED_RATIONAL = 10 -FLOAT = 11 -DOUBLE = 12 -IFD = 13 -LONG8 = 16 - -TAGS_V2 = { - 254: ("NewSubfileType", LONG, 1), - 255: ("SubfileType", SHORT, 1), - 256: ("ImageWidth", LONG, 1), - 257: ("ImageLength", LONG, 1), - 258: ("BitsPerSample", SHORT, 0), - 259: ( - "Compression", - SHORT, - 1, - { - "Uncompressed": 1, - "CCITT 1d": 2, - "Group 3 Fax": 3, - "Group 4 Fax": 4, - "LZW": 5, - "JPEG": 6, - "PackBits": 32773, - }, - ), - 262: ( - "PhotometricInterpretation", - SHORT, - 1, - { - "WhiteIsZero": 0, - "BlackIsZero": 1, - "RGB": 2, - "RGB Palette": 3, - "Transparency Mask": 4, - "CMYK": 5, - "YCbCr": 6, - "CieLAB": 8, - "CFA": 32803, # TIFF/EP, Adobe DNG - "LinearRaw": 32892, # Adobe DNG - }, - ), - 263: ("Threshholding", SHORT, 1), - 264: ("CellWidth", SHORT, 1), - 265: ("CellLength", SHORT, 1), - 266: ("FillOrder", SHORT, 1), - 269: ("DocumentName", ASCII, 1), - 270: ("ImageDescription", ASCII, 1), - 271: ("Make", ASCII, 1), - 272: ("Model", ASCII, 1), - 273: ("StripOffsets", LONG, 0), - 274: ("Orientation", SHORT, 1), - 277: ("SamplesPerPixel", SHORT, 1), - 278: ("RowsPerStrip", LONG, 1), - 279: ("StripByteCounts", LONG, 0), - 280: ("MinSampleValue", SHORT, 0), - 281: ("MaxSampleValue", SHORT, 0), - 282: ("XResolution", RATIONAL, 1), - 283: ("YResolution", RATIONAL, 1), - 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), - 285: ("PageName", ASCII, 1), - 286: ("XPosition", RATIONAL, 1), - 287: ("YPosition", RATIONAL, 1), - 288: ("FreeOffsets", LONG, 1), - 289: ("FreeByteCounts", LONG, 1), - 290: ("GrayResponseUnit", SHORT, 1), - 291: ("GrayResponseCurve", SHORT, 0), - 292: ("T4Options", LONG, 1), - 293: ("T6Options", LONG, 1), - 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), - 297: ("PageNumber", SHORT, 2), - 301: ("TransferFunction", SHORT, 0), - 305: ("Software", ASCII, 1), - 306: ("DateTime", ASCII, 1), - 315: ("Artist", ASCII, 1), - 316: ("HostComputer", ASCII, 1), - 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), - 318: ("WhitePoint", RATIONAL, 2), - 319: ("PrimaryChromaticities", RATIONAL, 6), - 320: ("ColorMap", SHORT, 0), - 321: ("HalftoneHints", SHORT, 2), - 322: ("TileWidth", LONG, 1), - 323: ("TileLength", LONG, 1), - 324: ("TileOffsets", LONG, 0), - 325: ("TileByteCounts", LONG, 0), - 332: ("InkSet", SHORT, 1), - 333: ("InkNames", ASCII, 1), - 334: ("NumberOfInks", SHORT, 1), - 336: ("DotRange", SHORT, 0), - 337: ("TargetPrinter", ASCII, 1), - 338: ("ExtraSamples", SHORT, 0), - 339: ("SampleFormat", SHORT, 0), - 340: ("SMinSampleValue", DOUBLE, 0), - 341: ("SMaxSampleValue", DOUBLE, 0), - 342: ("TransferRange", SHORT, 6), - 347: ("JPEGTables", UNDEFINED, 1), - # obsolete JPEG tags - 512: ("JPEGProc", SHORT, 1), - 513: ("JPEGInterchangeFormat", LONG, 1), - 514: ("JPEGInterchangeFormatLength", LONG, 1), - 515: ("JPEGRestartInterval", SHORT, 1), - 517: ("JPEGLosslessPredictors", SHORT, 0), - 518: ("JPEGPointTransforms", SHORT, 0), - 519: ("JPEGQTables", LONG, 0), - 520: ("JPEGDCTables", LONG, 0), - 521: ("JPEGACTables", LONG, 0), - 529: ("YCbCrCoefficients", RATIONAL, 3), - 530: ("YCbCrSubSampling", SHORT, 2), - 531: ("YCbCrPositioning", SHORT, 1), - 532: ("ReferenceBlackWhite", RATIONAL, 6), - 700: ("XMP", BYTE, 0), - 33432: ("Copyright", ASCII, 1), - 33723: ("IptcNaaInfo", UNDEFINED, 1), - 34377: ("PhotoshopInfo", BYTE, 0), - # FIXME add more tags here - 34665: ("ExifIFD", LONG, 1), - 34675: ("ICCProfile", UNDEFINED, 1), - 34853: ("GPSInfoIFD", LONG, 1), - 36864: ("ExifVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - # MPInfo - 45056: ("MPFVersion", UNDEFINED, 1), - 45057: ("NumberOfImages", LONG, 1), - 45058: ("MPEntry", UNDEFINED, 1), - 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check - 45060: ("TotalFrames", LONG, 1), - 45313: ("MPIndividualNum", LONG, 1), - 45569: ("PanOrientation", LONG, 1), - 45570: ("PanOverlap_H", RATIONAL, 1), - 45571: ("PanOverlap_V", RATIONAL, 1), - 45572: ("BaseViewpointNum", LONG, 1), - 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), - 45574: ("BaselineLength", RATIONAL, 1), - 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), - 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), - 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), - 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), - 45579: ("YawAngle", SIGNED_RATIONAL, 1), - 45580: ("PitchAngle", SIGNED_RATIONAL, 1), - 45581: ("RollAngle", SIGNED_RATIONAL, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), - 50780: ("BestQualityScale", RATIONAL, 1), - 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one - 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 -} -TAGS_V2_GROUPS = { - # ExifIFD - 34665: { - 36864: ("ExifVersion", UNDEFINED, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - }, - # GPSInfoIFD - 34853: {}, - # InteroperabilityIFD - 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, -} - -# Legacy Tags structure -# these tags aren't included above, but were in the previous versions -TAGS = { - 347: "JPEGTables", - 700: "XMP", - # Additional Exif Info - 32932: "Wang Annotation", - 33434: "ExposureTime", - 33437: "FNumber", - 33445: "MD FileTag", - 33446: "MD ScalePixel", - 33447: "MD ColorTable", - 33448: "MD LabName", - 33449: "MD SampleInfo", - 33450: "MD PrepDate", - 33451: "MD PrepTime", - 33452: "MD FileUnits", - 33550: "ModelPixelScaleTag", - 33723: "IptcNaaInfo", - 33918: "INGR Packet Data Tag", - 33919: "INGR Flag Registers", - 33920: "IrasB Transformation Matrix", - 33922: "ModelTiepointTag", - 34264: "ModelTransformationTag", - 34377: "PhotoshopInfo", - 34735: "GeoKeyDirectoryTag", - 34736: "GeoDoubleParamsTag", - 34737: "GeoAsciiParamsTag", - 34850: "ExposureProgram", - 34852: "SpectralSensitivity", - 34855: "ISOSpeedRatings", - 34856: "OECF", - 34864: "SensitivityType", - 34865: "StandardOutputSensitivity", - 34866: "RecommendedExposureIndex", - 34867: "ISOSpeed", - 34868: "ISOSpeedLatitudeyyy", - 34869: "ISOSpeedLatitudezzz", - 34908: "HylaFAX FaxRecvParams", - 34909: "HylaFAX FaxSubAddress", - 34910: "HylaFAX FaxRecvTime", - 36864: "ExifVersion", - 36867: "DateTimeOriginal", - 36868: "DateTImeDigitized", - 37121: "ComponentsConfiguration", - 37122: "CompressedBitsPerPixel", - 37724: "ImageSourceData", - 37377: "ShutterSpeedValue", - 37378: "ApertureValue", - 37379: "BrightnessValue", - 37380: "ExposureBiasValue", - 37381: "MaxApertureValue", - 37382: "SubjectDistance", - 37383: "MeteringMode", - 37384: "LightSource", - 37385: "Flash", - 37386: "FocalLength", - 37396: "SubjectArea", - 37500: "MakerNote", - 37510: "UserComment", - 37520: "SubSec", - 37521: "SubSecTimeOriginal", - 37522: "SubsecTimeDigitized", - 40960: "FlashPixVersion", - 40961: "ColorSpace", - 40962: "PixelXDimension", - 40963: "PixelYDimension", - 40964: "RelatedSoundFile", - 40965: "InteroperabilityIFD", - 41483: "FlashEnergy", - 41484: "SpatialFrequencyResponse", - 41486: "FocalPlaneXResolution", - 41487: "FocalPlaneYResolution", - 41488: "FocalPlaneResolutionUnit", - 41492: "SubjectLocation", - 41493: "ExposureIndex", - 41495: "SensingMethod", - 41728: "FileSource", - 41729: "SceneType", - 41730: "CFAPattern", - 41985: "CustomRendered", - 41986: "ExposureMode", - 41987: "WhiteBalance", - 41988: "DigitalZoomRatio", - 41989: "FocalLengthIn35mmFilm", - 41990: "SceneCaptureType", - 41991: "GainControl", - 41992: "Contrast", - 41993: "Saturation", - 41994: "Sharpness", - 41995: "DeviceSettingDescription", - 41996: "SubjectDistanceRange", - 42016: "ImageUniqueID", - 42032: "CameraOwnerName", - 42033: "BodySerialNumber", - 42034: "LensSpecification", - 42035: "LensMake", - 42036: "LensModel", - 42037: "LensSerialNumber", - 42112: "GDAL_METADATA", - 42113: "GDAL_NODATA", - 42240: "Gamma", - 50215: "Oce Scanjob Description", - 50216: "Oce Application Selector", - 50217: "Oce Identification Number", - 50218: "Oce ImageLogic Characteristics", - # Adobe DNG - 50706: "DNGVersion", - 50707: "DNGBackwardVersion", - 50708: "UniqueCameraModel", - 50709: "LocalizedCameraModel", - 50710: "CFAPlaneColor", - 50711: "CFALayout", - 50712: "LinearizationTable", - 50713: "BlackLevelRepeatDim", - 50714: "BlackLevel", - 50715: "BlackLevelDeltaH", - 50716: "BlackLevelDeltaV", - 50717: "WhiteLevel", - 50718: "DefaultScale", - 50719: "DefaultCropOrigin", - 50720: "DefaultCropSize", - 50721: "ColorMatrix1", - 50722: "ColorMatrix2", - 50723: "CameraCalibration1", - 50724: "CameraCalibration2", - 50725: "ReductionMatrix1", - 50726: "ReductionMatrix2", - 50727: "AnalogBalance", - 50728: "AsShotNeutral", - 50729: "AsShotWhiteXY", - 50730: "BaselineExposure", - 50731: "BaselineNoise", - 50732: "BaselineSharpness", - 50733: "BayerGreenSplit", - 50734: "LinearResponseLimit", - 50735: "CameraSerialNumber", - 50736: "LensInfo", - 50737: "ChromaBlurRadius", - 50738: "AntiAliasStrength", - 50740: "DNGPrivateData", - 50778: "CalibrationIlluminant1", - 50779: "CalibrationIlluminant2", - 50784: "Alias Layer Metadata", -} - - -def _populate(): - for k, v in TAGS_V2.items(): - # Populate legacy structure. - TAGS[k] = v[0] - if len(v) == 4: - for sk, sv in v[3].items(): - TAGS[(k, sv)] = sk - - TAGS_V2[k] = TagInfo(k, *v) - - for group, tags in TAGS_V2_GROUPS.items(): - for k, v in tags.items(): - tags[k] = TagInfo(k, *v) - - -_populate() -## -# Map type numbers to type names -- defined in ImageFileDirectory. - -TYPES = {} - -# was: -# TYPES = { -# 1: "byte", -# 2: "ascii", -# 3: "short", -# 4: "long", -# 5: "rational", -# 6: "signed byte", -# 7: "undefined", -# 8: "signed short", -# 9: "signed long", -# 10: "signed rational", -# 11: "float", -# 12: "double", -# } - -# -# These tags are handled by default in libtiff, without -# adding to the custom dictionary. From tif_dir.c, searching for -# case TIFFTAG in the _TIFFVSetField function: -# Line: item. -# 148: case TIFFTAG_SUBFILETYPE: -# 151: case TIFFTAG_IMAGEWIDTH: -# 154: case TIFFTAG_IMAGELENGTH: -# 157: case TIFFTAG_BITSPERSAMPLE: -# 181: case TIFFTAG_COMPRESSION: -# 202: case TIFFTAG_PHOTOMETRIC: -# 205: case TIFFTAG_THRESHHOLDING: -# 208: case TIFFTAG_FILLORDER: -# 214: case TIFFTAG_ORIENTATION: -# 221: case TIFFTAG_SAMPLESPERPIXEL: -# 228: case TIFFTAG_ROWSPERSTRIP: -# 238: case TIFFTAG_MINSAMPLEVALUE: -# 241: case TIFFTAG_MAXSAMPLEVALUE: -# 244: case TIFFTAG_SMINSAMPLEVALUE: -# 247: case TIFFTAG_SMAXSAMPLEVALUE: -# 250: case TIFFTAG_XRESOLUTION: -# 256: case TIFFTAG_YRESOLUTION: -# 262: case TIFFTAG_PLANARCONFIG: -# 268: case TIFFTAG_XPOSITION: -# 271: case TIFFTAG_YPOSITION: -# 274: case TIFFTAG_RESOLUTIONUNIT: -# 280: case TIFFTAG_PAGENUMBER: -# 284: case TIFFTAG_HALFTONEHINTS: -# 288: case TIFFTAG_COLORMAP: -# 294: case TIFFTAG_EXTRASAMPLES: -# 298: case TIFFTAG_MATTEING: -# 305: case TIFFTAG_TILEWIDTH: -# 316: case TIFFTAG_TILELENGTH: -# 327: case TIFFTAG_TILEDEPTH: -# 333: case TIFFTAG_DATATYPE: -# 344: case TIFFTAG_SAMPLEFORMAT: -# 361: case TIFFTAG_IMAGEDEPTH: -# 364: case TIFFTAG_SUBIFD: -# 376: case TIFFTAG_YCBCRPOSITIONING: -# 379: case TIFFTAG_YCBCRSUBSAMPLING: -# 383: case TIFFTAG_TRANSFERFUNCTION: -# 389: case TIFFTAG_REFERENCEBLACKWHITE: -# 393: case TIFFTAG_INKNAMES: - -# Following pseudo-tags are also handled by default in libtiff: -# TIFFTAG_JPEGQUALITY 65537 - -# some of these are not in our TAGS_V2 dict and were included from tiff.h - -# This list also exists in encode.c -LIBTIFF_CORE = { - 255, - 256, - 257, - 258, - 259, - 262, - 263, - 266, - 274, - 277, - 278, - 280, - 281, - 340, - 341, - 282, - 283, - 284, - 286, - 287, - 296, - 297, - 321, - 320, - 338, - 32995, - 322, - 323, - 32998, - 32996, - 339, - 32997, - 330, - 531, - 530, - 301, - 532, - 333, - # as above - 269, # this has been in our tests forever, and works - 65537, -} - -LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes -LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff -LIBTIFF_CORE.remove(323) # Tiled images -LIBTIFF_CORE.remove(333) # Ink Names either - -# Note to advanced users: There may be combinations of these -# parameters and values that when added properly, will work and -# produce valid tiff images that may work in your application. -# It is safe to add and remove tags from this set from Pillow's point -# of view so long as you test against libtiff. diff --git a/waypoint_manager/manager_GUI/PIL/WalImageFile.py b/waypoint_manager/manager_GUI/PIL/WalImageFile.py deleted file mode 100644 index 0dc695a..0000000 --- a/waypoint_manager/manager_GUI/PIL/WalImageFile.py +++ /dev/null @@ -1,124 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# WAL file handling -# -# History: -# 2003-04-23 fl created -# -# Copyright (c) 2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -This reader is based on the specification available from: -https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml -and has been tested with a few sample files found using google. - -.. note:: - This format cannot be automatically recognized, so the reader - is not registered for use with :py:func:`PIL.Image.open()`. - To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. -""" - -from . import Image, ImageFile -from ._binary import i32le as i32 - - -class WalImageFile(ImageFile.ImageFile): - - format = "WAL" - format_description = "Quake2 Texture" - - def _open(self): - self.mode = "P" - - # read header fields - header = self.fp.read(32 + 24 + 32 + 12) - self._size = i32(header, 32), i32(header, 36) - Image._decompression_bomb_check(self.size) - - # load pixel data - offset = i32(header, 40) - self.fp.seek(offset) - - # strings are null-terminated - self.info["name"] = header[:32].split(b"\0", 1)[0] - next_name = header[56 : 56 + 32].split(b"\0", 1)[0] - if next_name: - self.info["next_name"] = next_name - - def load(self): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self.size[0] * self.size[1])) - self.putpalette(quake2palette) - return Image.Image.load(self) - - -def open(filename): - """ - Load texture from a Quake2 WAL texture file. - - By default, a Quake2 standard palette is attached to the texture. - To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. - - :param filename: WAL file name, or an opened file handle. - :returns: An image instance. - """ - return WalImageFile(filename) - - -quake2palette = ( - # default palette taken from piffo 0.93 by Hans Häggström - b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" - b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" - b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" - b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" - b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" - b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" - b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" - b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" - b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" - b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" - b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" - b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" - b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" - b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" - b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" - b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" - b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" - b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" - b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" - b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" - b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" - b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" - b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" - b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" - b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" - b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" - b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" - b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" - b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" - b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" - b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" - b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" - b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" - b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" - b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" - b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" - b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" - b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" - b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" - b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" - b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" - b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" - b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" - b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" - b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" - b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" - b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" - b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" -) diff --git a/waypoint_manager/manager_GUI/PIL/WebPImagePlugin.py b/waypoint_manager/manager_GUI/PIL/WebPImagePlugin.py deleted file mode 100644 index c1f4b73..0000000 --- a/waypoint_manager/manager_GUI/PIL/WebPImagePlugin.py +++ /dev/null @@ -1,352 +0,0 @@ -from io import BytesIO - -from . import Image, ImageFile - -try: - from . import _webp - - SUPPORTED = True -except ImportError: - SUPPORTED = False - - -_VALID_WEBP_MODES = {"RGBX": True, "RGBA": True, "RGB": True} - -_VALID_WEBP_LEGACY_MODES = {"RGB": True, "RGBA": True} - -_VP8_MODES_BY_IDENTIFIER = { - b"VP8 ": "RGB", - b"VP8X": "RGBA", - b"VP8L": "RGBA", # lossless -} - - -def _accept(prefix): - is_riff_file_format = prefix[:4] == b"RIFF" - is_webp_file = prefix[8:12] == b"WEBP" - is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER - - if is_riff_file_format and is_webp_file and is_valid_vp8_mode: - if not SUPPORTED: - return ( - "image file could not be identified because WEBP support not installed" - ) - return True - - -class WebPImageFile(ImageFile.ImageFile): - - format = "WEBP" - format_description = "WebP image" - __loaded = 0 - __logical_frame = 0 - - def _open(self): - if not _webp.HAVE_WEBPANIM: - # Legacy mode - data, width, height, self.mode, icc_profile, exif = _webp.WebPDecode( - self.fp.read() - ) - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - self._size = width, height - self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] - self.n_frames = 1 - self.is_animated = False - return - - # Use the newer AnimDecoder API to parse the (possibly) animated file, - # and access muxed chunks like ICC/EXIF/XMP. - self._decoder = _webp.WebPAnimDecoder(self.fp.read()) - - # Get info from decoder - width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() - self._size = width, height - self.info["loop"] = loop_count - bg_a, bg_r, bg_g, bg_b = ( - (bgcolor >> 24) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - bgcolor & 0xFF, - ) - self.info["background"] = (bg_r, bg_g, bg_b, bg_a) - self.n_frames = frame_count - self.is_animated = self.n_frames > 1 - self.mode = "RGB" if mode == "RGBX" else mode - self.rawmode = mode - self.tile = [] - - # Attempt to read ICC / EXIF / XMP chunks from file - icc_profile = self._decoder.get_chunk("ICCP") - exif = self._decoder.get_chunk("EXIF") - xmp = self._decoder.get_chunk("XMP ") - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - if xmp: - self.info["xmp"] = xmp - - # Initialize seek state - self._reset(reset=False) - - def _getexif(self): - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def seek(self, frame): - if not self._seek_check(frame): - return - - # Set logical frame to requested position - self.__logical_frame = frame - - def _reset(self, reset=True): - if reset: - self._decoder.reset() - self.__physical_frame = 0 - self.__loaded = -1 - self.__timestamp = 0 - - def _get_next(self): - # Get next frame - ret = self._decoder.get_next() - self.__physical_frame += 1 - - # Check if an error occurred - if ret is None: - self._reset() # Reset just to be safe - self.seek(0) - raise EOFError("failed to decode next frame in WebP file") - - # Compute duration - data, timestamp = ret - duration = timestamp - self.__timestamp - self.__timestamp = timestamp - - # libwebp gives frame end, adjust to start of frame - timestamp -= duration - return data, timestamp, duration - - def _seek(self, frame): - if self.__physical_frame == frame: - return # Nothing to do - if frame < self.__physical_frame: - self._reset() # Rewind to beginning - while self.__physical_frame < frame: - self._get_next() # Advance to the requested frame - - def load(self): - if _webp.HAVE_WEBPANIM: - if self.__loaded != self.__logical_frame: - self._seek(self.__logical_frame) - - # We need to load the image data for this frame - data, timestamp, duration = self._get_next() - self.info["timestamp"] = timestamp - self.info["duration"] = duration - self.__loaded = self.__logical_frame - - # Set tile - if self.fp and self._exclusive_fp: - self.fp.close() - self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] - - return super().load() - - def tell(self): - if not _webp.HAVE_WEBPANIM: - return super().tell() - - return self.__logical_frame - - -def _save_all(im, fp, filename): - encoderinfo = im.encoderinfo.copy() - append_images = list(encoderinfo.get("append_images", [])) - - # If total frame count is 1, then save using the legacy API, which - # will preserve non-alpha modes - total = 0 - for ims in [im] + append_images: - total += getattr(ims, "n_frames", 1) - if total == 1: - _save(im, fp, filename) - return - - background = (0, 0, 0, 0) - if "background" in encoderinfo: - background = encoderinfo["background"] - elif "background" in im.info: - background = im.info["background"] - if isinstance(background, int): - # GifImagePlugin stores a global color table index in - # info["background"]. So it must be converted to an RGBA value - palette = im.getpalette() - if palette: - r, g, b = palette[background * 3 : (background + 1) * 3] - background = (r, g, b, 255) - else: - background = (background, background, background, 255) - - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", 0) - minimize_size = im.encoderinfo.get("minimize_size", False) - kmin = im.encoderinfo.get("kmin", None) - kmax = im.encoderinfo.get("kmax", None) - allow_mixed = im.encoderinfo.get("allow_mixed", False) - verbose = False - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - method = im.encoderinfo.get("method", 0) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - if allow_mixed: - lossless = False - - # Sensible keyframe defaults are from gif2webp.c script - if kmin is None: - kmin = 9 if lossless else 3 - if kmax is None: - kmax = 17 if lossless else 5 - - # Validate background color - if ( - not isinstance(background, (list, tuple)) - or len(background) != 4 - or not all(0 <= v < 256 for v in background) - ): - raise OSError( - f"Background color is not an RGBA tuple clamped to (0-255): {background}" - ) - - # Convert to packed uint - bg_r, bg_g, bg_b, bg_a = background - background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) - - # Setup the WebP animation encoder - enc = _webp.WebPAnimEncoder( - im.size[0], - im.size[1], - background, - loop, - minimize_size, - kmin, - kmax, - allow_mixed, - verbose, - ) - - # Add each frame - frame_idx = 0 - timestamp = 0 - cur_idx = im.tell() - try: - for ims in [im] + append_images: - # Get # of frames in this image - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - ims.load() - - # Make sure image mode is supported - frame = ims - rawmode = ims.mode - if ims.mode not in _VALID_WEBP_MODES: - alpha = ( - "A" in ims.mode - or "a" in ims.mode - or (ims.mode == "P" and "A" in ims.im.getpalettemode()) - ) - rawmode = "RGBA" if alpha else "RGB" - frame = ims.convert(rawmode) - - if rawmode == "RGB": - # For faster conversion, use RGBX - rawmode = "RGBX" - - # Append the frame to the animation encoder - enc.add( - frame.tobytes("raw", rawmode), - timestamp, - frame.size[0], - frame.size[1], - rawmode, - lossless, - quality, - method, - ) - - # Update timestamp and frame index - if isinstance(duration, (list, tuple)): - timestamp += duration[frame_idx] - else: - timestamp += duration - frame_idx += 1 - - finally: - im.seek(cur_idx) - - # Force encoder to flush frames - enc.add(None, timestamp, 0, 0, "", lossless, quality, 0) - - # Get the final output from the encoder - data = enc.assemble(icc_profile, exif, xmp) - if data is None: - raise OSError("cannot write file as WebP (encoder returned None)") - - fp.write(data) - - -def _save(im, fp, filename): - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - method = im.encoderinfo.get("method", 4) - - if im.mode not in _VALID_WEBP_LEGACY_MODES: - alpha = ( - "A" in im.mode - or "a" in im.mode - or (im.mode == "P" and "transparency" in im.info) - ) - im = im.convert("RGBA" if alpha else "RGB") - - data = _webp.WebPEncode( - im.tobytes(), - im.size[0], - im.size[1], - lossless, - float(quality), - im.mode, - icc_profile, - method, - exif, - xmp, - ) - if data is None: - raise OSError("cannot write file as WebP (encoder returned None)") - - fp.write(data) - - -Image.register_open(WebPImageFile.format, WebPImageFile, _accept) -if SUPPORTED: - Image.register_save(WebPImageFile.format, _save) - if _webp.HAVE_WEBPANIM: - Image.register_save_all(WebPImageFile.format, _save_all) - Image.register_extension(WebPImageFile.format, ".webp") - Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/waypoint_manager/manager_GUI/PIL/WmfImagePlugin.py b/waypoint_manager/manager_GUI/PIL/WmfImagePlugin.py deleted file mode 100644 index 2f54cde..0000000 --- a/waypoint_manager/manager_GUI/PIL/WmfImagePlugin.py +++ /dev/null @@ -1,177 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WMF stub codec -# -# history: -# 1996-12-14 fl Created -# 2004-02-22 fl Turned into a stub driver -# 2004-02-23 fl Added EMF support -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -# WMF/EMF reference documentation: -# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf -# http://wvware.sourceforge.net/caolan/index.html -# http://wvware.sourceforge.net/caolan/ora-wmf.html - -from . import Image, ImageFile -from ._binary import i16le as word -from ._binary import si16le as short -from ._binary import si32le as _long - -_handler = None - - -def register_handler(handler): - """ - Install application-specific WMF image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -if hasattr(Image.core, "drawwmf"): - # install default handler (windows only) - - class WmfHandler: - def open(self, im): - im.mode = "RGB" - self.bbox = im.info["wmf_bbox"] - - def load(self, im): - im.fp.seek(0) # rewind - return Image.frombytes( - "RGB", - im.size, - Image.core.drawwmf(im.fp.read(), im.size, self.bbox), - "raw", - "BGR", - (im.size[0] * 3 + 3) & -4, - -1, - ) - - register_handler(WmfHandler()) - -# -# -------------------------------------------------------------------- -# Read WMF file - - -def _accept(prefix): - return ( - prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" - ) - - -## -# Image plugin for Windows metafiles. - - -class WmfStubImageFile(ImageFile.StubImageFile): - - format = "WMF" - format_description = "Windows Metafile" - - def _open(self): - self._inch = None - - # check placable header - s = self.fp.read(80) - - if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": - - # placeable windows metafile - - # get units per inch - self._inch = word(s, 14) - - # get bounding box - x0 = short(s, 6) - y0 = short(s, 8) - x1 = short(s, 10) - y1 = short(s, 12) - - # normalize size to 72 dots per inch - self.info["dpi"] = 72 - size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - # sanity check (standard metafile header) - if s[22:26] != b"\x01\x00\t\x00": - raise SyntaxError("Unsupported WMF file format") - - elif s[:4] == b"\x01\x00\x00\x00" and s[40:44] == b" EMF": - # enhanced metafile - - # get bounding box - x0 = _long(s, 8) - y0 = _long(s, 12) - x1 = _long(s, 16) - y1 = _long(s, 20) - - # get frame (in 0.01 millimeter units) - frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) - - size = x1 - x0, y1 - y0 - - # calculate dots per inch from bbox and frame - xdpi = 2540.0 * (x1 - y0) / (frame[2] - frame[0]) - ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1]) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - if xdpi == ydpi: - self.info["dpi"] = xdpi - else: - self.info["dpi"] = xdpi, ydpi - - else: - raise SyntaxError("Unsupported file format") - - self.mode = "RGB" - self._size = size - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - def load(self, dpi=None): - if dpi is not None and self._inch is not None: - self.info["dpi"] = dpi - x0, y0, x1, y1 = self.info["wmf_bbox"] - self._size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - return super().load() - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("WMF save handler not installed") - _handler.save(im, fp, filename) - - -# -# -------------------------------------------------------------------- -# Registry stuff - - -Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) -Image.register_save(WmfStubImageFile.format, _save) - -Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/waypoint_manager/manager_GUI/PIL/XVThumbImagePlugin.py b/waypoint_manager/manager_GUI/PIL/XVThumbImagePlugin.py deleted file mode 100644 index 4efedb7..0000000 --- a/waypoint_manager/manager_GUI/PIL/XVThumbImagePlugin.py +++ /dev/null @@ -1,78 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XV Thumbnail file handler by Charles E. "Gene" Cash -# (gcash@magicnet.net) -# -# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, -# available from ftp://ftp.cis.upenn.edu/pub/xv/ -# -# history: -# 98-08-15 cec created (b/w only) -# 98-12-09 cec added color palette -# 98-12-28 fl added to PIL (with only a few very minor modifications) -# -# To do: -# FIXME: make save work (this requires quantization support) -# - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -_MAGIC = b"P7 332" - -# standard color palette for thumbnails (RGB332) -PALETTE = b"" -for r in range(8): - for g in range(8): - for b in range(4): - PALETTE = PALETTE + ( - o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) - ) - - -def _accept(prefix): - return prefix[:6] == _MAGIC - - -## -# Image plugin for XV thumbnail images. - - -class XVThumbImageFile(ImageFile.ImageFile): - - format = "XVThumb" - format_description = "XV thumbnail image" - - def _open(self): - - # check magic - if not _accept(self.fp.read(6)): - raise SyntaxError("not an XV thumbnail file") - - # Skip to beginning of next line - self.fp.readline() - - # skip info comments - while True: - s = self.fp.readline() - if not s: - raise SyntaxError("Unexpected EOF reading XV thumbnail file") - if s[0] != 35: # ie. when not a comment: '#' - break - - # parse header line (already read) - s = s.strip().split() - - self.mode = "P" - self._size = int(s[0]), int(s[1]) - - self.palette = ImagePalette.raw("RGB", PALETTE) - - self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))] - - -# -------------------------------------------------------------------- - -Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/waypoint_manager/manager_GUI/PIL/XbmImagePlugin.py b/waypoint_manager/manager_GUI/PIL/XbmImagePlugin.py deleted file mode 100644 index 59acabe..0000000 --- a/waypoint_manager/manager_GUI/PIL/XbmImagePlugin.py +++ /dev/null @@ -1,95 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XBM File handling -# -# History: -# 1995-09-08 fl Created -# 1996-11-01 fl Added save support -# 1997-07-07 fl Made header parser more tolerant -# 1997-07-22 fl Fixed yet another parser bug -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) -# 2004-02-24 fl Allow some whitespace before first #define -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import re - -from . import Image, ImageFile - -# XBM header -xbm_head = re.compile( - rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" - b"(?P" - b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" - b")?" - rb"[\000-\377]*_bits\[]" -) - - -def _accept(prefix): - return prefix.lstrip()[:7] == b"#define" - - -## -# Image plugin for X11 bitmaps. - - -class XbmImageFile(ImageFile.ImageFile): - - format = "XBM" - format_description = "X11 Bitmap" - - def _open(self): - - m = xbm_head.match(self.fp.read(512)) - - if not m: - raise SyntaxError("not a XBM file") - - xsize = int(m.group("width")) - ysize = int(m.group("height")) - - if m.group("hotspot"): - self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) - - self.mode = "1" - self._size = xsize, ysize - - self.tile = [("xbm", (0, 0) + self.size, m.end(), None)] - - -def _save(im, fp, filename): - - if im.mode != "1": - raise OSError(f"cannot write mode {im.mode} as XBM") - - fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) - fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) - - hotspot = im.encoderinfo.get("hotspot") - if hotspot: - fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) - fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) - - fp.write(b"static char im_bits[] = {\n") - - ImageFile._save(im, fp, [("xbm", (0, 0) + im.size, 0, None)]) - - fp.write(b"};\n") - - -Image.register_open(XbmImageFile.format, XbmImageFile, _accept) -Image.register_save(XbmImageFile.format, _save) - -Image.register_extension(XbmImageFile.format, ".xbm") - -Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/waypoint_manager/manager_GUI/PIL/XpmImagePlugin.py b/waypoint_manager/manager_GUI/PIL/XpmImagePlugin.py deleted file mode 100644 index aaed203..0000000 --- a/waypoint_manager/manager_GUI/PIL/XpmImagePlugin.py +++ /dev/null @@ -1,130 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XPM File handling -# -# History: -# 1996-12-29 fl Created -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# - - -import re - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -# XPM header -xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') - - -def _accept(prefix): - return prefix[:9] == b"/* XPM */" - - -## -# Image plugin for X11 pixel maps. - - -class XpmImageFile(ImageFile.ImageFile): - - format = "XPM" - format_description = "X11 Pixel Map" - - def _open(self): - - if not _accept(self.fp.read(9)): - raise SyntaxError("not an XPM file") - - # skip forward to next string - while True: - s = self.fp.readline() - if not s: - raise SyntaxError("broken XPM file") - m = xpm_head.match(s) - if m: - break - - self._size = int(m.group(1)), int(m.group(2)) - - pal = int(m.group(3)) - bpp = int(m.group(4)) - - if pal > 256 or bpp != 1: - raise ValueError("cannot read this XPM file") - - # - # load palette description - - palette = [b"\0\0\0"] * 256 - - for _ in range(pal): - - s = self.fp.readline() - if s[-2:] == b"\r\n": - s = s[:-2] - elif s[-1:] in b"\r\n": - s = s[:-1] - - c = s[1] - s = s[2:-2].split() - - for i in range(0, len(s), 2): - - if s[i] == b"c": - - # process colour key - rgb = s[i + 1] - if rgb == b"None": - self.info["transparency"] = c - elif rgb[:1] == b"#": - # FIXME: handle colour names (see ImagePalette.py) - rgb = int(rgb[1:], 16) - palette[c] = ( - o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) - ) - else: - # unknown colour - raise ValueError("cannot read this XPM file") - break - - else: - - # missing colour key - raise ValueError("cannot read this XPM file") - - self.mode = "P" - self.palette = ImagePalette.raw("RGB", b"".join(palette)) - - self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1))] - - def load_read(self, bytes): - - # - # load all image data in one chunk - - xsize, ysize = self.size - - s = [None] * ysize - - for i in range(ysize): - s[i] = self.fp.readline()[1 : xsize + 1].ljust(xsize) - - return b"".join(s) - - -# -# Registry - - -Image.register_open(XpmImageFile.format, XpmImageFile, _accept) - -Image.register_extension(XpmImageFile.format, ".xpm") - -Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/waypoint_manager/manager_GUI/PIL/__init__.py b/waypoint_manager/manager_GUI/PIL/__init__.py deleted file mode 100644 index e65b155..0000000 --- a/waypoint_manager/manager_GUI/PIL/__init__.py +++ /dev/null @@ -1,80 +0,0 @@ -"""Pillow (Fork of the Python Imaging Library) - -Pillow is the friendly PIL fork by Alex Clark and Contributors. - https://github.com/python-pillow/Pillow/ - -Pillow is forked from PIL 1.1.7. - -PIL is the Python Imaging Library by Fredrik Lundh and Contributors. -Copyright (c) 1999 by Secret Labs AB. - -Use PIL.__version__ for this Pillow version. - -;-) -""" - -from . import _version - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -__version__ = _version.__version__ -del _version - - -_plugins = [ - "BlpImagePlugin", - "BmpImagePlugin", - "BufrStubImagePlugin", - "CurImagePlugin", - "DcxImagePlugin", - "DdsImagePlugin", - "EpsImagePlugin", - "FitsImagePlugin", - "FitsStubImagePlugin", - "FliImagePlugin", - "FpxImagePlugin", - "FtexImagePlugin", - "GbrImagePlugin", - "GifImagePlugin", - "GribStubImagePlugin", - "Hdf5StubImagePlugin", - "IcnsImagePlugin", - "IcoImagePlugin", - "ImImagePlugin", - "ImtImagePlugin", - "IptcImagePlugin", - "JpegImagePlugin", - "Jpeg2KImagePlugin", - "McIdasImagePlugin", - "MicImagePlugin", - "MpegImagePlugin", - "MpoImagePlugin", - "MspImagePlugin", - "PalmImagePlugin", - "PcdImagePlugin", - "PcxImagePlugin", - "PdfImagePlugin", - "PixarImagePlugin", - "PngImagePlugin", - "PpmImagePlugin", - "PsdImagePlugin", - "SgiImagePlugin", - "SpiderImagePlugin", - "SunImagePlugin", - "TgaImagePlugin", - "TiffImagePlugin", - "WebPImagePlugin", - "WmfImagePlugin", - "XbmImagePlugin", - "XpmImagePlugin", - "XVThumbImagePlugin", -] - - -class UnidentifiedImageError(OSError): - """ - Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. - """ - - pass diff --git a/waypoint_manager/manager_GUI/PIL/__main__.py b/waypoint_manager/manager_GUI/PIL/__main__.py deleted file mode 100644 index a05323f..0000000 --- a/waypoint_manager/manager_GUI/PIL/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .features import pilinfo - -pilinfo() diff --git a/waypoint_manager/manager_GUI/PIL/_binary.py b/waypoint_manager/manager_GUI/PIL/_binary.py deleted file mode 100644 index a74ee9e..0000000 --- a/waypoint_manager/manager_GUI/PIL/_binary.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Binary input/output support routines. -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1995-2003 by Fredrik Lundh -# Copyright (c) 2012 by Brian Crowell -# -# See the README file for information on usage and redistribution. -# - - -"""Binary input/output support routines.""" - - -from struct import pack, unpack_from - - -def i8(c): - return c if c.__class__ is int else c[0] - - -def o8(i): - return bytes((i & 255,)) - - -# Input, le = little endian, be = big endian -def i16le(c, o=0): - """ - Converts a 2-bytes (16 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from("h", c, o)[0] - - -def i32le(c, o=0): - """ - Converts a 4-bytes (32 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from("H", c, o)[0] - - -def i32be(c, o=0): - return unpack_from(">I", c, o)[0] - - -# Output, le = little endian, be = big endian -def o16le(i): - return pack("H", i) - - -def o32be(i): - return pack(">I", i) diff --git a/waypoint_manager/manager_GUI/PIL/_deprecate.py b/waypoint_manager/manager_GUI/PIL/_deprecate.py deleted file mode 100644 index 30a8a89..0000000 --- a/waypoint_manager/manager_GUI/PIL/_deprecate.py +++ /dev/null @@ -1,66 +0,0 @@ -from __future__ import annotations - -import warnings - -from . import __version__ - - -def deprecate( - deprecated: str, - when: int | None, - replacement: str | None = None, - *, - action: str | None = None, - plural: bool = False, -) -> None: - """ - Deprecations helper. - - :param deprecated: Name of thing to be deprecated. - :param when: Pillow major version to be removed in. - :param replacement: Name of replacement. - :param action: Instead of "replacement", give a custom call to action - e.g. "Upgrade to new thing". - :param plural: if the deprecated thing is plural, needing "are" instead of "is". - - Usually of the form: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - Use [replacement] instead." - - You can leave out the replacement sentence: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" - - Or with another call to action: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - [action]." - """ - - is_ = "are" if plural else "is" - - if when is None: - removed = "a future version" - elif when <= int(__version__.split(".")[0]): - raise RuntimeError(f"{deprecated} {is_} deprecated and should be removed.") - elif when == 10: - removed = "Pillow 10 (2023-07-01)" - else: - raise ValueError(f"Unknown removal version, update {__name__}?") - - if replacement and action: - raise ValueError("Use only one of 'replacement' and 'action'") - - if replacement: - action = f". Use {replacement} instead." - elif action: - action = f". {action.rstrip('.')}." - else: - action = "" - - warnings.warn( - f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", - DeprecationWarning, - stacklevel=3, - ) diff --git a/waypoint_manager/manager_GUI/PIL/_imaging.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/PIL/_imaging.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 5c27ed8..0000000 --- a/waypoint_manager/manager_GUI/PIL/_imaging.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/_imagingcms.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/PIL/_imagingcms.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index f6b89aa..0000000 --- a/waypoint_manager/manager_GUI/PIL/_imagingcms.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/_imagingft.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/PIL/_imagingft.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 836a1fd..0000000 --- a/waypoint_manager/manager_GUI/PIL/_imagingft.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/_imagingmath.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/PIL/_imagingmath.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 32d255f..0000000 --- a/waypoint_manager/manager_GUI/PIL/_imagingmath.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/_imagingmorph.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/PIL/_imagingmorph.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index ad0e696..0000000 --- a/waypoint_manager/manager_GUI/PIL/_imagingmorph.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/_imagingtk.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/PIL/_imagingtk.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 592592a..0000000 --- a/waypoint_manager/manager_GUI/PIL/_imagingtk.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/_tkinter_finder.py b/waypoint_manager/manager_GUI/PIL/_tkinter_finder.py deleted file mode 100644 index 5cd7e9b..0000000 --- a/waypoint_manager/manager_GUI/PIL/_tkinter_finder.py +++ /dev/null @@ -1,23 +0,0 @@ -""" Find compiled module linking to Tcl / Tk libraries -""" -import sys -import tkinter -from tkinter import _tkinter as tk - -from ._deprecate import deprecate - -try: - if hasattr(sys, "pypy_find_executable"): - TKINTER_LIB = tk.tklib_cffi.__file__ - else: - TKINTER_LIB = tk.__file__ -except AttributeError: - # _tkinter may be compiled directly into Python, in which case __file__ is - # not available. load_tkinter_funcs will check the binary first in any case. - TKINTER_LIB = None - -tk_version = str(tkinter.TkVersion) -if tk_version == "8.4": - deprecate( - "Support for Tk/Tcl 8.4", 10, action="Please upgrade to Tk/Tcl 8.5 or newer" - ) diff --git a/waypoint_manager/manager_GUI/PIL/_util.py b/waypoint_manager/manager_GUI/PIL/_util.py deleted file mode 100644 index ba27b7e..0000000 --- a/waypoint_manager/manager_GUI/PIL/_util.py +++ /dev/null @@ -1,19 +0,0 @@ -import os -from pathlib import Path - - -def is_path(f): - return isinstance(f, (bytes, str, Path)) - - -def is_directory(f): - """Checks if an object is a string, and that it points to a directory.""" - return is_path(f) and os.path.isdir(f) - - -class DeferredError: - def __init__(self, ex): - self.ex = ex - - def __getattr__(self, elt): - raise self.ex diff --git a/waypoint_manager/manager_GUI/PIL/_version.py b/waypoint_manager/manager_GUI/PIL/_version.py deleted file mode 100644 index 3b67ed5..0000000 --- a/waypoint_manager/manager_GUI/PIL/_version.py +++ /dev/null @@ -1,2 +0,0 @@ -# Master version for Pillow -__version__ = "9.2.0" diff --git a/waypoint_manager/manager_GUI/PIL/_webp.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/PIL/_webp.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 68561fb..0000000 --- a/waypoint_manager/manager_GUI/PIL/_webp.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/PIL/features.py b/waypoint_manager/manager_GUI/PIL/features.py deleted file mode 100644 index 3838568..0000000 --- a/waypoint_manager/manager_GUI/PIL/features.py +++ /dev/null @@ -1,320 +0,0 @@ -import collections -import os -import sys -import warnings - -import PIL - -from . import Image - -modules = { - "pil": ("PIL._imaging", "PILLOW_VERSION"), - "tkinter": ("PIL._tkinter_finder", "tk_version"), - "freetype2": ("PIL._imagingft", "freetype2_version"), - "littlecms2": ("PIL._imagingcms", "littlecms_version"), - "webp": ("PIL._webp", "webpdecoder_version"), -} - - -def check_module(feature): - """ - Checks if a module is available. - - :param feature: The module to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if not (feature in modules): - raise ValueError(f"Unknown module {feature}") - - module, ver = modules[feature] - - try: - __import__(module) - return True - except ImportError: - return False - - -def version_module(feature): - """ - :param feature: The module to check for. - :returns: - The loaded version number as a string, or ``None`` if unknown or not available. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if not check_module(feature): - return None - - module, ver = modules[feature] - - if ver is None: - return None - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_modules(): - """ - :returns: A list of all supported modules. - """ - return [f for f in modules if check_module(f)] - - -codecs = { - "jpg": ("jpeg", "jpeglib"), - "jpg_2000": ("jpeg2k", "jp2klib"), - "zlib": ("zip", "zlib"), - "libtiff": ("libtiff", "libtiff"), -} - - -def check_codec(feature): - """ - Checks if a codec is available. - - :param feature: The codec to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if feature not in codecs: - raise ValueError(f"Unknown codec {feature}") - - codec, lib = codecs[feature] - - return codec + "_encoder" in dir(Image.core) - - -def version_codec(feature): - """ - :param feature: The codec to check for. - :returns: - The version number as a string, or ``None`` if not available. - Checked at compile time for ``jpg``, run-time otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if not check_codec(feature): - return None - - codec, lib = codecs[feature] - - version = getattr(Image.core, lib + "_version") - - if feature == "libtiff": - return version.split("\n")[0].split("Version ")[1] - - return version - - -def get_supported_codecs(): - """ - :returns: A list of all supported codecs. - """ - return [f for f in codecs if check_codec(f)] - - -features = { - "webp_anim": ("PIL._webp", "HAVE_WEBPANIM", None), - "webp_mux": ("PIL._webp", "HAVE_WEBPMUX", None), - "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY", None), - "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), - "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), - "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), - "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"), - "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"), - "xcb": ("PIL._imaging", "HAVE_XCB", None), -} - - -def check_feature(feature): - """ - Checks if a feature is available. - - :param feature: The feature to check for. - :returns: ``True`` if available, ``False`` if unavailable, ``None`` if unknown. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if feature not in features: - raise ValueError(f"Unknown feature {feature}") - - module, flag, ver = features[feature] - - try: - imported_module = __import__(module, fromlist=["PIL"]) - return getattr(imported_module, flag) - except ImportError: - return None - - -def version_feature(feature): - """ - :param feature: The feature to check for. - :returns: The version number as a string, or ``None`` if not available. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if not check_feature(feature): - return None - - module, flag, ver = features[feature] - - if ver is None: - return None - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_features(): - """ - :returns: A list of all supported features. - """ - return [f for f in features if check_feature(f)] - - -def check(feature): - """ - :param feature: A module, codec, or feature name. - :returns: - ``True`` if the module, codec, or feature is available, - ``False`` or ``None`` otherwise. - """ - - if feature in modules: - return check_module(feature) - if feature in codecs: - return check_codec(feature) - if feature in features: - return check_feature(feature) - warnings.warn(f"Unknown feature '{feature}'.", stacklevel=2) - return False - - -def version(feature): - """ - :param feature: - The module, codec, or feature to check for. - :returns: - The version number as a string, or ``None`` if unknown or not available. - """ - if feature in modules: - return version_module(feature) - if feature in codecs: - return version_codec(feature) - if feature in features: - return version_feature(feature) - return None - - -def get_supported(): - """ - :returns: A list of all supported modules, features, and codecs. - """ - - ret = get_supported_modules() - ret.extend(get_supported_features()) - ret.extend(get_supported_codecs()) - return ret - - -def pilinfo(out=None, supported_formats=True): - """ - Prints information about this installation of Pillow. - This function can be called with ``python3 -m PIL``. - - :param out: - The output stream to print to. Defaults to ``sys.stdout`` if ``None``. - :param supported_formats: - If ``True``, a list of all supported image file formats will be printed. - """ - - if out is None: - out = sys.stdout - - Image.init() - - print("-" * 68, file=out) - print(f"Pillow {PIL.__version__}", file=out) - py_version = sys.version.splitlines() - print(f"Python {py_version[0].strip()}", file=out) - for py_version in py_version[1:]: - print(f" {py_version.strip()}", file=out) - print("-" * 68, file=out) - print( - f"Python modules loaded from {os.path.dirname(Image.__file__)}", - file=out, - ) - print( - f"Binary modules loaded from {os.path.dirname(Image.core.__file__)}", - file=out, - ) - print("-" * 68, file=out) - - for name, feature in [ - ("pil", "PIL CORE"), - ("tkinter", "TKINTER"), - ("freetype2", "FREETYPE2"), - ("littlecms2", "LITTLECMS2"), - ("webp", "WEBP"), - ("transp_webp", "WEBP Transparency"), - ("webp_mux", "WEBPMUX"), - ("webp_anim", "WEBP Animation"), - ("jpg", "JPEG"), - ("jpg_2000", "OPENJPEG (JPEG2000)"), - ("zlib", "ZLIB (PNG/ZIP)"), - ("libtiff", "LIBTIFF"), - ("raqm", "RAQM (Bidirectional Text)"), - ("libimagequant", "LIBIMAGEQUANT (Quantization method)"), - ("xcb", "XCB (X protocol)"), - ]: - if check(name): - if name == "jpg" and check_feature("libjpeg_turbo"): - v = "libjpeg-turbo " + version_feature("libjpeg_turbo") - else: - v = version(name) - if v is not None: - version_static = name in ("pil", "jpg") - if name == "littlecms2": - # this check is also in src/_imagingcms.c:setup_module() - version_static = tuple(int(x) for x in v.split(".")) < (2, 7) - t = "compiled for" if version_static else "loaded" - if name == "raqm": - for f in ("fribidi", "harfbuzz"): - v2 = version_feature(f) - if v2 is not None: - v += f", {f} {v2}" - print("---", feature, "support ok,", t, v, file=out) - else: - print("---", feature, "support ok", file=out) - else: - print("***", feature, "support not installed", file=out) - print("-" * 68, file=out) - - if supported_formats: - extensions = collections.defaultdict(list) - for ext, i in Image.EXTENSION.items(): - extensions[i].append(ext) - - for i in sorted(Image.ID): - line = f"{i}" - if i in Image.MIME: - line = f"{line} {Image.MIME[i]}" - print(line, file=out) - - if i in extensions: - print( - "Extensions: {}".format(", ".join(sorted(extensions[i]))), file=out - ) - - features = [] - if i in Image.OPEN: - features.append("open") - if i in Image.SAVE: - features.append("save") - if i in Image.SAVE_ALL: - features.append("save_all") - if i in Image.DECODERS: - features.append("decode") - if i in Image.ENCODERS: - features.append("encode") - - print("Features: {}".format(", ".join(features)), file=out) - print("-" * 68, file=out) diff --git a/waypoint_manager/manager_GUI/_ruamel_yaml.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/_ruamel_yaml.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index b570aaf..0000000 --- a/waypoint_manager/manager_GUI/_ruamel_yaml.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/base_library.zip b/waypoint_manager/manager_GUI/base_library.zip deleted file mode 100644 index c4bc9d5..0000000 --- a/waypoint_manager/manager_GUI/base_library.zip +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/icons/delete_param_btn.png b/waypoint_manager/manager_GUI/icons/delete_param_btn.png deleted file mode 100644 index 86f4660..0000000 --- a/waypoint_manager/manager_GUI/icons/delete_param_btn.png +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/icons/new_param_btn.png b/waypoint_manager/manager_GUI/icons/new_param_btn.png deleted file mode 100644 index fdf4e36..0000000 --- a/waypoint_manager/manager_GUI/icons/new_param_btn.png +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_asyncio.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_asyncio.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 8fef11d..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_asyncio.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_bz2.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_bz2.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 12a5ad4..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_bz2.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_codecs_cn.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_codecs_cn.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index bb3c344..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_codecs_cn.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_codecs_hk.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_codecs_hk.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 7a9530f..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_codecs_hk.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_codecs_iso2022.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_codecs_iso2022.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index b3d3e92..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_codecs_iso2022.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_codecs_jp.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_codecs_jp.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index c78e5c6..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_codecs_jp.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_codecs_kr.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_codecs_kr.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index b890ccc..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_codecs_kr.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_codecs_tw.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_codecs_tw.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index a90dc3b..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_codecs_tw.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_contextvars.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_contextvars.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 092fc6a..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_contextvars.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_ctypes.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_ctypes.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 6ca24e9..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_ctypes.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_decimal.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_decimal.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 76e39e1..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_decimal.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_hashlib.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_hashlib.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index c730bb7..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_hashlib.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_lzma.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_lzma.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 2d5e7d4..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_lzma.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_multibytecodec.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_multibytecodec.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index d6a3f5b..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_multibytecodec.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_multiprocessing.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_multiprocessing.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 4b80d33..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_multiprocessing.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_opcode.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_opcode.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 4fe159f..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_opcode.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_posixshmem.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_posixshmem.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index f72df61..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_posixshmem.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_queue.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_queue.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 37dd77c..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_queue.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_ssl.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_ssl.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 36d9fe1..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_ssl.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/_tkinter.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/_tkinter.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index e47377a..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/_tkinter.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/mmap.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/mmap.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index ace1039..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/mmap.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/readline.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/readline.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index e50736b..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/readline.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/resource.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/resource.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 5c93882..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/resource.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/lib-dynload/termios.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/lib-dynload/termios.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index f604d9d..0000000 --- a/waypoint_manager/manager_GUI/lib-dynload/termios.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libBLT.2.5.so.8.6 b/waypoint_manager/manager_GUI/libBLT.2.5.so.8.6 deleted file mode 100755 index 6fe047d..0000000 --- a/waypoint_manager/manager_GUI/libBLT.2.5.so.8.6 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libX11.so.6 b/waypoint_manager/manager_GUI/libX11.so.6 deleted file mode 100755 index f0ef0e8..0000000 --- a/waypoint_manager/manager_GUI/libX11.so.6 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libXau-154567c4.so.6.0.0 b/waypoint_manager/manager_GUI/libXau-154567c4.so.6.0.0 deleted file mode 100755 index 42cf9df..0000000 --- a/waypoint_manager/manager_GUI/libXau-154567c4.so.6.0.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libXau.so.6 b/waypoint_manager/manager_GUI/libXau.so.6 deleted file mode 100755 index 44e16b2..0000000 --- a/waypoint_manager/manager_GUI/libXau.so.6 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libXdmcp.so.6 b/waypoint_manager/manager_GUI/libXdmcp.so.6 deleted file mode 100755 index dd60046..0000000 --- a/waypoint_manager/manager_GUI/libXdmcp.so.6 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libXext.so.6 b/waypoint_manager/manager_GUI/libXext.so.6 deleted file mode 100755 index a051e22..0000000 --- a/waypoint_manager/manager_GUI/libXext.so.6 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libXft.so.2 b/waypoint_manager/manager_GUI/libXft.so.2 deleted file mode 100755 index 06d54b0..0000000 --- a/waypoint_manager/manager_GUI/libXft.so.2 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libXrender.so.1 b/waypoint_manager/manager_GUI/libXrender.so.1 deleted file mode 100755 index 6a45fcd..0000000 --- a/waypoint_manager/manager_GUI/libXrender.so.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libXss.so.1 b/waypoint_manager/manager_GUI/libXss.so.1 deleted file mode 100755 index a380227..0000000 --- a/waypoint_manager/manager_GUI/libXss.so.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libblas.so.3 b/waypoint_manager/manager_GUI/libblas.so.3 deleted file mode 100755 index 0fcedd7..0000000 --- a/waypoint_manager/manager_GUI/libblas.so.3 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libbsd.so.0 b/waypoint_manager/manager_GUI/libbsd.so.0 deleted file mode 100755 index 3a55093..0000000 --- a/waypoint_manager/manager_GUI/libbsd.so.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libbz2.so.1.0 b/waypoint_manager/manager_GUI/libbz2.so.1.0 deleted file mode 100755 index b4f6762..0000000 --- a/waypoint_manager/manager_GUI/libbz2.so.1.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libcrypto.so.1.1 b/waypoint_manager/manager_GUI/libcrypto.so.1.1 deleted file mode 100755 index 27040a8..0000000 --- a/waypoint_manager/manager_GUI/libcrypto.so.1.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libexpat.so.1 b/waypoint_manager/manager_GUI/libexpat.so.1 deleted file mode 100755 index 6fe2a7b..0000000 --- a/waypoint_manager/manager_GUI/libexpat.so.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libffi.so.7 b/waypoint_manager/manager_GUI/libffi.so.7 deleted file mode 100755 index 62ab7da..0000000 --- a/waypoint_manager/manager_GUI/libffi.so.7 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libfontconfig.so.1 b/waypoint_manager/manager_GUI/libfontconfig.so.1 deleted file mode 100755 index f14ece6..0000000 --- a/waypoint_manager/manager_GUI/libfontconfig.so.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libfreetype.so.6 b/waypoint_manager/manager_GUI/libfreetype.so.6 deleted file mode 100755 index 60239ab..0000000 --- a/waypoint_manager/manager_GUI/libfreetype.so.6 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libgcc_s.so.1 b/waypoint_manager/manager_GUI/libgcc_s.so.1 deleted file mode 100755 index 797c5e1..0000000 --- a/waypoint_manager/manager_GUI/libgcc_s.so.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libgfortran.so.5 b/waypoint_manager/manager_GUI/libgfortran.so.5 deleted file mode 100755 index 9e9fd63..0000000 --- a/waypoint_manager/manager_GUI/libgfortran.so.5 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libjpeg-a4c3d5e9.so.62.3.0 b/waypoint_manager/manager_GUI/libjpeg-a4c3d5e9.so.62.3.0 deleted file mode 100755 index d4f0909..0000000 --- a/waypoint_manager/manager_GUI/libjpeg-a4c3d5e9.so.62.3.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/liblapack.so.3 b/waypoint_manager/manager_GUI/liblapack.so.3 deleted file mode 100755 index e29da67..0000000 --- a/waypoint_manager/manager_GUI/liblapack.so.3 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/liblzma-96284f0d.so.5.2.5 b/waypoint_manager/manager_GUI/liblzma-96284f0d.so.5.2.5 deleted file mode 100755 index 426073b..0000000 --- a/waypoint_manager/manager_GUI/liblzma-96284f0d.so.5.2.5 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/liblzma.so.5 b/waypoint_manager/manager_GUI/liblzma.so.5 deleted file mode 100755 index bdd932a..0000000 --- a/waypoint_manager/manager_GUI/liblzma.so.5 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libmpdec.so.2 b/waypoint_manager/manager_GUI/libmpdec.so.2 deleted file mode 100755 index 777ea20..0000000 --- a/waypoint_manager/manager_GUI/libmpdec.so.2 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libopenjp2-8fa4ced9.so.2.5.0 b/waypoint_manager/manager_GUI/libopenjp2-8fa4ced9.so.2.5.0 deleted file mode 100755 index 23f681e..0000000 --- a/waypoint_manager/manager_GUI/libopenjp2-8fa4ced9.so.2.5.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libpng16.so.16 b/waypoint_manager/manager_GUI/libpng16.so.16 deleted file mode 100755 index df5f4ab..0000000 --- a/waypoint_manager/manager_GUI/libpng16.so.16 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libpython3.8.so.1.0 b/waypoint_manager/manager_GUI/libpython3.8.so.1.0 deleted file mode 100755 index edad2df..0000000 --- a/waypoint_manager/manager_GUI/libpython3.8.so.1.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libquadmath.so.0 b/waypoint_manager/manager_GUI/libquadmath.so.0 deleted file mode 100755 index a9efebd..0000000 --- a/waypoint_manager/manager_GUI/libquadmath.so.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libreadline.so.8 b/waypoint_manager/manager_GUI/libreadline.so.8 deleted file mode 100755 index 1a77db9..0000000 --- a/waypoint_manager/manager_GUI/libreadline.so.8 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libssl.so.1.1 b/waypoint_manager/manager_GUI/libssl.so.1.1 deleted file mode 100755 index 55663f1..0000000 --- a/waypoint_manager/manager_GUI/libssl.so.1.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libtcl8.6.so b/waypoint_manager/manager_GUI/libtcl8.6.so deleted file mode 100755 index eaaebee..0000000 --- a/waypoint_manager/manager_GUI/libtcl8.6.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libtiff-f706b4a5.so.5.8.0 b/waypoint_manager/manager_GUI/libtiff-f706b4a5.so.5.8.0 deleted file mode 100755 index 8356284..0000000 --- a/waypoint_manager/manager_GUI/libtiff-f706b4a5.so.5.8.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libtinfo.so.6 b/waypoint_manager/manager_GUI/libtinfo.so.6 deleted file mode 100755 index 405ebed..0000000 --- a/waypoint_manager/manager_GUI/libtinfo.so.6 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libtk8.6.so b/waypoint_manager/manager_GUI/libtk8.6.so deleted file mode 100755 index 579ef84..0000000 --- a/waypoint_manager/manager_GUI/libtk8.6.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libuuid.so.1 b/waypoint_manager/manager_GUI/libuuid.so.1 deleted file mode 100755 index 68cc1e8..0000000 --- a/waypoint_manager/manager_GUI/libuuid.so.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libwebp-a2d91712.so.7.1.3 b/waypoint_manager/manager_GUI/libwebp-a2d91712.so.7.1.3 deleted file mode 100755 index 46d7e70..0000000 --- a/waypoint_manager/manager_GUI/libwebp-a2d91712.so.7.1.3 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libwebpdemux-df590b8f.so.2.0.9 b/waypoint_manager/manager_GUI/libwebpdemux-df590b8f.so.2.0.9 deleted file mode 100755 index a7e5fab..0000000 --- a/waypoint_manager/manager_GUI/libwebpdemux-df590b8f.so.2.0.9 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libwebpmux-625e1d4a.so.3.0.8 b/waypoint_manager/manager_GUI/libwebpmux-625e1d4a.so.3.0.8 deleted file mode 100755 index 3f69eef..0000000 --- a/waypoint_manager/manager_GUI/libwebpmux-625e1d4a.so.3.0.8 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libxcb-4971137c.so.1.1.0 b/waypoint_manager/manager_GUI/libxcb-4971137c.so.1.1.0 deleted file mode 100755 index 99a0236..0000000 --- a/waypoint_manager/manager_GUI/libxcb-4971137c.so.1.1.0 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/libz.so.1 b/waypoint_manager/manager_GUI/libz.so.1 deleted file mode 100755 index 1a5407f..0000000 --- a/waypoint_manager/manager_GUI/libz.so.1 +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/manager_GUI b/waypoint_manager/manager_GUI/manager_GUI deleted file mode 100755 index 825fb12..0000000 --- a/waypoint_manager/manager_GUI/manager_GUI +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/core/_multiarray_tests.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/core/_multiarray_tests.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 3f3e662..0000000 --- a/waypoint_manager/manager_GUI/numpy/core/_multiarray_tests.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index ae525a4..0000000 --- a/waypoint_manager/manager_GUI/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/fft/_pocketfft_internal.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/fft/_pocketfft_internal.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 3fb2c9a..0000000 --- a/waypoint_manager/manager_GUI/numpy/fft/_pocketfft_internal.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/linalg/_umath_linalg.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/linalg/_umath_linalg.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 7887c2b..0000000 --- a/waypoint_manager/manager_GUI/numpy/linalg/_umath_linalg.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/linalg/lapack_lite.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/linalg/lapack_lite.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 424d2af..0000000 --- a/waypoint_manager/manager_GUI/numpy/linalg/lapack_lite.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/bit_generator.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/bit_generator.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index f7209cd..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/bit_generator.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/bounded_integers.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/bounded_integers.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 6fb07ad..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/bounded_integers.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/common.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/common.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index ba451ae..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/common.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/generator.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/generator.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 8dd20a3..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/generator.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/mt19937.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/mt19937.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index f6055fd..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/mt19937.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/mtrand.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/mtrand.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 5005165..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/mtrand.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/pcg64.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/pcg64.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index d08d007..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/pcg64.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/philox.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/philox.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index a80ec4b..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/philox.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/numpy/random/sfc64.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/numpy/random/sfc64.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index c8b9d5e..0000000 --- a/waypoint_manager/manager_GUI/numpy/random/sfc64.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/quaternion/numpy_quaternion.cpython-38-x86_64-linux-gnu.so b/waypoint_manager/manager_GUI/quaternion/numpy_quaternion.cpython-38-x86_64-linux-gnu.so deleted file mode 100755 index 29b62c7..0000000 --- a/waypoint_manager/manager_GUI/quaternion/numpy_quaternion.cpython-38-x86_64-linux-gnu.so +++ /dev/null Binary files differ diff --git a/waypoint_manager/manager_GUI/tcl/auto.tcl b/waypoint_manager/manager_GUI/tcl/auto.tcl deleted file mode 100644 index a7a8979..0000000 --- a/waypoint_manager/manager_GUI/tcl/auto.tcl +++ /dev/null @@ -1,646 +0,0 @@ -# auto.tcl -- -# -# utility procs formerly in init.tcl dealing with auto execution of commands -# and can be auto loaded themselves. -# -# Copyright (c) 1991-1993 The Regents of the University of California. -# Copyright (c) 1994-1998 Sun Microsystems, Inc. -# -# See the file "license.terms" for information on usage and redistribution of -# this file, and for a DISCLAIMER OF ALL WARRANTIES. -# - -# auto_reset -- -# -# Destroy all cached information for auto-loading and auto-execution, so that -# the information gets recomputed the next time it's needed. Also delete any -# commands that are listed in the auto-load index. -# -# Arguments: -# None. - -proc auto_reset {} { - global auto_execs auto_index auto_path - if {[array exists auto_index]} { - foreach cmdName [array names auto_index] { - set fqcn [namespace which $cmdName] - if {$fqcn eq ""} { - continue - } - rename $fqcn {} - } - } - unset -nocomplain auto_execs auto_index ::tcl::auto_oldpath - if {[catch {llength $auto_path}]} { - set auto_path [list [info library]] - } elseif {[info library] ni $auto_path} { - lappend auto_path [info library] - } -} - -# tcl_findLibrary -- -# -# This is a utility for extensions that searches for a library directory -# using a canonical searching algorithm. A side effect is to source the -# initialization script and set a global library variable. -# -# Arguments: -# basename Prefix of the directory name, (e.g., "tk") -# version Version number of the package, (e.g., "8.0") -# patch Patchlevel of the package, (e.g., "8.0.3") -# initScript Initialization script to source (e.g., tk.tcl) -# enVarName environment variable to honor (e.g., TK_LIBRARY) -# varName Global variable to set when done (e.g., tk_library) - -proc tcl_findLibrary {basename version patch initScript enVarName varName} { - upvar #0 $varName the_library - global auto_path env tcl_platform - - set dirs {} - set errors {} - - # The C application may have hardwired a path, which we honor - - if {[info exists the_library] && $the_library ne ""} { - lappend dirs $the_library - } else { - # Do the canonical search - - # 1. From an environment variable, if it exists. Placing this first - # gives the end-user ultimate control to work-around any bugs, or - # to customize. - - if {[info exists env($enVarName)]} { - lappend dirs $env($enVarName) - } - - # 2. In the package script directory registered within the - # configuration of the package itself. - - catch { - lappend dirs [::${basename}::pkgconfig get scriptdir,runtime] - } - - # 3. Relative to auto_path directories. This checks relative to the - # Tcl library as well as allowing loading of libraries added to the - # auto_path that is not relative to the core library or binary paths. - foreach d $auto_path { - lappend dirs [file join $d $basename$version] - if {$tcl_platform(platform) eq "unix" - && $tcl_platform(os) eq "Darwin"} { - # 4. On MacOSX, check the Resources/Scripts subdir too - lappend dirs [file join $d $basename$version Resources Scripts] - } - } - - # 3. Various locations relative to the executable - # ../lib/foo1.0 (From bin directory in install hierarchy) - # ../../lib/foo1.0 (From bin/arch directory in install hierarchy) - # ../library (From unix directory in build hierarchy) - # - # Remaining locations are out of date (when relevant, they ought to be - # covered by the $::auto_path seach above) and disabled. - # - # ../../library (From unix/arch directory in build hierarchy) - # ../../foo1.0.1/library - # (From unix directory in parallel build hierarchy) - # ../../../foo1.0.1/library - # (From unix/arch directory in parallel build hierarchy) - - set parentDir [file dirname [file dirname [info nameofexecutable]]] - set grandParentDir [file dirname $parentDir] - lappend dirs [file join $parentDir lib $basename$version] - lappend dirs [file join $grandParentDir lib $basename$version] - lappend dirs [file join $parentDir library] - if {0} { - lappend dirs [file join $grandParentDir library] - lappend dirs [file join $grandParentDir $basename$patch library] - lappend dirs [file join [file dirname $grandParentDir] \ - $basename$patch library] - } - } - # uniquify $dirs in order - array set seen {} - foreach i $dirs { - # Make sure $i is unique under normalization. Avoid repeated [source]. - if {[interp issafe]} { - # Safe interps have no [file normalize]. - set norm $i - } else { - set norm [file normalize $i] - } - if {[info exists seen($norm)]} { - continue - } - set seen($norm) {} - - set the_library $i - set file [file join $i $initScript] - - # source everything when in a safe interpreter because we have a - # source command, but no file exists command - - if {[interp issafe] || [file exists $file]} { - if {![catch {uplevel #0 [list source $file]} msg opts]} { - return - } - append errors "$file: $msg\n" - append errors [dict get $opts -errorinfo]\n - } - } - unset -nocomplain the_library - set msg "Can't find a usable $initScript in the following directories: \n" - append msg " $dirs\n\n" - append msg "$errors\n\n" - append msg "This probably means that $basename wasn't installed properly.\n" - error $msg -} - - -# ---------------------------------------------------------------------- -# auto_mkindex -# ---------------------------------------------------------------------- -# The following procedures are used to generate the tclIndex file from Tcl -# source files. They use a special safe interpreter to parse Tcl source -# files, writing out index entries as "proc" commands are encountered. This -# implementation won't work in a safe interpreter, since a safe interpreter -# can't create the special parser and mess with its commands. - -if {[interp issafe]} { - return ;# Stop sourcing the file here -} - -# auto_mkindex -- -# Regenerate a tclIndex file from Tcl source files. Takes as argument the -# name of the directory in which the tclIndex file is to be placed, followed -# by any number of glob patterns to use in that directory to locate all of the -# relevant files. -# -# Arguments: -# dir - Name of the directory in which to create an index. - -# args - Any number of additional arguments giving the names of files -# within dir. If no additional are given auto_mkindex will look -# for *.tcl. - -proc auto_mkindex {dir args} { - if {[interp issafe]} { - error "can't generate index within safe interpreter" - } - - set oldDir [pwd] - cd $dir - - append index "# Tcl autoload index file, version 2.0\n" - append index "# This file is generated by the \"auto_mkindex\" command\n" - append index "# and sourced to set up indexing information for one or\n" - append index "# more commands. Typically each line is a command that\n" - append index "# sets an element in the auto_index array, where the\n" - append index "# element name is the name of a command and the value is\n" - append index "# a script that loads the command.\n\n" - if {![llength $args]} { - set args *.tcl - } - - auto_mkindex_parser::init - foreach file [lsort [glob -- {*}$args]] { - try { - append index [auto_mkindex_parser::mkindex $file] - } on error {msg opts} { - cd $oldDir - return -options $opts $msg - } - } - auto_mkindex_parser::cleanup - - set fid [open "tclIndex" w] - puts -nonewline $fid $index - close $fid - cd $oldDir -} - -# Original version of auto_mkindex that just searches the source code for -# "proc" at the beginning of the line. - -proc auto_mkindex_old {dir args} { - set oldDir [pwd] - cd $dir - set dir [pwd] - append index "# Tcl autoload index file, version 2.0\n" - append index "# This file is generated by the \"auto_mkindex\" command\n" - append index "# and sourced to set up indexing information for one or\n" - append index "# more commands. Typically each line is a command that\n" - append index "# sets an element in the auto_index array, where the\n" - append index "# element name is the name of a command and the value is\n" - append index "# a script that loads the command.\n\n" - if {![llength $args]} { - set args *.tcl - } - foreach file [lsort [glob -- {*}$args]] { - set f "" - set error [catch { - set f [open $file] - while {[gets $f line] >= 0} { - if {[regexp {^proc[ ]+([^ ]*)} $line match procName]} { - set procName [lindex [auto_qualify $procName "::"] 0] - append index "set [list auto_index($procName)]" - append index " \[list source \[file join \$dir [list $file]\]\]\n" - } - } - close $f - } msg opts] - if {$error} { - catch {close $f} - cd $oldDir - return -options $opts $msg - } - } - set f "" - set error [catch { - set f [open tclIndex w] - puts -nonewline $f $index - close $f - cd $oldDir - } msg opts] - if {$error} { - catch {close $f} - cd $oldDir - error $msg $info $code - return -options $opts $msg - } -} - -# Create a safe interpreter that can be used to parse Tcl source files -# generate a tclIndex file for autoloading. This interp contains commands for -# things that need index entries. Each time a command is executed, it writes -# an entry out to the index file. - -namespace eval auto_mkindex_parser { - variable parser "" ;# parser used to build index - variable index "" ;# maintains index as it is built - variable scriptFile "" ;# name of file being processed - variable contextStack "" ;# stack of namespace scopes - variable imports "" ;# keeps track of all imported cmds - variable initCommands ;# list of commands that create aliases - if {![info exists initCommands]} { - set initCommands [list] - } - - proc init {} { - variable parser - variable initCommands - - if {![interp issafe]} { - set parser [interp create -safe] - $parser hide info - $parser hide rename - $parser hide proc - $parser hide namespace - $parser hide eval - $parser hide puts - foreach ns [$parser invokehidden namespace children ::] { - # MUST NOT DELETE "::tcl" OR BAD THINGS HAPPEN! - if {$ns eq "::tcl"} continue - $parser invokehidden namespace delete $ns - } - foreach cmd [$parser invokehidden info commands ::*] { - $parser invokehidden rename $cmd {} - } - $parser invokehidden proc unknown {args} {} - - # We'll need access to the "namespace" command within the - # interp. Put it back, but move it out of the way. - - $parser expose namespace - $parser invokehidden rename namespace _%@namespace - $parser expose eval - $parser invokehidden rename eval _%@eval - - # Install all the registered psuedo-command implementations - - foreach cmd $initCommands { - eval $cmd - } - } - } - proc cleanup {} { - variable parser - interp delete $parser - unset parser - } -} - -# auto_mkindex_parser::mkindex -- -# -# Used by the "auto_mkindex" command to create a "tclIndex" file for the given -# Tcl source file. Executes the commands in the file, and handles things like -# the "proc" command by adding an entry for the index file. Returns a string -# that represents the index file. -# -# Arguments: -# file Name of Tcl source file to be indexed. - -proc auto_mkindex_parser::mkindex {file} { - variable parser - variable index - variable scriptFile - variable contextStack - variable imports - - set scriptFile $file - - set fid [open $file] - set contents [read $fid] - close $fid - - # There is one problem with sourcing files into the safe interpreter: - # references like "$x" will fail since code is not really being executed - # and variables do not really exist. To avoid this, we replace all $ with - # \0 (literally, the null char) later, when getting proc names we will - # have to reverse this replacement, in case there were any $ in the proc - # name. This will cause a problem if somebody actually tries to have a \0 - # in their proc name. Too bad for them. - set contents [string map [list \$ \0] $contents] - - set index "" - set contextStack "" - set imports "" - - $parser eval $contents - - foreach name $imports { - catch {$parser eval [list _%@namespace forget $name]} - } - return $index -} - -# auto_mkindex_parser::hook command -# -# Registers a Tcl command to evaluate when initializing the slave interpreter -# used by the mkindex parser. The command is evaluated in the master -# interpreter, and can use the variable auto_mkindex_parser::parser to get to -# the slave - -proc auto_mkindex_parser::hook {cmd} { - variable initCommands - - lappend initCommands $cmd -} - -# auto_mkindex_parser::slavehook command -# -# Registers a Tcl command to evaluate when initializing the slave interpreter -# used by the mkindex parser. The command is evaluated in the slave -# interpreter. - -proc auto_mkindex_parser::slavehook {cmd} { - variable initCommands - - # The $parser variable is defined to be the name of the slave interpreter - # when this command is used later. - - lappend initCommands "\$parser eval [list $cmd]" -} - -# auto_mkindex_parser::command -- -# -# Registers a new command with the "auto_mkindex_parser" interpreter that -# parses Tcl files. These commands are fake versions of things like the -# "proc" command. When you execute them, they simply write out an entry to a -# "tclIndex" file for auto-loading. -# -# This procedure allows extensions to register their own commands with the -# auto_mkindex facility. For example, a package like [incr Tcl] might -# register a "class" command so that class definitions could be added to a -# "tclIndex" file for auto-loading. -# -# Arguments: -# name Name of command recognized in Tcl files. -# arglist Argument list for command. -# body Implementation of command to handle indexing. - -proc auto_mkindex_parser::command {name arglist body} { - hook [list auto_mkindex_parser::commandInit $name $arglist $body] -} - -# auto_mkindex_parser::commandInit -- -# -# This does the actual work set up by auto_mkindex_parser::command. This is -# called when the interpreter used by the parser is created. -# -# Arguments: -# name Name of command recognized in Tcl files. -# arglist Argument list for command. -# body Implementation of command to handle indexing. - -proc auto_mkindex_parser::commandInit {name arglist body} { - variable parser - - set ns [namespace qualifiers $name] - set tail [namespace tail $name] - if {$ns eq ""} { - set fakeName [namespace current]::_%@fake_$tail - } else { - set fakeName [namespace current]::[string map {:: _} _%@fake_$name] - } - proc $fakeName $arglist $body - - # YUK! Tcl won't let us alias fully qualified command names, so we can't - # handle names like "::itcl::class". Instead, we have to build procs with - # the fully qualified names, and have the procs point to the aliases. - - if {[string match *::* $name]} { - set exportCmd [list _%@namespace export [namespace tail $name]] - $parser eval [list _%@namespace eval $ns $exportCmd] - - # The following proc definition does not work if you want to tolerate - # space or something else diabolical in the procedure name, (i.e., - # space in $alias). The following does not work: - # "_%@eval {$alias} \$args" - # because $alias gets concat'ed to $args. The following does not work - # because $cmd is somehow undefined - # "set cmd {$alias} \; _%@eval {\$cmd} \$args" - # A gold star to someone that can make test autoMkindex-3.3 work - # properly - - set alias [namespace tail $fakeName] - $parser invokehidden proc $name {args} "_%@eval {$alias} \$args" - $parser alias $alias $fakeName - } else { - $parser alias $name $fakeName - } - return -} - -# auto_mkindex_parser::fullname -- -# -# Used by commands like "proc" within the auto_mkindex parser. Returns the -# qualified namespace name for the "name" argument. If the "name" does not -# start with "::", elements are added from the current namespace stack to -# produce a qualified name. Then, the name is examined to see whether or not -# it should really be qualified. If the name has more than the leading "::", -# it is returned as a fully qualified name. Otherwise, it is returned as a -# simple name. That way, the Tcl autoloader will recognize it properly. -# -# Arguments: -# name - Name that is being added to index. - -proc auto_mkindex_parser::fullname {name} { - variable contextStack - - if {![string match ::* $name]} { - foreach ns $contextStack { - set name "${ns}::$name" - if {[string match ::* $name]} { - break - } - } - } - - if {[namespace qualifiers $name] eq ""} { - set name [namespace tail $name] - } elseif {![string match ::* $name]} { - set name "::$name" - } - - # Earlier, mkindex replaced all $'s with \0. Now, we have to reverse that - # replacement. - return [string map [list \0 \$] $name] -} - -# auto_mkindex_parser::indexEntry -- -# -# Used by commands like "proc" within the auto_mkindex parser to add a -# correctly-quoted entry to the index. This is shared code so it is done -# *right*, in one place. -# -# Arguments: -# name - Name that is being added to index. - -proc auto_mkindex_parser::indexEntry {name} { - variable index - variable scriptFile - - # We convert all metacharacters to their backslashed form, and pre-split - # the file name that we know about (which will be a proper list, and so - # correctly quoted). - - set name [string range [list \}[fullname $name]] 2 end] - set filenameParts [file split $scriptFile] - - append index [format \ - {set auto_index(%s) [list source [file join $dir %s]]%s} \ - $name $filenameParts \n] - return -} - -if {[llength $::auto_mkindex_parser::initCommands]} { - return -} - -# Register all of the procedures for the auto_mkindex parser that will build -# the "tclIndex" file. - -# AUTO MKINDEX: proc name arglist body -# Adds an entry to the auto index list for the given procedure name. - -auto_mkindex_parser::command proc {name args} { - indexEntry $name -} - -# Conditionally add support for Tcl byte code files. There are some tricky -# details here. First, we need to get the tbcload library initialized in the -# current interpreter. We cannot load tbcload into the slave until we have -# done so because it needs access to the tcl_patchLevel variable. Second, -# because the package index file may defer loading the library until we invoke -# a command, we need to explicitly invoke auto_load to force it to be loaded. -# This should be a noop if the package has already been loaded - -auto_mkindex_parser::hook { - try { - package require tbcload - } on error {} { - # OK, don't have it so do nothing - } on ok {} { - if {[namespace which -command tbcload::bcproc] eq ""} { - auto_load tbcload::bcproc - } - load {} tbcload $auto_mkindex_parser::parser - - # AUTO MKINDEX: tbcload::bcproc name arglist body - # Adds an entry to the auto index list for the given pre-compiled - # procedure name. - - auto_mkindex_parser::commandInit tbcload::bcproc {name args} { - indexEntry $name - } - } -} - -# AUTO MKINDEX: namespace eval name command ?arg arg...? -# Adds the namespace name onto the context stack and evaluates the associated -# body of commands. -# -# AUTO MKINDEX: namespace import ?-force? pattern ?pattern...? -# Performs the "import" action in the parser interpreter. This is important -# for any commands contained in a namespace that affect the index. For -# example, a script may say "itcl::class ...", or it may import "itcl::*" and -# then say "class ...". This procedure does the import operation, but keeps -# track of imported patterns so we can remove the imports later. - -auto_mkindex_parser::command namespace {op args} { - switch -- $op { - eval { - variable parser - variable contextStack - - set name [lindex $args 0] - set args [lrange $args 1 end] - - set contextStack [linsert $contextStack 0 $name] - $parser eval [list _%@namespace eval $name] $args - set contextStack [lrange $contextStack 1 end] - } - import { - variable parser - variable imports - foreach pattern $args { - if {$pattern ne "-force"} { - lappend imports $pattern - } - } - catch {$parser eval "_%@namespace import $args"} - } - ensemble { - variable parser - variable contextStack - if {[lindex $args 0] eq "create"} { - set name ::[join [lreverse $contextStack] ::] - catch { - set name [dict get [lrange $args 1 end] -command] - if {![string match ::* $name]} { - set name ::[join [lreverse $contextStack] ::]$name - } - regsub -all ::+ $name :: name - } - # create artifical proc to force an entry in the tclIndex - $parser eval [list ::proc $name {} {}] - } - } - } -} - -# AUTO MKINDEX: oo::class create name ?definition? -# Adds an entry to the auto index list for the given class name. -auto_mkindex_parser::command oo::class {op name {body ""}} { - if {$op eq "create"} { - indexEntry $name - } -} -auto_mkindex_parser::command class {op name {body ""}} { - if {$op eq "create"} { - indexEntry $name - } -} - -return diff --git a/waypoint_manager/manager_GUI/tcl/clock.tcl b/waypoint_manager/manager_GUI/tcl/clock.tcl deleted file mode 100644 index 8e4b657..0000000 --- a/waypoint_manager/manager_GUI/tcl/clock.tcl +++ /dev/null @@ -1,4547 +0,0 @@ -#---------------------------------------------------------------------- -# -# clock.tcl -- -# -# This file implements the portions of the [clock] ensemble that are -# coded in Tcl. Refer to the users' manual to see the description of -# the [clock] command and its subcommands. -# -# -#---------------------------------------------------------------------- -# -# Copyright (c) 2004,2005,2006,2007 by Kevin B. Kenny -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -# -#---------------------------------------------------------------------- - -# We must have message catalogs that support the root locale, and we need -# access to the Registry on Windows systems. - -uplevel \#0 { - package require msgcat 1.6 - if { $::tcl_platform(platform) eq {windows} } { - if { [catch { package require registry 1.1 }] } { - namespace eval ::tcl::clock [list variable NoRegistry {}] - } - } -} - -# Put the library directory into the namespace for the ensemble so that the -# library code can find message catalogs and time zone definition files. - -namespace eval ::tcl::clock \ - [list variable LibDir [file dirname [info script]]] - -#---------------------------------------------------------------------- -# -# clock -- -# -# Manipulate times. -# -# The 'clock' command manipulates time. Refer to the user documentation for -# the available subcommands and what they do. -# -#---------------------------------------------------------------------- - -namespace eval ::tcl::clock { - - # Export the subcommands - - namespace export format - namespace export clicks - namespace export microseconds - namespace export milliseconds - namespace export scan - namespace export seconds - namespace export add - - # Import the message catalog commands that we use. - - namespace import ::msgcat::mcload - namespace import ::msgcat::mclocale - namespace import ::msgcat::mc - namespace import ::msgcat::mcpackagelocale - -} - -#---------------------------------------------------------------------- -# -# ::tcl::clock::Initialize -- -# -# Finish initializing the 'clock' subsystem -# -# Results: -# None. -# -# Side effects: -# Namespace variable in the 'clock' subsystem are initialized. -# -# The '::tcl::clock::Initialize' procedure initializes the namespace variables -# and root locale message catalog for the 'clock' subsystem. It is broken -# into a procedure rather than simply evaluated as a script so that it will be -# able to use local variables, avoiding the dangers of 'creative writing' as -# in Bug 1185933. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::Initialize {} { - - rename ::tcl::clock::Initialize {} - - variable LibDir - - # Define the Greenwich time zone - - proc InitTZData {} { - variable TZData - array unset TZData - set TZData(:Etc/GMT) { - {-9223372036854775808 0 0 GMT} - } - set TZData(:GMT) $TZData(:Etc/GMT) - set TZData(:Etc/UTC) { - {-9223372036854775808 0 0 UTC} - } - set TZData(:UTC) $TZData(:Etc/UTC) - set TZData(:localtime) {} - } - InitTZData - - mcpackagelocale set {} - ::msgcat::mcpackageconfig set mcfolder [file join $LibDir msgs] - ::msgcat::mcpackageconfig set unknowncmd "" - ::msgcat::mcpackageconfig set changecmd ChangeCurrentLocale - - # Define the message catalog for the root locale. - - ::msgcat::mcmset {} { - AM {am} - BCE {B.C.E.} - CE {C.E.} - DATE_FORMAT {%m/%d/%Y} - DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y} - DAYS_OF_WEEK_ABBREV { - Sun Mon Tue Wed Thu Fri Sat - } - DAYS_OF_WEEK_FULL { - Sunday Monday Tuesday Wednesday Thursday Friday Saturday - } - GREGORIAN_CHANGE_DATE 2299161 - LOCALE_DATE_FORMAT {%m/%d/%Y} - LOCALE_DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y} - LOCALE_ERAS {} - LOCALE_NUMERALS { - 00 01 02 03 04 05 06 07 08 09 - 10 11 12 13 14 15 16 17 18 19 - 20 21 22 23 24 25 26 27 28 29 - 30 31 32 33 34 35 36 37 38 39 - 40 41 42 43 44 45 46 47 48 49 - 50 51 52 53 54 55 56 57 58 59 - 60 61 62 63 64 65 66 67 68 69 - 70 71 72 73 74 75 76 77 78 79 - 80 81 82 83 84 85 86 87 88 89 - 90 91 92 93 94 95 96 97 98 99 - } - LOCALE_TIME_FORMAT {%H:%M:%S} - LOCALE_YEAR_FORMAT {%EC%Ey} - MONTHS_ABBREV { - Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec - } - MONTHS_FULL { - January February March - April May June - July August September - October November December - } - PM {pm} - TIME_FORMAT {%H:%M:%S} - TIME_FORMAT_12 {%I:%M:%S %P} - TIME_FORMAT_24 {%H:%M} - TIME_FORMAT_24_SECS {%H:%M:%S} - } - - # Define a few Gregorian change dates for other locales. In most cases - # the change date follows a language, because a nation's colonies changed - # at the same time as the nation itself. In many cases, different - # national boundaries existed; the dominating rule is to follow the - # nation's capital. - - # Italy, Spain, Portugal, Poland - - ::msgcat::mcset it GREGORIAN_CHANGE_DATE 2299161 - ::msgcat::mcset es GREGORIAN_CHANGE_DATE 2299161 - ::msgcat::mcset pt GREGORIAN_CHANGE_DATE 2299161 - ::msgcat::mcset pl GREGORIAN_CHANGE_DATE 2299161 - - # France, Austria - - ::msgcat::mcset fr GREGORIAN_CHANGE_DATE 2299227 - - # For Belgium, we follow Southern Netherlands; Liege Diocese changed - # several weeks later. - - ::msgcat::mcset fr_BE GREGORIAN_CHANGE_DATE 2299238 - ::msgcat::mcset nl_BE GREGORIAN_CHANGE_DATE 2299238 - - # Austria - - ::msgcat::mcset de_AT GREGORIAN_CHANGE_DATE 2299527 - - # Hungary - - ::msgcat::mcset hu GREGORIAN_CHANGE_DATE 2301004 - - # Germany, Norway, Denmark (Catholic Germany changed earlier) - - ::msgcat::mcset de_DE GREGORIAN_CHANGE_DATE 2342032 - ::msgcat::mcset nb GREGORIAN_CHANGE_DATE 2342032 - ::msgcat::mcset nn GREGORIAN_CHANGE_DATE 2342032 - ::msgcat::mcset no GREGORIAN_CHANGE_DATE 2342032 - ::msgcat::mcset da GREGORIAN_CHANGE_DATE 2342032 - - # Holland (Brabant, Gelderland, Flanders, Friesland, etc. changed at - # various times) - - ::msgcat::mcset nl GREGORIAN_CHANGE_DATE 2342165 - - # Protestant Switzerland (Catholic cantons changed earlier) - - ::msgcat::mcset fr_CH GREGORIAN_CHANGE_DATE 2361342 - ::msgcat::mcset it_CH GREGORIAN_CHANGE_DATE 2361342 - ::msgcat::mcset de_CH GREGORIAN_CHANGE_DATE 2361342 - - # English speaking countries - - ::msgcat::mcset en GREGORIAN_CHANGE_DATE 2361222 - - # Sweden (had several changes onto and off of the Gregorian calendar) - - ::msgcat::mcset sv GREGORIAN_CHANGE_DATE 2361390 - - # Russia - - ::msgcat::mcset ru GREGORIAN_CHANGE_DATE 2421639 - - # Romania (Transylvania changed earler - perhaps de_RO should show the - # earlier date?) - - ::msgcat::mcset ro GREGORIAN_CHANGE_DATE 2422063 - - # Greece - - ::msgcat::mcset el GREGORIAN_CHANGE_DATE 2423480 - - #------------------------------------------------------------------ - # - # CONSTANTS - # - #------------------------------------------------------------------ - - # Paths at which binary time zone data for the Olson libraries are known - # to reside on various operating systems - - variable ZoneinfoPaths {} - foreach path { - /usr/share/zoneinfo - /usr/share/lib/zoneinfo - /usr/lib/zoneinfo - /usr/local/etc/zoneinfo - } { - if { [file isdirectory $path] } { - lappend ZoneinfoPaths $path - } - } - - # Define the directories for time zone data and message catalogs. - - variable DataDir [file join $LibDir tzdata] - - # Number of days in the months, in common years and leap years. - - variable DaysInRomanMonthInCommonYear \ - { 31 28 31 30 31 30 31 31 30 31 30 31 } - variable DaysInRomanMonthInLeapYear \ - { 31 29 31 30 31 30 31 31 30 31 30 31 } - variable DaysInPriorMonthsInCommonYear [list 0] - variable DaysInPriorMonthsInLeapYear [list 0] - set i 0 - foreach j $DaysInRomanMonthInCommonYear { - lappend DaysInPriorMonthsInCommonYear [incr i $j] - } - set i 0 - foreach j $DaysInRomanMonthInLeapYear { - lappend DaysInPriorMonthsInLeapYear [incr i $j] - } - - # Another epoch (Hi, Jeff!) - - variable Roddenberry 1946 - - # Integer ranges - - variable MINWIDE -9223372036854775808 - variable MAXWIDE 9223372036854775807 - - # Day before Leap Day - - variable FEB_28 58 - - # Translation table to map Windows TZI onto cities, so that the Olson - # rules can apply. In some cases the mapping is ambiguous, so it's wise - # to specify $::env(TCL_TZ) rather than simply depending on the system - # time zone. - - # The keys are long lists of values obtained from the time zone - # information in the Registry. In order, the list elements are: - # Bias StandardBias DaylightBias - # StandardDate.wYear StandardDate.wMonth StandardDate.wDayOfWeek - # StandardDate.wDay StandardDate.wHour StandardDate.wMinute - # StandardDate.wSecond StandardDate.wMilliseconds - # DaylightDate.wYear DaylightDate.wMonth DaylightDate.wDayOfWeek - # DaylightDate.wDay DaylightDate.wHour DaylightDate.wMinute - # DaylightDate.wSecond DaylightDate.wMilliseconds - # The values are the names of time zones where those rules apply. There - # is considerable ambiguity in certain zones; an attempt has been made to - # make a reasonable guess, but this table needs to be taken with a grain - # of salt. - - variable WinZoneInfo [dict create {*}{ - {-43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Kwajalein - {-39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Midway - {-36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Honolulu - {-32400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Anchorage - {-28800 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Los_Angeles - {-28800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Tijuana - {-25200 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Denver - {-25200 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Chihuahua - {-25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Phoenix - {-21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Regina - {-21600 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Chicago - {-21600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Mexico_City - {-18000 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/New_York - {-18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Indianapolis - {-14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Caracas - {-14400 0 3600 0 3 6 2 23 59 59 999 0 10 6 2 23 59 59 999} - :America/Santiago - {-14400 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Manaus - {-14400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Halifax - {-12600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/St_Johns - {-10800 0 3600 0 2 0 2 2 0 0 0 0 10 0 3 2 0 0 0} :America/Sao_Paulo - {-10800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Godthab - {-10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Buenos_Aires - {-10800 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Bahia - {-10800 0 3600 0 3 0 2 2 0 0 0 0 10 0 1 2 0 0 0} :America/Montevideo - {-7200 0 3600 0 9 0 5 2 0 0 0 0 3 0 5 2 0 0 0} :America/Noronha - {-3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Atlantic/Azores - {-3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Atlantic/Cape_Verde - {0 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :UTC - {0 0 3600 0 10 0 5 2 0 0 0 0 3 0 5 1 0 0 0} :Europe/London - {3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Kinshasa - {3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :CET - {7200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Harare - {7200 0 3600 0 9 4 5 23 59 59 0 0 4 4 5 23 59 59 0} - :Africa/Cairo - {7200 0 3600 0 10 0 5 4 0 0 0 0 3 0 5 3 0 0 0} :Europe/Helsinki - {7200 0 3600 0 9 0 3 2 0 0 0 0 3 5 5 2 0 0 0} :Asia/Jerusalem - {7200 0 3600 0 9 0 5 1 0 0 0 0 3 0 5 0 0 0 0} :Europe/Bucharest - {7200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Athens - {7200 0 3600 0 9 5 5 1 0 0 0 0 3 4 5 0 0 0 0} :Asia/Amman - {7200 0 3600 0 10 6 5 23 59 59 999 0 3 0 5 0 0 0 0} - :Asia/Beirut - {7200 0 -3600 0 4 0 1 2 0 0 0 0 9 0 1 2 0 0 0} :Africa/Windhoek - {10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Riyadh - {10800 0 3600 0 10 0 1 4 0 0 0 0 4 0 1 3 0 0 0} :Asia/Baghdad - {10800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Moscow - {12600 0 3600 0 9 2 4 2 0 0 0 0 3 0 1 2 0 0 0} :Asia/Tehran - {14400 0 3600 0 10 0 5 5 0 0 0 0 3 0 5 4 0 0 0} :Asia/Baku - {14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Muscat - {14400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Tbilisi - {16200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Kabul - {18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Karachi - {18000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yekaterinburg - {19800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Calcutta - {20700 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Katmandu - {21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Dhaka - {21600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Novosibirsk - {23400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Rangoon - {25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Bangkok - {25200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Krasnoyarsk - {28800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Chongqing - {28800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Irkutsk - {32400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Tokyo - {32400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yakutsk - {34200 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Adelaide - {34200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Darwin - {36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Brisbane - {36000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Vladivostok - {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 1 2 0 0 0} :Australia/Hobart - {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Sydney - {39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Noumea - {43200 0 3600 0 3 0 3 3 0 0 0 0 10 0 1 2 0 0 0} :Pacific/Auckland - {43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Fiji - {46800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Tongatapu - }] - - # Groups of fields that specify the date, priorities, and code bursts that - # determine Julian Day Number given those groups. The code in [clock - # scan] will choose the highest priority (lowest numbered) set of fields - # that determines the date. - - variable DateParseActions { - - { seconds } 0 {} - - { julianDay } 1 {} - - { era century yearOfCentury month dayOfMonth } 2 { - dict set date year [expr { 100 * [dict get $date century] - + [dict get $date yearOfCentury] }] - set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ - $changeover] - } - { era century yearOfCentury dayOfYear } 2 { - dict set date year [expr { 100 * [dict get $date century] - + [dict get $date yearOfCentury] }] - set date [GetJulianDayFromEraYearDay $date[set date {}] \ - $changeover] - } - - { century yearOfCentury month dayOfMonth } 3 { - dict set date era CE - dict set date year [expr { 100 * [dict get $date century] - + [dict get $date yearOfCentury] }] - set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ - $changeover] - } - { century yearOfCentury dayOfYear } 3 { - dict set date era CE - dict set date year [expr { 100 * [dict get $date century] - + [dict get $date yearOfCentury] }] - set date [GetJulianDayFromEraYearDay $date[set date {}] \ - $changeover] - } - { iso8601Century iso8601YearOfCentury iso8601Week dayOfWeek } 3 { - dict set date era CE - dict set date iso8601Year \ - [expr { 100 * [dict get $date iso8601Century] - + [dict get $date iso8601YearOfCentury] }] - set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ - $changeover] - } - - { yearOfCentury month dayOfMonth } 4 { - set date [InterpretTwoDigitYear $date[set date {}] $baseTime] - dict set date era CE - set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ - $changeover] - } - { yearOfCentury dayOfYear } 4 { - set date [InterpretTwoDigitYear $date[set date {}] $baseTime] - dict set date era CE - set date [GetJulianDayFromEraYearDay $date[set date {}] \ - $changeover] - } - { iso8601YearOfCentury iso8601Week dayOfWeek } 4 { - set date [InterpretTwoDigitYear \ - $date[set date {}] $baseTime \ - iso8601YearOfCentury iso8601Year] - dict set date era CE - set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ - $changeover] - } - - { month dayOfMonth } 5 { - set date [AssignBaseYear $date[set date {}] \ - $baseTime $timeZone $changeover] - set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ - $changeover] - } - { dayOfYear } 5 { - set date [AssignBaseYear $date[set date {}] \ - $baseTime $timeZone $changeover] - set date [GetJulianDayFromEraYearDay $date[set date {}] \ - $changeover] - } - { iso8601Week dayOfWeek } 5 { - set date [AssignBaseIso8601Year $date[set date {}] \ - $baseTime $timeZone $changeover] - set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ - $changeover] - } - - { dayOfMonth } 6 { - set date [AssignBaseMonth $date[set date {}] \ - $baseTime $timeZone $changeover] - set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ - $changeover] - } - - { dayOfWeek } 7 { - set date [AssignBaseWeek $date[set date {}] \ - $baseTime $timeZone $changeover] - set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ - $changeover] - } - - {} 8 { - set date [AssignBaseJulianDay $date[set date {}] \ - $baseTime $timeZone $changeover] - } - } - - # Groups of fields that specify time of day, priorities, and code that - # processes them - - variable TimeParseActions { - - seconds 1 {} - - { hourAMPM minute second amPmIndicator } 2 { - dict set date secondOfDay [InterpretHMSP $date] - } - { hour minute second } 2 { - dict set date secondOfDay [InterpretHMS $date] - } - - { hourAMPM minute amPmIndicator } 3 { - dict set date second 0 - dict set date secondOfDay [InterpretHMSP $date] - } - { hour minute } 3 { - dict set date second 0 - dict set date secondOfDay [InterpretHMS $date] - } - - { hourAMPM amPmIndicator } 4 { - dict set date minute 0 - dict set date second 0 - dict set date secondOfDay [InterpretHMSP $date] - } - { hour } 4 { - dict set date minute 0 - dict set date second 0 - dict set date secondOfDay [InterpretHMS $date] - } - - { } 5 { - dict set date secondOfDay 0 - } - } - - # Legacy time zones, used primarily for parsing RFC822 dates. - - variable LegacyTimeZone [dict create \ - gmt +0000 \ - ut +0000 \ - utc +0000 \ - bst +0100 \ - wet +0000 \ - wat -0100 \ - at -0200 \ - nft -0330 \ - nst -0330 \ - ndt -0230 \ - ast -0400 \ - adt -0300 \ - est -0500 \ - edt -0400 \ - cst -0600 \ - cdt -0500 \ - mst -0700 \ - mdt -0600 \ - pst -0800 \ - pdt -0700 \ - yst -0900 \ - ydt -0800 \ - hst -1000 \ - hdt -0900 \ - cat -1000 \ - ahst -1000 \ - nt -1100 \ - idlw -1200 \ - cet +0100 \ - cest +0200 \ - met +0100 \ - mewt +0100 \ - mest +0200 \ - swt +0100 \ - sst +0200 \ - fwt +0100 \ - fst +0200 \ - eet +0200 \ - eest +0300 \ - bt +0300 \ - it +0330 \ - zp4 +0400 \ - zp5 +0500 \ - ist +0530 \ - zp6 +0600 \ - wast +0700 \ - wadt +0800 \ - jt +0730 \ - cct +0800 \ - jst +0900 \ - kst +0900 \ - cast +0930 \ - jdt +1000 \ - kdt +1000 \ - cadt +1030 \ - east +1000 \ - eadt +1030 \ - gst +1000 \ - nzt +1200 \ - nzst +1200 \ - nzdt +1300 \ - idle +1200 \ - a +0100 \ - b +0200 \ - c +0300 \ - d +0400 \ - e +0500 \ - f +0600 \ - g +0700 \ - h +0800 \ - i +0900 \ - k +1000 \ - l +1100 \ - m +1200 \ - n -0100 \ - o -0200 \ - p -0300 \ - q -0400 \ - r -0500 \ - s -0600 \ - t -0700 \ - u -0800 \ - v -0900 \ - w -1000 \ - x -1100 \ - y -1200 \ - z +0000 \ - ] - - # Caches - - variable LocaleNumeralCache {}; # Dictionary whose keys are locale - # names and whose values are pairs - # comprising regexes matching numerals - # in the given locales and dictionaries - # mapping the numerals to their numeric - # values. - # variable CachedSystemTimeZone; # If 'CachedSystemTimeZone' exists, - # it contains the value of the - # system time zone, as determined from - # the environment. - variable TimeZoneBad {}; # Dictionary whose keys are time zone - # names and whose values are 1 if - # the time zone is unknown and 0 - # if it is known. - variable TZData; # Array whose keys are time zone names - # and whose values are lists of quads - # comprising start time, UTC offset, - # Daylight Saving Time indicator, and - # time zone abbreviation. - variable FormatProc; # Array mapping format group - # and locale to the name of a procedure - # that renders the given format -} -::tcl::clock::Initialize - -#---------------------------------------------------------------------- -# -# clock format -- -# -# Formats a count of seconds since the Posix Epoch as a time of day. -# -# The 'clock format' command formats times of day for output. Refer to the -# user documentation to see what it does. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::format { args } { - - variable FormatProc - variable TZData - - lassign [ParseFormatArgs {*}$args] format locale timezone - set locale [string tolower $locale] - set clockval [lindex $args 0] - - # Get the data for time changes in the given zone - - if {$timezone eq ""} { - set timezone [GetSystemTimeZone] - } - if {![info exists TZData($timezone)]} { - if {[catch {SetupTimeZone $timezone} retval opts]} { - dict unset opts -errorinfo - return -options $opts $retval - } - } - - # Build a procedure to format the result. Cache the built procedure's name - # in the 'FormatProc' array to avoid losing its internal representation, - # which contains the name resolution. - - set procName formatproc'$format'$locale - set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName] - if {[info exists FormatProc($procName)]} { - set procName $FormatProc($procName) - } else { - set FormatProc($procName) \ - [ParseClockFormatFormat $procName $format $locale] - } - - return [$procName $clockval $timezone] - -} - -#---------------------------------------------------------------------- -# -# ParseClockFormatFormat -- -# -# Builds and caches a procedure that formats a time value. -# -# Parameters: -# format -- Format string to use -# locale -- Locale in which the format string is to be interpreted -# -# Results: -# Returns the name of the newly-built procedure. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ParseClockFormatFormat {procName format locale} { - - if {[namespace which $procName] ne {}} { - return $procName - } - - # Map away the locale-dependent composite format groups - - EnterLocale $locale - - # Change locale if a fresh locale has been given on the command line. - - try { - return [ParseClockFormatFormat2 $format $locale $procName] - } trap CLOCK {result opts} { - dict unset opts -errorinfo - return -options $opts $result - } -} - -proc ::tcl::clock::ParseClockFormatFormat2 {format locale procName} { - set didLocaleEra 0 - set didLocaleNumerals 0 - set preFormatCode \ - [string map [list @GREGORIAN_CHANGE_DATE@ \ - [mc GREGORIAN_CHANGE_DATE]] \ - { - variable TZData - set date [GetDateFields $clockval \ - $TZData($timezone) \ - @GREGORIAN_CHANGE_DATE@] - }] - set formatString {} - set substituents {} - set state {} - - set format [LocalizeFormat $locale $format] - - foreach char [split $format {}] { - switch -exact -- $state { - {} { - if { [string equal % $char] } { - set state percent - } else { - append formatString $char - } - } - percent { # Character following a '%' character - set state {} - switch -exact -- $char { - % { # A literal character, '%' - append formatString %% - } - a { # Day of week, abbreviated - append formatString %s - append substituents \ - [string map \ - [list @DAYS_OF_WEEK_ABBREV@ \ - [list [mc DAYS_OF_WEEK_ABBREV]]] \ - { [lindex @DAYS_OF_WEEK_ABBREV@ \ - [expr {[dict get $date dayOfWeek] \ - % 7}]]}] - } - A { # Day of week, spelt out. - append formatString %s - append substituents \ - [string map \ - [list @DAYS_OF_WEEK_FULL@ \ - [list [mc DAYS_OF_WEEK_FULL]]] \ - { [lindex @DAYS_OF_WEEK_FULL@ \ - [expr {[dict get $date dayOfWeek] \ - % 7}]]}] - } - b - h { # Name of month, abbreviated. - append formatString %s - append substituents \ - [string map \ - [list @MONTHS_ABBREV@ \ - [list [mc MONTHS_ABBREV]]] \ - { [lindex @MONTHS_ABBREV@ \ - [expr {[dict get $date month]-1}]]}] - } - B { # Name of month, spelt out - append formatString %s - append substituents \ - [string map \ - [list @MONTHS_FULL@ \ - [list [mc MONTHS_FULL]]] \ - { [lindex @MONTHS_FULL@ \ - [expr {[dict get $date month]-1}]]}] - } - C { # Century number - append formatString %02d - append substituents \ - { [expr {[dict get $date year] / 100}]} - } - d { # Day of month, with leading zero - append formatString %02d - append substituents { [dict get $date dayOfMonth]} - } - e { # Day of month, without leading zero - append formatString %2d - append substituents { [dict get $date dayOfMonth]} - } - E { # Format group in a locale-dependent - # alternative era - set state percentE - if {!$didLocaleEra} { - append preFormatCode \ - [string map \ - [list @LOCALE_ERAS@ \ - [list [mc LOCALE_ERAS]]] \ - { - set date [GetLocaleEra \ - $date[set date {}] \ - @LOCALE_ERAS@]}] \n - set didLocaleEra 1 - } - if {!$didLocaleNumerals} { - append preFormatCode \ - [list set localeNumerals \ - [mc LOCALE_NUMERALS]] \n - set didLocaleNumerals 1 - } - } - g { # Two-digit year relative to ISO8601 - # week number - append formatString %02d - append substituents \ - { [expr { [dict get $date iso8601Year] % 100 }]} - } - G { # Four-digit year relative to ISO8601 - # week number - append formatString %02d - append substituents { [dict get $date iso8601Year]} - } - H { # Hour in the 24-hour day, leading zero - append formatString %02d - append substituents \ - { [expr { [dict get $date localSeconds] \ - / 3600 % 24}]} - } - I { # Hour AM/PM, with leading zero - append formatString %02d - append substituents \ - { [expr { ( ( ( [dict get $date localSeconds] \ - % 86400 ) \ - + 86400 \ - - 3600 ) \ - / 3600 ) \ - % 12 + 1 }] } - } - j { # Day of year (001-366) - append formatString %03d - append substituents { [dict get $date dayOfYear]} - } - J { # Julian Day Number - append formatString %07ld - append substituents { [dict get $date julianDay]} - } - k { # Hour (0-23), no leading zero - append formatString %2d - append substituents \ - { [expr { [dict get $date localSeconds] - / 3600 - % 24 }]} - } - l { # Hour (12-11), no leading zero - append formatString %2d - append substituents \ - { [expr { ( ( ( [dict get $date localSeconds] - % 86400 ) - + 86400 - - 3600 ) - / 3600 ) - % 12 + 1 }]} - } - m { # Month number, leading zero - append formatString %02d - append substituents { [dict get $date month]} - } - M { # Minute of the hour, leading zero - append formatString %02d - append substituents \ - { [expr { [dict get $date localSeconds] - / 60 - % 60 }]} - } - n { # A literal newline - append formatString \n - } - N { # Month number, no leading zero - append formatString %2d - append substituents { [dict get $date month]} - } - O { # A format group in the locale's - # alternative numerals - set state percentO - if {!$didLocaleNumerals} { - append preFormatCode \ - [list set localeNumerals \ - [mc LOCALE_NUMERALS]] \n - set didLocaleNumerals 1 - } - } - p { # Localized 'AM' or 'PM' indicator - # converted to uppercase - append formatString %s - append preFormatCode \ - [list set AM [string toupper [mc AM]]] \n \ - [list set PM [string toupper [mc PM]]] \n - append substituents \ - { [expr {(([dict get $date localSeconds] - % 86400) < 43200) ? - $AM : $PM}]} - } - P { # Localized 'AM' or 'PM' indicator - append formatString %s - append preFormatCode \ - [list set am [mc AM]] \n \ - [list set pm [mc PM]] \n - append substituents \ - { [expr {(([dict get $date localSeconds] - % 86400) < 43200) ? - $am : $pm}]} - - } - Q { # Hi, Jeff! - append formatString %s - append substituents { [FormatStarDate $date]} - } - s { # Seconds from the Posix Epoch - append formatString %s - append substituents { [dict get $date seconds]} - } - S { # Second of the minute, with - # leading zero - append formatString %02d - append substituents \ - { [expr { [dict get $date localSeconds] - % 60 }]} - } - t { # A literal tab character - append formatString \t - } - u { # Day of the week (1-Monday, 7-Sunday) - append formatString %1d - append substituents { [dict get $date dayOfWeek]} - } - U { # Week of the year (00-53). The - # first Sunday of the year is the - # first day of week 01 - append formatString %02d - append preFormatCode { - set dow [dict get $date dayOfWeek] - if { $dow == 7 } { - set dow 0 - } - incr dow - set UweekNumber \ - [expr { ( [dict get $date dayOfYear] - - $dow + 7 ) - / 7 }] - } - append substituents { $UweekNumber} - } - V { # The ISO8601 week number - append formatString %02d - append substituents { [dict get $date iso8601Week]} - } - w { # Day of the week (0-Sunday, - # 6-Saturday) - append formatString %1d - append substituents \ - { [expr { [dict get $date dayOfWeek] % 7 }]} - } - W { # Week of the year (00-53). The first - # Monday of the year is the first day - # of week 01. - append preFormatCode { - set WweekNumber \ - [expr { ( [dict get $date dayOfYear] - - [dict get $date dayOfWeek] - + 7 ) - / 7 }] - } - append formatString %02d - append substituents { $WweekNumber} - } - y { # The two-digit year of the century - append formatString %02d - append substituents \ - { [expr { [dict get $date year] % 100 }]} - } - Y { # The four-digit year - append formatString %04d - append substituents { [dict get $date year]} - } - z { # The time zone as hours and minutes - # east (+) or west (-) of Greenwich - append formatString %s - append substituents { [FormatNumericTimeZone \ - [dict get $date tzOffset]]} - } - Z { # The name of the time zone - append formatString %s - append substituents { [dict get $date tzName]} - } - % { # A literal percent character - append formatString %% - } - default { # An unknown escape sequence - append formatString %% $char - } - } - } - percentE { # Character following %E - set state {} - switch -exact -- $char { - E { - append formatString %s - append substituents { } \ - [string map \ - [list @BCE@ [list [mc BCE]] \ - @CE@ [list [mc CE]]] \ - {[dict get {BCE @BCE@ CE @CE@} \ - [dict get $date era]]}] - } - C { # Locale-dependent era - append formatString %s - append substituents { [dict get $date localeEra]} - } - y { # Locale-dependent year of the era - append preFormatCode { - set y [dict get $date localeYear] - if { $y >= 0 && $y < 100 } { - set Eyear [lindex $localeNumerals $y] - } else { - set Eyear $y - } - } - append formatString %s - append substituents { $Eyear} - } - default { # Unknown %E format group - append formatString %%E $char - } - } - } - percentO { # Character following %O - set state {} - switch -exact -- $char { - d - e { # Day of the month in alternative - # numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [dict get $date dayOfMonth]]} - } - H - k { # Hour of the day in alternative - # numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [expr { [dict get $date localSeconds] - / 3600 - % 24 }]]} - } - I - l { # Hour (12-11) AM/PM in alternative - # numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [expr { ( ( ( [dict get $date localSeconds] - % 86400 ) - + 86400 - - 3600 ) - / 3600 ) - % 12 + 1 }]]} - } - m { # Month number in alternative numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals [dict get $date month]]} - } - M { # Minute of the hour in alternative - # numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [expr { [dict get $date localSeconds] - / 60 - % 60 }]]} - } - S { # Second of the minute in alternative - # numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [expr { [dict get $date localSeconds] - % 60 }]]} - } - u { # Day of the week (Monday=1,Sunday=7) - # in alternative numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [dict get $date dayOfWeek]]} - } - w { # Day of the week (Sunday=0,Saturday=6) - # in alternative numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [expr { [dict get $date dayOfWeek] % 7 }]]} - } - y { # Year of the century in alternative - # numerals - append formatString %s - append substituents \ - { [lindex $localeNumerals \ - [expr { [dict get $date year] % 100 }]]} - } - default { # Unknown format group - append formatString %%O $char - } - } - } - } - } - - # Clean up any improperly terminated groups - - switch -exact -- $state { - percent { - append formatString %% - } - percentE { - append retval %%E - } - percentO { - append retval %%O - } - } - - proc $procName {clockval timezone} " - $preFormatCode - return \[::format [list $formatString] $substituents\] - " - - # puts [list $procName [info args $procName] [info body $procName]] - - return $procName -} - -#---------------------------------------------------------------------- -# -# clock scan -- -# -# Inputs a count of seconds since the Posix Epoch as a time of day. -# -# The 'clock format' command scans times of day on input. Refer to the user -# documentation to see what it does. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::scan { args } { - - set format {} - - # Check the count of args - - if { [llength $args] < 1 || [llength $args] % 2 != 1 } { - set cmdName "clock scan" - return -code error \ - -errorcode [list CLOCK wrongNumArgs] \ - "wrong \# args: should be\ - \"$cmdName string\ - ?-base seconds?\ - ?-format string? ?-gmt boolean?\ - ?-locale LOCALE? ?-timezone ZONE?\"" - } - - # Set defaults - - set base [clock seconds] - set string [lindex $args 0] - set format {} - set gmt 0 - set locale c - set timezone [GetSystemTimeZone] - - # Pick up command line options. - - foreach { flag value } [lreplace $args 0 0] { - set saw($flag) {} - switch -exact -- $flag { - -b - -ba - -bas - -base { - set base $value - } - -f - -fo - -for - -form - -forma - -format { - set format $value - } - -g - -gm - -gmt { - set gmt $value - } - -l - -lo - -loc - -loca - -local - -locale { - set locale [string tolower $value] - } - -t - -ti - -tim - -time - -timez - -timezo - -timezon - -timezone { - set timezone $value - } - default { - return -code error \ - -errorcode [list CLOCK badOption $flag] \ - "bad option \"$flag\",\ - must be -base, -format, -gmt, -locale or -timezone" - } - } - } - - # Check options for validity - - if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } { - return -code error \ - -errorcode [list CLOCK gmtWithTimezone] \ - "cannot use -gmt and -timezone in same call" - } - if { [catch { expr { wide($base) } } result] } { - return -code error "expected integer but got \"$base\"" - } - if { ![string is boolean -strict $gmt] } { - return -code error "expected boolean value but got \"$gmt\"" - } elseif { $gmt } { - set timezone :GMT - } - - if { ![info exists saw(-format)] } { - # Perhaps someday we'll localize the legacy code. Right now, it's not - # localized. - if { [info exists saw(-locale)] } { - return -code error \ - -errorcode [list CLOCK flagWithLegacyFormat] \ - "legacy \[clock scan\] does not support -locale" - - } - return [FreeScan $string $base $timezone $locale] - } - - # Change locale if a fresh locale has been given on the command line. - - EnterLocale $locale - - try { - # Map away the locale-dependent composite format groups - - set scanner [ParseClockScanFormat $format $locale] - return [$scanner $string $base $timezone] - } trap CLOCK {result opts} { - # Conceal location of generation of expected errors - dict unset opts -errorinfo - return -options $opts $result - } -} - -#---------------------------------------------------------------------- -# -# FreeScan -- -# -# Scans a time in free format -# -# Parameters: -# string - String containing the time to scan -# base - Base time, expressed in seconds from the Epoch -# timezone - Default time zone in which the time will be expressed -# locale - (Unused) Name of the locale where the time will be scanned. -# -# Results: -# Returns the date and time extracted from the string in seconds from -# the epoch -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::FreeScan { string base timezone locale } { - - variable TZData - - # Get the data for time changes in the given zone - - try { - SetupTimeZone $timezone - } on error {retval opts} { - dict unset opts -errorinfo - return -options $opts $retval - } - - # Extract year, month and day from the base time for the parser to use as - # defaults - - set date [GetDateFields $base $TZData($timezone) 2361222] - dict set date secondOfDay [expr { - [dict get $date localSeconds] % 86400 - }] - - # Parse the date. The parser will return a list comprising date, time, - # time zone, relative month/day/seconds, relative weekday, ordinal month. - - try { - set scanned [Oldscan $string \ - [dict get $date year] \ - [dict get $date month] \ - [dict get $date dayOfMonth]] - lassign $scanned \ - parseDate parseTime parseZone parseRel \ - parseWeekday parseOrdinalMonth - } on error message { - return -code error \ - "unable to convert date-time string \"$string\": $message" - } - - # If the caller supplied a date in the string, update the 'date' dict with - # the value. If the caller didn't specify a time with the date, default to - # midnight. - - if { [llength $parseDate] > 0 } { - lassign $parseDate y m d - if { $y < 100 } { - if { $y >= 39 } { - incr y 1900 - } else { - incr y 2000 - } - } - dict set date era CE - dict set date year $y - dict set date month $m - dict set date dayOfMonth $d - if { $parseTime eq {} } { - set parseTime 0 - } - } - - # If the caller supplied a time zone in the string, it comes back as a - # two-element list; the first element is the number of minutes east of - # Greenwich, and the second is a Daylight Saving Time indicator (1 == yes, - # 0 == no, -1 == unknown). We make it into a time zone indicator of - # +-hhmm. - - if { [llength $parseZone] > 0 } { - lassign $parseZone minEast dstFlag - set timezone [FormatNumericTimeZone \ - [expr { 60 * $minEast + 3600 * $dstFlag }]] - SetupTimeZone $timezone - } - dict set date tzName $timezone - - # Assemble date, time, zone into seconds-from-epoch - - set date [GetJulianDayFromEraYearMonthDay $date[set date {}] 2361222] - if { $parseTime ne {} } { - dict set date secondOfDay $parseTime - } elseif { [llength $parseWeekday] != 0 - || [llength $parseOrdinalMonth] != 0 - || ( [llength $parseRel] != 0 - && ( [lindex $parseRel 0] != 0 - || [lindex $parseRel 1] != 0 ) ) } { - dict set date secondOfDay 0 - } - - dict set date localSeconds [expr { - -210866803200 - + ( 86400 * wide([dict get $date julianDay]) ) - + [dict get $date secondOfDay] - }] - dict set date tzName $timezone - set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) 2361222] - set seconds [dict get $date seconds] - - # Do relative times - - if { [llength $parseRel] > 0 } { - lassign $parseRel relMonth relDay relSecond - set seconds [add $seconds \ - $relMonth months $relDay days $relSecond seconds \ - -timezone $timezone -locale $locale] - } - - # Do relative weekday - - if { [llength $parseWeekday] > 0 } { - lassign $parseWeekday dayOrdinal dayOfWeek - set date2 [GetDateFields $seconds $TZData($timezone) 2361222] - dict set date2 era CE - set jdwkday [WeekdayOnOrBefore $dayOfWeek [expr { - [dict get $date2 julianDay] + 6 - }]] - incr jdwkday [expr { 7 * $dayOrdinal }] - if { $dayOrdinal > 0 } { - incr jdwkday -7 - } - dict set date2 secondOfDay \ - [expr { [dict get $date2 localSeconds] % 86400 }] - dict set date2 julianDay $jdwkday - dict set date2 localSeconds [expr { - -210866803200 - + ( 86400 * wide([dict get $date2 julianDay]) ) - + [dict get $date secondOfDay] - }] - dict set date2 tzName $timezone - set date2 [ConvertLocalToUTC $date2[set date2 {}] $TZData($timezone) \ - 2361222] - set seconds [dict get $date2 seconds] - - } - - # Do relative month - - if { [llength $parseOrdinalMonth] > 0 } { - lassign $parseOrdinalMonth monthOrdinal monthNumber - if { $monthOrdinal > 0 } { - set monthDiff [expr { $monthNumber - [dict get $date month] }] - if { $monthDiff <= 0 } { - incr monthDiff 12 - } - incr monthOrdinal -1 - } else { - set monthDiff [expr { [dict get $date month] - $monthNumber }] - if { $monthDiff >= 0 } { - incr monthDiff -12 - } - incr monthOrdinal - } - set seconds [add $seconds $monthOrdinal years $monthDiff months \ - -timezone $timezone -locale $locale] - } - - return $seconds -} - - -#---------------------------------------------------------------------- -# -# ParseClockScanFormat -- -# -# Parses a format string given to [clock scan -format] -# -# Parameters: -# formatString - The format being parsed -# locale - The current locale -# -# Results: -# Constructs and returns a procedure that accepts the string being -# scanned, the base time, and the time zone. The procedure will either -# return the scanned time or else throw an error that should be rethrown -# to the caller of [clock scan] -# -# Side effects: -# The given procedure is defined in the ::tcl::clock namespace. Scan -# procedures are not deleted once installed. -# -# Why do we parse dates by defining a procedure to parse them? The reason is -# that by doing so, we have one convenient place to cache all the information: -# the regular expressions that match the patterns (which will be compiled), -# the code that assembles the date information, everything lands in one place. -# In this way, when a given format is reused at run time, all the information -# of how to apply it is available in a single place. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ParseClockScanFormat {formatString locale} { - # Check whether the format has been parsed previously, and return the - # existing recognizer if it has. - - set procName scanproc'$formatString'$locale - set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName] - if { [namespace which $procName] != {} } { - return $procName - } - - variable DateParseActions - variable TimeParseActions - - # Localize the %x, %X, etc. groups - - set formatString [LocalizeFormat $locale $formatString] - - # Condense whitespace - - regsub -all {[[:space:]]+} $formatString { } formatString - - # Walk through the groups of the format string. In this loop, we - # accumulate: - # - a regular expression that matches the string, - # - the count of capturing brackets in the regexp - # - a set of code that post-processes the fields captured by the regexp, - # - a dictionary whose keys are the names of fields that are present - # in the format string. - - set re {^[[:space:]]*} - set captureCount 0 - set postcode {} - set fieldSet [dict create] - set fieldCount 0 - set postSep {} - set state {} - - foreach c [split $formatString {}] { - switch -exact -- $state { - {} { - if { $c eq "%" } { - set state % - } elseif { $c eq " " } { - append re {[[:space:]]+} - } else { - if { ! [string is alnum $c] } { - append re "\\" - } - append re $c - } - } - % { - set state {} - switch -exact -- $c { - % { - append re % - } - { } { - append re "\[\[:space:\]\]*" - } - a - A { # Day of week, in words - set l {} - foreach \ - i {7 1 2 3 4 5 6} \ - abr [mc DAYS_OF_WEEK_ABBREV] \ - full [mc DAYS_OF_WEEK_FULL] { - dict set l [string tolower $abr] $i - dict set l [string tolower $full] $i - incr i - } - lassign [UniquePrefixRegexp $l] regex lookup - append re ( $regex ) - dict set fieldSet dayOfWeek [incr fieldCount] - append postcode "dict set date dayOfWeek \[" \ - "dict get " [list $lookup] " " \ - \[ {string tolower $field} [incr captureCount] \] \ - "\]\n" - } - b - B - h { # Name of month - set i 0 - set l {} - foreach \ - abr [mc MONTHS_ABBREV] \ - full [mc MONTHS_FULL] { - incr i - dict set l [string tolower $abr] $i - dict set l [string tolower $full] $i - } - lassign [UniquePrefixRegexp $l] regex lookup - append re ( $regex ) - dict set fieldSet month [incr fieldCount] - append postcode "dict set date month \[" \ - "dict get " [list $lookup] \ - " " \[ {string tolower $field} \ - [incr captureCount] \] \ - "\]\n" - } - C { # Gregorian century - append re \\s*(\\d\\d?) - dict set fieldSet century [incr fieldCount] - append postcode "dict set date century \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - d - e { # Day of month - append re \\s*(\\d\\d?) - dict set fieldSet dayOfMonth [incr fieldCount] - append postcode "dict set date dayOfMonth \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - E { # Prefix for locale-specific codes - set state %E - } - g { # ISO8601 2-digit year - append re \\s*(\\d\\d) - dict set fieldSet iso8601YearOfCentury \ - [incr fieldCount] - append postcode \ - "dict set date iso8601YearOfCentury \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - G { # ISO8601 4-digit year - append re \\s*(\\d\\d)(\\d\\d) - dict set fieldSet iso8601Century [incr fieldCount] - dict set fieldSet iso8601YearOfCentury \ - [incr fieldCount] - append postcode \ - "dict set date iso8601Century \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" \ - "dict set date iso8601YearOfCentury \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - H - k { # Hour of day - append re \\s*(\\d\\d?) - dict set fieldSet hour [incr fieldCount] - append postcode "dict set date hour \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - I - l { # Hour, AM/PM - append re \\s*(\\d\\d?) - dict set fieldSet hourAMPM [incr fieldCount] - append postcode "dict set date hourAMPM \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - j { # Day of year - append re \\s*(\\d\\d?\\d?) - dict set fieldSet dayOfYear [incr fieldCount] - append postcode "dict set date dayOfYear \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - J { # Julian Day Number - append re \\s*(\\d+) - dict set fieldSet julianDay [incr fieldCount] - append postcode "dict set date julianDay \[" \ - "::scan \$field" [incr captureCount] " %ld" \ - "\]\n" - } - m - N { # Month number - append re \\s*(\\d\\d?) - dict set fieldSet month [incr fieldCount] - append postcode "dict set date month \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - M { # Minute - append re \\s*(\\d\\d?) - dict set fieldSet minute [incr fieldCount] - append postcode "dict set date minute \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - n { # Literal newline - append re \\n - } - O { # Prefix for locale numerics - set state %O - } - p - P { # AM/PM indicator - set l [list [string tolower [mc AM]] 0 \ - [string tolower [mc PM]] 1] - lassign [UniquePrefixRegexp $l] regex lookup - append re ( $regex ) - dict set fieldSet amPmIndicator [incr fieldCount] - append postcode "dict set date amPmIndicator \[" \ - "dict get " [list $lookup] " \[string tolower " \ - "\$field" \ - [incr captureCount] \ - "\]\]\n" - } - Q { # Hi, Jeff! - append re {Stardate\s+([-+]?\d+)(\d\d\d)[.](\d)} - incr captureCount - dict set fieldSet seconds [incr fieldCount] - append postcode {dict set date seconds } \[ \ - {ParseStarDate $field} [incr captureCount] \ - { $field} [incr captureCount] \ - { $field} [incr captureCount] \ - \] \n - } - s { # Seconds from Posix Epoch - # This next case is insanely difficult, because it's - # problematic to determine whether the field is - # actually within the range of a wide integer. - append re {\s*([-+]?\d+)} - dict set fieldSet seconds [incr fieldCount] - append postcode {dict set date seconds } \[ \ - {ScanWide $field} [incr captureCount] \] \n - } - S { # Second - append re \\s*(\\d\\d?) - dict set fieldSet second [incr fieldCount] - append postcode "dict set date second \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - t { # Literal tab character - append re \\t - } - u - w { # Day number within week, 0 or 7 == Sun - # 1=Mon, 6=Sat - append re \\s*(\\d) - dict set fieldSet dayOfWeek [incr fieldCount] - append postcode {::scan $field} [incr captureCount] \ - { %d dow} \n \ - { - if { $dow == 0 } { - set dow 7 - } elseif { $dow > 7 } { - return -code error \ - -errorcode [list CLOCK badDayOfWeek] \ - "day of week is greater than 7" - } - dict set date dayOfWeek $dow - } - } - U { # Week of year. The first Sunday of - # the year is the first day of week - # 01. No scan rule uses this group. - append re \\s*\\d\\d? - } - V { # Week of ISO8601 year - - append re \\s*(\\d\\d?) - dict set fieldSet iso8601Week [incr fieldCount] - append postcode "dict set date iso8601Week \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - W { # Week of the year (00-53). The first - # Monday of the year is the first day - # of week 01. No scan rule uses this - # group. - append re \\s*\\d\\d? - } - y { # Two-digit Gregorian year - append re \\s*(\\d\\d?) - dict set fieldSet yearOfCentury [incr fieldCount] - append postcode "dict set date yearOfCentury \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - Y { # 4-digit Gregorian year - append re \\s*(\\d\\d)(\\d\\d) - dict set fieldSet century [incr fieldCount] - dict set fieldSet yearOfCentury [incr fieldCount] - append postcode \ - "dict set date century \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" \ - "dict set date yearOfCentury \[" \ - "::scan \$field" [incr captureCount] " %d" \ - "\]\n" - } - z - Z { # Time zone name - append re {(?:([-+]\d\d(?::?\d\d(?::?\d\d)?)?)|([[:alnum:]]{1,4}))} - dict set fieldSet tzName [incr fieldCount] - append postcode \ - {if } \{ { $field} [incr captureCount] \ - { ne "" } \} { } \{ \n \ - {dict set date tzName $field} \ - $captureCount \n \ - \} { else } \{ \n \ - {dict set date tzName } \[ \ - {ConvertLegacyTimeZone $field} \ - [incr captureCount] \] \n \ - \} \n \ - } - % { # Literal percent character - append re % - } - default { - append re % - if { ! [string is alnum $c] } { - append re \\ - } - append re $c - } - } - } - %E { - switch -exact -- $c { - C { # Locale-dependent era - set d {} - foreach triple [mc LOCALE_ERAS] { - lassign $triple t symbol year - dict set d [string tolower $symbol] $year - } - lassign [UniquePrefixRegexp $d] regex lookup - append re (?: $regex ) - } - E { - set l {} - dict set l [string tolower [mc BCE]] BCE - dict set l [string tolower [mc CE]] CE - dict set l b.c.e. BCE - dict set l c.e. CE - dict set l b.c. BCE - dict set l a.d. CE - lassign [UniquePrefixRegexp $l] regex lookup - append re ( $regex ) - dict set fieldSet era [incr fieldCount] - append postcode "dict set date era \["\ - "dict get " [list $lookup] \ - { } \[ {string tolower $field} \ - [incr captureCount] \] \ - "\]\n" - } - y { # Locale-dependent year of the era - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - incr captureCount - } - default { - append re %E - if { ! [string is alnum $c] } { - append re \\ - } - append re $c - } - } - set state {} - } - %O { - switch -exact -- $c { - d - e { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet dayOfMonth [incr fieldCount] - append postcode "dict set date dayOfMonth \[" \ - "dict get " [list $lookup] " \$field" \ - [incr captureCount] \ - "\]\n" - } - H - k { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet hour [incr fieldCount] - append postcode "dict set date hour \[" \ - "dict get " [list $lookup] " \$field" \ - [incr captureCount] \ - "\]\n" - } - I - l { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet hourAMPM [incr fieldCount] - append postcode "dict set date hourAMPM \[" \ - "dict get " [list $lookup] " \$field" \ - [incr captureCount] \ - "\]\n" - } - m { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet month [incr fieldCount] - append postcode "dict set date month \[" \ - "dict get " [list $lookup] " \$field" \ - [incr captureCount] \ - "\]\n" - } - M { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet minute [incr fieldCount] - append postcode "dict set date minute \[" \ - "dict get " [list $lookup] " \$field" \ - [incr captureCount] \ - "\]\n" - } - S { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet second [incr fieldCount] - append postcode "dict set date second \[" \ - "dict get " [list $lookup] " \$field" \ - [incr captureCount] \ - "\]\n" - } - u - w { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet dayOfWeek [incr fieldCount] - append postcode "set dow \[dict get " [list $lookup] \ - { $field} [incr captureCount] \] \n \ - { - if { $dow == 0 } { - set dow 7 - } elseif { $dow > 7 } { - return -code error \ - -errorcode [list CLOCK badDayOfWeek] \ - "day of week is greater than 7" - } - dict set date dayOfWeek $dow - } - } - y { - lassign [LocaleNumeralMatcher $locale] regex lookup - append re $regex - dict set fieldSet yearOfCentury [incr fieldCount] - append postcode {dict set date yearOfCentury } \[ \ - {dict get } [list $lookup] { $field} \ - [incr captureCount] \] \n - } - default { - append re %O - if { ! [string is alnum $c] } { - append re \\ - } - append re $c - } - } - set state {} - } - } - } - - # Clean up any unfinished format groups - - append re $state \\s*\$ - - # Build the procedure - - set procBody {} - append procBody "variable ::tcl::clock::TZData" \n - append procBody "if \{ !\[ regexp -nocase [list $re] \$string ->" - for { set i 1 } { $i <= $captureCount } { incr i } { - append procBody " " field $i - } - append procBody "\] \} \{" \n - append procBody { - return -code error -errorcode [list CLOCK badInputString] \ - {input string does not match supplied format} - } - append procBody \}\n - append procBody "set date \[dict create\]" \n - append procBody {dict set date tzName $timeZone} \n - append procBody $postcode - append procBody [list set changeover [mc GREGORIAN_CHANGE_DATE]] \n - - # Set up the time zone before doing anything with a default base date - # that might need a timezone to interpret it. - - if { ![dict exists $fieldSet seconds] - && ![dict exists $fieldSet starDate] } { - if { [dict exists $fieldSet tzName] } { - append procBody { - set timeZone [dict get $date tzName] - } - } - append procBody { - ::tcl::clock::SetupTimeZone $timeZone - } - } - - # Add code that gets Julian Day Number from the fields. - - append procBody [MakeParseCodeFromFields $fieldSet $DateParseActions] - - # Get time of day - - append procBody [MakeParseCodeFromFields $fieldSet $TimeParseActions] - - # Assemble seconds from the Julian day and second of the day. - # Convert to local time unless epoch seconds or stardate are - # being processed - they're always absolute - - if { ![dict exists $fieldSet seconds] - && ![dict exists $fieldSet starDate] } { - append procBody { - if { [dict get $date julianDay] > 5373484 } { - return -code error -errorcode [list CLOCK dateTooLarge] \ - "requested date too large to represent" - } - dict set date localSeconds [expr { - -210866803200 - + ( 86400 * wide([dict get $date julianDay]) ) - + [dict get $date secondOfDay] - }] - } - - # Finally, convert the date to local time - - append procBody { - set date [::tcl::clock::ConvertLocalToUTC $date[set date {}] \ - $TZData($timeZone) $changeover] - } - } - - # Return result - - append procBody {return [dict get $date seconds]} \n - - proc $procName { string baseTime timeZone } $procBody - - # puts [list proc $procName [list string baseTime timeZone] $procBody] - - return $procName -} - -#---------------------------------------------------------------------- -# -# LocaleNumeralMatcher -- -# -# Composes a regexp that captures the numerals in the given locale, and -# a dictionary to map them to conventional numerals. -# -# Parameters: -# locale - Name of the current locale -# -# Results: -# Returns a two-element list comprising the regexp and the dictionary. -# -# Side effects: -# Caches the result. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::LocaleNumeralMatcher {l} { - variable LocaleNumeralCache - - if { ![dict exists $LocaleNumeralCache $l] } { - set d {} - set i 0 - set sep \( - foreach n [mc LOCALE_NUMERALS] { - dict set d $n $i - regsub -all {[^[:alnum:]]} $n \\\\& subex - append re $sep $subex - set sep | - incr i - } - append re \) - dict set LocaleNumeralCache $l [list $re $d] - } - return [dict get $LocaleNumeralCache $l] -} - - - -#---------------------------------------------------------------------- -# -# UniquePrefixRegexp -- -# -# Composes a regexp that performs unique-prefix matching. The RE -# matches one of a supplied set of strings, or any unique prefix -# thereof. -# -# Parameters: -# data - List of alternating match-strings and values. -# Match-strings with distinct values are considered -# distinct. -# -# Results: -# Returns a two-element list. The first is a regexp that matches any -# unique prefix of any of the strings. The second is a dictionary whose -# keys are match values from the regexp and whose values are the -# corresponding values from 'data'. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::UniquePrefixRegexp { data } { - # The 'successors' dictionary will contain, for each string that is a - # prefix of any key, all characters that may follow that prefix. The - # 'prefixMapping' dictionary will have keys that are prefixes of keys and - # values that correspond to the keys. - - set prefixMapping [dict create] - set successors [dict create {} {}] - - # Walk the key-value pairs - - foreach { key value } $data { - # Construct all prefixes of the key; - - set prefix {} - foreach char [split $key {}] { - set oldPrefix $prefix - dict set successors $oldPrefix $char {} - append prefix $char - - # Put the prefixes in the 'prefixMapping' and 'successors' - # dictionaries - - dict lappend prefixMapping $prefix $value - if { ![dict exists $successors $prefix] } { - dict set successors $prefix {} - } - } - } - - # Identify those prefixes that designate unique values, and those that are - # the full keys - - set uniquePrefixMapping {} - dict for { key valueList } $prefixMapping { - if { [llength $valueList] == 1 } { - dict set uniquePrefixMapping $key [lindex $valueList 0] - } - } - foreach { key value } $data { - dict set uniquePrefixMapping $key $value - } - - # Construct the re. - - return [list \ - [MakeUniquePrefixRegexp $successors $uniquePrefixMapping {}] \ - $uniquePrefixMapping] -} - -#---------------------------------------------------------------------- -# -# MakeUniquePrefixRegexp -- -# -# Service procedure for 'UniquePrefixRegexp' that constructs a regular -# expresison that matches the unique prefixes. -# -# Parameters: -# successors - Dictionary whose keys are all prefixes -# of keys passed to 'UniquePrefixRegexp' and whose -# values are dictionaries whose keys are the characters -# that may follow those prefixes. -# uniquePrefixMapping - Dictionary whose keys are the unique -# prefixes and whose values are not examined. -# prefixString - Current prefix being processed. -# -# Results: -# Returns a constructed regular expression that matches the set of -# unique prefixes beginning with the 'prefixString'. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::MakeUniquePrefixRegexp { successors - uniquePrefixMapping - prefixString } { - - # Get the characters that may follow the current prefix string - - set schars [lsort -ascii [dict keys [dict get $successors $prefixString]]] - if { [llength $schars] == 0 } { - return {} - } - - # If there is more than one successor character, or if the current prefix - # is a unique prefix, surround the generated re with non-capturing - # parentheses. - - set re {} - if { - [dict exists $uniquePrefixMapping $prefixString] - || [llength $schars] > 1 - } then { - append re "(?:" - } - - # Generate a regexp that matches the successors. - - set sep "" - foreach { c } $schars { - set nextPrefix $prefixString$c - regsub -all {[^[:alnum:]]} $c \\\\& rechar - append re $sep $rechar \ - [MakeUniquePrefixRegexp \ - $successors $uniquePrefixMapping $nextPrefix] - set sep | - } - - # If the current prefix is a unique prefix, make all following text - # optional. Otherwise, if there is more than one successor character, - # close the non-capturing parentheses. - - if { [dict exists $uniquePrefixMapping $prefixString] } { - append re ")?" - } elseif { [llength $schars] > 1 } { - append re ")" - } - - return $re -} - -#---------------------------------------------------------------------- -# -# MakeParseCodeFromFields -- -# -# Composes Tcl code to extract the Julian Day Number from a dictionary -# containing date fields. -# -# Parameters: -# dateFields -- Dictionary whose keys are fields of the date, -# and whose values are the rightmost positions -# at which those fields appear. -# parseActions -- List of triples: field set, priority, and -# code to emit. Smaller priorities are better, and -# the list must be in ascending order by priority -# -# Results: -# Returns a burst of code that extracts the day number from the given -# date. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::MakeParseCodeFromFields { dateFields parseActions } { - - set currPrio 999 - set currFieldPos [list] - set currCodeBurst { - error "in ::tcl::clock::MakeParseCodeFromFields: can't happen" - } - - foreach { fieldSet prio parseAction } $parseActions { - # If we've found an answer that's better than any that follow, quit - # now. - - if { $prio > $currPrio } { - break - } - - # Accumulate the field positions that are used in the current field - # grouping. - - set fieldPos [list] - set ok true - foreach field $fieldSet { - if { ! [dict exists $dateFields $field] } { - set ok 0 - break - } - lappend fieldPos [dict get $dateFields $field] - } - - # Quit if we don't have a complete set of fields - if { !$ok } { - continue - } - - # Determine whether the current answer is better than the last. - - set fPos [lsort -integer -decreasing $fieldPos] - - if { $prio == $currPrio } { - foreach currPos $currFieldPos newPos $fPos { - if { - ![string is integer $newPos] - || ![string is integer $currPos] - || $newPos > $currPos - } then { - break - } - if { $newPos < $currPos } { - set ok 0 - break - } - } - } - if { !$ok } { - continue - } - - # Remember the best possibility for extracting date information - - set currPrio $prio - set currFieldPos $fPos - set currCodeBurst $parseAction - } - - return $currCodeBurst -} - -#---------------------------------------------------------------------- -# -# EnterLocale -- -# -# Switch [mclocale] to a given locale if necessary -# -# Parameters: -# locale -- Desired locale -# -# Results: -# Returns the locale that was previously current. -# -# Side effects: -# Does [mclocale]. If necessary, loades the designated locale's files. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::EnterLocale { locale } { - if { $locale eq {system} } { - if { $::tcl_platform(platform) ne {windows} } { - # On a non-windows platform, the 'system' locale is the same as - # the 'current' locale - - set locale current - } else { - # On a windows platform, the 'system' locale is adapted from the - # 'current' locale by applying the date and time formats from the - # Control Panel. First, load the 'current' locale if it's not yet - # loaded - - mcpackagelocale set [mclocale] - - # Make a new locale string for the system locale, and get the - # Control Panel information - - set locale [mclocale]_windows - if { ! [mcpackagelocale present $locale] } { - LoadWindowsDateTimeFormats $locale - } - } - } - if { $locale eq {current}} { - set locale [mclocale] - } - # Eventually load the locale - mcpackagelocale set $locale -} - -#---------------------------------------------------------------------- -# -# LoadWindowsDateTimeFormats -- -# -# Load the date/time formats from the Control Panel in Windows and -# convert them so that they're usable by Tcl. -# -# Parameters: -# locale - Name of the locale in whose message catalog -# the converted formats are to be stored. -# -# Results: -# None. -# -# Side effects: -# Updates the given message catalog with the locale strings. -# -# Presumes that on entry, [mclocale] is set to the current locale, so that -# default strings can be obtained if the Registry query fails. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::LoadWindowsDateTimeFormats { locale } { - # Bail out if we can't find the Registry - - variable NoRegistry - if { [info exists NoRegistry] } return - - if { ![catch { - registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ - sShortDate - } string] } { - set quote {} - set datefmt {} - foreach { unquoted quoted } [split $string '] { - append datefmt $quote [string map { - dddd %A - ddd %a - dd %d - d %e - MMMM %B - MMM %b - MM %m - M %N - yyyy %Y - yy %y - y %y - gg {} - } $unquoted] - if { $quoted eq {} } { - set quote ' - } else { - set quote $quoted - } - } - ::msgcat::mcset $locale DATE_FORMAT $datefmt - } - - if { ![catch { - registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ - sLongDate - } string] } { - set quote {} - set ldatefmt {} - foreach { unquoted quoted } [split $string '] { - append ldatefmt $quote [string map { - dddd %A - ddd %a - dd %d - d %e - MMMM %B - MMM %b - MM %m - M %N - yyyy %Y - yy %y - y %y - gg {} - } $unquoted] - if { $quoted eq {} } { - set quote ' - } else { - set quote $quoted - } - } - ::msgcat::mcset $locale LOCALE_DATE_FORMAT $ldatefmt - } - - if { ![catch { - registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ - sTimeFormat - } string] } { - set quote {} - set timefmt {} - foreach { unquoted quoted } [split $string '] { - append timefmt $quote [string map { - HH %H - H %k - hh %I - h %l - mm %M - m %M - ss %S - s %S - tt %p - t %p - } $unquoted] - if { $quoted eq {} } { - set quote ' - } else { - set quote $quoted - } - } - ::msgcat::mcset $locale TIME_FORMAT $timefmt - } - - catch { - ::msgcat::mcset $locale DATE_TIME_FORMAT "$datefmt $timefmt" - } - catch { - ::msgcat::mcset $locale LOCALE_DATE_TIME_FORMAT "$ldatefmt $timefmt" - } - - return - -} - -#---------------------------------------------------------------------- -# -# LocalizeFormat -- -# -# Map away locale-dependent format groups in a clock format. -# -# Parameters: -# locale -- Current [mclocale] locale, supplied to avoid -# an extra call -# format -- Format supplied to [clock scan] or [clock format] -# -# Results: -# Returns the string with locale-dependent composite format groups -# substituted out. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::LocalizeFormat { locale format } { - - # message catalog key to cache this format - set key FORMAT_$format - - if { [::msgcat::mcexists -exactlocale -exactnamespace $key] } { - return [mc $key] - } - # Handle locale-dependent format groups by mapping them out of the format - # string. Note that the order of the [string map] operations is - # significant because later formats can refer to later ones; for example - # %c can refer to %X, which in turn can refer to %T. - - set list { - %% %% - %D %m/%d/%Y - %+ {%a %b %e %H:%M:%S %Z %Y} - } - lappend list %EY [string map $list [mc LOCALE_YEAR_FORMAT]] - lappend list %T [string map $list [mc TIME_FORMAT_24_SECS]] - lappend list %R [string map $list [mc TIME_FORMAT_24]] - lappend list %r [string map $list [mc TIME_FORMAT_12]] - lappend list %X [string map $list [mc TIME_FORMAT]] - lappend list %EX [string map $list [mc LOCALE_TIME_FORMAT]] - lappend list %x [string map $list [mc DATE_FORMAT]] - lappend list %Ex [string map $list [mc LOCALE_DATE_FORMAT]] - lappend list %c [string map $list [mc DATE_TIME_FORMAT]] - lappend list %Ec [string map $list [mc LOCALE_DATE_TIME_FORMAT]] - set format [string map $list $format] - - ::msgcat::mcset $locale $key $format - return $format -} - -#---------------------------------------------------------------------- -# -# FormatNumericTimeZone -- -# -# Formats a time zone as +hhmmss -# -# Parameters: -# z - Time zone in seconds east of Greenwich -# -# Results: -# Returns the time zone formatted in a numeric form -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::FormatNumericTimeZone { z } { - if { $z < 0 } { - set z [expr { - $z }] - set retval - - } else { - set retval + - } - append retval [::format %02d [expr { $z / 3600 }]] - set z [expr { $z % 3600 }] - append retval [::format %02d [expr { $z / 60 }]] - set z [expr { $z % 60 }] - if { $z != 0 } { - append retval [::format %02d $z] - } - return $retval -} - -#---------------------------------------------------------------------- -# -# FormatStarDate -- -# -# Formats a date as a StarDate. -# -# Parameters: -# date - Dictionary containing 'year', 'dayOfYear', and -# 'localSeconds' fields. -# -# Results: -# Returns the given date formatted as a StarDate. -# -# Side effects: -# None. -# -# Jeff Hobbs put this in to support an atrocious pun about Tcl being -# "Enterprise ready." Now we're stuck with it. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::FormatStarDate { date } { - variable Roddenberry - - # Get day of year, zero based - - set doy [expr { [dict get $date dayOfYear] - 1 }] - - # Determine whether the year is a leap year - - set lp [IsGregorianLeapYear $date] - - # Convert day of year to a fractional year - - if { $lp } { - set fractYear [expr { 1000 * $doy / 366 }] - } else { - set fractYear [expr { 1000 * $doy / 365 }] - } - - # Put together the StarDate - - return [::format "Stardate %02d%03d.%1d" \ - [expr { [dict get $date year] - $Roddenberry }] \ - $fractYear \ - [expr { [dict get $date localSeconds] % 86400 - / ( 86400 / 10 ) }]] -} - -#---------------------------------------------------------------------- -# -# ParseStarDate -- -# -# Parses a StarDate -# -# Parameters: -# year - Year from the Roddenberry epoch -# fractYear - Fraction of a year specifiying the day of year. -# fractDay - Fraction of a day -# -# Results: -# Returns a count of seconds from the Posix epoch. -# -# Side effects: -# None. -# -# Jeff Hobbs put this in to support an atrocious pun about Tcl being -# "Enterprise ready." Now we're stuck with it. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ParseStarDate { year fractYear fractDay } { - variable Roddenberry - - # Build a tentative date from year and fraction. - - set date [dict create \ - gregorian 1 \ - era CE \ - year [expr { $year + $Roddenberry }] \ - dayOfYear [expr { $fractYear * 365 / 1000 + 1 }]] - set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]] - - # Determine whether the given year is a leap year - - set lp [IsGregorianLeapYear $date] - - # Reconvert the fractional year according to whether the given year is a - # leap year - - if { $lp } { - dict set date dayOfYear \ - [expr { $fractYear * 366 / 1000 + 1 }] - } else { - dict set date dayOfYear \ - [expr { $fractYear * 365 / 1000 + 1 }] - } - dict unset date julianDay - dict unset date gregorian - set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]] - - return [expr { - 86400 * [dict get $date julianDay] - - 210866803200 - + ( 86400 / 10 ) * $fractDay - }] -} - -#---------------------------------------------------------------------- -# -# ScanWide -- -# -# Scans a wide integer from an input -# -# Parameters: -# str - String containing a decimal wide integer -# -# Results: -# Returns the string as a pure wide integer. Throws an error if the -# string is misformatted or out of range. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ScanWide { str } { - set count [::scan $str {%ld %c} result junk] - if { $count != 1 } { - return -code error -errorcode [list CLOCK notAnInteger $str] \ - "\"$str\" is not an integer" - } - if { [incr result 0] != $str } { - return -code error -errorcode [list CLOCK integervalueTooLarge] \ - "integer value too large to represent" - } - return $result -} - -#---------------------------------------------------------------------- -# -# InterpretTwoDigitYear -- -# -# Given a date that contains only the year of the century, determines -# the target value of a two-digit year. -# -# Parameters: -# date - Dictionary containing fields of the date. -# baseTime - Base time relative to which the date is expressed. -# twoDigitField - Name of the field that stores the two-digit year. -# Default is 'yearOfCentury' -# fourDigitField - Name of the field that will receive the four-digit -# year. Default is 'year' -# -# Results: -# Returns the dictionary augmented with the four-digit year, stored in -# the given key. -# -# Side effects: -# None. -# -# The current rule for interpreting a two-digit year is that the year shall be -# between 1937 and 2037, thus staying within the range of a 32-bit signed -# value for time. This rule may change to a sliding window in future -# versions, so the 'baseTime' parameter (which is currently ignored) is -# provided in the procedure signature. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::InterpretTwoDigitYear { date baseTime - { twoDigitField yearOfCentury } - { fourDigitField year } } { - set yr [dict get $date $twoDigitField] - if { $yr <= 37 } { - dict set date $fourDigitField [expr { $yr + 2000 }] - } else { - dict set date $fourDigitField [expr { $yr + 1900 }] - } - return $date -} - -#---------------------------------------------------------------------- -# -# AssignBaseYear -- -# -# Places the number of the current year into a dictionary. -# -# Parameters: -# date - Dictionary value to update -# baseTime - Base time from which to extract the year, expressed -# in seconds from the Posix epoch -# timezone - the time zone in which the date is being scanned -# changeover - the Julian Day on which the Gregorian calendar -# was adopted in the target locale. -# -# Results: -# Returns the dictionary with the current year assigned. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AssignBaseYear { date baseTime timezone changeover } { - variable TZData - - # Find the Julian Day Number corresponding to the base time, and - # find the Gregorian year corresponding to that Julian Day. - - set date2 [GetDateFields $baseTime $TZData($timezone) $changeover] - - # Store the converted year - - dict set date era [dict get $date2 era] - dict set date year [dict get $date2 year] - - return $date -} - -#---------------------------------------------------------------------- -# -# AssignBaseIso8601Year -- -# -# Determines the base year in the ISO8601 fiscal calendar. -# -# Parameters: -# date - Dictionary containing the fields of the date that -# is to be augmented with the base year. -# baseTime - Base time expressed in seconds from the Posix epoch. -# timeZone - Target time zone -# changeover - Julian Day of adoption of the Gregorian calendar in -# the target locale. -# -# Results: -# Returns the given date with "iso8601Year" set to the -# base year. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AssignBaseIso8601Year {date baseTime timeZone changeover} { - variable TZData - - # Find the Julian Day Number corresponding to the base time - - set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] - - # Calculate the ISO8601 date and transfer the year - - dict set date era CE - dict set date iso8601Year [dict get $date2 iso8601Year] - return $date -} - -#---------------------------------------------------------------------- -# -# AssignBaseMonth -- -# -# Places the number of the current year and month into a -# dictionary. -# -# Parameters: -# date - Dictionary value to update -# baseTime - Time from which the year and month are to be -# obtained, expressed in seconds from the Posix epoch. -# timezone - Name of the desired time zone -# changeover - Julian Day on which the Gregorian calendar was adopted. -# -# Results: -# Returns the dictionary with the base year and month assigned. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AssignBaseMonth {date baseTime timezone changeover} { - variable TZData - - # Find the year and month corresponding to the base time - - set date2 [GetDateFields $baseTime $TZData($timezone) $changeover] - dict set date era [dict get $date2 era] - dict set date year [dict get $date2 year] - dict set date month [dict get $date2 month] - return $date -} - -#---------------------------------------------------------------------- -# -# AssignBaseWeek -- -# -# Determines the base year and week in the ISO8601 fiscal calendar. -# -# Parameters: -# date - Dictionary containing the fields of the date that -# is to be augmented with the base year and week. -# baseTime - Base time expressed in seconds from the Posix epoch. -# changeover - Julian Day on which the Gregorian calendar was adopted -# in the target locale. -# -# Results: -# Returns the given date with "iso8601Year" set to the -# base year and "iso8601Week" to the week number. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AssignBaseWeek {date baseTime timeZone changeover} { - variable TZData - - # Find the Julian Day Number corresponding to the base time - - set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] - - # Calculate the ISO8601 date and transfer the year - - dict set date era CE - dict set date iso8601Year [dict get $date2 iso8601Year] - dict set date iso8601Week [dict get $date2 iso8601Week] - return $date -} - -#---------------------------------------------------------------------- -# -# AssignBaseJulianDay -- -# -# Determines the base day for a time-of-day conversion. -# -# Parameters: -# date - Dictionary that is to get the base day -# baseTime - Base time expressed in seconds from the Posix epoch -# changeover - Julian day on which the Gregorian calendar was -# adpoted in the target locale. -# -# Results: -# Returns the given dictionary augmented with a 'julianDay' field -# that contains the base day. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AssignBaseJulianDay { date baseTime timeZone changeover } { - variable TZData - - # Find the Julian Day Number corresponding to the base time - - set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] - dict set date julianDay [dict get $date2 julianDay] - - return $date -} - -#---------------------------------------------------------------------- -# -# InterpretHMSP -- -# -# Interprets a time in the form "hh:mm:ss am". -# -# Parameters: -# date -- Dictionary containing "hourAMPM", "minute", "second" -# and "amPmIndicator" fields. -# -# Results: -# Returns the number of seconds from local midnight. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::InterpretHMSP { date } { - set hr [dict get $date hourAMPM] - if { $hr == 12 } { - set hr 0 - } - if { [dict get $date amPmIndicator] } { - incr hr 12 - } - dict set date hour $hr - return [InterpretHMS $date[set date {}]] -} - -#---------------------------------------------------------------------- -# -# InterpretHMS -- -# -# Interprets a 24-hour time "hh:mm:ss" -# -# Parameters: -# date -- Dictionary containing the "hour", "minute" and "second" -# fields. -# -# Results: -# Returns the given dictionary augmented with a "secondOfDay" -# field containing the number of seconds from local midnight. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::InterpretHMS { date } { - return [expr { - ( [dict get $date hour] * 60 - + [dict get $date minute] ) * 60 - + [dict get $date second] - }] -} - -#---------------------------------------------------------------------- -# -# GetSystemTimeZone -- -# -# Determines the system time zone, which is the default for the -# 'clock' command if no other zone is supplied. -# -# Parameters: -# None. -# -# Results: -# Returns the system time zone. -# -# Side effects: -# Stores the sustem time zone in the 'CachedSystemTimeZone' -# variable, since determining it may be an expensive process. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::GetSystemTimeZone {} { - variable CachedSystemTimeZone - variable TimeZoneBad - - if {[set result [getenv TCL_TZ]] ne {}} { - set timezone $result - } elseif {[set result [getenv TZ]] ne {}} { - set timezone $result - } - if {![info exists timezone]} { - # Cache the time zone only if it was detected by one of the - # expensive methods. - if { [info exists CachedSystemTimeZone] } { - set timezone $CachedSystemTimeZone - } elseif { $::tcl_platform(platform) eq {windows} } { - set timezone [GuessWindowsTimeZone] - } elseif { [file exists /etc/localtime] - && ![catch {ReadZoneinfoFile \ - Tcl/Localtime /etc/localtime}] } { - set timezone :Tcl/Localtime - } else { - set timezone :localtime - } - set CachedSystemTimeZone $timezone - } - if { ![dict exists $TimeZoneBad $timezone] } { - dict set TimeZoneBad $timezone [catch {SetupTimeZone $timezone}] - } - if { [dict get $TimeZoneBad $timezone] } { - return :localtime - } else { - return $timezone - } -} - -#---------------------------------------------------------------------- -# -# ConvertLegacyTimeZone -- -# -# Given an alphanumeric time zone identifier and the system time zone, -# convert the alphanumeric identifier to an unambiguous time zone. -# -# Parameters: -# tzname - Name of the time zone to convert -# -# Results: -# Returns a time zone name corresponding to tzname, but in an -# unambiguous form, generally +hhmm. -# -# This procedure is implemented primarily to allow the parsing of RFC822 -# date/time strings. Processing a time zone name on input is not recommended -# practice, because there is considerable room for ambiguity; for instance, is -# BST Brazilian Standard Time, or British Summer Time? -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ConvertLegacyTimeZone { tzname } { - variable LegacyTimeZone - - set tzname [string tolower $tzname] - if { ![dict exists $LegacyTimeZone $tzname] } { - return -code error -errorcode [list CLOCK badTZName $tzname] \ - "time zone \"$tzname\" not found" - } - return [dict get $LegacyTimeZone $tzname] -} - -#---------------------------------------------------------------------- -# -# SetupTimeZone -- -# -# Given the name or specification of a time zone, sets up its in-memory -# data. -# -# Parameters: -# tzname - Name of a time zone -# -# Results: -# Unless the time zone is ':localtime', sets the TZData array to contain -# the lookup table for local<->UTC conversion. Returns an error if the -# time zone cannot be parsed. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::SetupTimeZone { timezone } { - variable TZData - - if {! [info exists TZData($timezone)] } { - variable MINWIDE - if { $timezone eq {:localtime} } { - # Nothing to do, we'll convert using the localtime function - - } elseif { - [regexp {^([-+])(\d\d)(?::?(\d\d)(?::?(\d\d))?)?} $timezone \ - -> s hh mm ss] - } then { - # Make a fixed offset - - ::scan $hh %d hh - if { $mm eq {} } { - set mm 0 - } else { - ::scan $mm %d mm - } - if { $ss eq {} } { - set ss 0 - } else { - ::scan $ss %d ss - } - set offset [expr { ( $hh * 60 + $mm ) * 60 + $ss }] - if { $s eq {-} } { - set offset [expr { - $offset }] - } - set TZData($timezone) [list [list $MINWIDE $offset -1 $timezone]] - - } elseif { [string index $timezone 0] eq {:} } { - # Convert using a time zone file - - if { - [catch { - LoadTimeZoneFile [string range $timezone 1 end] - }] && [catch { - LoadZoneinfoFile [string range $timezone 1 end] - }] - } then { - return -code error \ - -errorcode [list CLOCK badTimeZone $timezone] \ - "time zone \"$timezone\" not found" - } - } elseif { ![catch {ParsePosixTimeZone $timezone} tzfields] } { - # This looks like a POSIX time zone - try to process it - - if { [catch {ProcessPosixTimeZone $tzfields} data opts] } { - if { [lindex [dict get $opts -errorcode] 0] eq {CLOCK} } { - dict unset opts -errorinfo - } - return -options $opts $data - } else { - set TZData($timezone) $data - } - - } else { - # We couldn't parse this as a POSIX time zone. Try again with a - # time zone file - this time without a colon - - if { [catch { LoadTimeZoneFile $timezone }] - && [catch { LoadZoneinfoFile $timezone } - opts] } { - dict unset opts -errorinfo - return -options $opts "time zone $timezone not found" - } - set TZData($timezone) $TZData(:$timezone) - } - } - - return -} - -#---------------------------------------------------------------------- -# -# GuessWindowsTimeZone -- -# -# Determines the system time zone on windows. -# -# Parameters: -# None. -# -# Results: -# Returns a time zone specifier that corresponds to the system time zone -# information found in the Registry. -# -# Bugs: -# Fixed dates for DST change are unimplemented at present, because no -# time zone information supplied with Windows actually uses them! -# -# On a Windows system where neither $env(TCL_TZ) nor $env(TZ) is specified, -# GuessWindowsTimeZone looks in the Registry for the system time zone -# information. It then attempts to find an entry in WinZoneInfo for a time -# zone that uses the same rules. If it finds one, it returns it; otherwise, -# it constructs a Posix-style time zone string and returns that. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::GuessWindowsTimeZone {} { - variable WinZoneInfo - variable NoRegistry - variable TimeZoneBad - - if { [info exists NoRegistry] } { - return :localtime - } - - # Dredge time zone information out of the registry - - if { [catch { - set rpath HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\TimeZoneInformation - set data [list \ - [expr { -60 - * [registry get $rpath Bias] }] \ - [expr { -60 - * [registry get $rpath StandardBias] }] \ - [expr { -60 \ - * [registry get $rpath DaylightBias] }]] - set stdtzi [registry get $rpath StandardStart] - foreach ind {0 2 14 4 6 8 10 12} { - binary scan $stdtzi @${ind}s val - lappend data $val - } - set daytzi [registry get $rpath DaylightStart] - foreach ind {0 2 14 4 6 8 10 12} { - binary scan $daytzi @${ind}s val - lappend data $val - } - }] } { - # Missing values in the Registry - bail out - - return :localtime - } - - # Make up a Posix time zone specifier if we can't find one. Check here - # that the tzdata file exists, in case we're running in an environment - # (e.g. starpack) where tzdata is incomplete. (Bug 1237907) - - if { [dict exists $WinZoneInfo $data] } { - set tzname [dict get $WinZoneInfo $data] - if { ! [dict exists $TimeZoneBad $tzname] } { - dict set TimeZoneBad $tzname [catch {SetupTimeZone $tzname}] - } - } else { - set tzname {} - } - if { $tzname eq {} || [dict get $TimeZoneBad $tzname] } { - lassign $data \ - bias stdBias dstBias \ - stdYear stdMonth stdDayOfWeek stdDayOfMonth \ - stdHour stdMinute stdSecond stdMillisec \ - dstYear dstMonth dstDayOfWeek dstDayOfMonth \ - dstHour dstMinute dstSecond dstMillisec - set stdDelta [expr { $bias + $stdBias }] - set dstDelta [expr { $bias + $dstBias }] - if { $stdDelta <= 0 } { - set stdSignum + - set stdDelta [expr { - $stdDelta }] - set dispStdSignum - - } else { - set stdSignum - - set dispStdSignum + - } - set hh [::format %02d [expr { $stdDelta / 3600 }]] - set mm [::format %02d [expr { ($stdDelta / 60 ) % 60 }]] - set ss [::format %02d [expr { $stdDelta % 60 }]] - set tzname {} - append tzname < $dispStdSignum $hh $mm > $stdSignum $hh : $mm : $ss - if { $stdMonth >= 0 } { - if { $dstDelta <= 0 } { - set dstSignum + - set dstDelta [expr { - $dstDelta }] - set dispDstSignum - - } else { - set dstSignum - - set dispDstSignum + - } - set hh [::format %02d [expr { $dstDelta / 3600 }]] - set mm [::format %02d [expr { ($dstDelta / 60 ) % 60 }]] - set ss [::format %02d [expr { $dstDelta % 60 }]] - append tzname < $dispDstSignum $hh $mm > $dstSignum $hh : $mm : $ss - if { $dstYear == 0 } { - append tzname ,M $dstMonth . $dstDayOfMonth . $dstDayOfWeek - } else { - # I have not been able to find any locale on which Windows - # converts time zone on a fixed day of the year, hence don't - # know how to interpret the fields. If someone can inform me, - # I'd be glad to code it up. For right now, we bail out in - # such a case. - return :localtime - } - append tzname / [::format %02d $dstHour] \ - : [::format %02d $dstMinute] \ - : [::format %02d $dstSecond] - if { $stdYear == 0 } { - append tzname ,M $stdMonth . $stdDayOfMonth . $stdDayOfWeek - } else { - # I have not been able to find any locale on which Windows - # converts time zone on a fixed day of the year, hence don't - # know how to interpret the fields. If someone can inform me, - # I'd be glad to code it up. For right now, we bail out in - # such a case. - return :localtime - } - append tzname / [::format %02d $stdHour] \ - : [::format %02d $stdMinute] \ - : [::format %02d $stdSecond] - } - dict set WinZoneInfo $data $tzname - } - - return [dict get $WinZoneInfo $data] -} - -#---------------------------------------------------------------------- -# -# LoadTimeZoneFile -- -# -# Load the data file that specifies the conversion between a -# given time zone and Greenwich. -# -# Parameters: -# fileName -- Name of the file to load -# -# Results: -# None. -# -# Side effects: -# TZData(:fileName) contains the time zone data -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::LoadTimeZoneFile { fileName } { - variable DataDir - variable TZData - - if { [info exists TZData($fileName)] } { - return - } - - # Since an unsafe interp uses the [clock] command in the master, this code - # is security sensitive. Make sure that the path name cannot escape the - # given directory. - - if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } { - return -code error \ - -errorcode [list CLOCK badTimeZone $:fileName] \ - "time zone \":$fileName\" not valid" - } - try { - source -encoding utf-8 [file join $DataDir $fileName] - } on error {} { - return -code error \ - -errorcode [list CLOCK badTimeZone :$fileName] \ - "time zone \":$fileName\" not found" - } - return -} - -#---------------------------------------------------------------------- -# -# LoadZoneinfoFile -- -# -# Loads a binary time zone information file in Olson format. -# -# Parameters: -# fileName - Relative path name of the file to load. -# -# Results: -# Returns an empty result normally; returns an error if no Olson file -# was found or the file was malformed in some way. -# -# Side effects: -# TZData(:fileName) contains the time zone data -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::LoadZoneinfoFile { fileName } { - variable ZoneinfoPaths - - # Since an unsafe interp uses the [clock] command in the master, this code - # is security sensitive. Make sure that the path name cannot escape the - # given directory. - - if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } { - return -code error \ - -errorcode [list CLOCK badTimeZone $:fileName] \ - "time zone \":$fileName\" not valid" - } - foreach d $ZoneinfoPaths { - set fname [file join $d $fileName] - if { [file readable $fname] && [file isfile $fname] } { - break - } - unset fname - } - ReadZoneinfoFile $fileName $fname -} - -#---------------------------------------------------------------------- -# -# ReadZoneinfoFile -- -# -# Loads a binary time zone information file in Olson format. -# -# Parameters: -# fileName - Name of the time zone (relative path name of the -# file). -# fname - Absolute path name of the file. -# -# Results: -# Returns an empty result normally; returns an error if no Olson file -# was found or the file was malformed in some way. -# -# Side effects: -# TZData(:fileName) contains the time zone data -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ReadZoneinfoFile {fileName fname} { - variable MINWIDE - variable TZData - if { ![file exists $fname] } { - return -code error "$fileName not found" - } - - if { [file size $fname] > 262144 } { - return -code error "$fileName too big" - } - - # Suck in all the data from the file - - set f [open $fname r] - fconfigure $f -translation binary - set d [read $f] - close $f - - # The file begins with a magic number, sixteen reserved bytes, and then - # six 4-byte integers giving counts of fileds in the file. - - binary scan $d a4a1x15IIIIII \ - magic version nIsGMT nIsStd nLeap nTime nType nChar - set seek 44 - set ilen 4 - set iformat I - if { $magic != {TZif} } { - return -code error "$fileName not a time zone information file" - } - if { $nType > 255 } { - return -code error "$fileName contains too many time types" - } - # Accept only Posix-style zoneinfo. Sorry, 'leaps' bigots. - if { $nLeap != 0 } { - return -code error "$fileName contains leap seconds" - } - - # In a version 2 file, we use the second part of the file, which contains - # 64-bit transition times. - - if {$version eq "2"} { - set seek [expr { - 44 - + 5 * $nTime - + 6 * $nType - + 4 * $nLeap - + $nIsStd - + $nIsGMT - + $nChar - }] - binary scan $d @${seek}a4a1x15IIIIII \ - magic version nIsGMT nIsStd nLeap nTime nType nChar - if {$magic ne {TZif}} { - return -code error "seek address $seek miscomputed, magic = $magic" - } - set iformat W - set ilen 8 - incr seek 44 - } - - # Next come ${nTime} transition times, followed by ${nTime} time type - # codes. The type codes are unsigned 1-byte quantities. We insert an - # arbitrary start time in front of the transitions. - - binary scan $d @${seek}${iformat}${nTime}c${nTime} times tempCodes - incr seek [expr { ($ilen + 1) * $nTime }] - set times [linsert $times 0 $MINWIDE] - set codes {} - foreach c $tempCodes { - lappend codes [expr { $c & 0xff }] - } - set codes [linsert $codes 0 0] - - # Next come ${nType} time type descriptions, each of which has an offset - # (seconds east of GMT), a DST indicator, and an index into the - # abbreviation text. - - for { set i 0 } { $i < $nType } { incr i } { - binary scan $d @${seek}Icc gmtOff isDst abbrInd - lappend types [list $gmtOff $isDst $abbrInd] - incr seek 6 - } - - # Next come $nChar characters of time zone name abbreviations, which are - # null-terminated. - # We build them up into a dictionary indexed by character index, because - # that's what's in the indices above. - - binary scan $d @${seek}a${nChar} abbrs - incr seek ${nChar} - set abbrList [split $abbrs \0] - set i 0 - set abbrevs {} - foreach a $abbrList { - for {set j 0} {$j <= [string length $a]} {incr j} { - dict set abbrevs $i [string range $a $j end] - incr i - } - } - - # Package up a list of tuples, each of which contains transition time, - # seconds east of Greenwich, DST flag and time zone abbreviation. - - set r {} - set lastTime $MINWIDE - foreach t $times c $codes { - if { $t < $lastTime } { - return -code error "$fileName has times out of order" - } - set lastTime $t - lassign [lindex $types $c] gmtoff isDst abbrInd - set abbrev [dict get $abbrevs $abbrInd] - lappend r [list $t $gmtoff $isDst $abbrev] - } - - # In a version 2 file, there is also a POSIX-style time zone description - # at the very end of the file. To get to it, skip over nLeap leap second - # values (8 bytes each), - # nIsStd standard/DST indicators and nIsGMT UTC/local indicators. - - if {$version eq {2}} { - set seek [expr {$seek + 8 * $nLeap + $nIsStd + $nIsGMT + 1}] - set last [string first \n $d $seek] - set posix [string range $d $seek [expr {$last-1}]] - if {[llength $posix] > 0} { - set posixFields [ParsePosixTimeZone $posix] - foreach tuple [ProcessPosixTimeZone $posixFields] { - lassign $tuple t gmtoff isDst abbrev - if {$t > $lastTime} { - lappend r $tuple - } - } - } - } - - set TZData(:$fileName) $r - - return -} - -#---------------------------------------------------------------------- -# -# ParsePosixTimeZone -- -# -# Parses the TZ environment variable in Posix form -# -# Parameters: -# tz Time zone specifier to be interpreted -# -# Results: -# Returns a dictionary whose values contain the various pieces of the -# time zone specification. -# -# Side effects: -# None. -# -# Errors: -# Throws an error if the syntax of the time zone is incorrect. -# -# The following keys are present in the dictionary: -# stdName - Name of the time zone when Daylight Saving Time -# is not in effect. -# stdSignum - Sign (+, -, or empty) of the offset from Greenwich -# to the given (non-DST) time zone. + and the empty -# string denote zones west of Greenwich, - denotes east -# of Greenwich; this is contrary to the ISO convention -# but follows Posix. -# stdHours - Hours part of the offset from Greenwich to the given -# (non-DST) time zone. -# stdMinutes - Minutes part of the offset from Greenwich to the -# given (non-DST) time zone. Empty denotes zero. -# stdSeconds - Seconds part of the offset from Greenwich to the -# given (non-DST) time zone. Empty denotes zero. -# dstName - Name of the time zone when DST is in effect, or the -# empty string if the time zone does not observe Daylight -# Saving Time. -# dstSignum, dstHours, dstMinutes, dstSeconds - -# Fields corresponding to stdSignum, stdHours, stdMinutes, -# stdSeconds for the Daylight Saving Time version of the -# time zone. If dstHours is empty, it is presumed to be 1. -# startDayOfYear - The ordinal number of the day of the year on which -# Daylight Saving Time begins. If this field is -# empty, then DST begins on a given month-week-day, -# as below. -# startJ - The letter J, or an empty string. If a J is present in -# this field, then startDayOfYear does not count February 29 -# even in leap years. -# startMonth - The number of the month in which Daylight Saving Time -# begins, supplied if startDayOfYear is empty. If both -# startDayOfYear and startMonth are empty, then US rules -# are presumed. -# startWeekOfMonth - The number of the week in the month in which -# Daylight Saving Time begins, in the range 1-5. -# 5 denotes the last week of the month even in a -# 4-week month. -# startDayOfWeek - The number of the day of the week (Sunday=0, -# Saturday=6) on which Daylight Saving Time begins. -# startHours - The hours part of the time of day at which Daylight -# Saving Time begins. An empty string is presumed to be 2. -# startMinutes - The minutes part of the time of day at which DST begins. -# An empty string is presumed zero. -# startSeconds - The seconds part of the time of day at which DST begins. -# An empty string is presumed zero. -# endDayOfYear, endJ, endMonth, endWeekOfMonth, endDayOfWeek, -# endHours, endMinutes, endSeconds - -# Specify the end of DST in the same way that the start* fields -# specify the beginning of DST. -# -# This procedure serves only to break the time specifier into fields. No -# attempt is made to canonicalize the fields or supply default values. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ParsePosixTimeZone { tz } { - if {[regexp -expanded -nocase -- { - ^ - # 1 - Standard time zone name - ([[:alpha:]]+ | <[-+[:alnum:]]+>) - # 2 - Standard time zone offset, signum - ([-+]?) - # 3 - Standard time zone offset, hours - ([[:digit:]]{1,2}) - (?: - # 4 - Standard time zone offset, minutes - : ([[:digit:]]{1,2}) - (?: - # 5 - Standard time zone offset, seconds - : ([[:digit:]]{1,2} ) - )? - )? - (?: - # 6 - DST time zone name - ([[:alpha:]]+ | <[-+[:alnum:]]+>) - (?: - (?: - # 7 - DST time zone offset, signum - ([-+]?) - # 8 - DST time zone offset, hours - ([[:digit:]]{1,2}) - (?: - # 9 - DST time zone offset, minutes - : ([[:digit:]]{1,2}) - (?: - # 10 - DST time zone offset, seconds - : ([[:digit:]]{1,2}) - )? - )? - )? - (?: - , - (?: - # 11 - Optional J in n and Jn form 12 - Day of year - ( J ? ) ( [[:digit:]]+ ) - | M - # 13 - Month number 14 - Week of month 15 - Day of week - ( [[:digit:]] + ) - [.] ( [[:digit:]] + ) - [.] ( [[:digit:]] + ) - ) - (?: - # 16 - Start time of DST - hours - / ( [[:digit:]]{1,2} ) - (?: - # 17 - Start time of DST - minutes - : ( [[:digit:]]{1,2} ) - (?: - # 18 - Start time of DST - seconds - : ( [[:digit:]]{1,2} ) - )? - )? - )? - , - (?: - # 19 - Optional J in n and Jn form 20 - Day of year - ( J ? ) ( [[:digit:]]+ ) - | M - # 21 - Month number 22 - Week of month 23 - Day of week - ( [[:digit:]] + ) - [.] ( [[:digit:]] + ) - [.] ( [[:digit:]] + ) - ) - (?: - # 24 - End time of DST - hours - / ( [[:digit:]]{1,2} ) - (?: - # 25 - End time of DST - minutes - : ( [[:digit:]]{1,2} ) - (?: - # 26 - End time of DST - seconds - : ( [[:digit:]]{1,2} ) - )? - )? - )? - )? - )? - )? - $ - } $tz -> x(stdName) x(stdSignum) x(stdHours) x(stdMinutes) x(stdSeconds) \ - x(dstName) x(dstSignum) x(dstHours) x(dstMinutes) x(dstSeconds) \ - x(startJ) x(startDayOfYear) \ - x(startMonth) x(startWeekOfMonth) x(startDayOfWeek) \ - x(startHours) x(startMinutes) x(startSeconds) \ - x(endJ) x(endDayOfYear) \ - x(endMonth) x(endWeekOfMonth) x(endDayOfWeek) \ - x(endHours) x(endMinutes) x(endSeconds)] } { - # it's a good timezone - - return [array get x] - } - - return -code error\ - -errorcode [list CLOCK badTimeZone $tz] \ - "unable to parse time zone specification \"$tz\"" -} - -#---------------------------------------------------------------------- -# -# ProcessPosixTimeZone -- -# -# Handle a Posix time zone after it's been broken out into fields. -# -# Parameters: -# z - Dictionary returned from 'ParsePosixTimeZone' -# -# Results: -# Returns time zone information for the 'TZData' array. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ProcessPosixTimeZone { z } { - variable MINWIDE - variable TZData - - # Determine the standard time zone name and seconds east of Greenwich - - set stdName [dict get $z stdName] - if { [string index $stdName 0] eq {<} } { - set stdName [string range $stdName 1 end-1] - } - if { [dict get $z stdSignum] eq {-} } { - set stdSignum +1 - } else { - set stdSignum -1 - } - set stdHours [lindex [::scan [dict get $z stdHours] %d] 0] - if { [dict get $z stdMinutes] ne {} } { - set stdMinutes [lindex [::scan [dict get $z stdMinutes] %d] 0] - } else { - set stdMinutes 0 - } - if { [dict get $z stdSeconds] ne {} } { - set stdSeconds [lindex [::scan [dict get $z stdSeconds] %d] 0] - } else { - set stdSeconds 0 - } - set stdOffset [expr { - (($stdHours * 60 + $stdMinutes) * 60 + $stdSeconds) * $stdSignum - }] - set data [list [list $MINWIDE $stdOffset 0 $stdName]] - - # If there's no daylight zone, we're done - - set dstName [dict get $z dstName] - if { $dstName eq {} } { - return $data - } - if { [string index $dstName 0] eq {<} } { - set dstName [string range $dstName 1 end-1] - } - - # Determine the daylight name - - if { [dict get $z dstSignum] eq {-} } { - set dstSignum +1 - } else { - set dstSignum -1 - } - if { [dict get $z dstHours] eq {} } { - set dstOffset [expr { 3600 + $stdOffset }] - } else { - set dstHours [lindex [::scan [dict get $z dstHours] %d] 0] - if { [dict get $z dstMinutes] ne {} } { - set dstMinutes [lindex [::scan [dict get $z dstMinutes] %d] 0] - } else { - set dstMinutes 0 - } - if { [dict get $z dstSeconds] ne {} } { - set dstSeconds [lindex [::scan [dict get $z dstSeconds] %d] 0] - } else { - set dstSeconds 0 - } - set dstOffset [expr { - (($dstHours*60 + $dstMinutes) * 60 + $dstSeconds) * $dstSignum - }] - } - - # Fill in defaults for European or US DST rules - # US start time is the second Sunday in March - # EU start time is the last Sunday in March - # US end time is the first Sunday in November. - # EU end time is the last Sunday in October - - if { - [dict get $z startDayOfYear] eq {} - && [dict get $z startMonth] eq {} - } then { - if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} { - # EU - dict set z startWeekOfMonth 5 - if {$stdHours>2} { - dict set z startHours 2 - } else { - dict set z startHours [expr {$stdHours+1}] - } - } else { - # US - dict set z startWeekOfMonth 2 - dict set z startHours 2 - } - dict set z startMonth 3 - dict set z startDayOfWeek 0 - dict set z startMinutes 0 - dict set z startSeconds 0 - } - if { - [dict get $z endDayOfYear] eq {} - && [dict get $z endMonth] eq {} - } then { - if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} { - # EU - dict set z endMonth 10 - dict set z endWeekOfMonth 5 - if {$stdHours>2} { - dict set z endHours 3 - } else { - dict set z endHours [expr {$stdHours+2}] - } - } else { - # US - dict set z endMonth 11 - dict set z endWeekOfMonth 1 - dict set z endHours 2 - } - dict set z endDayOfWeek 0 - dict set z endMinutes 0 - dict set z endSeconds 0 - } - - # Put DST in effect in all years from 1916 to 2099. - - for { set y 1916 } { $y < 2100 } { incr y } { - set startTime [DeterminePosixDSTTime $z start $y] - incr startTime [expr { - wide($stdOffset) }] - set endTime [DeterminePosixDSTTime $z end $y] - incr endTime [expr { - wide($dstOffset) }] - if { $startTime < $endTime } { - lappend data \ - [list $startTime $dstOffset 1 $dstName] \ - [list $endTime $stdOffset 0 $stdName] - } else { - lappend data \ - [list $endTime $stdOffset 0 $stdName] \ - [list $startTime $dstOffset 1 $dstName] - } - } - - return $data -} - -#---------------------------------------------------------------------- -# -# DeterminePosixDSTTime -- -# -# Determines the time that Daylight Saving Time starts or ends from a -# Posix time zone specification. -# -# Parameters: -# z - Time zone data returned from ParsePosixTimeZone. -# Missing fields are expected to be filled in with -# default values. -# bound - The word 'start' or 'end' -# y - The year for which the transition time is to be determined. -# -# Results: -# Returns the transition time as a count of seconds from the epoch. The -# time is relative to the wall clock, not UTC. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::DeterminePosixDSTTime { z bound y } { - - variable FEB_28 - - # Determine the start or end day of DST - - set date [dict create era CE year $y] - set doy [dict get $z ${bound}DayOfYear] - if { $doy ne {} } { - - # Time was specified as a day of the year - - if { [dict get $z ${bound}J] ne {} - && [IsGregorianLeapYear $y] - && ( $doy > $FEB_28 ) } { - incr doy - } - dict set date dayOfYear $doy - set date [GetJulianDayFromEraYearDay $date[set date {}] 2361222] - } else { - # Time was specified as a day of the week within a month - - dict set date month [dict get $z ${bound}Month] - dict set date dayOfWeek [dict get $z ${bound}DayOfWeek] - set dowim [dict get $z ${bound}WeekOfMonth] - if { $dowim >= 5 } { - set dowim -1 - } - dict set date dayOfWeekInMonth $dowim - set date [GetJulianDayFromEraYearMonthWeekDay $date[set date {}] 2361222] - - } - - set jd [dict get $date julianDay] - set seconds [expr { - wide($jd) * wide(86400) - wide(210866803200) - }] - - set h [dict get $z ${bound}Hours] - if { $h eq {} } { - set h 2 - } else { - set h [lindex [::scan $h %d] 0] - } - set m [dict get $z ${bound}Minutes] - if { $m eq {} } { - set m 0 - } else { - set m [lindex [::scan $m %d] 0] - } - set s [dict get $z ${bound}Seconds] - if { $s eq {} } { - set s 0 - } else { - set s [lindex [::scan $s %d] 0] - } - set tod [expr { ( $h * 60 + $m ) * 60 + $s }] - return [expr { $seconds + $tod }] -} - -#---------------------------------------------------------------------- -# -# GetLocaleEra -- -# -# Given local time expressed in seconds from the Posix epoch, -# determine localized era and year within the era. -# -# Parameters: -# date - Dictionary that must contain the keys, 'localSeconds', -# whose value is expressed as the appropriate local time; -# and 'year', whose value is the Gregorian year. -# etable - Value of the LOCALE_ERAS key in the message catalogue -# for the target locale. -# -# Results: -# Returns the dictionary, augmented with the keys, 'localeEra' and -# 'localeYear'. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::GetLocaleEra { date etable } { - set index [BSearch $etable [dict get $date localSeconds]] - if { $index < 0} { - dict set date localeEra \ - [::format %02d [expr { [dict get $date year] / 100 }]] - dict set date localeYear [expr { - [dict get $date year] % 100 - }] - } else { - dict set date localeEra [lindex $etable $index 1] - dict set date localeYear [expr { - [dict get $date year] - [lindex $etable $index 2] - }] - } - return $date -} - -#---------------------------------------------------------------------- -# -# GetJulianDayFromEraYearDay -- -# -# Given a year, month and day on the Gregorian calendar, determines -# the Julian Day Number beginning at noon on that date. -# -# Parameters: -# date -- A dictionary in which the 'era', 'year', and -# 'dayOfYear' slots are populated. The calendar in use -# is determined by the date itself relative to: -# changeover -- Julian day on which the Gregorian calendar was -# adopted in the current locale. -# -# Results: -# Returns the given dictionary augmented with a 'julianDay' key whose -# value is the desired Julian Day Number, and a 'gregorian' key that -# specifies whether the calendar is Gregorian (1) or Julian (0). -# -# Side effects: -# None. -# -# Bugs: -# This code needs to be moved to the C layer. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::GetJulianDayFromEraYearDay {date changeover} { - # Get absolute year number from the civil year - - switch -exact -- [dict get $date era] { - BCE { - set year [expr { 1 - [dict get $date year] }] - } - CE { - set year [dict get $date year] - } - } - set ym1 [expr { $year - 1 }] - - # Try the Gregorian calendar first. - - dict set date gregorian 1 - set jd [expr { - 1721425 - + [dict get $date dayOfYear] - + ( 365 * $ym1 ) - + ( $ym1 / 4 ) - - ( $ym1 / 100 ) - + ( $ym1 / 400 ) - }] - - # If the date is before the Gregorian change, use the Julian calendar. - - if { $jd < $changeover } { - dict set date gregorian 0 - set jd [expr { - 1721423 - + [dict get $date dayOfYear] - + ( 365 * $ym1 ) - + ( $ym1 / 4 ) - }] - } - - dict set date julianDay $jd - return $date -} - -#---------------------------------------------------------------------- -# -# GetJulianDayFromEraYearMonthWeekDay -- -# -# Determines the Julian Day number corresponding to the nth given -# day-of-the-week in a given month. -# -# Parameters: -# date - Dictionary containing the keys, 'era', 'year', 'month' -# 'weekOfMonth', 'dayOfWeek', and 'dayOfWeekInMonth'. -# changeover - Julian Day of adoption of the Gregorian calendar -# -# Results: -# Returns the given dictionary, augmented with a 'julianDay' key. -# -# Side effects: -# None. -# -# Bugs: -# This code needs to be moved to the C layer. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::GetJulianDayFromEraYearMonthWeekDay {date changeover} { - # Come up with a reference day; either the zeroeth day of the given month - # (dayOfWeekInMonth >= 0) or the seventh day of the following month - # (dayOfWeekInMonth < 0) - - set date2 $date - set week [dict get $date dayOfWeekInMonth] - if { $week >= 0 } { - dict set date2 dayOfMonth 0 - } else { - dict incr date2 month - dict set date2 dayOfMonth 7 - } - set date2 [GetJulianDayFromEraYearMonthDay $date2[set date2 {}] \ - $changeover] - set wd0 [WeekdayOnOrBefore [dict get $date dayOfWeek] \ - [dict get $date2 julianDay]] - dict set date julianDay [expr { $wd0 + 7 * $week }] - return $date -} - -#---------------------------------------------------------------------- -# -# IsGregorianLeapYear -- -# -# Determines whether a given date represents a leap year in the -# Gregorian calendar. -# -# Parameters: -# date -- The date to test. The fields, 'era', 'year' and 'gregorian' -# must be set. -# -# Results: -# Returns 1 if the year is a leap year, 0 otherwise. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::IsGregorianLeapYear { date } { - switch -exact -- [dict get $date era] { - BCE { - set year [expr { 1 - [dict get $date year]}] - } - CE { - set year [dict get $date year] - } - } - if { $year % 4 != 0 } { - return 0 - } elseif { ![dict get $date gregorian] } { - return 1 - } elseif { $year % 400 == 0 } { - return 1 - } elseif { $year % 100 == 0 } { - return 0 - } else { - return 1 - } -} - -#---------------------------------------------------------------------- -# -# WeekdayOnOrBefore -- -# -# Determine the nearest day of week (given by the 'weekday' parameter, -# Sunday==0) on or before a given Julian Day. -# -# Parameters: -# weekday -- Day of the week -# j -- Julian Day number -# -# Results: -# Returns the Julian Day Number of the desired date. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::WeekdayOnOrBefore { weekday j } { - set k [expr { ( $weekday + 6 ) % 7 }] - return [expr { $j - ( $j - $k ) % 7 }] -} - -#---------------------------------------------------------------------- -# -# BSearch -- -# -# Service procedure that does binary search in several places inside the -# 'clock' command. -# -# Parameters: -# list - List of lists, sorted in ascending order by the -# first elements -# key - Value to search for -# -# Results: -# Returns the index of the greatest element in $list that is less than -# or equal to $key. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::BSearch { list key } { - if {[llength $list] == 0} { - return -1 - } - if { $key < [lindex $list 0 0] } { - return -1 - } - - set l 0 - set u [expr { [llength $list] - 1 }] - - while { $l < $u } { - # At this point, we know that - # $k >= [lindex $list $l 0] - # Either $u == [llength $list] or else $k < [lindex $list $u+1 0] - # We find the midpoint of the interval {l,u} rounded UP, compare - # against it, and set l or u to maintain the invariant. Note that the - # interval shrinks at each step, guaranteeing convergence. - - set m [expr { ( $l + $u + 1 ) / 2 }] - if { $key >= [lindex $list $m 0] } { - set l $m - } else { - set u [expr { $m - 1 }] - } - } - - return $l -} - -#---------------------------------------------------------------------- -# -# clock add -- -# -# Adds an offset to a given time. -# -# Syntax: -# clock add clockval ?count unit?... ?-option value? -# -# Parameters: -# clockval -- Starting time value -# count -- Amount of a unit of time to add -# unit -- Unit of time to add, must be one of: -# years year months month weeks week -# days day hours hour minutes minute -# seconds second -# -# Options: -# -gmt BOOLEAN -# (Deprecated) Flag synonymous with '-timezone :GMT' -# -timezone ZONE -# Name of the time zone in which calculations are to be done. -# -locale NAME -# Name of the locale in which calculations are to be done. -# Used to determine the Gregorian change date. -# -# Results: -# Returns the given time adjusted by the given offset(s) in -# order. -# -# Notes: -# It is possible that adding a number of months or years will adjust the -# day of the month as well. For instance, the time at one month after -# 31 January is either 28 or 29 February, because February has fewer -# than 31 days. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::add { clockval args } { - if { [llength $args] % 2 != 0 } { - set cmdName "clock add" - return -code error \ - -errorcode [list CLOCK wrongNumArgs] \ - "wrong \# args: should be\ - \"$cmdName clockval ?number units?...\ - ?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?\"" - } - if { [catch { expr {wide($clockval)} } result] } { - return -code error $result - } - - set offsets {} - set gmt 0 - set locale c - set timezone [GetSystemTimeZone] - - foreach { a b } $args { - if { [string is integer -strict $a] } { - lappend offsets $a $b - } else { - switch -exact -- $a { - -g - -gm - -gmt { - set gmt $b - } - -l - -lo - -loc - -loca - -local - -locale { - set locale [string tolower $b] - } - -t - -ti - -tim - -time - -timez - -timezo - -timezon - - -timezone { - set timezone $b - } - default { - throw [list CLOCK badOption $a] \ - "bad option \"$a\",\ - must be -gmt, -locale or -timezone" - } - } - } - } - - # Check options for validity - - if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } { - return -code error \ - -errorcode [list CLOCK gmtWithTimezone] \ - "cannot use -gmt and -timezone in same call" - } - if { [catch { expr { wide($clockval) } } result] } { - return -code error "expected integer but got \"$clockval\"" - } - if { ![string is boolean -strict $gmt] } { - return -code error "expected boolean value but got \"$gmt\"" - } elseif { $gmt } { - set timezone :GMT - } - - EnterLocale $locale - - set changeover [mc GREGORIAN_CHANGE_DATE] - - if {[catch {SetupTimeZone $timezone} retval opts]} { - dict unset opts -errorinfo - return -options $opts $retval - } - - try { - foreach { quantity unit } $offsets { - switch -exact -- $unit { - years - year { - set clockval [AddMonths [expr { 12 * $quantity }] \ - $clockval $timezone $changeover] - } - months - month { - set clockval [AddMonths $quantity $clockval $timezone \ - $changeover] - } - - weeks - week { - set clockval [AddDays [expr { 7 * $quantity }] \ - $clockval $timezone $changeover] - } - days - day { - set clockval [AddDays $quantity $clockval $timezone \ - $changeover] - } - - hours - hour { - set clockval [expr { 3600 * $quantity + $clockval }] - } - minutes - minute { - set clockval [expr { 60 * $quantity + $clockval }] - } - seconds - second { - set clockval [expr { $quantity + $clockval }] - } - - default { - throw [list CLOCK badUnit $unit] \ - "unknown unit \"$unit\", must be \ - years, months, weeks, days, hours, minutes or seconds" - } - } - } - return $clockval - } trap CLOCK {result opts} { - # Conceal the innards of [clock] when it's an expected error - dict unset opts -errorinfo - return -options $opts $result - } -} - -#---------------------------------------------------------------------- -# -# AddMonths -- -# -# Add a given number of months to a given clock value in a given -# time zone. -# -# Parameters: -# months - Number of months to add (may be negative) -# clockval - Seconds since the epoch before the operation -# timezone - Time zone in which the operation is to be performed -# -# Results: -# Returns the new clock value as a number of seconds since -# the epoch. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AddMonths { months clockval timezone changeover } { - variable DaysInRomanMonthInCommonYear - variable DaysInRomanMonthInLeapYear - variable TZData - - # Convert the time to year, month, day, and fraction of day. - - set date [GetDateFields $clockval $TZData($timezone) $changeover] - dict set date secondOfDay [expr { - [dict get $date localSeconds] % 86400 - }] - dict set date tzName $timezone - - # Add the requisite number of months - - set m [dict get $date month] - incr m $months - incr m -1 - set delta [expr { $m / 12 }] - set mm [expr { $m % 12 }] - dict set date month [expr { $mm + 1 }] - dict incr date year $delta - - # If the date doesn't exist in the current month, repair it - - if { [IsGregorianLeapYear $date] } { - set hath [lindex $DaysInRomanMonthInLeapYear $mm] - } else { - set hath [lindex $DaysInRomanMonthInCommonYear $mm] - } - if { [dict get $date dayOfMonth] > $hath } { - dict set date dayOfMonth $hath - } - - # Reconvert to a number of seconds - - set date [GetJulianDayFromEraYearMonthDay \ - $date[set date {}]\ - $changeover] - dict set date localSeconds [expr { - -210866803200 - + ( 86400 * wide([dict get $date julianDay]) ) - + [dict get $date secondOfDay] - }] - set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \ - $changeover] - - return [dict get $date seconds] - -} - -#---------------------------------------------------------------------- -# -# AddDays -- -# -# Add a given number of days to a given clock value in a given time -# zone. -# -# Parameters: -# days - Number of days to add (may be negative) -# clockval - Seconds since the epoch before the operation -# timezone - Time zone in which the operation is to be performed -# changeover - Julian Day on which the Gregorian calendar was adopted -# in the target locale. -# -# Results: -# Returns the new clock value as a number of seconds since the epoch. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AddDays { days clockval timezone changeover } { - variable TZData - - # Convert the time to Julian Day - - set date [GetDateFields $clockval $TZData($timezone) $changeover] - dict set date secondOfDay [expr { - [dict get $date localSeconds] % 86400 - }] - dict set date tzName $timezone - - # Add the requisite number of days - - dict incr date julianDay $days - - # Reconvert to a number of seconds - - dict set date localSeconds [expr { - -210866803200 - + ( 86400 * wide([dict get $date julianDay]) ) - + [dict get $date secondOfDay] - }] - set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \ - $changeover] - - return [dict get $date seconds] - -} - -#---------------------------------------------------------------------- -# -# ChangeCurrentLocale -- -# -# The global locale was changed within msgcat. -# Clears the buffered parse functions of the current locale. -# -# Parameters: -# loclist (ignored) -# -# Results: -# None. -# -# Side effects: -# Buffered parse functions are cleared. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ChangeCurrentLocale {args} { - variable FormatProc - variable LocaleNumeralCache - variable CachedSystemTimeZone - variable TimeZoneBad - - foreach p [info procs [namespace current]::scanproc'*'current] { - rename $p {} - } - foreach p [info procs [namespace current]::formatproc'*'current] { - rename $p {} - } - - catch {array unset FormatProc *'current} - set LocaleNumeralCache {} -} - -#---------------------------------------------------------------------- -# -# ClearCaches -- -# -# Clears all caches to reclaim the memory used in [clock] -# -# Parameters: -# None. -# -# Results: -# None. -# -# Side effects: -# Caches are cleared. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::ClearCaches {} { - variable FormatProc - variable LocaleNumeralCache - variable CachedSystemTimeZone - variable TimeZoneBad - - foreach p [info procs [namespace current]::scanproc'*] { - rename $p {} - } - foreach p [info procs [namespace current]::formatproc'*] { - rename $p {} - } - - catch {unset FormatProc} - set LocaleNumeralCache {} - catch {unset CachedSystemTimeZone} - set TimeZoneBad {} - InitTZData -} diff --git a/waypoint_manager/manager_GUI/tcl/encoding/ascii.enc b/waypoint_manager/manager_GUI/tcl/encoding/ascii.enc deleted file mode 100644 index e0320b8..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/ascii.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: ascii, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/big5.enc b/waypoint_manager/manager_GUI/tcl/encoding/big5.enc deleted file mode 100644 index 26179f4..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/big5.enc +++ /dev/null @@ -1,1516 +0,0 @@ -# Encoding file: big5, multi-byte -M -003F 0 89 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3000FF0C30013002FF0E2022FF1BFF1AFF1FFF01FE3020262025FE50FF64FE52 -00B7FE54FE55FE56FE57FF5C2013FE312014FE33FFFDFE34FE4FFF08FF09FE35 -FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D -FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A -203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC -32A32105203EFFFDFF3FFFFDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B -FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63 -FE64FE65FE66223C2229222A22A52220221F22BF33D233D1222B222E22352234 -26402642264126092191219321902192219621972199219822252223FFFD0000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FFFDFF0FFF3CFF0400A5301200A200A3FF05FF2021032109FE69FE6AFE6B33D5 -339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7 -74E97CCE25812582258325842585258625872588258F258E258D258C258B258A -2589253C2534252C2524251C2594250025022595250C251025142518256D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10 -FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166 -216721682169302130223023302430253026302730283029FFFD5344FFFDFF21 -FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31 -FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47 -FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C -039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4 -03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5 -03C603C703C803C931053106310731083109310A310B310C310D310E310F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00003110311131123113311431153116311731183119311A311B311C311D311E -311F312031213122312331243125312631273128312902D902C902CA02C702CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B -53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E -4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8 -5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1 -4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6 -52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD -58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3 -62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79 -6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4 -4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317 -531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8 -53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01 -5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63 -6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529 -7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB -4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10 -4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5171518D51B0521752115212520E521652A3530853215320537053715409540F -540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD -573357305728572D572C572F57295919591A59375938598459785983597D5979 -598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC -65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F -6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A -7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B -821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57 -4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225 -52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426 -544E542754465443543354485442541B5429544A5439543B5438542E54355436 -5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996 -598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F -5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77 -5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276 -6289626D628A627C627E627962736292626F6298626E62956293629162866539 -653B653865F166F4675F674E674F67506751675C6756675E6749674667600000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70 -6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076 -707C707D707872627261726072C472C27396752C752B75377538768276EF77E3 -79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B -8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E -9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F -4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154 -51525155516951775176517851BD51FD523B52385237523A5230522E52365241 -52BE52BB5352535453535351536653775378537953D653D453D7547354750000 -A9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5496547854955480547B5477548454925486547C549054715476548C549A5462 -5468548B547D548E56FA57835777576A5769576157665764577C591C59495947 -59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF -59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78 -5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD -5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215 -623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB -62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC -62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000 -AA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6607670D670B676D678B67956771679C677367776787679D6797676F6770677F -6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3 -6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9 -6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7 -72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD -793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2 -80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F -82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE -8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000 -AB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD -4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192 -519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B -539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2 -57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA -59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9 -5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B -5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C -606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000 -AC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F -661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF -67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83 -6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB -70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7 -73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2 -75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC -770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F -7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000 -AD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD -81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301 -82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4 -8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C -964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D -50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014 -50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5 -51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8 -55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000 -AE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A -5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0 -5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8 -5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006063606560506055606D6069606F6084609F609A608D6094608C60856096 -624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A -632B6328634D634C65486549659965C165C566426649664F66436652664C6645 -664166F867146715671768216838684868466853683968426854682968B36817 -684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7 -6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000 -AF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9 -70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE -7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B -76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4 -79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A -7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006 -8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108 -80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354 -834A83388350834983358334834F833283398336831783408331832883430000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18 -8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77 -8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095 -90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A -507D505C50475043504C505A504950655076504E5055507550745077504F500F -506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340 -533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F -55645538552E555C552C55635533554155575708570B570957DF5805580A5806 -57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60 -5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2 -5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97 -5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248 -63A063A76372639663A263A563776367639863AA637163A963896383639B636B -63A863846388639963A163AC6392638F6380637B63696368637A655D65566551 -65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A -666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7 -689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB -6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA -6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D -7281731C731B73167313731973877405740A7403740673FE740D74E074F60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4 -76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92 -7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E -7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2 -801C804A8046812F81168123812B81298130812482028235823782368239838E -839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E -888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B -8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019 -900D901A90179023901F901D90109015901E9020900F90229016901B90140000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673 -96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75 -9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274 -5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C -55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589 -55AB5599570D582F582A58345824583058315821581D582058F958FA59600000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C -5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9 -5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1 -610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E -6566656265636591659065AF666E667066746676666F6691667A667E667766FE -66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2 -68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC -6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B -6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C -724C728472807336732573347329743A742A743374227425743574367434742F -741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C -7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F -7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5 -800B8052808581558154814B8151814E81398146813E814C815381748212821C -83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC -83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB -86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB -8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB -8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163 -916591CF9214921592239209921E920D9210920792119594958F958B95910000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000095939592958E968A968E968B967D96859686968D9672968496C196C596C4 -96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD -9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F -5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1 -55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A -5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148 -611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137 -622162226413643E641E642A642D643D642C640F641C6414640D643664166417 -6406656C659F65B06697668966876688669666846698668D67036994696D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000695A697769606954697569306982694A6968696B695E695369796986695D -6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7 -6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159 -7169716471497167715C716C7166714C7165715E714671687156723A72527337 -7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600 -75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891 -7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77 -7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A -7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008179817A81668205824784828477843D843184758466846B8449846C845B -843C8435846184638469846D8446865E865C865F86F9871387088707870086FE -86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2 -899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62 -8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2 -8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E -904191129117916C916A916991C9923792579238923D9240923E925B924B9264 -925192349249924D92459239923F925A959896989694969596CD96CB96C996CA -96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6 -50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600 -561B561755FD561456065609560D560E55F75616561F5608561055F657185716 -5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6 -5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D -5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -613F614B617761626163615F615A61586175622A64876458645464A46478645F -647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995 -69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3 -6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2 -6ECC6EF771947199717D718A71847192723E729272967344735074647463746A -7470746D750475917627760D760B7609761376E176E37784777D777F776178C1 -789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95 -7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD -7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA -82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3 -849084BC84D184CA873F871C873B872287258734871887558737872988F38902 -88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99 -8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B -91199118911E917591789177917492789280928592989296927B9293929C92A8 -927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785 -97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4 -9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -528752885289528D528A52F053B2562E563B56395632563F563456295653564E -565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB -5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2 -5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469 -646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A -64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E -6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F -6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58 -6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C -7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B -7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB -7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513 -851185238521851484EC852584FF850687828774877687608766877887688759 -8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95 -8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0 -8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D -8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8F259069906E9068906D90779130912D9127913191879189918B918392C592BB -92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707 -97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF -99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291 -529352F35659566B5679566956645678566A566856655671566F566C56625676 -58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD -61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF -64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58 -6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8 -71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D -76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E -7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3 -81A981A881FB820882588259854A855985488568856985438549856D856A855E -8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB -8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93 -8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078 -9072907C907A913491929320933692F89333932F932292FC932B9304931A0000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713 -970F975B975C9766979898309838983B9837982D9839982499109928991E991B -9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12 -9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8 -5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6 -64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E -6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80 -6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235 -72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7 -7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B -7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070 -806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2 -87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B -8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B -8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E -919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA -95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2 -569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7 -66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE -70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A -7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076 -81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0 -898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0 -8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0 -9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03 -9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133 -56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5 -6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F -7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9 -85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41 -8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A -8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6 -93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A -9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6 -5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662 -76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815 -896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4 -91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D -9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC -61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3 -7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B -95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D -9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9 -5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61 -9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31 -9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10 -74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463 -946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F -9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA -9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470 -9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5 -947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030FE309D309E3005304130423043304430453046304730483049304A304B -304C304D304E304F3050305130523053305430553056305730583059305A305B -305C305D305E305F3060306130623063306430653066306730683069306A306B -306C306D306E306F3070307130723073307430753076307730783079307A307B -307C307D307E307F3080308130823083308430853086308730883089308A308B -308C308D308E308F309030913092309330A130A230A330A430A530A630A70000 -C7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30A830A930AA30AB30AC30AD30AE30AF30B030B130B230B330B430B530B630B7 -30B830B930BA30BB30BC30BD30BE30BF30C030C130C230C330C430C530C630C7 -30C830C930CA30CB30CC30CD30CE30CF30D030D130D230D330D430D530D630D7 -30D830D930DA30DB30DC30DD30DE30DF30E030E130E230E330E430E530E60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030E730E830E930EA30EB30EC30ED30EE30EF30F030F130F230F330F430F5 -30F60414041504010416041704180419041A041B041C04230424042504260427 -04280429042A042B042C042D042E042F04300431043204330434043504510436 -043704380439043A043B043C043D043E043F0440044104420443044404450446 -044704480449044A044B044C044D044E044F2460246124622463246424652466 -246724682469247424752476247724782479247A247B247C247D000000000000 -C9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E -4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3 -6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723 -5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14 -4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210 -52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B -597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74 -5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E -67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D -897E909990979098909B909496229624962096234F564F3B4F624F494F534F64 -4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD -52AE530953635372538E538F54305437542A545454455419541C542554180000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000543D544F544154285424544756EE56E756E557415745574C5749574B5752 -5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A -5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C -5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3 -5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A -6270628162886277627D62726274653765F065F465F365F265F5674567470000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B -6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A -726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594 -75957681793D80348095809980908092809C8290828F8285828E829182930000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F -962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A -4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE -5235523252335246523152BC530A530B533C539253945487547F548154915482 -5488546B547A547E5465546C54745466548D546F546154605498546354675464 -56F756F9576F5772576D576B57715770577657805775577B5773577457620000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1 -59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF -5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19 -5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006034600A60176033601A601E602C6022600D6010602E60136011600C6009 -601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0 -62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611 -661066F6670A6785676C678E67926776677B6798678667846774678D678C677A -679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC -6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1 -709470987085709370867084709170967082709A7083726A72D672CB72D872C9 -72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8 -753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5 -80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8 -82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD -8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3 -4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC -5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0 -57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4 -590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB -59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9 -5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037 -603960546072605E6045605360476049605B604C60406042605F602460446058 -6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6 -63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C -662666226633662B663A661D66346639662E670F671067C167F267C867BA0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE -67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9 -67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D -6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F -70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4 -72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB -73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4 -7708770377047705770A76F776FB76FA77E777E878067811781278057810780F -780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D -7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9 -80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8 -830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3 -8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8 -91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5 -4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194 -519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E -552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6 -57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15 -5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1 -5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000604160A26088608060926081609D60836095609B60976087609C608E6219 -624662F263106356632C634463456336634363E46339634B634A633C63296341 -6334635863546359632D63476333635A63516338635763406348654A654665C6 -65C365C465C2664A665F6647665167126713681F681A684968326833683B684B -684F68166831681C6835682B682D682F684E68446834681D6812681468266828 -682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F -6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68 -6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39 -70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC -73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5 -7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710 -771377127723771177157719771A772277277823782C78227835782F7828782E -782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0 -79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85 -7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D -7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100 -8201822F82258333832D83448319835183258356833F83418326831C83220000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008342834E831B832A8308833C834D8316832483208337832F832983478345 -834C8353831E832C834B832783488653865286A286A88696868D8691869E8687 -86978686868B869A868586A5869986A186A786958698868E869D869086948843 -8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57 -8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004 -8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E -50605053504B505D50725048504D5041505B504A506250155045505F5069506B -5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D -539C55755576553C554D55505534552A55515562553655355530555255450000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2 -57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5 -57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58 -5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52 -5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72 -5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96 -5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB -60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397 -63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006378638563816391638D6370655365CD66656661665B6659665C66626718 -687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2 -688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4 -6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A -6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6 -6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104 -70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F -731D7317730773117318730A730872FF730F731E738873F673F873F574047401 -73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D -7725773B7735784878527849784D784A784C782678457850796479677969796A -7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30 -7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98 -7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B -7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -801E801B804780438048811881258119811B812D811F812C811E812181158127 -811D8122821182388233823A823482328274839083A383A8838D837A837383A4 -8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E -83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD -86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897 -88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C -8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7 -8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB -90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5 -9997509B50955094509E508B50A35083508C508E509D5068509C509250825087 -515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F -55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005819581E58275823582857F558485825581C581B5833583F5836582E5839 -5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC -5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D -5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35 -5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36 -5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104 -610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5 -63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0 -63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC -68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970 -68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD -68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97 -6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45 -6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64 -6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125 -71227132711F7128713A711B724B725A7288728972867285728B7312730B7330 -73227331733373277332732D732673237335730C742E742C7430742B74160000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7 -75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A -774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868 -785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B -7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56 -7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D -814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423 -83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5 -83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB -83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1 -88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9 -89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52 -8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89 -8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F -9106912C910490FF90FC910890F990FB9101910091079105910391619164915F -916291609201920A92259203921A9226920F920C9200921291FF91FD92069204 -92279202921C92249219921792059216957B958D958C95909687967E96880000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6 -9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA -50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA -55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9 -55C25714585358685864584F584D5849586F5855584E585D58595865585B583D -5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A -5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6 -5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F -612961406220916862236225622463C563F163EB641064126409642064240000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064336443641F641564186439643764226423640C64266430642864416435 -642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686 -668C66956690668B668A66996694667867206966695F6938694E69626971693F -6945696A6939694269576959697A694869496935696C6933693D696568F06978 -693469696940696F69446976695869416974694C693B694B6937695C694F6951 -69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2 -6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92 -6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160 -7141715D716271727178716A7161714271587143714B7170715F715071530000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A -73497444744A744B7452745174577440744F7450744E74427446744D745474E1 -74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610 -75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767 -77547759776D77E07887789A7894788F788478957885788678A1788378797899 -78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70 -7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B -7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB -7FDC8021816481608177815C8169815B816281726721815E81768167816F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081448161821D8249824482408242824584F1843F845684768479848F848D -846584518440848684678430844D847D845A845984748473845D8507845E8437 -843A8434847A8443847884328445842983D9844B842F8442842D845F84708439 -844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454 -846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D -870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81 -8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C -8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2 -8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090449049903D9110910D910F911191169114910B910E916E916F92489252 -9230923A926692339265925E9283922E924A9246926D926C924F92609267926F -92369261927092319254926392509272924E9253924C92569232959F959C959E -959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D -980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD -50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613 -560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A -58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA -5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D -5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43 -5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A -615B6165613B616A6161615662296227622B642B644D645B645D647464766472 -6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C -646B645964656477657365A066A166A0669F67056704672269B169B669C90000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4 -69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2 -69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03 -6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD -6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182 -718F717B718671817197724472537297729572937343734D7351734C74627473 -7471747574727467746E750075027503757D759076167608760C76157611760A -761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8 -787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C -7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF -7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC -7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008024805D805C8189818681838187818D818C818B8215849784A484A1849F -84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7 -84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4 -84D284DB84B084918661873387238728876B8740872E871E87218719871B8743 -872C8741873E874687208732872A872D873C8712873A87318735874287268727 -87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96 -8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06 -8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124 -9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1 -928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D -977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900 -9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60 -9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C -50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF -58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05 -5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D -5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496 -64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579 -657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15 -69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40 -6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16 -6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57 -6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77 -6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA -719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000736274877489748A74867481747D74857488747C747975087507757E7625 -761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788 -78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2 -799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5 -7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE -7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -819E819581A2819981978216824F825382528250824E82518524853B850F8500 -8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2 -851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E -84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000875687638764877787E1877387588754875B87528761875A8751875E876D -876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767 -8769885A8905890C8914890B891789188919890689168911890E890989A289A4 -89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5 -8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0 -8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073 -9070906F9067906B912F912B9129912A91329126912E91859186918A91819182 -9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC -92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702 -975A978A978E978897D097CF981E981D9826982998289820981B982798B29908 -98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB -99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75 -9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04 -9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC -58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1 -5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9 -5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533 -657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66 -6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A -6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54 -6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8 -6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4 -71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365 -736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633 -763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44 -7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9 -7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C -7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43 -7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC -81B481B281B781A781F282558256825785568545856B854D8553856185580000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -854085468564854185628544855185478563853E855B8571854E856E85758555 -85678560858C8566855D85548565856C866386658664879B878F879787938792 -87888781879687988779878787A3878587908791879D87848794879C879A8789 -891E89268930892D892E89278931892289298923892F892C891F89F18AE00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF -8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38 -8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34 -90769079907B908690FA913391359136919391909191918D918F9327931E9308 -931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D -92FA9325931392F992F793349302932492FF932993399335932A9314930C0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9 -96D4970B9712971097999797979497F097F89835982F98329924991F99279929 -999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA -9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88 -9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4 -5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25 -5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3 -61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580 -65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9 -6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2 -71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510 -75117512750F7584764376487649764776A476E977B577AB77B277B777B60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB -79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB -7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8 -7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44 -7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9 -825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8577857C858985A1857A85788557858E85968586858D8599859D858185A28582 -858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5 -87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE -87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13 -8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47 -8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF -936493569347937C9358935C93769349935093519360936D938F934C936A9379 -935793559352934F93719377937B9361935E936393679380934E935995C795C0 -95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -979E979D97D597D497F198419844984A9849984598439925992B992C992A9933 -9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB -99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1 -9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA -9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699 -59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6 -61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD -6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005 -7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657 -765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC -7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56 -7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB -85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB -87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4 -87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35 -8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75 -8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5 -91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395 -93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3 -96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F -9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35 -9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C -9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C -9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4 -56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1 -6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016 -702B702170227023702970177024701C702A720C720A72077202720572A572A6 -72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76 -7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE -807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2 -85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7 -8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958 -895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D -8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD -93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3 -93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948 -9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C -9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4 -9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78 -9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F -9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF -66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034 -703170427038703F703A70397040703B703370417213721472A8737D737C74BA -76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80 -7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604 -86098605860C85FD8819881088118817881388168963896689B989F78B608B6A -8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A -908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410 -94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000 -F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862 -9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36 -9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8 -9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6 -9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91 -513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC -6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A -77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030 -81DD8618862A8626861F8623861C86198627862E862186208629861E86250000 -F6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45 -8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B -94369429943D943C94309439942A9437942C9440943195E595E495E39735973A -97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29 -9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9 -9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18 -9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2 -65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F -74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000 -F7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826 -882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A -8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449 -9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33 -9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF -9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2 -513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB -6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C -863A86408639863C8631863B863E88308832882E883389768974897389FE0000 -F8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4 -97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C -9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC -9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D -7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835 -884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743 -974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03 -9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E -65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000 -F9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5 -8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10 -9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2 -8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874 -98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482 -948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D -7069706A9EA49F7E9F499F980000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1250.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1250.enc deleted file mode 100644 index 070ad90..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1250.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1250, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC0081201A0083201E2026202020210088203001602039015A0164017D0179 -009020182019201C201D202220132014009821220161203A015B0165017E017A -00A002C702D8014100A4010400A600A700A800A9015E00AB00AC00AD00AE017B -00B000B102DB014200B400B500B600B700B80105015F00BB013D02DD013E017C -015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E -01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF -015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F -01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1251.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1251.enc deleted file mode 100644 index 376b1b4..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1251.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1251, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -04020403201A0453201E20262020202120AC203004092039040A040C040B040F -045220182019201C201D202220132014009821220459203A045A045C045B045F -00A0040E045E040800A4049000A600A7040100A9040400AB00AC00AD00AE0407 -00B000B104060456049100B500B600B704512116045400BB0458040504550457 -0410041104120413041404150416041704180419041A041B041C041D041E041F -0420042104220423042404250426042704280429042A042B042C042D042E042F -0430043104320433043404350436043704380439043A043B043C043D043E043F -0440044104420443044404450446044704480449044A044B044C044D044E044F diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1252.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1252.enc deleted file mode 100644 index dd525ea..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1252.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1252, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC0081201A0192201E20262020202102C62030016020390152008D017D008F -009020182019201C201D20222013201402DC21220161203A0153009D017E0178 -00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF -00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF -00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF -00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF -00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1253.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1253.enc deleted file mode 100644 index a8754c3..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1253.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1253, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC0081201A0192201E20262020202100882030008A2039008C008D008E008F -009020182019201C201D20222013201400982122009A203A009C009D009E009F -00A00385038600A300A400A500A600A700A800A9000000AB00AC00AD00AE2015 -00B000B100B200B3038400B500B600B703880389038A00BB038C00BD038E038F -0390039103920393039403950396039703980399039A039B039C039D039E039F -03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF -03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1254.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1254.enc deleted file mode 100644 index b9e3b3c..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1254.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1254, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC0081201A0192201E20262020202102C62030016020390152008D008E008F -009020182019201C201D20222013201402DC21220161203A0153009D009E0178 -00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF -00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF -011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF -00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF -011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1255.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1255.enc deleted file mode 100644 index 6e78b95..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1255.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1255, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC0081201A0192201E20262020202102C62030008A2039008C008D008E008F -009020182019201C201D20222013201402DC2122009A203A009C009D009E009F -00A000A100A200A320AA00A500A600A700A800A900D700AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE00BF -05B005B105B205B305B405B505B605B705B805B9000005BB05BC05BD05BE05BF -05C005C105C205C305F005F105F205F305F40000000000000000000000000000 -05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF -05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1256.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1256.enc deleted file mode 100644 index a98762a..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1256.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1256, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC067E201A0192201E20262020202102C62030067920390152068606980688 -06AF20182019201C201D20222013201406A921220691203A0153200C200D06BA -00A0060C00A200A300A400A500A600A700A800A906BE00AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B9061B00BB00BC00BD00BE061F -06C1062106220623062406250626062706280629062A062B062C062D062E062F -063006310632063306340635063600D7063706380639063A0640064106420643 -00E0064400E2064506460647064800E700E800E900EA00EB0649064A00EE00EF -064B064C064D064E00F4064F065000F7065100F9065200FB00FC200E200F06D2 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1257.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1257.enc deleted file mode 100644 index 4aa135d..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1257.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1257, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC0081201A0083201E20262020202100882030008A2039008C00A802C700B8 -009020182019201C201D20222013201400982122009A203A009C00AF02DB009F -00A0000000A200A300A4000000A600A700D800A9015600AB00AC00AD00AE00C6 -00B000B100B200B300B400B500B600B700F800B9015700BB00BC00BD00BE00E6 -0104012E0100010600C400C501180112010C00C90179011601220136012A013B -01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF -0105012F0101010700E400E501190113010D00E9017A011701230137012B013C -01610144014600F3014D00F500F600F701730142015B016B00FC017C017E02D9 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp1258.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp1258.enc deleted file mode 100644 index 95fdef8..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp1258.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp1258, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC0081201A0192201E20262020202102C62030008A20390152008D008E008F -009020182019201C201D20222013201402DC2122009A203A0153009D009E0178 -00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF -00C000C100C2010200C400C500C600C700C800C900CA00CB030000CD00CE00CF -011000D1030900D300D401A000D600D700D800D900DA00DB00DC01AF030300DF -00E000E100E2010300E400E500E600E700E800E900EA00EB030100ED00EE00EF -011100F1032300F300F401A100F600F700F800F900FA00FB00FC01B020AB00FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp437.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp437.enc deleted file mode 100644 index ecae4e6..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp437.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp437, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 -00C900E600C600F400F600F200FB00F900FF00D600DC00A200A300A520A70192 -00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 -226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp737.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp737.enc deleted file mode 100644 index 5b59661..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp737.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp737, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -039103920393039403950396039703980399039A039B039C039D039E039F03A0 -03A103A303A403A503A603A703A803A903B103B203B303B403B503B603B703B8 -03B903BA03BB03BC03BD03BE03BF03C003C103C303C203C403C503C603C703C8 -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -03C903AC03AD03AE03CA03AF03CC03CD03CB03CE038603880389038A038C038E -038F00B12265226403AA03AB00F7224800B0221900B7221A207F00B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp775.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp775.enc deleted file mode 100644 index 71b65c3..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp775.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp775, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -010600FC00E9010100E4012300E501070142011301560157012B017900C400C5 -00C900E600C6014D00F6012200A2015A015B00D600DC00F800A300D800D700A4 -0100012A00F3017B017C017A201D00A600A900AE00AC00BD00BC014100AB00BB -259125922593250225240104010C01180116256325512557255D012E01602510 -25142534252C251C2500253C0172016A255A25542569256625602550256C017D -0105010D01190117012F01610173016B017E2518250C25882584258C25902580 -00D300DF014C014300F500D500B5014401360137013B013C0146011201452019 -00AD00B1201C00BE00B600A700F7201E00B0221900B700B900B300B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp850.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp850.enc deleted file mode 100644 index 4e7a90d..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp850.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp850, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 -00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D800D70192 -00E100ED00F300FA00F100D100AA00BA00BF00AE00AC00BD00BC00A100AB00BB -2591259225932502252400C100C200C000A9256325512557255D00A200A52510 -25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4 -00F000D000CA00CB00C8013100CD00CE00CF2518250C2588258400A600CC2580 -00D300DF00D400D200F500D500B500FE00DE00DA00DB00D900FD00DD00AF00B4 -00AD00B1201700BE00B600A700F700B800B000A800B700B900B300B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp852.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp852.enc deleted file mode 100644 index f34899e..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp852.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp852, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200E4016F010700E7014200EB0150015100EE017900C40106 -00C90139013A00F400F6013D013E015A015B00D600DC01640165014100D7010D -00E100ED00F300FA01040105017D017E0118011900AC017A010C015F00AB00BB -2591259225932502252400C100C2011A015E256325512557255D017B017C2510 -25142534252C251C2500253C01020103255A25542569256625602550256C00A4 -01110110010E00CB010F014700CD00CE011B2518250C258825840162016E2580 -00D300DF00D401430144014801600161015400DA0155017000FD00DD016300B4 -00AD02DD02DB02C702D800A700F700B800B000A802D901710158015925A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp855.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp855.enc deleted file mode 100644 index 4d58b86..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp855.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp855, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0452040204530403045104010454040404550405045604060457040704580408 -04590409045A040A045B040B045C040C045E040E045F040F044E042E044A042A -0430041004310411044604260434041404350415044404240433041300AB00BB -259125922593250225240445042504380418256325512557255D043904192510 -25142534252C251C2500253C043A041A255A25542569256625602550256C00A4 -043B041B043C041C043D041D043E041E043F2518250C25882584041F044F2580 -042F044004200441042104420422044304230436041604320412044C042C2116 -00AD044B042B0437041704480428044D042D044904290447042700A725A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp857.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp857.enc deleted file mode 100644 index b42ed55..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp857.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp857, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE013100C400C5 -00C900E600C600F400F600F200FB00F9013000D600DC00F800A300D8015E015F -00E100ED00F300FA00F100D1011E011F00BF00AE00AC00BD00BC00A100AB00BB -2591259225932502252400C100C200C000A9256325512557255D00A200A52510 -25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4 -00BA00AA00CA00CB00C8000000CD00CE00CF2518250C2588258400A600CC2580 -00D300DF00D400D200F500D500B5000000D700DA00DB00D900EC00FF00AF00B4 -00AD00B1000000BE00B600A700F700B800B000A800B700B900B300B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp860.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp860.enc deleted file mode 100644 index 871943b..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp860.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp860, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200E300E000C100E700EA00CA00E800CD00D400EC00C300C2 -00C900C000C800F400F500F200DA00F900CC00D500DC00A200A300D920A700D3 -00E100ED00F300FA00F100D100AA00BA00BF00D200AC00BD00BC00A100AB00BB -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 -226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp861.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp861.enc deleted file mode 100644 index 3f8f605..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp861.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp861, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200E400E000E500E700EA00EB00E800D000F000DE00C400C5 -00C900E600C600F400F600FE00FB00DD00FD00D600DC00F800A300D820A70192 -00E100ED00F300FA00C100CD00D300DA00BF231000AC00BD00BC00A100AB00BB -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 -226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp862.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp862.enc deleted file mode 100644 index 5f9d16c..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp862.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp862, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF -05E005E105E205E305E405E505E605E705E805E905EA00A200A300A520A70192 -00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 -226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp863.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp863.enc deleted file mode 100644 index c8b8686..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp863.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp863, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200C200E000B600E700EA00EB00E800EF00EE201700C000A7 -00C900C800CA00F400CB00CF00FB00F900A400D400DC00A200A300D900DB0192 -00A600B400F300FA00A800B800B300AF00CE231000AC00BD00BC00BE00AB00BB -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 -226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp864.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp864.enc deleted file mode 100644 index 71f9e62..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp864.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp864, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -00200021002200230024066A0026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00B000B72219221A259225002502253C2524252C251C25342510250C25142518 -03B2221E03C600B100BD00BC224800AB00BBFEF7FEF8009B009CFEFBFEFC009F -00A000ADFE8200A300A4FE8400000000FE8EFE8FFE95FE99060CFE9DFEA1FEA5 -0660066106620663066406650666066706680669FED1061BFEB1FEB5FEB9061F -00A2FE80FE81FE83FE85FECAFE8BFE8DFE91FE93FE97FE9BFE9FFEA3FEA7FEA9 -FEABFEADFEAFFEB3FEB7FEBBFEBFFEC1FEC5FECBFECF00A600AC00F700D7FEC9 -0640FED3FED7FEDBFEDFFEE3FEE7FEEBFEEDFEEFFEF3FEBDFECCFECEFECDFEE1 -FE7D0651FEE5FEE9FEECFEF0FEF2FED0FED5FEF5FEF6FEDDFED9FEF125A00000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp865.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp865.enc deleted file mode 100644 index 543da9c..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp865.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp865, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 -00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D820A70192 -00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00A4 -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 -226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp866.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp866.enc deleted file mode 100644 index b851cf5..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp866.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp866, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0410041104120413041404150416041704180419041A041B041C041D041E041F -0420042104220423042404250426042704280429042A042B042C042D042E042F -0430043104320433043404350436043704380439043A043B043C043D043E043F -259125922593250225242561256225562555256325512557255D255C255B2510 -25142534252C251C2500253C255E255F255A25542569256625602550256C2567 -2568256425652559255825522553256B256A2518250C25882584258C25902580 -0440044104420443044404450446044704480449044A044B044C044D044E044F -040104510404045404070457040E045E00B0221900B7221A211600A425A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp869.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp869.enc deleted file mode 100644 index 9fd2929..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp869.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp869, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850386008700B700AC00A620182019038820150389 -038A03AA038C00930094038E03AB00A9038F00B200B303AC00A303AD03AE03AF -03CA039003CC03CD039103920393039403950396039700BD0398039900AB00BB -25912592259325022524039A039B039C039D256325512557255D039E039F2510 -25142534252C251C2500253C03A003A1255A25542569256625602550256C03A3 -03A403A503A603A703A803A903B103B203B32518250C2588258403B403B52580 -03B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C203C40384 -00AD00B103C503C603C700A703C8038500B000A803C903CB03B003CE25A000A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp874.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp874.enc deleted file mode 100644 index 0487b97..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp874.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: cp874, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC008100820083008420260086008700880089008A008B008C008D008E008F -009020182019201C201D20222013201400980099009A009B009C009D009E009F -00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F -0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F -0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F -0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F -0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F -0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp932.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp932.enc deleted file mode 100644 index 8da8cd6..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp932.enc +++ /dev/null @@ -1,801 +0,0 @@ -# Encoding file: cp932, multi-byte -M -003F 0 46 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080000000000000000000850086000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F -FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F -FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F -FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -81 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E -FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C -FF5E2225FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B -FF5D30083009300A300B300C300D300E300F30103011FF0BFF0D00B100D70000 -00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 -FF04FFE0FFE1FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 -25A125A025B325B225BD25BC203B301221922190219121933013000000000000 -000000000000000000000000000000002208220B2286228722822283222A2229 -0000000000000000000000000000000022272228FFE221D221D4220022030000 -0000000000000000000000000000000000000000222022A52312220222072261 -2252226A226B221A223D221D2235222B222C0000000000000000000000000000 -212B2030266F266D266A2020202100B6000000000000000025EF000000000000 -82 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000FF10 -FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 -FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 -FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 -0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 -30423043304430453046304730483049304A304B304C304D304E304F30503051 -30523053305430553056305730583059305A305B305C305D305E305F30603061 -30623063306430653066306730683069306A306B306C306D306E306F30703071 -30723073307430753076307730783079307A307B307C307D307E307F30803081 -30823083308430853086308730883089308A308B308C308D308E308F30903091 -3092309300000000000000000000000000000000000000000000000000000000 -83 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 -30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 -30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 -30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000391 -03920393039403950396039703980399039A039B039C039D039E039F03A003A1 -03A303A403A503A603A703A803A90000000000000000000000000000000003B1 -03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 -03C303C403C503C603C703C803C9000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -84 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -04100411041204130414041504010416041704180419041A041B041C041D041E -041F0420042104220423042404250426042704280429042A042B042C042D042E -042F000000000000000000000000000000000000000000000000000000000000 -04300431043204330434043504510436043704380439043A043B043C043D0000 -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000002500 -2502250C251025182514251C252C25242534253C25012503250F2513251B2517 -25232533252B253B254B2520252F25282537253F251D25302525253825420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -87 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2460246124622463246424652466246724682469246A246B246C246D246E246F -2470247124722473216021612162216321642165216621672168216900003349 -33143322334D331833273303333633513357330D33263323332B334A333B339C -339D339E338E338F33C433A100000000000000000000000000000000337B0000 -301D301F211633CD212132A432A532A632A732A8323132323239337E337D337C -22522261222B222E2211221A22A52220221F22BF22352229222A000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -88 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000004E9C -55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 -82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 -5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 -5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 -8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 -828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 -89 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 -81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 -834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 -82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 -5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 -827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC -65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 -81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 -4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 -798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E -971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A -89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 -8A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 -54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 -67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A -89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 -6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 -53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 -520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 -5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 -6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 -8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 -764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 -5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 -8B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC -8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 -7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD -53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 -673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 -5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B -4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F -6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF -99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 -5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 -91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 -611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 -8C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB -8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 -5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C -7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 -5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 -503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C -6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A -98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA -96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 -7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 -5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 -4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 -8D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 -6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 -6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 -818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 -980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B -544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 -98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E -9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 -5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 -707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A -8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E -6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 -8E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 -509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 -991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 -59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 -6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C -8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 -6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 -9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA -5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E -793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 -932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 -91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 -8F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 -89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 -6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA -88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 -6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 -7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD -5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 -5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 -6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 -7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E -9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE -676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 -90 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 -5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E -79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 -58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 -9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F -745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 -647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F -667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB -901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D -7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 -8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 -681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 -91 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D -55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 -758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC -53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 -64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 -83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 -85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA -65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 -8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 -5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E -968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 -629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 -92 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 -53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 -86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B -6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 -901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 -8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 -5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 -817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD -8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 -6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 -4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 -633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 -93 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 -64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 -4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B -83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 -51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF -76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 -856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C -58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 -6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB -5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 -51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 -6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 -94 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 -637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 -899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 -5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 -6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD -67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD -7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA -4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 -642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 -981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 -6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB -907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 -95 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 -59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF -63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 -983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 -65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB -6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F -8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E -711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 -4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 -72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 -6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 -5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 -96 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD -9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 -51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 -6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 -646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE -9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B -85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 -772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF -8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 -5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B -7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 -5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000 -97 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C -733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 -8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 -75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 -6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A -4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 -88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 -786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 -68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B -539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 -4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 -6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 -98 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C -69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 -502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 -6E7E789781550000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000005F0C -4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D -4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED -4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 -4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A -50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 -6703505550505048505A5056506C50785080509A508550B450B2000000000000 -99 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 -51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 -516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 -51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 -51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C -525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 -52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 -530653087538530D5310530F5315531A5323532F533153335338534053465345 -4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE -53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C -542D543C542E54365429541D544E548F5475548E545F5471547754705492547B -5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 -9A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 -55405563554C552E555C55455556555755385533555D5599558054AF558A559F -557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 -55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 -566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 -56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 -570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 -57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A -57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 -589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 -58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 -5938593E7AD259555950594E595A5958596259605967596C5969000000000000 -9B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 -5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD -5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 -5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 -5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 -5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 -5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 -5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B -5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 -5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 -5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 -5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 -9C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE -5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 -5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 -5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 -601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F -604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 -609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 -614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E -61286127614A613F613C612C6134613D614261446173617761586159615A616B -6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 -61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 -61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 -9D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 -6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 -62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 -633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 -636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 -651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA -64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 -64F464F264FA650064FD6518651C650565246523652B65346535653765366538 -754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB -65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB -6773663566366634661C664F664466496641665E665D666466676668665F6662 -667066836688668E668966846698669D66C166B966C966BE66BC000000000000 -9E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 -9738672E673F67366741673867376746675E67606759676367646789677067A9 -677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE -67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 -68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 -68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 -68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 -68C669796977695C6978696B6954697E696E69396974693D695969306961695E -695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 -69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 -6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 -6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 -9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 -86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 -6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA -6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 -9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B -6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA -6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 -6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 -6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E -6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D -6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 -6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E -6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 -6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 -703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 -70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 -719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 -71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 -7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 -72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E -734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 -73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C -746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D -75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 -756B756D75787576758675877574758A758975827594759A759D75A575A375C2 -75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 -75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 -7630763B764776487646765C76587661766276687669766A7667766C76707672 -76767678767C768076837688768B768E769676937699769A76B076B476B876B9 -76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 -7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 -778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA -77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C -78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 -7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC -79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 -7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 -7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 -7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A -7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F -7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 -7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A -7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C -7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 -7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 -7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB -7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A -7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 -7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D -8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 -7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 -7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 -7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 -8019801C80218028803F803B804A804680528058805A805F8062806880738072 -807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 -80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -968B8146813E8153815180FC8171816E81658166817481838188818A81808182 -81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 -81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 -820A820D821082168229822B82388233824082598258825D825A825F82640000 -82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 -82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 -83348316833283318340833983508345832F832B831783188385839A83AA839F -83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB -83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 -83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 -843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 -84FF84F485178518852C851F8515851484FC8540856385588548000000000000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C -8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B -85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 -86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 -86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F -8737873B87258729871A8760875F8778874C874E877487578768876E87598753 -8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 -87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 -88218831883688398827883B8844884288528859885E8862886B8881887E889E -8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 -88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 -891E8925892A892B89418944893B89368938894C891D8960895E000000000000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 -89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 -8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 -8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 -8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 -8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F -8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 -8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C -8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA -8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 -8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 -8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 -8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 -8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F -8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 -8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 -90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F -905090519052900E9049903E90569058905E9068906F907696A890729082907D -90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 -91329130914A9156915891639165916991739172918B9189918291A291AB91AF -91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 -921E91FF9214922C92159211925E925792459249926492489295923F924B9250 -929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 -93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 -94109436942B94359421943A944194529444945B94609462945E946A92299470 -94759477947D945A947C947E9481947F95829587958A95949596959895990000 -95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 -95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D -965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 -96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 -970F971697199724972A97309739973D973E97449746974897429749975C9760 -97649766976852D2976B977197799785977C9781977A9786978B978F9790979C -97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 -980F980C9838982498219837983D9846984F984B986B986F9870000000000000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 -99189921991D991E99249920992C992E993D993E9942994999459950994B9951 -9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE -99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 -9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 -9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB -9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 -9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 -9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 -9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 -9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 -9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 -9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A -9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 -9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 -9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 -9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F -69C79059746451DC719900000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7E8A891C9348928884DC4FC970BB663168C892F966FB5F454E284EE14EFC4F00 -4F034F394F564F924F8A4F9A4F944FCD504050224FFF501E5046507050425094 -50F450D8514A5164519D51BE51EC5215529C52A652C052DB5300530753245372 -539353B253DDFA0E549C548A54A954FF55865759576557AC57C857C7FA0F0000 -FA10589E58B2590B5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E -5CA65CBA5CF55D275D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE -605D6085608A60DE60D5612060F26111613761306198621362A663F56460649D -64CE654E66006615663B6609662E661E6624666566576659FA126673669966A0 -66B266BF66FA670EF929676667BB685267C06801684468CFFA136968FA146998 -69E26A306A6B6A466A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D87 -6D6F6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF57005 -70077028708570AB710F7104715C71467147FA1571C171FE72B1000000000000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -72BE7324FA16737773BD73C973D673E373D2740773F57426742A7429742E7462 -7489749F7501756F7682769C769E769B76A6FA17774652AF7821784E7864787A -7930FA18FA19FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB7 -7DA07DD67E527F477FA1FA1E83018362837F83C783F6844884B4855385590000 -856BFA1F85B0FA20FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B53 -8B7F8CF08CF48D128D76FA238ECFFA24FA25906790DEFA269115912791DA91D7 -91DE91ED91EE91E491E592069210920A923A9240923C924E9259925192399267 -92A79277927892E792D792D992D0FA2792D592E092D39325932192FBFA28931E -92FF931D93029370935793A493C693DE93F89431944594489592F9DCFA29969D -96AF9733973B9743974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E -9AD99ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED1000000002170 -217121722173217421752176217721782179FFE2FFE4FF07FF02000000000000 -FA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2170217121722173217421752176217721782179216021612162216321642165 -2166216721682169FFE2FFE4FF07FF0232312116212122357E8A891C93489288 -84DC4FC970BB663168C892F966FB5F454E284EE14EFC4F004F034F394F564F92 -4F8A4F9A4F944FCD504050224FFF501E504650705042509450F450D8514A0000 -5164519D51BE51EC5215529C52A652C052DB5300530753245372539353B253DD -FA0E549C548A54A954FF55865759576557AC57C857C7FA0FFA10589E58B2590B -5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E5CA65CBA5CF55D27 -5D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE605D6085608A60DE -60D5612060F26111613761306198621362A663F56460649D64CE654E66006615 -663B6609662E661E6624666566576659FA126673669966A066B266BF66FA670E -F929676667BB685267C06801684468CFFA136968FA14699869E26A306A6B6A46 -6A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D876D6F000000000000 -FB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF570057007 -7028708570AB710F7104715C71467147FA1571C171FE72B172BE7324FA167377 -73BD73C973D673E373D2740773F57426742A7429742E74627489749F7501756F -7682769C769E769B76A6FA17774652AF7821784E7864787A7930FA18FA190000 -FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB77DA07DD67E52 -7F477FA1FA1E83018362837F83C783F6844884B485538559856BFA1F85B0FA20 -FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B538B7F8CF08CF48D12 -8D76FA238ECFFA24FA25906790DEFA269115912791DA91D791DE91ED91EE91E4 -91E592069210920A923A9240923C924E925992519239926792A79277927892E7 -92D792D992D0FA2792D592E092D39325932192FBFA28931E92FF931D93029370 -935793A493C693DE93F89431944594489592F9DCFA29969D96AF9733973B9743 -974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E9AD9000000000000 -FC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED10000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -R -8160 301C FF5E -8161 2016 2225 -817C 2212 FF0D -8191 00A2 FFE0 -8192 00A3 FFE1 -81CA 00AC FFE2 -81BE 222a -81BF 2229 -81DA 2220 -81DB 22a5 -81DF 2261 -81E0 2252 -81E3 221a -81E6 2235 -81E7 222b diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp936.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp936.enc deleted file mode 100644 index 37bcc80..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp936.enc +++ /dev/null @@ -1,2162 +0,0 @@ -# Encoding file: cp936, multi-byte -M -003F 0 127 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -20AC000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -81 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E024E044E054E064E0F4E124E174E1F4E204E214E234E264E294E2E4E2F4E31 -4E334E354E374E3C4E404E414E424E444E464E4A4E514E554E574E5A4E5B4E62 -4E634E644E654E674E684E6A4E6B4E6C4E6D4E6E4E6F4E724E744E754E764E77 -4E784E794E7A4E7B4E7C4E7D4E7F4E804E814E824E834E844E854E874E8A0000 -4E904E964E974E994E9C4E9D4E9E4EA34EAA4EAF4EB04EB14EB44EB64EB74EB8 -4EB94EBC4EBD4EBE4EC84ECC4ECF4ED04ED24EDA4EDB4EDC4EE04EE24EE64EE7 -4EE94EED4EEE4EEF4EF14EF44EF84EF94EFA4EFC4EFE4F004F024F034F044F05 -4F064F074F084F0B4F0C4F124F134F144F154F164F1C4F1D4F214F234F284F29 -4F2C4F2D4F2E4F314F334F354F374F394F3B4F3E4F3F4F404F414F424F444F45 -4F474F484F494F4A4F4B4F4C4F524F544F564F614F624F664F684F6A4F6B4F6D -4F6E4F714F724F754F774F784F794F7A4F7D4F804F814F824F854F864F874F8A -4F8C4F8E4F904F924F934F954F964F984F994F9A4F9C4F9E4F9F4FA14FA20000 -82 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4FA44FAB4FAD4FB04FB14FB24FB34FB44FB64FB74FB84FB94FBA4FBB4FBC4FBD -4FBE4FC04FC14FC24FC64FC74FC84FC94FCB4FCC4FCD4FD24FD34FD44FD54FD6 -4FD94FDB4FE04FE24FE44FE54FE74FEB4FEC4FF04FF24FF44FF54FF64FF74FF9 -4FFB4FFC4FFD4FFF5000500150025003500450055006500750085009500A0000 -500B500E501050115013501550165017501B501D501E50205022502350245027 -502B502F5030503150325033503450355036503750385039503B503D503F5040 -504150425044504550465049504A504B504D5050505150525053505450565057 -50585059505B505D505E505F506050615062506350645066506750685069506A -506B506D506E506F50705071507250735074507550785079507A507C507D5081 -508250835084508650875089508A508B508C508E508F50905091509250935094 -50955096509750985099509A509B509C509D509E509F50A050A150A250A450A6 -50AA50AB50AD50AE50AF50B050B150B350B450B550B650B750B850B950BC0000 -83 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50BD50BE50BF50C050C150C250C350C450C550C650C750C850C950CA50CB50CC -50CD50CE50D050D150D250D350D450D550D750D850D950DB50DC50DD50DE50DF -50E050E150E250E350E450E550E850E950EA50EB50EF50F050F150F250F450F6 -50F750F850F950FA50FC50FD50FE50FF51005101510251035104510551080000 -5109510A510C510D510E510F511051115113511451155116511751185119511A -511B511C511D511E511F512051225123512451255126512751285129512A512B -512C512D512E512F5130513151325133513451355136513751385139513A513B -513C513D513E51425147514A514C514E514F515051525153515751585159515B -515D515E515F5160516151635164516651675169516A516F5172517A517E517F -5183518451865187518A518B518E518F51905191519351945198519A519D519E -519F51A151A351A651A751A851A951AA51AD51AE51B451B851B951BA51BE51BF -51C151C251C351C551C851CA51CD51CE51D051D251D351D451D551D651D70000 -84 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51D851D951DA51DC51DE51DF51E251E351E551E651E751E851E951EA51EC51EE -51F151F251F451F751FE520452055209520B520C520F5210521352145215521C -521E521F522152225223522552265227522A522C522F5231523252345235523C -523E524452455246524752485249524B524E524F525252535255525752580000 -5259525A525B525D525F526052625263526452665268526B526C526D526E5270 -52715273527452755276527752785279527A527B527C527E5280528352845285 -528652875289528A528B528C528D528E528F5291529252945295529652975298 -5299529A529C52A452A552A652A752AE52AF52B052B452B552B652B752B852B9 -52BA52BB52BC52BD52C052C152C252C452C552C652C852CA52CC52CD52CE52CF -52D152D352D452D552D752D952DA52DB52DC52DD52DE52E052E152E252E352E5 -52E652E752E852E952EA52EB52EC52ED52EE52EF52F152F252F352F452F552F6 -52F752F852FB52FC52FD530153025303530453075309530A530B530C530E0000 -85 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53115312531353145318531B531C531E531F532253245325532753285329532B -532C532D532F533053315332533353345335533653375338533C533D53405342 -53445346534B534C534D5350535453585359535B535D53655368536A536C536D -537253765379537B537C537D537E53805381538353875388538A538E538F0000 -53905391539253935394539653975399539B539C539E53A053A153A453A753AA -53AB53AC53AD53AF53B053B153B253B353B453B553B753B853B953BA53BC53BD -53BE53C053C353C453C553C653C753CE53CF53D053D253D353D553DA53DC53DD -53DE53E153E253E753F453FA53FE53FF5400540254055407540B541454185419 -541A541C542254245425542A5430543354365437543A543D543F544154425444 -544554475449544C544D544E544F5451545A545D545E545F5460546154635465 -54675469546A546B546C546D546E546F547054745479547A547E547F54815483 -5485548754885489548A548D5491549354975498549C549E549F54A054A10000 -86 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54A254A554AE54B054B254B554B654B754B954BA54BC54BE54C354C554CA54CB -54D654D854DB54E054E154E254E354E454EB54EC54EF54F054F154F454F554F6 -54F754F854F954FB54FE550055025503550455055508550A550B550C550D550E -5512551355155516551755185519551A551C551D551E551F5521552555260000 -55285529552B552D553255345535553655385539553A553B553D554055425545 -55475548554B554C554D554E554F5551555255535554555755585559555A555B -555D555E555F55605562556355685569556B556F557055715572557355745579 -557A557D557F55855586558C558D558E559055925593559555965597559A559B -559E55A055A155A255A355A455A555A655A855A955AA55AB55AC55AD55AE55AF -55B055B255B455B655B855BA55BC55BF55C055C155C255C355C655C755C855CA -55CB55CE55CF55D055D555D755D855D955DA55DB55DE55E055E255E755E955ED -55EE55F055F155F455F655F855F955FA55FB55FC55FF56025603560456050000 -87 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56065607560A560B560D561056115612561356145615561656175619561A561C -561D5620562156225625562656285629562A562B562E562F5630563356355637 -5638563A563C563D563E5640564156425643564456455646564756485649564A -564B564F565056515652565356555656565A565B565D565E565F566056610000 -5663566556665667566D566E566F56705672567356745675567756785679567A -567D567E567F56805681568256835684568756885689568A568B568C568D5690 -56915692569456955696569756985699569A569B569C569D569E569F56A056A1 -56A256A456A556A656A756A856A956AA56AB56AC56AD56AE56B056B156B256B3 -56B456B556B656B856B956BA56BB56BD56BE56BF56C056C156C256C356C456C5 -56C656C756C856C956CB56CC56CD56CE56CF56D056D156D256D356D556D656D8 -56D956DC56E356E556E656E756E856E956EA56EC56EE56EF56F256F356F656F7 -56F856FB56FC57005701570257055707570B570C570D570E570F571057110000 -88 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -57125713571457155716571757185719571A571B571D571E5720572157225724 -572557265727572B5731573257345735573657375738573C573D573F57415743 -57445745574657485749574B5752575357545755575657585759576257635765 -5767576C576E5770577157725774577557785779577A577D577E577F57800000 -5781578757885789578A578D578E578F57905791579457955796579757985799 -579A579C579D579E579F57A557A857AA57AC57AF57B057B157B357B557B657B7 -57B957BA57BB57BC57BD57BE57BF57C057C157C457C557C657C757C857C957CA -57CC57CD57D057D157D357D657D757DB57DC57DE57E157E257E357E557E657E7 -57E857E957EA57EB57EC57EE57F057F157F257F357F557F657F757FB57FC57FE -57FF580158035804580558085809580A580C580E580F58105812581358145816 -58175818581A581B581C581D581F5822582358255826582758285829582B582C -582D582E582F58315832583358345836583758385839583A583B583C583D0000 -89 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -583E583F584058415842584358455846584758485849584A584B584E584F5850 -585258535855585658575859585A585B585C585D585F58605861586258635864 -5866586758685869586A586D586E586F58705871587258735874587558765877 -58785879587A587B587C587D587F58825884588658875888588A588B588C0000 -588D588E588F5890589158945895589658975898589B589C589D58A058A158A2 -58A358A458A558A658A758AA58AB58AC58AD58AE58AF58B058B158B258B358B4 -58B558B658B758B858B958BA58BB58BD58BE58BF58C058C258C358C458C658C7 -58C858C958CA58CB58CC58CD58CE58CF58D058D258D358D458D658D758D858D9 -58DA58DB58DC58DD58DE58DF58E058E158E258E358E558E658E758E858E958EA -58ED58EF58F158F258F458F558F758F858FA58FB58FC58FD58FE58FF59005901 -59035905590659085909590A590B590C590E591059115912591359175918591B -591D591E592059215922592359265928592C59305932593359355936593B0000 -8A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -593D593E593F5940594359455946594A594C594D5950595259535959595B595C -595D595E595F5961596359645966596759685969596A596B596C596D596E596F -59705971597259755977597A597B597C597E597F598059855989598B598C598E -598F59905991599459955998599A599B599C599D599F59A059A159A259A60000 -59A759AC59AD59B059B159B359B459B559B659B759B859BA59BC59BD59BF59C0 -59C159C259C359C459C559C759C859C959CC59CD59CE59CF59D559D659D959DB -59DE59DF59E059E159E259E459E659E759E959EA59EB59ED59EE59EF59F059F1 -59F259F359F459F559F659F759F859FA59FC59FD59FE5A005A025A0A5A0B5A0D -5A0E5A0F5A105A125A145A155A165A175A195A1A5A1B5A1D5A1E5A215A225A24 -5A265A275A285A2A5A2B5A2C5A2D5A2E5A2F5A305A335A355A375A385A395A3A -5A3B5A3D5A3E5A3F5A415A425A435A445A455A475A485A4B5A4C5A4D5A4E5A4F -5A505A515A525A535A545A565A575A585A595A5B5A5C5A5D5A5E5A5F5A600000 -8B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A615A635A645A655A665A685A695A6B5A6C5A6D5A6E5A6F5A705A715A725A73 -5A785A795A7B5A7C5A7D5A7E5A805A815A825A835A845A855A865A875A885A89 -5A8A5A8B5A8C5A8D5A8E5A8F5A905A915A935A945A955A965A975A985A995A9C -5A9D5A9E5A9F5AA05AA15AA25AA35AA45AA55AA65AA75AA85AA95AAB5AAC0000 -5AAD5AAE5AAF5AB05AB15AB45AB65AB75AB95ABA5ABB5ABC5ABD5ABF5AC05AC3 -5AC45AC55AC65AC75AC85ACA5ACB5ACD5ACE5ACF5AD05AD15AD35AD55AD75AD9 -5ADA5ADB5ADD5ADE5ADF5AE25AE45AE55AE75AE85AEA5AEC5AED5AEE5AEF5AF0 -5AF25AF35AF45AF55AF65AF75AF85AF95AFA5AFB5AFC5AFD5AFE5AFF5B005B01 -5B025B035B045B055B065B075B085B0A5B0B5B0C5B0D5B0E5B0F5B105B115B12 -5B135B145B155B185B195B1A5B1B5B1C5B1D5B1E5B1F5B205B215B225B235B24 -5B255B265B275B285B295B2A5B2B5B2C5B2D5B2E5B2F5B305B315B335B355B36 -5B385B395B3A5B3B5B3C5B3D5B3E5B3F5B415B425B435B445B455B465B470000 -8C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B485B495B4A5B4B5B4C5B4D5B4E5B4F5B525B565B5E5B605B615B675B685B6B -5B6D5B6E5B6F5B725B745B765B775B785B795B7B5B7C5B7E5B7F5B825B865B8A -5B8D5B8E5B905B915B925B945B965B9F5BA75BA85BA95BAC5BAD5BAE5BAF5BB1 -5BB25BB75BBA5BBB5BBC5BC05BC15BC35BC85BC95BCA5BCB5BCD5BCE5BCF0000 -5BD15BD45BD55BD65BD75BD85BD95BDA5BDB5BDC5BE05BE25BE35BE65BE75BE9 -5BEA5BEB5BEC5BED5BEF5BF15BF25BF35BF45BF55BF65BF75BFD5BFE5C005C02 -5C035C055C075C085C0B5C0C5C0D5C0E5C105C125C135C175C195C1B5C1E5C1F -5C205C215C235C265C285C295C2A5C2B5C2D5C2E5C2F5C305C325C335C355C36 -5C375C435C445C465C475C4C5C4D5C525C535C545C565C575C585C5A5C5B5C5C -5C5D5C5F5C625C645C675C685C695C6A5C6B5C6C5C6D5C705C725C735C745C75 -5C765C775C785C7B5C7C5C7D5C7E5C805C835C845C855C865C875C895C8A5C8B -5C8E5C8F5C925C935C955C9D5C9E5C9F5CA05CA15CA45CA55CA65CA75CA80000 -8D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5CAA5CAE5CAF5CB05CB25CB45CB65CB95CBA5CBB5CBC5CBE5CC05CC25CC35CC5 -5CC65CC75CC85CC95CCA5CCC5CCD5CCE5CCF5CD05CD15CD35CD45CD55CD65CD7 -5CD85CDA5CDB5CDC5CDD5CDE5CDF5CE05CE25CE35CE75CE95CEB5CEC5CEE5CEF -5CF15CF25CF35CF45CF55CF65CF75CF85CF95CFA5CFC5CFD5CFE5CFF5D000000 -5D015D045D055D085D095D0A5D0B5D0C5D0D5D0F5D105D115D125D135D155D17 -5D185D195D1A5D1C5D1D5D1F5D205D215D225D235D255D285D2A5D2B5D2C5D2F -5D305D315D325D335D355D365D375D385D395D3A5D3B5D3C5D3F5D405D415D42 -5D435D445D455D465D485D495D4D5D4E5D4F5D505D515D525D535D545D555D56 -5D575D595D5A5D5C5D5E5D5F5D605D615D625D635D645D655D665D675D685D6A -5D6D5D6E5D705D715D725D735D755D765D775D785D795D7A5D7B5D7C5D7D5D7E -5D7F5D805D815D835D845D855D865D875D885D895D8A5D8B5D8C5D8D5D8E5D8F -5D905D915D925D935D945D955D965D975D985D9A5D9B5D9C5D9E5D9F5DA00000 -8E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5DA15DA25DA35DA45DA55DA65DA75DA85DA95DAA5DAB5DAC5DAD5DAE5DAF5DB0 -5DB15DB25DB35DB45DB55DB65DB85DB95DBA5DBB5DBC5DBD5DBE5DBF5DC05DC1 -5DC25DC35DC45DC65DC75DC85DC95DCA5DCB5DCC5DCE5DCF5DD05DD15DD25DD3 -5DD45DD55DD65DD75DD85DD95DDA5DDC5DDF5DE05DE35DE45DEA5DEC5DED0000 -5DF05DF55DF65DF85DF95DFA5DFB5DFC5DFF5E005E045E075E095E0A5E0B5E0D -5E0E5E125E135E175E1E5E1F5E205E215E225E235E245E255E285E295E2A5E2B -5E2C5E2F5E305E325E335E345E355E365E395E3A5E3E5E3F5E405E415E435E46 -5E475E485E495E4A5E4B5E4D5E4E5E4F5E505E515E525E535E565E575E585E59 -5E5A5E5C5E5D5E5F5E605E635E645E655E665E675E685E695E6A5E6B5E6C5E6D -5E6E5E6F5E705E715E755E775E795E7E5E815E825E835E855E885E895E8C5E8D -5E8E5E925E985E9B5E9D5EA15EA25EA35EA45EA85EA95EAA5EAB5EAC5EAE5EAF -5EB05EB15EB25EB45EBA5EBB5EBC5EBD5EBF5EC05EC15EC25EC35EC45EC50000 -8F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5EC65EC75EC85ECB5ECC5ECD5ECE5ECF5ED05ED45ED55ED75ED85ED95EDA5EDC -5EDD5EDE5EDF5EE05EE15EE25EE35EE45EE55EE65EE75EE95EEB5EEC5EED5EEE -5EEF5EF05EF15EF25EF35EF55EF85EF95EFB5EFC5EFD5F055F065F075F095F0C -5F0D5F0E5F105F125F145F165F195F1A5F1C5F1D5F1E5F215F225F235F240000 -5F285F2B5F2C5F2E5F305F325F335F345F355F365F375F385F3B5F3D5F3E5F3F -5F415F425F435F445F455F465F475F485F495F4A5F4B5F4C5F4D5F4E5F4F5F51 -5F545F595F5A5F5B5F5C5F5E5F5F5F605F635F655F675F685F6B5F6E5F6F5F72 -5F745F755F765F785F7A5F7D5F7E5F7F5F835F865F8D5F8E5F8F5F915F935F94 -5F965F9A5F9B5F9D5F9E5F9F5FA05FA25FA35FA45FA55FA65FA75FA95FAB5FAC -5FAF5FB05FB15FB25FB35FB45FB65FB85FB95FBA5FBB5FBE5FBF5FC05FC15FC2 -5FC75FC85FCA5FCB5FCE5FD35FD45FD55FDA5FDB5FDC5FDE5FDF5FE25FE35FE5 -5FE65FE85FE95FEC5FEF5FF05FF25FF35FF45FF65FF75FF95FFA5FFC60070000 -90 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60086009600B600C60106011601360176018601A601E601F602260236024602C -602D602E603060316032603360346036603760386039603A603D603E60406044 -60456046604760486049604A604C604E604F605160536054605660576058605B -605C605E605F6060606160656066606E60716072607460756077607E60800000 -608160826085608660876088608A608B608E608F609060916093609560976098 -6099609C609E60A160A260A460A560A760A960AA60AE60B060B360B560B660B7 -60B960BA60BD60BE60BF60C060C160C260C360C460C760C860C960CC60CD60CE -60CF60D060D260D360D460D660D760D960DB60DE60E160E260E360E460E560EA -60F160F260F560F760F860FB60FC60FD60FE60FF61026103610461056107610A -610B610C611061116112611361146116611761186119611B611C611D611E6121 -6122612561286129612A612C612D612E612F6130613161326133613461356136 -613761386139613A613B613C613D613E61406141614261436144614561460000 -91 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -61476149614B614D614F61506152615361546156615761586159615A615B615C -615E615F6160616161636164616561666169616A616B616C616D616E616F6171 -617261736174617661786179617A617B617C617D617E617F6180618161826183 -618461856186618761886189618A618C618D618F619061916192619361950000 -6196619761986199619A619B619C619E619F61A061A161A261A361A461A561A6 -61AA61AB61AD61AE61AF61B061B161B261B361B461B561B661B861B961BA61BB -61BC61BD61BF61C061C161C361C461C561C661C761C961CC61CD61CE61CF61D0 -61D361D561D661D761D861D961DA61DB61DC61DD61DE61DF61E061E161E261E3 -61E461E561E761E861E961EA61EB61EC61ED61EE61EF61F061F161F261F361F4 -61F661F761F861F961FA61FB61FC61FD61FE6200620162026203620462056207 -6209621362146219621C621D621E622062236226622762286229622B622D622F -6230623162326235623662386239623A623B623C6242624462456246624A0000 -92 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -624F62506255625662576259625A625C625D625E625F62606261626262646265 -6268627162726274627562776278627A627B627D628162826283628562866287 -6288628B628C628D628E628F629062946299629C629D629E62A362A662A762A9 -62AA62AD62AE62AF62B062B262B362B462B662B762B862BA62BE62C062C10000 -62C362CB62CF62D162D562DD62DE62E062E162E462EA62EB62F062F262F562F8 -62F962FA62FB63006303630463056306630A630B630C630D630F631063126313 -63146315631763186319631C632663276329632C632D632E6330633163336334 -6335633663376338633B633C633E633F63406341634463476348634A63516352 -635363546356635763586359635A635B635C635D63606364636563666368636A -636B636C636F6370637263736374637563786379637C637D637E637F63816383 -638463856386638B638D639163936394639563976399639A639B639C639D639E -639F63A163A463A663AB63AF63B163B263B563B663B963BB63BD63BF63C00000 -93 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63C163C263C363C563C763C863CA63CB63CC63D163D363D463D563D763D863D9 -63DA63DB63DC63DD63DF63E263E463E563E663E763E863EB63EC63EE63EF63F0 -63F163F363F563F763F963FA63FB63FC63FE640364046406640764086409640A -640D640E6411641264156416641764186419641A641D641F6422642364240000 -6425642764286429642B642E642F643064316432643364356436643764386439 -643B643C643E6440644264436449644B644C644D644E644F6450645164536455 -645664576459645A645B645C645D645F64606461646264636464646564666468 -646A646B646C646E646F64706471647264736474647564766477647B647C647D -647E647F648064816483648664886489648A648B648C648D648E648F64906493 -649464976498649A649B649C649D649F64A064A164A264A364A564A664A764A8 -64AA64AB64AF64B164B264B364B464B664B964BB64BD64BE64BF64C164C364C4 -64C664C764C864C964CA64CB64CC64CF64D164D364D464D564D664D964DA0000 -94 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -64DB64DC64DD64DF64E064E164E364E564E764E864E964EA64EB64EC64ED64EE -64EF64F064F164F264F364F464F564F664F764F864F964FA64FB64FC64FD64FE -64FF65016502650365046505650665076508650A650B650C650D650E650F6510 -6511651365146515651665176519651A651B651C651D651E651F652065210000 -6522652365246526652765286529652A652C652D65306531653265336537653A -653C653D6540654165426543654465466547654A654B654D654E655065526553 -655465576558655A655C655F6560656165646565656765686569656A656D656E -656F657165736575657665786579657A657B657C657D657E657F658065816582 -658365846585658665886589658A658D658E658F65926594659565966598659A -659D659E65A065A265A365A665A865AA65AC65AE65B165B265B365B465B565B6 -65B765B865BA65BB65BE65BF65C065C265C765C865C965CA65CD65D065D165D3 -65D465D565D865D965DA65DB65DC65DD65DE65DF65E165E365E465EA65EB0000 -95 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -65F265F365F465F565F865F965FB65FC65FD65FE65FF66016604660566076608 -6609660B660D661066116612661666176618661A661B661C661E662166226623 -662466266629662A662B662C662E663066326633663766386639663A663B663D -663F66406642664466456646664766486649664A664D664E6650665166580000 -6659665B665C665D665E666066626663666566676669666A666B666C666D6671 -66726673667566786679667B667C667D667F6680668166836685668666886689 -668A668B668D668E668F6690669266936694669566986699669A669B669C669E -669F66A066A166A266A366A466A566A666A966AA66AB66AC66AD66AF66B066B1 -66B266B366B566B666B766B866BA66BB66BC66BD66BF66C066C166C266C366C4 -66C566C666C766C866C966CA66CB66CC66CD66CE66CF66D066D166D266D366D4 -66D566D666D766D866DA66DE66DF66E066E166E266E366E466E566E766E866EA -66EB66EC66ED66EE66EF66F166F566F666F866FA66FB66FD6701670267030000 -96 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6704670567066707670C670E670F671167126713671667186719671A671C671E -67206721672267236724672567276729672E6730673267336736673767386739 -673B673C673E673F6741674467456747674A674B674D67526754675567576758 -6759675A675B675D67626763676467666767676B676C676E6771677467760000 -67786779677A677B677D678067826783678567866788678A678C678D678E678F -679167926793679467966799679B679F67A067A167A467A667A967AC67AE67B1 -67B267B467B967BA67BB67BC67BD67BE67BF67C067C267C567C667C767C867C9 -67CA67CB67CC67CD67CE67D567D667D767DB67DF67E167E367E467E667E767E8 -67EA67EB67ED67EE67F267F567F667F767F867F967FA67FB67FC67FE68016802 -680368046806680D681068126814681568186819681A681B681C681E681F6820 -6822682368246825682668276828682B682C682D682E682F6830683168346835 -6836683A683B683F6847684B684D684F68526856685768586859685A685B0000 -97 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -685C685D685E685F686A686C686D686E686F6870687168726873687568786879 -687A687B687C687D687E687F688068826884688768886889688A688B688C688D -688E68906891689268946895689668986899689A689B689C689D689E689F68A0 -68A168A368A468A568A968AA68AB68AC68AE68B168B268B468B668B768B80000 -68B968BA68BB68BC68BD68BE68BF68C168C368C468C568C668C768C868CA68CC -68CE68CF68D068D168D368D468D668D768D968DB68DC68DD68DE68DF68E168E2 -68E468E568E668E768E868E968EA68EB68EC68ED68EF68F268F368F468F668F7 -68F868FB68FD68FE68FF69006902690369046906690769086909690A690C690F -69116913691469156916691769186919691A691B691C691D691E692169226923 -69256926692769286929692A692B692C692E692F693169326933693569366937 -6938693A693B693C693E694069416943694469456946694769486949694A694B -694C694D694E694F69506951695269536955695669586959695B695C695F0000 -98 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6961696269646965696769686969696A696C696D696F69706972697369746975 -6976697A697B697D697E697F698169836985698A698B698C698E698F69906991 -69926993699669976999699A699D699E699F69A069A169A269A369A469A569A6 -69A969AA69AC69AE69AF69B069B269B369B569B669B869B969BA69BC69BD0000 -69BE69BF69C069C269C369C469C569C669C769C869C969CB69CD69CF69D169D2 -69D369D569D669D769D869D969DA69DC69DD69DE69E169E269E369E469E569E6 -69E769E869E969EA69EB69EC69EE69EF69F069F169F369F469F569F669F769F8 -69F969FA69FB69FC69FE6A006A016A026A036A046A056A066A076A086A096A0B -6A0C6A0D6A0E6A0F6A106A116A126A136A146A156A166A196A1A6A1B6A1C6A1D -6A1E6A206A226A236A246A256A266A276A296A2B6A2C6A2D6A2E6A306A326A33 -6A346A366A376A386A396A3A6A3B6A3C6A3F6A406A416A426A436A456A466A48 -6A496A4A6A4B6A4C6A4D6A4E6A4F6A516A526A536A546A556A566A576A5A0000 -99 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A5C6A5D6A5E6A5F6A606A626A636A646A666A676A686A696A6A6A6B6A6C6A6D -6A6E6A6F6A706A726A736A746A756A766A776A786A7A6A7B6A7D6A7E6A7F6A81 -6A826A836A856A866A876A886A896A8A6A8B6A8C6A8D6A8F6A926A936A946A95 -6A966A986A996A9A6A9B6A9C6A9D6A9E6A9F6AA16AA26AA36AA46AA56AA60000 -6AA76AA86AAA6AAD6AAE6AAF6AB06AB16AB26AB36AB46AB56AB66AB76AB86AB9 -6ABA6ABB6ABC6ABD6ABE6ABF6AC06AC16AC26AC36AC46AC56AC66AC76AC86AC9 -6ACA6ACB6ACC6ACD6ACE6ACF6AD06AD16AD26AD36AD46AD56AD66AD76AD86AD9 -6ADA6ADB6ADC6ADD6ADE6ADF6AE06AE16AE26AE36AE46AE56AE66AE76AE86AE9 -6AEA6AEB6AEC6AED6AEE6AEF6AF06AF16AF26AF36AF46AF56AF66AF76AF86AF9 -6AFA6AFB6AFC6AFD6AFE6AFF6B006B016B026B036B046B056B066B076B086B09 -6B0A6B0B6B0C6B0D6B0E6B0F6B106B116B126B136B146B156B166B176B186B19 -6B1A6B1B6B1C6B1D6B1E6B1F6B256B266B286B296B2A6B2B6B2C6B2D6B2E0000 -9A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6B2F6B306B316B336B346B356B366B386B3B6B3C6B3D6B3F6B406B416B426B44 -6B456B486B4A6B4B6B4D6B4E6B4F6B506B516B526B536B546B556B566B576B58 -6B5A6B5B6B5C6B5D6B5E6B5F6B606B616B686B696B6B6B6C6B6D6B6E6B6F6B70 -6B716B726B736B746B756B766B776B786B7A6B7D6B7E6B7F6B806B856B880000 -6B8C6B8E6B8F6B906B916B946B956B976B986B996B9C6B9D6B9E6B9F6BA06BA2 -6BA36BA46BA56BA66BA76BA86BA96BAB6BAC6BAD6BAE6BAF6BB06BB16BB26BB6 -6BB86BB96BBA6BBB6BBC6BBD6BBE6BC06BC36BC46BC66BC76BC86BC96BCA6BCC -6BCE6BD06BD16BD86BDA6BDC6BDD6BDE6BDF6BE06BE26BE36BE46BE56BE66BE7 -6BE86BE96BEC6BED6BEE6BF06BF16BF26BF46BF66BF76BF86BFA6BFB6BFC6BFE -6BFF6C006C016C026C036C046C086C096C0A6C0B6C0C6C0E6C126C176C1C6C1D -6C1E6C206C236C256C2B6C2C6C2D6C316C336C366C376C396C3A6C3B6C3C6C3E -6C3F6C436C446C456C486C4B6C4C6C4D6C4E6C4F6C516C526C536C566C580000 -9B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C596C5A6C626C636C656C666C676C6B6C6C6C6D6C6E6C6F6C716C736C756C77 -6C786C7A6C7B6C7C6C7F6C806C846C876C8A6C8B6C8D6C8E6C916C926C956C96 -6C976C986C9A6C9C6C9D6C9E6CA06CA26CA86CAC6CAF6CB06CB46CB56CB66CB7 -6CBA6CC06CC16CC26CC36CC66CC76CC86CCB6CCD6CCE6CCF6CD16CD26CD80000 -6CD96CDA6CDC6CDD6CDF6CE46CE66CE76CE96CEC6CED6CF26CF46CF96CFF6D00 -6D026D036D056D066D086D096D0A6D0D6D0F6D106D116D136D146D156D166D18 -6D1C6D1D6D1F6D206D216D226D236D246D266D286D296D2C6D2D6D2F6D306D34 -6D366D376D386D3A6D3F6D406D426D446D496D4C6D506D556D566D576D586D5B -6D5D6D5F6D616D626D646D656D676D686D6B6D6C6D6D6D706D716D726D736D75 -6D766D796D7A6D7B6D7D6D7E6D7F6D806D816D836D846D866D876D8A6D8B6D8D -6D8F6D906D926D966D976D986D996D9A6D9C6DA26DA56DAC6DAD6DB06DB16DB3 -6DB46DB66DB76DB96DBA6DBB6DBC6DBD6DBE6DC16DC26DC36DC86DC96DCA0000 -9C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6DCD6DCE6DCF6DD06DD26DD36DD46DD56DD76DDA6DDB6DDC6DDF6DE26DE36DE5 -6DE76DE86DE96DEA6DED6DEF6DF06DF26DF46DF56DF66DF86DFA6DFD6DFE6DFF -6E006E016E026E036E046E066E076E086E096E0B6E0F6E126E136E156E186E19 -6E1B6E1C6E1E6E1F6E226E266E276E286E2A6E2C6E2E6E306E316E336E350000 -6E366E376E396E3B6E3C6E3D6E3E6E3F6E406E416E426E456E466E476E486E49 -6E4A6E4B6E4C6E4F6E506E516E526E556E576E596E5A6E5C6E5D6E5E6E606E61 -6E626E636E646E656E666E676E686E696E6A6E6C6E6D6E6F6E706E716E726E73 -6E746E756E766E776E786E796E7A6E7B6E7C6E7D6E806E816E826E846E876E88 -6E8A6E8B6E8C6E8D6E8E6E916E926E936E946E956E966E976E996E9A6E9B6E9D -6E9E6EA06EA16EA36EA46EA66EA86EA96EAB6EAC6EAD6EAE6EB06EB36EB56EB8 -6EB96EBC6EBE6EBF6EC06EC36EC46EC56EC66EC86EC96ECA6ECC6ECD6ECE6ED0 -6ED26ED66ED86ED96EDB6EDC6EDD6EE36EE76EEA6EEB6EEC6EED6EEE6EEF0000 -9D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6EF06EF16EF26EF36EF56EF66EF76EF86EFA6EFB6EFC6EFD6EFE6EFF6F006F01 -6F036F046F056F076F086F0A6F0B6F0C6F0D6F0E6F106F116F126F166F176F18 -6F196F1A6F1B6F1C6F1D6F1E6F1F6F216F226F236F256F266F276F286F2C6F2E -6F306F326F346F356F376F386F396F3A6F3B6F3C6F3D6F3F6F406F416F420000 -6F436F446F456F486F496F4A6F4C6F4E6F4F6F506F516F526F536F546F556F56 -6F576F596F5A6F5B6F5D6F5F6F606F616F636F646F656F676F686F696F6A6F6B -6F6C6F6F6F706F716F736F756F766F776F796F7B6F7D6F7E6F7F6F806F816F82 -6F836F856F866F876F8A6F8B6F8F6F906F916F926F936F946F956F966F976F98 -6F996F9A6F9B6F9D6F9E6F9F6FA06FA26FA36FA46FA56FA66FA86FA96FAA6FAB -6FAC6FAD6FAE6FAF6FB06FB16FB26FB46FB56FB76FB86FBA6FBB6FBC6FBD6FBE -6FBF6FC16FC36FC46FC56FC66FC76FC86FCA6FCB6FCC6FCD6FCE6FCF6FD06FD3 -6FD46FD56FD66FD76FD86FD96FDA6FDB6FDC6FDD6FDF6FE26FE36FE46FE50000 -9E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6FE66FE76FE86FE96FEA6FEB6FEC6FED6FF06FF16FF26FF36FF46FF56FF66FF7 -6FF86FF96FFA6FFB6FFC6FFD6FFE6FFF70007001700270037004700570067007 -70087009700A700B700C700D700E700F70107012701370147015701670177018 -7019701C701D701E701F702070217022702470257026702770287029702A0000 -702B702C702D702E702F70307031703270337034703670377038703A703B703C -703D703E703F7040704170427043704470457046704770487049704A704B704D -704E7050705170527053705470557056705770587059705A705B705C705D705F -7060706170627063706470657066706770687069706A706E7071707270737074 -70777079707A707B707D7081708270837084708670877088708B708C708D708F -70907091709370977098709A709B709E709F70A070A170A270A370A470A570A6 -70A770A870A970AA70B070B270B470B570B670BA70BE70BF70C470C570C670C7 -70C970CB70CC70CD70CE70CF70D070D170D270D370D470D570D670D770DA0000 -9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -70DC70DD70DE70E070E170E270E370E570EA70EE70F070F170F270F370F470F5 -70F670F870FA70FB70FC70FE70FF710071017102710371047105710671077108 -710B710C710D710E710F7111711271147117711B711C711D711E711F71207121 -7122712371247125712771287129712A712B712C712D712E7132713371340000 -7135713771387139713A713B713C713D713E713F714071417142714371447146 -714771487149714B714D714F7150715171527153715471557156715771587159 -715A715B715D715F716071617162716371657169716A716B716C716D716F7170 -717171747175717671777179717B717C717E717F718071817182718371857186 -718771887189718B718C718D718E7190719171927193719571967197719A719B -719C719D719E71A171A271A371A471A571A671A771A971AA71AB71AD71AE71AF -71B071B171B271B471B671B771B871BA71BB71BC71BD71BE71BF71C071C171C2 -71C471C571C671C771C871C971CA71CB71CC71CD71CF71D071D171D271D30000 -A0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -71D671D771D871D971DA71DB71DC71DD71DE71DF71E171E271E371E471E671E8 -71E971EA71EB71EC71ED71EF71F071F171F271F371F471F571F671F771F871FA -71FB71FC71FD71FE71FF720072017202720372047205720772087209720A720B -720C720D720E720F7210721172127213721472157216721772187219721A0000 -721B721C721E721F722072217222722372247225722672277229722B722D722E -722F723272337234723A723C723E72407241724272437244724572467249724A -724B724E724F7250725172537254725572577258725A725C725E726072637264 -72657268726A726B726C726D7270727172737274727672777278727B727C727D -7282728372857286728772887289728C728E7290729172937294729572967297 -72987299729A729B729C729D729E72A072A172A272A372A472A572A672A772A8 -72A972AA72AB72AE72B172B272B372B572BA72BB72BC72BD72BE72BF72C072C5 -72C672C772C972CA72CB72CC72CF72D172D372D472D572D672D872DA72DB0000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030003001300200B702C902C700A8300330052014FF5E2016202620182019 -201C201D3014301530083009300A300B300C300D300E300F3016301730103011 -00B100D700F72236222722282211220F222A222922082237221A22A522252220 -23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 -22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 -25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000217021712172217321742175217621772178217900000000000000000000 -000024882489248A248B248C248D248E248F2490249124922493249424952496 -249724982499249A249B247424752476247724782479247A247B247C247D247E -247F248024812482248324842485248624872460246124622463246424652466 -2467246824690000000032203221322232233224322532263227322832290000 -00002160216121622163216421652166216721682169216A216B000000000000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -FE35FE36FE39FE3AFE3FFE40FE3DFE3EFE41FE42FE43FE4400000000FE3BFE3C -FE37FE38FE310000FE33FE340000000000000000000000000000000000000000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -02CA02CB02D920132015202520352105210921962197219821992215221F2223 -22522266226722BF2550255125522553255425552556255725582559255A255B -255C255D255E255F2560256125622563256425652566256725682569256A256B -256C256D256E256F257025712572257325812582258325842585258625870000 -25882589258A258B258C258D258E258F25932594259525BC25BD25E225E325E4 -25E5260922953012301D301E0000000000000000000000000000000000000000 -0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 -00F2016B00FA01D400F901D601D801DA01DC00FC00EA02510000014401480000 -0261000000000000000031053106310731083109310A310B310C310D310E310F -3110311131123113311431153116311731183119311A311B311C311D311E311F -3120312131223123312431253126312731283129000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30213022302330243025302630273028302932A3338E338F339C339D339E33A1 -33C433CE33D133D233D5FE30FFE2FFE400002121323100002010000000000000 -30FC309B309C30FD30FE3006309D309EFE49FE4AFE4BFE4CFE4DFE4EFE4FFE50 -FE51FE52FE54FE55FE56FE57FE59FE5AFE5BFE5CFE5DFE5EFE5FFE60FE610000 -FE62FE63FE64FE65FE66FE68FE69FE6AFE6B0000000000000000000000000000 -0000000000000000000000003007000000000000000000000000000000000000 -00000000000000002500250125022503250425052506250725082509250A250B -250C250D250E250F2510251125122513251425152516251725182519251A251B -251C251D251E251F2520252125222523252425252526252725282529252A252B -252C252D252E252F2530253125322533253425352536253725382539253A253B -253C253D253E253F2540254125422543254425452546254725482549254A254B -0000000000000000000000000000000000000000000000000000000000000000 -AA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -72DC72DD72DF72E272E372E472E572E672E772EA72EB72F572F672F972FD72FE -72FF73007302730473057306730773087309730B730C730D730F731073117312 -731473187319731A731F732073237324732673277328732D732F733073327333 -73357336733A733B733C733D7340734173427343734473457346734773480000 -7349734A734B734C734E734F7351735373547355735673587359735A735B735C -735D735E735F736173627363736473657366736773687369736A736B736E7370 -7371000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -AB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -73727373737473757376737773787379737A737B737C737D737F738073817382 -7383738573867388738A738C738D738F73907392739373947395739773987399 -739A739C739D739E73A073A173A373A473A573A673A773A873AA73AC73AD73B1 -73B473B573B673B873B973BC73BD73BE73BF73C173C373C473C573C673C70000 -73CB73CC73CE73D273D373D473D573D673D773D873DA73DB73DC73DD73DF73E1 -73E273E373E473E673E873EA73EB73EC73EE73EF73F073F173F373F473F573F6 -73F7000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -AC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -73F873F973FA73FB73FC73FD73FE73FF740074017402740474077408740B740C -740D740E741174127413741474157416741774187419741C741D741E741F7420 -74217423742474277429742B742D742F74317432743774387439743A743B743D -743E743F744074427443744474457446744774487449744A744B744C744D0000 -744E744F7450745174527453745474567458745D746074617462746374647465 -7466746774687469746A746B746C746E746F7471747274737474747574787479 -747A000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -AD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -747B747C747D747F748274847485748674887489748A748C748D748F74917492 -7493749474957496749774987499749A749B749D749F74A074A174A274A374A4 -74A574A674AA74AB74AC74AD74AE74AF74B074B174B274B374B474B574B674B7 -74B874B974BB74BC74BD74BE74BF74C074C174C274C374C474C574C674C70000 -74C874C974CA74CB74CC74CD74CE74CF74D074D174D374D474D574D674D774D8 -74D974DA74DB74DD74DF74E174E574E774E874E974EA74EB74EC74ED74F074F1 -74F2000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -AE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74F374F574F874F974FA74FB74FC74FD74FE7500750175027503750575067507 -75087509750A750B750C750E751075127514751575167517751B751D751E7520 -752175227523752475267527752A752E753475367539753C753D753F75417542 -75437544754675477549754A754D755075517552755375557556755775580000 -755D755E755F75607561756275637564756775687569756B756C756D756E756F -757075717573757575767577757A757B757C757D757E75807581758275847585 -7587000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -AF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -75887589758A758C758D758E7590759375957598759B759C759E75A275A675A7 -75A875A975AA75AD75B675B775BA75BB75BF75C075C175C675CB75CC75CE75CF -75D075D175D375D775D975DA75DC75DD75DF75E075E175E575E975EC75ED75EE -75EF75F275F375F575F675F775F875FA75FB75FD75FE76027604760676070000 -76087609760B760D760E760F76117612761376147616761A761C761D761E7621 -762376277628762C762E762F76317632763676377639763A763B763D76417642 -7644000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -76457646764776487649764A764B764E764F7650765176527653765576577658 -7659765A765B765D765F766076617662766476657666766776687669766A766C -766D766E767076717672767376747675767676777679767A767C767F76807681 -768376857689768A768C768D768F769076927694769576977698769A769B0000 -769C769D769E769F76A076A176A276A376A576A676A776A876A976AA76AB76AC -76AD76AF76B076B376B576B676B776B876B976BA76BB76BC76BD76BE76C076C1 -76C3554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 -978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 -888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB -9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 -73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E -6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -76C476C776C976CB76CC76D376D576D976DA76DC76DD76DE76E076E176E276E3 -76E476E676E776E876E976EA76EB76EC76ED76F076F376F576F676F776FA76FB -76FD76FF77007702770377057706770A770C770E770F77107711771277137714 -7715771677177718771B771C771D771E77217723772477257727772A772B0000 -772C772E773077317732773377347739773B773D773E773F7742774477457746 -77487749774A774B774C774D774E774F77527753775477557756775777587759 -775C858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 -535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 -5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 -6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 -7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B -522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -775D775E775F7760776477677769776A776D776E776F77707771777277737774 -7775777677777778777A777B777C7781778277837786778777887789778A778B -778F77907793779477957796779777987799779A779B779C779D779E77A177A3 -77A477A677A877AB77AD77AE77AF77B177B277B477B677B777B877B977BA0000 -77BC77BE77C077C177C277C377C477C577C677C777C877C977CA77CB77CC77CE -77CF77D077D177D277D377D477D577D677D877D977DA77DD77DE77DF77E077E1 -77E475C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B -82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 -601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 -6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 -4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 -62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -77E677E877EA77EF77F077F177F277F477F577F777F977FA77FB77FC78037804 -7805780678077808780A780B780E780F7810781378157819781B781E78207821 -782278247828782A782B782E782F78317832783378357836783D783F78417842 -78437844784678487849784A784B784D784F78517853785478587859785A0000 -785B785C785E785F7860786178627863786478657866786778687869786F7870 -78717872787378747875787678787879787A787B787D787E787F788078817882 -7883573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D -56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 -5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA -627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A -8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 -4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7884788578867888788A788B788F789078927894789578967899789D789E78A0 -78A278A478A678A878A978AA78AB78AC78AD78AE78AF78B578B678B778B878BA -78BB78BC78BD78BF78C078C278C378C478C678C778C878CC78CD78CE78CF78D1 -78D278D378D678D778D878DA78DB78DC78DD78DE78DF78E078E178E278E30000 -78E478E578E678E778E978EA78EB78ED78EE78EF78F078F178F378F578F678F8 -78F978FB78FC78FD78FE78FF79007902790379047906790779087909790A790B -790C784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE -7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF -882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A -847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC -810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE -7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -790D790E790F791079117912791479157916791779187919791A791B791C791D -791F792079217922792379257926792779287929792A792B792C792D792E792F -793079317932793379357936793779387939793D793F79427943794479457947 -794A794B794C794D794E794F7950795179527954795579587959796179630000 -796479667969796A796B796C796E79707971797279737974797579767979797B -797C797D797E797F798279837986798779887989798B798C798D798E79907991 -79926020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 -86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC -905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA -654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 -63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 -53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7993799479957996799779987999799B799C799D799E799F79A079A179A279A3 -79A479A579A679A879A979AA79AB79AC79AD79AE79AF79B079B179B279B479B5 -79B679B779B879BC79BF79C279C479C579C779C879CA79CC79CE79CF79D079D3 -79D479D679D779D979DA79DB79DC79DD79DE79E079E179E279E579E879EA0000 -79EC79EE79F179F279F379F479F579F679F779F979FA79FC79FE79FF7A017A04 -7A057A077A087A097A0A7A0C7A0F7A107A117A127A137A157A167A187A197A1B -7A1C4E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 -680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A -72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD -7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 -591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 -5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7A1D7A1F7A217A227A247A257A267A277A287A297A2A7A2B7A2C7A2D7A2E7A2F -7A307A317A327A347A357A367A387A3A7A3E7A407A417A427A437A447A457A47 -7A487A497A4A7A4B7A4C7A4D7A4E7A4F7A507A527A537A547A557A567A587A59 -7A5A7A5B7A5C7A5D7A5E7A5F7A607A617A627A637A647A657A667A677A680000 -7A697A6A7A6B7A6C7A6D7A6E7A6F7A717A727A737A757A7B7A7C7A7D7A7E7A82 -7A857A877A897A8A7A8B7A8C7A8E7A8F7A907A937A947A997A9A7A9B7A9E7AA1 -7AA28D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE -94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F -963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F -6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 -7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 -4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7AA37AA47AA77AA97AAA7AAB7AAE7AAF7AB07AB17AB27AB47AB57AB67AB77AB8 -7AB97ABA7ABB7ABC7ABD7ABE7AC07AC17AC27AC37AC47AC57AC67AC77AC87AC9 -7ACA7ACC7ACD7ACE7ACF7AD07AD17AD27AD37AD47AD57AD77AD87ADA7ADB7ADC -7ADD7AE17AE27AE47AE77AE87AE97AEA7AEB7AEC7AEE7AF07AF17AF27AF30000 -7AF47AF57AF67AF77AF87AFB7AFC7AFE7B007B017B027B057B077B097B0C7B0D -7B0E7B107B127B137B167B177B187B1A7B1C7B1D7B1F7B217B227B237B277B29 -7B2D6D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 -8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A -54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 -611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 -818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 -845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7B2F7B307B327B347B357B367B377B397B3B7B3D7B3F7B407B417B427B437B44 -7B467B487B4A7B4D7B4E7B537B557B577B597B5C7B5E7B5F7B617B637B647B65 -7B667B677B687B697B6A7B6B7B6C7B6D7B6F7B707B737B747B767B787B7A7B7C -7B7D7B7F7B817B827B837B847B867B877B887B897B8A7B8B7B8C7B8E7B8F0000 -7B917B927B937B967B987B997B9A7B9B7B9E7B9F7BA07BA37BA47BA57BAE7BAF -7BB07BB27BB37BB57BB67BB77BB97BBA7BBB7BBC7BBD7BBE7BBF7BC07BC27BC3 -7BC457C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E -62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D -4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC -52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF -704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 -684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7BC57BC87BC97BCA7BCB7BCD7BCE7BCF7BD07BD27BD47BD57BD67BD77BD87BDB -7BDC7BDE7BDF7BE07BE27BE37BE47BE77BE87BE97BEB7BEC7BED7BEF7BF07BF2 -7BF37BF47BF57BF67BF87BF97BFA7BFB7BFD7BFF7C007C017C027C037C047C05 -7C067C087C097C0A7C0D7C0E7C107C117C127C137C147C157C177C187C190000 -7C1A7C1B7C1C7C1D7C1E7C207C217C227C237C247C257C287C297C2B7C2C7C2D -7C2E7C2F7C307C317C327C337C347C357C367C377C397C3A7C3B7C3C7C3D7C3E -7C429AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD -558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E -8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 -76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC -4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 -543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7C437C447C457C467C477C487C497C4A7C4B7C4C7C4E7C4F7C507C517C527C53 -7C547C557C567C577C587C597C5A7C5B7C5C7C5D7C5E7C5F7C607C617C627C63 -7C647C657C667C677C687C697C6A7C6B7C6C7C6D7C6E7C6F7C707C717C727C75 -7C767C777C787C797C7A7C7E7C7F7C807C817C827C837C847C857C867C870000 -7C887C8A7C8B7C8C7C8D7C8E7C8F7C907C937C947C967C997C9A7C9B7CA07CA1 -7CA37CA67CA77CA87CA97CAB7CAC7CAD7CAF7CB07CB47CB57CB67CB77CB87CBA -7CBB5F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 -8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 -71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C -604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F -79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 -706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7CBF7CC07CC27CC37CC47CC67CC97CCB7CCE7CCF7CD07CD17CD27CD37CD47CD8 -7CDA7CDB7CDD7CDE7CE17CE27CE37CE47CE57CE67CE77CE97CEA7CEB7CEC7CED -7CEE7CF07CF17CF27CF37CF47CF57CF67CF77CF97CFA7CFC7CFD7CFE7CFF7D00 -7D017D027D037D047D057D067D077D087D097D0B7D0C7D0D7D0E7D0F7D100000 -7D117D127D137D147D157D167D177D187D197D1A7D1B7D1C7D1D7D1E7D1F7D21 -7D237D247D257D267D287D297D2A7D2C7D2D7D2E7D307D317D327D337D347D35 -7D36808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 -53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E -796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 -59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C -76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 -62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7D377D387D397D3A7D3B7D3C7D3D7D3E7D3F7D407D417D427D437D447D457D46 -7D477D487D497D4A7D4B7D4C7D4D7D4E7D4F7D507D517D527D537D547D557D56 -7D577D587D597D5A7D5B7D5C7D5D7D5E7D5F7D607D617D627D637D647D657D66 -7D677D687D697D6A7D6B7D6C7D6D7D6F7D707D717D727D737D747D757D760000 -7D787D797D7A7D7B7D7C7D7D7D7E7D7F7D807D817D827D837D847D857D867D87 -7D887D897D8A7D8B7D8C7D8D7D8E7D8F7D907D917D927D937D947D957D967D97 -7D98506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B -686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 -56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 -53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED -6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 -91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7D997D9A7D9B7D9C7D9D7D9E7D9F7DA07DA17DA27DA37DA47DA57DA77DA87DA9 -7DAA7DAB7DAC7DAD7DAF7DB07DB17DB27DB37DB47DB57DB67DB77DB87DB97DBA -7DBB7DBC7DBD7DBE7DBF7DC07DC17DC27DC37DC47DC57DC67DC77DC87DC97DCA -7DCB7DCC7DCD7DCE7DCF7DD07DD17DD27DD37DD47DD57DD67DD77DD87DD90000 -7DDA7DDB7DDC7DDD7DDE7DDF7DE07DE17DE27DE37DE47DE57DE67DE77DE87DE9 -7DEA7DEB7DEC7DED7DEE7DEF7DF07DF17DF27DF37DF47DF57DF67DF77DF87DF9 -7DFA5C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 -666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 -7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 -62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 -8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 -652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7DFB7DFC7DFD7DFE7DFF7E007E017E027E037E047E057E067E077E087E097E0A -7E0B7E0C7E0D7E0E7E0F7E107E117E127E137E147E157E167E177E187E197E1A -7E1B7E1C7E1D7E1E7E1F7E207E217E227E237E247E257E267E277E287E297E2A -7E2B7E2C7E2D7E2E7E2F7E307E317E327E337E347E357E367E377E387E390000 -7E3A7E3C7E3D7E3E7E3F7E407E427E437E447E457E467E487E497E4A7E4B7E4C -7E4D7E4E7E4F7E507E517E527E537E547E557E567E577E587E597E5A7E5B7E5C -7E5D4FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A -582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 -577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF -554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F -82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 -7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7E5E7E5F7E607E617E627E637E647E657E667E677E687E697E6A7E6B7E6C7E6D -7E6E7E6F7E707E717E727E737E747E757E767E777E787E797E7A7E7B7E7C7E7D -7E7E7E7F7E807E817E837E847E857E867E877E887E897E8A7E8B7E8C7E8D7E8E -7E8F7E907E917E927E937E947E957E967E977E987E997E9A7E9C7E9D7E9E0000 -7EAE7EB47EBB7EBC7ED67EE47EEC7EF97F0A7F107F1E7F377F397F3B7F3C7F3D -7F3E7F3F7F407F417F437F467F477F487F497F4A7F4B7F4C7F4D7F4E7F4F7F52 -7F53998861276E8357646606634656F062EC62695ED39614578362C955878721 -814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD -89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 -4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B -7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC -9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7F567F597F5B7F5C7F5D7F5E7F607F637F647F657F667F677F6B7F6C7F6D7F6F -7F707F737F757F767F777F787F7A7F7B7F7C7F7D7F7F7F807F827F837F847F85 -7F867F877F887F897F8B7F8D7F8F7F907F917F927F937F957F967F977F987F99 -7F9B7F9C7FA07FA27FA37FA57FA67FA87FA97FAA7FAB7FAC7FAD7FAE7FB10000 -7FB37FB47FB57FB67FB77FBA7FBB7FBE7FC07FC27FC37FC47FC67FC77FC87FC9 -7FCB7FCD7FCF7FD07FD17FD27FD37FD67FD77FD97FDA7FDB7FDC7FDD7FDE7FE2 -7FE375E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C -6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF -667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 -521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D -62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C -740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7FE47FE77FE87FEA7FEB7FEC7FED7FEF7FF27FF47FF57FF67FF77FF87FF97FFA -7FFD7FFE7FFF8002800780088009800A800E800F80118013801A801B801D801E -801F802180238024802B802C802D802E802F8030803280348039803A803C803E -8040804180448045804780488049804E804F8050805180538055805680570000 -8059805B805C805D805E805F806080618062806380648065806680678068806B -806C806D806E806F807080728073807480758076807780788079807A807B807C -807D9686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 -63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 -541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A -6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B -95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B -541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -807E8081808280858088808A808D808E808F8090809180928094809580978099 -809E80A380A680A780A880AC80B080B380B580B680B880B980BB80C580C780C8 -80C980CA80CB80CF80D080D180D280D380D480D580D880DF80E080E280E380E6 -80EE80F580F780F980FB80FE80FF8100810181038104810581078108810B0000 -810C811581178119811B811C811D811F81208121812281238124812581268127 -81288129812A812B812D812E813081338134813581378139813A813B813C813D -813F8C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 -51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF -7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F -772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 -7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 -706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -81408141814281438144814581478149814D814E814F8152815681578158815B -815C815D815E815F816181628163816481668168816A816B816C816F81728173 -81758176817781788181818381848185818681878189818B818C818D818E8190 -8192819381948195819681978199819A819E819F81A081A181A281A481A50000 -81A781A981AB81AC81AD81AE81AF81B081B181B281B481B581B681B781B881B9 -81BC81BD81BE81BF81C481C581C781C881C981CB81CD81CE81CF81D081D181D2 -81D3647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE -964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE -776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 -753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A -6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 -917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -81D481D581D681D781D881D981DA81DB81DC81DD81DE81DF81E081E181E281E4 -81E581E681E881E981EB81EE81EF81F081F181F281F581F681F781F881F981FA -81FD81FF8203820782088209820A820B820E820F821182138215821682178218 -8219821A821D822082248225822682278229822E8232823A823C823D823F0000 -8240824182428243824582468248824A824C824D824E82508251825282538254 -8255825682578259825B825C825D825E82608261826282638264826582668267 -826962E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 -8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 -722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 -522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA -57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA -787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -826A826B826C826D82718275827682778278827B827C82808281828382858286 -82878289828C82908293829482958296829A829B829E82A082A282A382A782B2 -82B582B682BA82BB82BC82BF82C082C282C382C582C682C982D082D682D982DA -82DD82E282E782E882E982EA82EC82ED82EE82F082F282F382F582F682F80000 -82FA82FC82FD82FE82FF8300830A830B830D831083128313831683188319831D -831E831F83208321832283238324832583268329832A832E833083328337833B -833D5564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 -74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 -8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 -83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 -51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 -8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 -C7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -833E833F83418342834483458348834A834B834C834D834E8353835583568357 -83588359835D836283708371837283738374837583768379837A837E837F8380 -838183828383838483878388838A838B838C838D838F83908391839483958396 -83978399839A839D839F83A183A283A383A483A583A683A783AC83AD83AE0000 -83AF83B583BB83BE83BF83C283C383C483C683C883C983CB83CD83CE83D083D1 -83D283D383D583D783D983DA83DB83DE83E283E383E483E683E783E883EB83EC -83ED60706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 -524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A -62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D -520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 -97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB -4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 -C8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -83EE83EF83F383F483F583F683F783FA83FB83FC83FE83FF8400840284058407 -84088409840A84108412841384148415841684178419841A841B841E841F8420 -8421842284238429842A842B842C842D842E842F843084328433843484358436 -84378439843A843B843E843F8440844184428443844484458447844884490000 -844A844B844C844D844E844F8450845284538454845584568458845D845E845F -8460846284648465846684678468846A846E846F84708472847484778479847B -847C53D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 -529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 -58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 -5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 -63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A -745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 -C9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -847D847E847F848084818483848484858486848A848D848F8490849184928493 -8494849584968498849A849B849D849E849F84A084A284A384A484A584A684A7 -84A884A984AA84AB84AC84AD84AE84B084B184B384B584B684B784BB84BC84BE -84C084C284C384C584C684C784C884CB84CC84CE84CF84D284D484D584D70000 -84D884D984DA84DB84DC84DE84E184E284E484E784E884E984EA84EB84ED84EE -84EF84F184F284F384F484F584F684F784F884F984FA84FB84FD84FE85008501 -85024F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E -7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D -886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A -5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 -820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 -7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8503850485058506850785088509850A850B850D850E850F8510851285148515 -851685188519851B851C851D851E852085228523852485258526852785288529 -852A852D852E852F8530853185328533853485358536853E853F854085418542 -8544854585468547854B854C854D854E854F8550855185528553855485550000 -85578558855A855B855C855D855F85608561856285638565856685678569856A -856B856C856D856E856F8570857185738575857685778578857C857D857F8580 -8581770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 -62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB -4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F -5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C -67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 -7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -85828583858685888589858A858B858C858D858E859085918592859385948595 -8596859785988599859A859D859E859F85A085A185A285A385A585A685A785A9 -85AB85AC85AD85B185B285B385B485B585B685B885BA85BB85BC85BD85BE85BF -85C085C285C385C485C585C685C785C885CA85CB85CC85CD85CE85D185D20000 -85D485D685D785D885D985DA85DB85DD85DE85DF85E085E185E285E385E585E6 -85E785E885EA85EB85EC85ED85EE85EF85F085F185F285F385F485F585F685F7 -85F860555237800D6454887075295E05681362F4971C53CC723D8C016C347761 -7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D -6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC -8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 -80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 -635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -85F985FA85FC85FD85FE860086018602860386048606860786088609860A860B -860C860D860E860F86108612861386148615861786188619861A861B861C861D -861E861F86208621862286238624862586268628862A862B862C862D862E862F -863086318632863386348635863686378639863A863B863D863E863F86400000 -864186428643864486458646864786488649864A864B864C8652865386558656 -865786588659865B865C865D865F866086618663866486658666866786688669 -866A736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A -8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD -6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 -7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 -951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 -751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -866D866F86708672867386748675867686778678868386848685868686878688 -8689868E868F86908691869286948696869786988699869A869B869E869F86A0 -86A186A286A586A686AB86AD86AE86B286B386B786B886B986BB86BC86BD86BE -86BF86C186C286C386C586C886CC86CD86D286D386D586D686D786DA86DC0000 -86DD86E086E186E286E386E586E686E786E886EA86EB86EC86EF86F586F686F7 -86FA86FB86FC86FD86FF8701870487058706870B870C870E870F871087118714 -87166C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 -687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 -5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 -625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 -889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB -5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8719871B871D871F87208724872687278728872A872B872C872D872F87308732 -87338735873687388739873A873C873D8740874187428743874487458746874A -874B874D874F8750875187528754875587568758875A875B875C875D875E875F -876187628766876787688769876A876B876C876D876F87718772877387750000 -877787788779877A877F878087818784878687878789878A878C878E878F8790 -8791879287948795879687988799879A879B879C879D879E87A087A187A287A3 -87A45DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 -4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 -536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 -6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C -68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 -52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -87A587A687A787A987AA87AE87B087B187B287B487B687B787B887B987BB87BC -87BE87BF87C187C287C387C487C587C787C887C987CC87CD87CE87CF87D087D4 -87D587D687D787D887D987DA87DC87DD87DE87DF87E187E287E387E487E687E7 -87E887E987EB87EC87ED87EF87F087F187F287F387F487F587F687F787F80000 -87FA87FB87FC87FD87FF880088018802880488058806880788088809880B880C -880D880E880F8810881188128814881788188819881A881C881D881E881F8820 -88237A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D -4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 -4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 -95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF -76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 -6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -882488258826882788288829882A882B882C882D882E882F8830883188338834 -8835883688378838883A883B883D883E883F8841884288438846884788488849 -884A884B884E884F8850885188528853885588568858885A885B885C885D885E -885F886088668867886A886D886F8871887388748875887688788879887A0000 -887B887C88808883888688878889888A888C888E888F88908891889388948895 -889788988899889A889B889D889E889F88A088A188A388A588A688A788A888A9 -88AA5C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A -90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C -6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 -884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E -673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 -53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -88AC88AE88AF88B088B288B388B488B588B688B888B988BA88BB88BD88BE88BF -88C088C388C488C788C888CA88CB88CC88CD88CF88D088D188D388D688D788DA -88DB88DC88DD88DE88E088E188E688E788E988EA88EB88EC88ED88EE88EF88F2 -88F588F688F788FA88FB88FD88FF890089018903890489058906890789080000 -8909890B890C890D890E890F891189148915891689178918891C891D891E891F -89208922892389248926892789288929892C892D892E892F8931893289338935 -89379009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 -5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD -7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 -781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 -71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C -4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -89388939893A893B893C893D893E893F89408942894389458946894789488949 -894A894B894C894D894E894F8950895189528953895489558956895789588959 -895A895B895C895D896089618962896389648965896789688969896A896B896C -896D896E896F8970897189728973897489758976897789788979897A897C0000 -897D897E8980898289848985898789888989898A898B898C898D898E898F8990 -899189928993899489958996899789988999899A899B899C899D899E899F89A0 -89A164475C2790657A918C2359DA54AC8200836F898180006930564E80367237 -91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 -4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 -501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB -4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE -8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -89A289A389A489A589A689A789A889A989AA89AB89AC89AD89AE89AF89B089B1 -89B289B389B489B589B689B789B889B989BA89BB89BC89BD89BE89BF89C089C3 -89CD89D389D489D589D789D889D989DB89DD89DF89E089E189E289E489E789E8 -89E989EA89EC89ED89EE89F089F189F289F489F589F689F789F889F989FA0000 -89FB89FC89FD89FE89FF8A018A028A038A048A058A068A088A098A0A8A0B8A0C -8A0D8A0E8A0F8A108A118A128A138A148A158A168A178A188A198A1A8A1B8A1C -8A1D537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 -5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C -6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 -670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 -4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED -7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8A1E8A1F8A208A218A228A238A248A258A268A278A288A298A2A8A2B8A2C8A2D -8A2E8A2F8A308A318A328A338A348A358A368A378A388A398A3A8A3B8A3C8A3D -8A3F8A408A418A428A438A448A458A468A478A498A4A8A4B8A4C8A4D8A4E8A4F -8A508A518A528A538A548A558A568A578A588A598A5A8A5B8A5C8A5D8A5E0000 -8A5F8A608A618A628A638A648A658A668A678A688A698A6A8A6B8A6C8A6D8A6E -8A6F8A708A718A728A738A748A758A768A778A788A7A8A7B8A7C8A7D8A7E8A7F -8A806D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 -56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 -5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 -5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 -810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 -8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8A818A828A838A848A858A868A878A888A8B8A8C8A8D8A8E8A8F8A908A918A92 -8A948A958A968A978A988A998A9A8A9B8A9C8A9D8A9E8A9F8AA08AA18AA28AA3 -8AA48AA58AA68AA78AA88AA98AAA8AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB3 -8AB48AB58AB68AB78AB88AB98ABA8ABB8ABC8ABD8ABE8ABF8AC08AC18AC20000 -8AC38AC48AC58AC68AC78AC88AC98ACA8ACB8ACC8ACD8ACE8ACF8AD08AD18AD2 -8AD38AD48AD58AD68AD78AD88AD98ADA8ADB8ADC8ADD8ADE8ADF8AE08AE18AE2 -8AE394E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 -77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B -7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C -62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 -951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA -9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8AE48AE58AE68AE78AE88AE98AEA8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF3 -8AF48AF58AF68AF78AF88AF98AFA8AFB8AFC8AFD8AFE8AFF8B008B018B028B03 -8B048B058B068B088B098B0A8B0B8B0C8B0D8B0E8B0F8B108B118B128B138B14 -8B158B168B178B188B198B1A8B1B8B1C8B1D8B1E8B1F8B208B218B228B230000 -8B248B258B278B288B298B2A8B2B8B2C8B2D8B2E8B2F8B308B318B328B338B34 -8B358B368B378B388B398B3A8B3B8B3C8B3D8B3E8B3F8B408B418B428B438B44 -8B455E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 -804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A -63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 -4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC -7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB -90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B468B478B488B498B4A8B4B8B4C8B4D8B4E8B4F8B508B518B528B538B548B55 -8B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B65 -8B678B688B698B6A8B6B8B6D8B6E8B6F8B708B718B728B738B748B758B768B77 -8B788B798B7A8B7B8B7C8B7D8B7E8B7F8B808B818B828B838B848B858B860000 -8B878B888B898B8A8B8B8B8C8B8D8B8E8B8F8B908B918B928B938B948B958B96 -8B978B988B998B9A8B9B8B9C8B9D8B9E8B9F8BAC8BB18BBB8BC78BD08BEA8C09 -8C1E4F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 -88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 -684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B -4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 -594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A -5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8C388C398C3A8C3B8C3C8C3D8C3E8C3F8C408C428C438C448C458C488C4A8C4B -8C4D8C4E8C4F8C508C518C528C538C548C568C578C588C598C5B8C5C8C5D8C5E -8C5F8C608C638C648C658C668C678C688C698C6C8C6D8C6E8C6F8C708C718C72 -8C748C758C768C778C7B8C7C8C7D8C7E8C7F8C808C818C838C848C868C870000 -8C888C8B8C8D8C8E8C8F8C908C918C928C938C958C968C978C998C9A8C9B8C9C -8C9D8C9E8C9F8CA08CA18CA28CA38CA48CA58CA68CA78CA88CA98CAA8CAB8CAC -8CAD4E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F -53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C -4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 -5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 -525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB -4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8CAE8CAF8CB08CB18CB28CB38CB48CB58CB68CB78CB88CB98CBA8CBB8CBC8CBD -8CBE8CBF8CC08CC18CC28CC38CC48CC58CC68CC78CC88CC98CCA8CCB8CCC8CCD -8CCE8CCF8CD08CD18CD28CD38CD48CD58CD68CD78CD88CD98CDA8CDB8CDC8CDD -8CDE8CDF8CE08CE18CE28CE38CE48CE58CE68CE78CE88CE98CEA8CEB8CEC0000 -8CED8CEE8CEF8CF08CF18CF28CF38CF48CF58CF68CF78CF88CF98CFA8CFB8CFC -8CFD8CFE8CFF8D008D018D028D038D048D058D068D078D088D098D0A8D0B8D0C -8D0D4F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC -4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F -502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 -50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 -6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 -51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8D0E8D0F8D108D118D128D138D148D158D168D178D188D198D1A8D1B8D1C8D20 -8D518D528D578D5F8D658D688D698D6A8D6C8D6E8D6F8D718D728D788D798D7A -8D7B8D7C8D7D8D7E8D7F8D808D828D838D868D878D888D898D8C8D8D8D8E8D8F -8D908D928D938D958D968D978D988D998D9A8D9B8D9C8D9D8D9E8DA08DA10000 -8DA28DA48DA58DA68DA78DA88DA98DAA8DAB8DAC8DAD8DAE8DAF8DB08DB28DB6 -8DB78DB98DBB8DBD8DC08DC18DC28DC58DC78DC88DC98DCA8DCD8DD08DD28DD3 -8DD451C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF -8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 -8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 -8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 -5369537A961D962296219631962A963D963C964296499654965F9667966C9672 -96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8DD58DD88DD98DDC8DE08DE18DE28DE58DE68DE78DE98DED8DEE8DF08DF18DF2 -8DF48DF68DFC8DFE8DFF8E008E018E028E038E048E068E078E088E0B8E0D8E0E -8E108E118E128E138E158E168E178E188E198E1A8E1B8E1C8E208E218E248E25 -8E268E278E288E2B8E2D8E308E328E338E348E368E378E388E3B8E3C8E3E0000 -8E3F8E438E458E468E4C8E4D8E4E8E4F8E508E538E548E558E568E578E588E5A -8E5B8E5C8E5D8E5E8E5F8E608E618E628E638E648E658E678E688E6A8E6B8E6E -8E7190B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB -90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD -52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF -574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B -574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF -57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E738E758E778E788E798E7A8E7B8E7D8E7E8E808E828E838E848E868E888E89 -8E8A8E8B8E8C8E8D8E8E8E918E928E938E958E968E978E988E998E9A8E9B8E9D -8E9F8EA08EA18EA28EA38EA48EA58EA68EA78EA88EA98EAA8EAD8EAE8EB08EB1 -8EB38EB48EB58EB68EB78EB88EB98EBB8EBC8EBD8EBE8EBF8EC08EC18EC20000 -8EC38EC48EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECF8ED08ED18ED28ED3 -8ED48ED58ED68ED78ED88ED98EDA8EDB8EDC8EDD8EDE8EDF8EE08EE18EE28EE3 -8EE4580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 -99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 -82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F -82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 -8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 -839B835E832F834F83478343835F834083178360832D833A8333836683650000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8EE58EE68EE78EE88EE98EEA8EEB8EEC8EED8EEE8EEF8EF08EF18EF28EF38EF4 -8EF58EF68EF78EF88EF98EFA8EFB8EFC8EFD8EFE8EFF8F008F018F028F038F04 -8F058F068F078F088F098F0A8F0B8F0C8F0D8F0E8F0F8F108F118F128F138F14 -8F158F168F178F188F198F1A8F1B8F1C8F1D8F1E8F1F8F208F218F228F230000 -8F248F258F268F278F288F298F2A8F2B8F2C8F2D8F2E8F2F8F308F318F328F33 -8F348F358F368F378F388F398F3A8F3B8F3C8F3D8F3E8F3F8F408F418F428F43 -8F448368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C -8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 -58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 -83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 -843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF -84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8F458F468F478F488F498F4A8F4B8F4C8F4D8F4E8F4F8F508F518F528F538F54 -8F558F568F578F588F598F5A8F5B8F5C8F5D8F5E8F5F8F608F618F628F638F64 -8F658F6A8F808F8C8F928F9D8FA08FA18FA28FA48FA58FA68FA78FAA8FAC8FAD -8FAE8FAF8FB28FB38FB48FB58FB78FB88FBA8FBB8FBC8FBF8FC08FC38FC60000 -8FC98FCA8FCB8FCC8FCD8FCF8FD28FD68FD78FDA8FE08FE18FE38FE78FEC8FEF -8FF18FF28FF48FF58FF68FFA8FFB8FFC8FFE8FFF90079008900C900E90139015 -90188556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 -85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 -86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 -624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 -637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE -645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9019901C902390249025902790289029902A902B902C90309031903290339034 -90379039903A903D903F904090439045904690489049904A904B904C904E9054 -905590569059905A905C905D905E905F906090619064906690679069906A906B -906C906F90709071907290739076907790789079907A907B907C907E90810000 -90849085908690879089908A908C908D908E908F90909092909490969098909A -909C909E909F90A090A490A590A790A890A990AB90AD90B290B790BC90BD90BF -90C0647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 -75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 -54435421545754595423543254825494547754715464549A549B548454765466 -549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC -54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 -5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -90C290C390C690C890C990CB90CC90CD90D290D490D590D690D890D990DA90DE -90DF90E090E390E490E590E990EA90EC90EE90F090F190F290F390F590F690F7 -90F990FA90FB90FC90FF91009101910391059106910791089109910A910B910C -910D910E910F911091119112911391149115911691179118911A911B911C0000 -911D911F91209121912491259126912791289129912A912B912C912D912E9130 -9132913391349135913691379138913A913B913C913D913E913F914091419142 -91445537555655755576557755335530555C558B55D2558355B155B955885581 -559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB -55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E -5608560C56015624562355FE56005627562D565856395657562C564D56625659 -565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 -56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9145914791489151915391549155915691589159915B915C915F916091669167 -9168916B916D9173917A917B917C9180918191829183918491869188918A918E -918F9193919491959196919791989199919C919D919E919F91A091A191A491A5 -91A691A791A891A991AB91AC91B091B191B291B391B691B791B891B991BB0000 -91BC91BD91BE91BF91C091C191C291C391C491C591C691C891CB91D091D291D3 -91D491D591D691D791D891D991DA91DB91DD91DE91DF91E091E191E291E391E4 -91E55E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 -5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 -5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F -5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 -5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 -72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -91E691E791E891E991EA91EB91EC91ED91EE91EF91F091F191F291F391F491F5 -91F691F791F891F991FA91FB91FC91FD91FE91FF920092019202920392049205 -9206920792089209920A920B920C920D920E920F921092119212921392149215 -9216921792189219921A921B921C921D921E921F922092219222922392240000 -92259226922792289229922A922B922C922D922E922F92309231923292339234 -92359236923792389239923A923B923C923D923E923F92409241924292439244 -924572FB731773137321730A731E731D7315732273397325732C733873317350 -734D73577360736C736F737E821B592598E7592459029963996799689969996A -996B996C99749977997D998099849987998A998D999099919993999499955E80 -5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA -5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 -60356026601B600F600D6029602B600A603F602160786079607B607A60420000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9246924792489249924A924B924C924D924E924F925092519252925392549255 -9256925792589259925A925B925C925D925E925F926092619262926392649265 -9266926792689269926A926B926C926D926E926F927092719272927392759276 -927792789279927A927B927C927D927E927F9280928192829283928492850000 -9286928792889289928A928B928C928D928F9290929192929293929492959296 -929792989299929A929B929C929D929E929F92A092A192A292A392A492A592A6 -92A7606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 -60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 -61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 -9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 -6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 -6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -92A892A992AA92AB92AC92AD92AF92B092B192B292B392B492B592B692B792B8 -92B992BA92BB92BC92BD92BE92BF92C092C192C292C392C492C592C692C792C9 -92CA92CB92CC92CD92CE92CF92D092D192D292D392D492D592D692D792D892D9 -92DA92DB92DC92DD92DE92DF92E092E192E292E392E492E592E692E792E80000 -92E992EA92EB92EC92ED92EE92EF92F092F192F292F392F492F592F692F792F8 -92F992FA92FB92FC92FD92FE92FF930093019302930393049305930693079308 -93096D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F -6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 -6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E -6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 -6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 -6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -930A930B930C930D930E930F9310931193129313931493159316931793189319 -931A931B931C931D931E931F9320932193229323932493259326932793289329 -932A932B932C932D932E932F9330933193329333933493359336933793389339 -933A933B933C933D933F93409341934293439344934593469347934893490000 -934A934B934C934D934E934F9350935193529353935493559356935793589359 -935A935B935C935D935E935F9360936193629363936493659366936793689369 -936B6FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 -704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 -8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 -900D9016902190359036902D902F9044905190529050906890589062905B66B9 -9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 -5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -936C936D936E936F9370937193729373937493759376937793789379937A937B -937C937D937E937F9380938193829383938493859386938793889389938A938B -938C938D938E9390939193929393939493959396939793989399939A939B939C -939D939E939F93A093A193A293A393A493A593A693A793A893A993AA93AB0000 -93AC93AD93AE93AF93B093B193B293B393B493B593B693B793B893B993BA93BB -93BC93BD93BE93BF93C093C193C293C393C493C593C693C793C893C993CB93CC -93CD599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 -59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 -80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 -5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 -9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 -9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -93CE93CF93D093D193D293D393D493D593D793D893D993DA93DB93DC93DD93DE -93DF93E093E193E293E393E493E593E693E793E893E993EA93EB93EC93ED93EE -93EF93F093F193F293F393F493F593F693F793F893F993FA93FB93FC93FD93FE -93FF9400940194029403940494059406940794089409940A940B940C940D0000 -940E940F9410941194129413941494159416941794189419941A941B941C941D -941E941F9420942194229423942494259426942794289429942A942B942C942D -942E7EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 -7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 -7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 -7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 -738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C -740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -942F9430943194329433943494359436943794389439943A943B943C943D943F -9440944194429443944494459446944794489449944A944B944C944D944E944F -9450945194529453945494559456945794589459945A945B945C945D945E945F -9460946194629463946494659466946794689469946A946C946D946E946F0000 -9470947194729473947494759476947794789479947A947B947C947D947E947F -9480948194829483948494919496949894C794CF94D394D494DA94E694FB951C -9520741B741A7441745C7457745574597477746D747E749C748E748074817487 -748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 -67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 -680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD -6832683368606861684E6862684468646883681D68556866684168676840683E -684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -95279533953D95439548954B9555955A9560956E95749575957795789579957A -957B957C957D957E9580958195829583958495859586958795889589958A958B -958C958D958E958F9590959195929593959495959596959795989599959A959B -959C959D959E959F95A095A195A295A395A495A595A695A795A895A995AA0000 -95AB95AC95AD95AE95AF95B095B195B295B395B495B595B695B795B895B995BA -95BB95BC95BD95BE95BF95C095C195C295C395C495C595C695C795C895C995CA -95CB692468F0690B6901695768E369106971693969606942695D6984696B6980 -69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD -69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 -6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB -733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 -8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB -95DC95DD95DE95DF95E095E195E295E395E495E595E695E795EC95FF96079613 -9618961B961E96209623962496259626962796289629962B962C962D962F9630 -963796389639963A963E96419643964A964E964F965196529653965696570000 -96589659965A965C965D965E9660966396659666966B966D966E966F96709671 -967396789679967A967B967C967D967E967F9680968196829683968496879689 -968A8F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C -81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 -6600708566F7661D66346631663666358006665F66546641664F665666616657 -66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 -8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 -726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -968C968E96919692969396959696969A969B969D969E969F96A096A196A296A3 -96A496A596A696A896A996AA96AB96AC96AD96AE96AF96B196B296B496B596B7 -96B896BA96BB96BF96C296C396C896CA96CB96D096D196D396D496D696D796D8 -96D996DA96DB96DC96DD96DE96DF96E196E296E396E496E596E696E796EB0000 -96EC96ED96EE96F096F196F296F496F596F896FA96FB96FC96FD96FF97029703 -9705970A970B970C97109711971297149715971797189719971A971B971D971F -9720643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 -6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F -809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 -80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 -8C5A8136811E812C811881328148814C815381748159815A817181608169817C -817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -972197229723972497259726972797289729972B972C972E972F973197339734 -973597369737973A973B973C973D973F97409741974297439744974597469747 -97489749974A974B974C974D974E974F975097519754975597579758975A975C -975D975F97639764976697679768976A976B976C976D976E976F977097710000 -97729775977797789779977A977B977D977E977F978097819782978397849786 -978797889789978A978C978E978F979097939795979697979799979A979B979C -979D81C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 -5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C -7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C -716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D -7228706C7118716671B9623E623D624362486249793B794079467949795B795C -7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -979E979F97A197A297A497A597A697A797A897A997AA97AC97AE97B097B197B3 -97B597B697B797B897B997BA97BB97BC97BD97BE97BF97C097C197C297C397C4 -97C597C697C797C897C997CA97CB97CC97CD97CE97CF97D097D197D297D397D4 -97D597D697D797D897D997DA97DB97DC97DD97DE97DF97E097E197E297E30000 -97E497E597E897EE97EF97F097F197F297F497F797F897F997FA97FB97FC97FD -97FE97FF9800980198029803980498059806980798089809980A980B980C980D -980E603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 -62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C -781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 -7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 -78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 -77077708771A77227719772D7726773577387750775177477743775A77680000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -980F9810981198129813981498159816981798189819981A981B981C981D981E -981F9820982198229823982498259826982798289829982A982B982C982D982E -982F9830983198329833983498359836983798389839983A983B983C983D983E -983F9840984198429843984498459846984798489849984A984B984C984D0000 -984E984F9850985198529853985498559856985798589859985A985B985C985D -985E985F9860986198629863986498659866986798689869986A986B986C986D -986E77627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 -754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 -7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 -949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 -94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 -94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -986F98709871987298739874988B988E98929895989998A398A898A998AA98AB -98AC98AD98AE98AF98B098B198B298B398B498B598B698B798B898B998BA98BB -98BC98BD98BE98BF98C098C198C298C398C498C598C698C798C898C998CA98CB -98CC98CD98CF98D098D498D698D798DB98DC98DD98E098E198E298E398E40000 -98E598E698E998EA98EB98EC98ED98EE98EF98F098F198F298F398F498F598F6 -98F798F898F998FA98FB98FC98FD98FE98FF9900990199029903990499059906 -990794E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 -95079509950A950D950E950F951295139514951595169518951B951D951E951F -9522952A952B9529952C953195329534953695379538953C953E953F95429535 -9544954595469549954C954E954F9552955395549556955795589559955B955E -955F955D95619562956495659566956795689569956A956B956C956F95719572 -9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -99089909990A990B990C990E990F991199129913991499159916991799189919 -991A991B991C991D991E991F9920992199229923992499259926992799289929 -992A992B992C992D992F9930993199329933993499359936993799389939993A -993B993C993D993E993F99409941994299439944994599469947994899490000 -994A994B994C994D994E994F99509951995299539956995799589959995A995B -995C995D995E995F99609961996299649966997399789979997B997E99829983 -99897A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 -9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 -9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 -9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC -75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB -75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -998C998E999A999B999C999D999E999F99A099A199A299A399A499A699A799A9 -99AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B9 -99BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C9 -99CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D80000 -99D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E8 -99E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F599F699F799F8 -99F9761B763C762276207640762D7630763F76357643763E7633764D765E7654 -765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 -7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 -88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 -8966897B758B80E576B276B477DC801280148016801C80208022802580268027 -802980288031800B803580438046804D80528069807189839878988098830000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -99FA99FB99FC99FD99FE99FF9A009A019A029A039A049A059A069A079A089A09 -9A0A9A0B9A0C9A0D9A0E9A0F9A109A119A129A139A149A159A169A179A189A19 -9A1A9A1B9A1C9A1D9A1E9A1F9A209A219A229A239A249A259A269A279A289A29 -9A2A9A2B9A2C9A2D9A2E9A2F9A309A319A329A339A349A359A369A379A380000 -9A399A3A9A3B9A3C9A3D9A3E9A3F9A409A419A429A439A449A459A469A479A48 -9A499A4A9A4B9A4C9A4D9A4E9A4F9A509A519A529A539A549A559A569A579A58 -9A599889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 -866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 -86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 -86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B -871E8725872E871A873E87488734873187298737873F87828722877D877E877B -87608770874C876E878B87538763877C876487598765879387AF87A887D20000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9A5A9A5B9A5C9A5D9A5E9A5F9A609A619A629A639A649A659A669A679A689A69 -9A6A9A6B9A729A839A899A8D9A8E9A949A959A999AA69AA99AAA9AAB9AAC9AAD -9AAE9AAF9AB29AB39AB49AB59AB99ABB9ABD9ABE9ABF9AC39AC49AC69AC79AC8 -9AC99ACA9ACD9ACE9ACF9AD09AD29AD49AD59AD69AD79AD99ADA9ADB9ADC0000 -9ADD9ADE9AE09AE29AE39AE49AE59AE79AE89AE99AEA9AEC9AEE9AF09AF19AF2 -9AF39AF49AF59AF69AF79AF89AFA9AFC9AFD9AFE9AFF9B009B019B029B049B05 -9B0687C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 -87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 -7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 -7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E -7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB -7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9B079B099B0A9B0B9B0C9B0D9B0E9B109B119B129B149B159B169B179B189B19 -9B1A9B1B9B1C9B1D9B1E9B209B219B229B249B259B269B279B289B299B2A9B2B -9B2C9B2D9B2E9B309B319B339B349B359B369B379B389B399B3A9B3D9B3E9B3F -9B409B469B4A9B4B9B4C9B4E9B509B529B539B559B569B579B589B599B5A0000 -9B5B9B5C9B5D9B5E9B5F9B609B619B629B639B649B659B669B679B689B699B6A -9B6B9B6C9B6D9B6E9B6F9B709B719B729B739B749B759B769B779B789B799B7A -9B7B7C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 -822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 -887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D -7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 -7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 -9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 -F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9B7C9B7D9B7E9B7F9B809B819B829B839B849B859B869B879B889B899B8A9B8B -9B8C9B8D9B8E9B8F9B909B919B929B939B949B959B969B979B989B999B9A9B9B -9B9C9B9D9B9E9B9F9BA09BA19BA29BA39BA49BA59BA69BA79BA89BA99BAA9BAB -9BAC9BAD9BAE9BAF9BB09BB19BB29BB39BB49BB59BB69BB79BB89BB99BBA0000 -9BBB9BBC9BBD9BBE9BBF9BC09BC19BC29BC39BC49BC59BC69BC79BC89BC99BCA -9BCB9BCC9BCD9BCE9BCF9BD09BD19BD29BD39BD49BD59BD69BD79BD89BD99BDA -9BDB9162916191709169916F917D917E917291749179918C91859190918D9191 -91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 -8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 -8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 -8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F -8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 -F6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9BDC9BDD9BDE9BDF9BE09BE19BE29BE39BE49BE59BE69BE79BE89BE99BEA9BEB -9BEC9BED9BEE9BEF9BF09BF19BF29BF39BF49BF59BF69BF79BF89BF99BFA9BFB -9BFC9BFD9BFE9BFF9C009C019C029C039C049C059C069C079C089C099C0A9C0B -9C0C9C0D9C0E9C0F9C109C119C129C139C149C159C169C179C189C199C1A0000 -9C1B9C1C9C1D9C1E9C1F9C209C219C229C239C249C259C269C279C289C299C2A -9C2B9C2C9C2D9C2E9C2F9C309C319C329C339C349C359C369C379C389C399C3A -9C3B89E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A -972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 -96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F -9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E -9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 -9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 -F7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9C3C9C3D9C3E9C3F9C409C419C429C439C449C459C469C479C489C499C4A9C4B -9C4C9C4D9C4E9C4F9C509C519C529C539C549C559C569C579C589C599C5A9C5B -9C5C9C5D9C5E9C5F9C609C619C629C639C649C659C669C679C689C699C6A9C6B -9C6C9C6D9C6E9C6F9C709C719C729C739C749C759C769C779C789C799C7A0000 -9C7B9C7D9C7E9C809C839C849C899C8A9C8C9C8F9C939C969C979C989C999C9D -9CAA9CAC9CAF9CB99CBE9CBF9CC09CC19CC29CC89CC99CD19CD29CDA9CDB9CE0 -9CE19CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 -977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA -9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 -990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F -9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 -9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 -F8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9CE39CE49CE59CE69CE79CE89CE99CEA9CEB9CEC9CED9CEE9CEF9CF09CF19CF2 -9CF39CF49CF59CF69CF79CF89CF99CFA9CFB9CFC9CFD9CFE9CFF9D009D019D02 -9D039D049D059D069D079D089D099D0A9D0B9D0C9D0D9D0E9D0F9D109D119D12 -9D139D149D159D169D179D189D199D1A9D1B9D1C9D1D9D1E9D1F9D209D210000 -9D229D239D249D259D269D279D289D299D2A9D2B9D2C9D2D9D2E9D2F9D309D31 -9D329D339D349D359D369D379D389D399D3A9D3B9D3C9D3D9D3E9D3F9D409D41 -9D42000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -F9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9D439D449D459D469D479D489D499D4A9D4B9D4C9D4D9D4E9D4F9D509D519D52 -9D539D549D559D569D579D589D599D5A9D5B9D5C9D5D9D5E9D5F9D609D619D62 -9D639D649D659D669D679D689D699D6A9D6B9D6C9D6D9D6E9D6F9D709D719D72 -9D739D749D759D769D779D789D799D7A9D7B9D7C9D7D9D7E9D7F9D809D810000 -9D829D839D849D859D869D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D909D91 -9D929D939D949D959D969D979D989D999D9A9D9B9D9C9D9D9D9E9D9F9DA09DA1 -9DA2000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9DA39DA49DA59DA69DA79DA89DA99DAA9DAB9DAC9DAD9DAE9DAF9DB09DB19DB2 -9DB39DB49DB59DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2 -9DC39DC49DC59DC69DC79DC89DC99DCA9DCB9DCC9DCD9DCE9DCF9DD09DD19DD2 -9DD39DD49DD59DD69DD79DD89DD99DDA9DDB9DDC9DDD9DDE9DDF9DE09DE10000 -9DE29DE39DE49DE59DE69DE79DE89DE99DEA9DEB9DEC9DED9DEE9DEF9DF09DF1 -9DF29DF39DF49DF59DF69DF79DF89DF99DFA9DFB9DFC9DFD9DFE9DFF9E009E01 -9E02000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9E039E049E059E069E079E089E099E0A9E0B9E0C9E0D9E0E9E0F9E109E119E12 -9E139E149E159E169E179E189E199E1A9E1B9E1C9E1D9E1E9E249E279E2E9E30 -9E349E3B9E3C9E409E4D9E509E529E539E549E569E599E5D9E5F9E609E619E62 -9E659E6E9E6F9E729E749E759E769E779E789E799E7A9E7B9E7C9E7D9E800000 -9E819E839E849E859E869E899E8A9E8C9E8D9E8E9E8F9E909E919E949E959E96 -9E979E989E999E9A9E9B9E9C9E9E9EA09EA19EA29EA39EA49EA59EA79EA89EA9 -9EAA000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9EAB9EAC9EAD9EAE9EAF9EB09EB19EB29EB39EB59EB69EB79EB99EBA9EBC9EBF -9EC09EC19EC29EC39EC59EC69EC79EC89ECA9ECB9ECC9ED09ED29ED39ED59ED6 -9ED79ED99EDA9EDE9EE19EE39EE49EE69EE89EEB9EEC9EED9EEE9EF09EF19EF2 -9EF39EF49EF59EF69EF79EF89EFA9EFD9EFF9F009F019F029F039F049F050000 -9F069F079F089F099F0A9F0C9F0F9F119F129F149F159F169F189F1A9F1B9F1C -9F1D9F1E9F1F9F219F239F249F259F269F279F289F299F2A9F2B9F2D9F2E9F30 -9F31000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9F329F339F349F359F369F389F3A9F3C9F3F9F409F419F429F439F459F469F47 -9F489F499F4A9F4B9F4C9F4D9F4E9F4F9F529F539F549F559F569F579F589F59 -9F5A9F5B9F5C9F5D9F5E9F5F9F609F619F629F639F649F659F669F679F689F69 -9F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F739F749F759F769F779F780000 -9F799F7A9F7B9F7C9F7D9F7E9F819F829F8D9F8E9F8F9F909F919F929F939F94 -9F959F969F979F989F9C9F9D9F9E9FA19FA29FA39FA49FA5F92CF979F995F9E7 -F9F1000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FA0CFA0DFA0EFA0FFA11FA13FA14FA18FA1FFA20FA21FA23FA24FA27FA28FA29 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp949.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp949.enc deleted file mode 100644 index 2f3ec39..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp949.enc +++ /dev/null @@ -1,2128 +0,0 @@ -# Encoding file: cp949, multi-byte -M -003F 0 125 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -81 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AC02AC03AC05AC06AC0BAC0CAC0DAC0EAC0FAC18AC1EAC1FAC21AC22AC23 -AC25AC26AC27AC28AC29AC2AAC2BAC2EAC32AC33AC3400000000000000000000 -0000AC35AC36AC37AC3AAC3BAC3DAC3EAC3FAC41AC42AC43AC44AC45AC46AC47 -AC48AC49AC4AAC4CAC4EAC4FAC50AC51AC52AC53AC5500000000000000000000 -0000AC56AC57AC59AC5AAC5BAC5DAC5EAC5FAC60AC61AC62AC63AC64AC65AC66 -AC67AC68AC69AC6AAC6BAC6CAC6DAC6EAC6FAC72AC73AC75AC76AC79AC7BAC7C -AC7DAC7EAC7FAC82AC87AC88AC8DAC8EAC8FAC91AC92AC93AC95AC96AC97AC98 -AC99AC9AAC9BAC9EACA2ACA3ACA4ACA5ACA6ACA7ACABACADACAEACB1ACB2ACB3 -ACB4ACB5ACB6ACB7ACBAACBEACBFACC0ACC2ACC3ACC5ACC6ACC7ACC9ACCAACCB -ACCDACCEACCFACD0ACD1ACD2ACD3ACD4ACD6ACD8ACD9ACDAACDBACDCACDDACDE -ACDFACE2ACE3ACE5ACE6ACE9ACEBACEDACEEACF2ACF4ACF7ACF8ACF9ACFAACFB -ACFEACFFAD01AD02AD03AD05AD07AD08AD09AD0AAD0BAD0EAD10AD12AD130000 -82 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AD14AD15AD16AD17AD19AD1AAD1BAD1DAD1EAD1FAD21AD22AD23AD24AD25 -AD26AD27AD28AD2AAD2BAD2EAD2FAD30AD31AD32AD3300000000000000000000 -0000AD36AD37AD39AD3AAD3BAD3DAD3EAD3FAD40AD41AD42AD43AD46AD48AD4A -AD4BAD4CAD4DAD4EAD4FAD51AD52AD53AD55AD56AD5700000000000000000000 -0000AD59AD5AAD5BAD5CAD5DAD5EAD5FAD60AD62AD64AD65AD66AD67AD68AD69 -AD6AAD6BAD6EAD6FAD71AD72AD77AD78AD79AD7AAD7EAD80AD83AD84AD85AD86 -AD87AD8AAD8BAD8DAD8EAD8FAD91AD92AD93AD94AD95AD96AD97AD98AD99AD9A -AD9BAD9EAD9FADA0ADA1ADA2ADA3ADA5ADA6ADA7ADA8ADA9ADAAADABADACADAD -ADAEADAFADB0ADB1ADB2ADB3ADB4ADB5ADB6ADB8ADB9ADBAADBBADBCADBDADBE -ADBFADC2ADC3ADC5ADC6ADC7ADC9ADCAADCBADCCADCDADCEADCFADD2ADD4ADD5 -ADD6ADD7ADD8ADD9ADDAADDBADDDADDEADDFADE1ADE2ADE3ADE5ADE6ADE7ADE8 -ADE9ADEAADEBADECADEDADEEADEFADF0ADF1ADF2ADF3ADF4ADF5ADF6ADF70000 -83 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000ADFAADFBADFDADFEAE02AE03AE04AE05AE06AE07AE0AAE0CAE0EAE0FAE10 -AE11AE12AE13AE15AE16AE17AE18AE19AE1AAE1BAE1C00000000000000000000 -0000AE1DAE1EAE1FAE20AE21AE22AE23AE24AE25AE26AE27AE28AE29AE2AAE2B -AE2CAE2DAE2EAE2FAE32AE33AE35AE36AE39AE3BAE3C00000000000000000000 -0000AE3DAE3EAE3FAE42AE44AE47AE48AE49AE4BAE4FAE51AE52AE53AE55AE57 -AE58AE59AE5AAE5BAE5EAE62AE63AE64AE66AE67AE6AAE6BAE6DAE6EAE6FAE71 -AE72AE73AE74AE75AE76AE77AE7AAE7EAE7FAE80AE81AE82AE83AE86AE87AE88 -AE89AE8AAE8BAE8DAE8EAE8FAE90AE91AE92AE93AE94AE95AE96AE97AE98AE99 -AE9AAE9BAE9CAE9DAE9EAE9FAEA0AEA1AEA2AEA3AEA4AEA5AEA6AEA7AEA8AEA9 -AEAAAEABAEACAEADAEAEAEAFAEB0AEB1AEB2AEB3AEB4AEB5AEB6AEB7AEB8AEB9 -AEBAAEBBAEBFAEC1AEC2AEC3AEC5AEC6AEC7AEC8AEC9AECAAECBAECEAED2AED3 -AED4AED5AED6AED7AEDAAEDBAEDDAEDEAEDFAEE0AEE1AEE2AEE3AEE4AEE50000 -84 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AEE6AEE7AEE9AEEAAEECAEEEAEEFAEF0AEF1AEF2AEF3AEF5AEF6AEF7AEF9 -AEFAAEFBAEFDAEFEAEFFAF00AF01AF02AF03AF04AF0500000000000000000000 -0000AF06AF09AF0AAF0BAF0CAF0EAF0FAF11AF12AF13AF14AF15AF16AF17AF18 -AF19AF1AAF1BAF1CAF1DAF1EAF1FAF20AF21AF22AF2300000000000000000000 -0000AF24AF25AF26AF27AF28AF29AF2AAF2BAF2EAF2FAF31AF33AF35AF36AF37 -AF38AF39AF3AAF3BAF3EAF40AF44AF45AF46AF47AF4AAF4BAF4CAF4DAF4EAF4F -AF51AF52AF53AF54AF55AF56AF57AF58AF59AF5AAF5BAF5EAF5FAF60AF61AF62 -AF63AF66AF67AF68AF69AF6AAF6BAF6CAF6DAF6EAF6FAF70AF71AF72AF73AF74 -AF75AF76AF77AF78AF7AAF7BAF7CAF7DAF7EAF7FAF81AF82AF83AF85AF86AF87 -AF89AF8AAF8BAF8CAF8DAF8EAF8FAF92AF93AF94AF96AF97AF98AF99AF9AAF9B -AF9DAF9EAF9FAFA0AFA1AFA2AFA3AFA4AFA5AFA6AFA7AFA8AFA9AFAAAFABAFAC -AFADAFAEAFAFAFB0AFB1AFB2AFB3AFB4AFB5AFB6AFB7AFBAAFBBAFBDAFBE0000 -85 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AFBFAFC1AFC2AFC3AFC4AFC5AFC6AFCAAFCCAFCFAFD0AFD1AFD2AFD3AFD5 -AFD6AFD7AFD8AFD9AFDAAFDBAFDDAFDEAFDFAFE0AFE100000000000000000000 -0000AFE2AFE3AFE4AFE5AFE6AFE7AFEAAFEBAFECAFEDAFEEAFEFAFF2AFF3AFF5 -AFF6AFF7AFF9AFFAAFFBAFFCAFFDAFFEAFFFB002B00300000000000000000000 -0000B005B006B007B008B009B00AB00BB00DB00EB00FB011B012B013B015B016 -B017B018B019B01AB01BB01EB01FB020B021B022B023B024B025B026B027B029 -B02AB02BB02CB02DB02EB02FB030B031B032B033B034B035B036B037B038B039 -B03AB03BB03CB03DB03EB03FB040B041B042B043B046B047B049B04BB04DB04F -B050B051B052B056B058B05AB05BB05CB05EB05FB060B061B062B063B064B065 -B066B067B068B069B06AB06BB06CB06DB06EB06FB070B071B072B073B074B075 -B076B077B078B079B07AB07BB07EB07FB081B082B083B085B086B087B088B089 -B08AB08BB08EB090B092B093B094B095B096B097B09BB09DB09EB0A3B0A40000 -86 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B0A5B0A6B0A7B0AAB0B0B0B2B0B6B0B7B0B9B0BAB0BBB0BDB0BEB0BFB0C0 -B0C1B0C2B0C3B0C6B0CAB0CBB0CCB0CDB0CEB0CFB0D200000000000000000000 -0000B0D3B0D5B0D6B0D7B0D9B0DAB0DBB0DCB0DDB0DEB0DFB0E1B0E2B0E3B0E4 -B0E6B0E7B0E8B0E9B0EAB0EBB0ECB0EDB0EEB0EFB0F000000000000000000000 -0000B0F1B0F2B0F3B0F4B0F5B0F6B0F7B0F8B0F9B0FAB0FBB0FCB0FDB0FEB0FF -B100B101B102B103B104B105B106B107B10AB10DB10EB10FB111B114B115B116 -B117B11AB11EB11FB120B121B122B126B127B129B12AB12BB12DB12EB12FB130 -B131B132B133B136B13AB13BB13CB13DB13EB13FB142B143B145B146B147B149 -B14AB14BB14CB14DB14EB14FB152B153B156B157B159B15AB15BB15DB15EB15F -B161B162B163B164B165B166B167B168B169B16AB16BB16CB16DB16EB16FB170 -B171B172B173B174B175B176B177B17AB17BB17DB17EB17FB181B183B184B185 -B186B187B18AB18CB18EB18FB190B191B195B196B197B199B19AB19BB19D0000 -87 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B19EB19FB1A0B1A1B1A2B1A3B1A4B1A5B1A6B1A7B1A9B1AAB1ABB1ACB1AD -B1AEB1AFB1B0B1B1B1B2B1B3B1B4B1B5B1B6B1B7B1B800000000000000000000 -0000B1B9B1BAB1BBB1BCB1BDB1BEB1BFB1C0B1C1B1C2B1C3B1C4B1C5B1C6B1C7 -B1C8B1C9B1CAB1CBB1CDB1CEB1CFB1D1B1D2B1D3B1D500000000000000000000 -0000B1D6B1D7B1D8B1D9B1DAB1DBB1DEB1E0B1E1B1E2B1E3B1E4B1E5B1E6B1E7 -B1EAB1EBB1EDB1EEB1EFB1F1B1F2B1F3B1F4B1F5B1F6B1F7B1F8B1FAB1FCB1FE -B1FFB200B201B202B203B206B207B209B20AB20DB20EB20FB210B211B212B213 -B216B218B21AB21BB21CB21DB21EB21FB221B222B223B224B225B226B227B228 -B229B22AB22BB22CB22DB22EB22FB230B231B232B233B235B236B237B238B239 -B23AB23BB23DB23EB23FB240B241B242B243B244B245B246B247B248B249B24A -B24BB24CB24DB24EB24FB250B251B252B253B254B255B256B257B259B25AB25B -B25DB25EB25FB261B262B263B264B265B266B267B26AB26BB26CB26DB26E0000 -88 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B26FB270B271B272B273B276B277B278B279B27AB27BB27DB27EB27FB280 -B281B282B283B286B287B288B28AB28BB28CB28DB28E00000000000000000000 -0000B28FB292B293B295B296B297B29BB29CB29DB29EB29FB2A2B2A4B2A7B2A8 -B2A9B2ABB2ADB2AEB2AFB2B1B2B2B2B3B2B5B2B6B2B700000000000000000000 -0000B2B8B2B9B2BAB2BBB2BCB2BDB2BEB2BFB2C0B2C1B2C2B2C3B2C4B2C5B2C6 -B2C7B2CAB2CBB2CDB2CEB2CFB2D1B2D3B2D4B2D5B2D6B2D7B2DAB2DCB2DEB2DF -B2E0B2E1B2E3B2E7B2E9B2EAB2F0B2F1B2F2B2F6B2FCB2FDB2FEB302B303B305 -B306B307B309B30AB30BB30CB30DB30EB30FB312B316B317B318B319B31AB31B -B31DB31EB31FB320B321B322B323B324B325B326B327B328B329B32AB32BB32C -B32DB32EB32FB330B331B332B333B334B335B336B337B338B339B33AB33BB33C -B33DB33EB33FB340B341B342B343B344B345B346B347B348B349B34AB34BB34C -B34DB34EB34FB350B351B352B353B357B359B35AB35DB360B361B362B3630000 -89 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B366B368B36AB36CB36DB36FB372B373B375B376B377B379B37AB37BB37C -B37DB37EB37FB382B386B387B388B389B38AB38BB38D00000000000000000000 -0000B38EB38FB391B392B393B395B396B397B398B399B39AB39BB39CB39DB39E -B39FB3A2B3A3B3A4B3A5B3A6B3A7B3A9B3AAB3ABB3AD00000000000000000000 -0000B3AEB3AFB3B0B3B1B3B2B3B3B3B4B3B5B3B6B3B7B3B8B3B9B3BAB3BBB3BC -B3BDB3BEB3BFB3C0B3C1B3C2B3C3B3C6B3C7B3C9B3CAB3CDB3CFB3D1B3D2B3D3 -B3D6B3D8B3DAB3DCB3DEB3DFB3E1B3E2B3E3B3E5B3E6B3E7B3E9B3EAB3EBB3EC -B3EDB3EEB3EFB3F0B3F1B3F2B3F3B3F4B3F5B3F6B3F7B3F8B3F9B3FAB3FBB3FD -B3FEB3FFB400B401B402B403B404B405B406B407B408B409B40AB40BB40CB40D -B40EB40FB411B412B413B414B415B416B417B419B41AB41BB41DB41EB41FB421 -B422B423B424B425B426B427B42AB42CB42DB42EB42FB430B431B432B433B435 -B436B437B438B439B43AB43BB43CB43DB43EB43FB440B441B442B443B4440000 -8A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B445B446B447B448B449B44AB44BB44CB44DB44EB44FB452B453B455B456 -B457B459B45AB45BB45CB45DB45EB45FB462B464B46600000000000000000000 -0000B467B468B469B46AB46BB46DB46EB46FB470B471B472B473B474B475B476 -B477B478B479B47AB47BB47CB47DB47EB47FB481B48200000000000000000000 -0000B483B484B485B486B487B489B48AB48BB48CB48DB48EB48FB490B491B492 -B493B494B495B496B497B498B499B49AB49BB49CB49EB49FB4A0B4A1B4A2B4A3 -B4A5B4A6B4A7B4A9B4AAB4ABB4ADB4AEB4AFB4B0B4B1B4B2B4B3B4B4B4B6B4B8 -B4BAB4BBB4BCB4BDB4BEB4BFB4C1B4C2B4C3B4C5B4C6B4C7B4C9B4CAB4CBB4CC -B4CDB4CEB4CFB4D1B4D2B4D3B4D4B4D6B4D7B4D8B4D9B4DAB4DBB4DEB4DFB4E1 -B4E2B4E5B4E7B4E8B4E9B4EAB4EBB4EEB4F0B4F2B4F3B4F4B4F5B4F6B4F7B4F9 -B4FAB4FBB4FCB4FDB4FEB4FFB500B501B502B503B504B505B506B507B508B509 -B50AB50BB50CB50DB50EB50FB510B511B512B513B516B517B519B51AB51D0000 -8B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B51EB51FB520B521B522B523B526B52BB52CB52DB52EB52FB532B533B535 -B536B537B539B53AB53BB53CB53DB53EB53FB542B54600000000000000000000 -0000B547B548B549B54AB54EB54FB551B552B553B555B556B557B558B559B55A -B55BB55EB562B563B564B565B566B567B568B569B56A00000000000000000000 -0000B56BB56CB56DB56EB56FB570B571B572B573B574B575B576B577B578B579 -B57AB57BB57CB57DB57EB57FB580B581B582B583B584B585B586B587B588B589 -B58AB58BB58CB58DB58EB58FB590B591B592B593B594B595B596B597B598B599 -B59AB59BB59CB59DB59EB59FB5A2B5A3B5A5B5A6B5A7B5A9B5ACB5ADB5AEB5AF -B5B2B5B6B5B7B5B8B5B9B5BAB5BEB5BFB5C1B5C2B5C3B5C5B5C6B5C7B5C8B5C9 -B5CAB5CBB5CEB5D2B5D3B5D4B5D5B5D6B5D7B5D9B5DAB5DBB5DCB5DDB5DEB5DF -B5E0B5E1B5E2B5E3B5E4B5E5B5E6B5E7B5E8B5E9B5EAB5EBB5EDB5EEB5EFB5F0 -B5F1B5F2B5F3B5F4B5F5B5F6B5F7B5F8B5F9B5FAB5FBB5FCB5FDB5FEB5FF0000 -8C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B600B601B602B603B604B605B606B607B608B609B60AB60BB60CB60DB60E -B60FB612B613B615B616B617B619B61AB61BB61CB61D00000000000000000000 -0000B61EB61FB620B621B622B623B624B626B627B628B629B62AB62BB62DB62E -B62FB630B631B632B633B635B636B637B638B639B63A00000000000000000000 -0000B63BB63CB63DB63EB63FB640B641B642B643B644B645B646B647B649B64A -B64BB64CB64DB64EB64FB650B651B652B653B654B655B656B657B658B659B65A -B65BB65CB65DB65EB65FB660B661B662B663B665B666B667B669B66AB66BB66C -B66DB66EB66FB670B671B672B673B674B675B676B677B678B679B67AB67BB67C -B67DB67EB67FB680B681B682B683B684B685B686B687B688B689B68AB68BB68C -B68DB68EB68FB690B691B692B693B694B695B696B697B698B699B69AB69BB69E -B69FB6A1B6A2B6A3B6A5B6A6B6A7B6A8B6A9B6AAB6ADB6AEB6AFB6B0B6B2B6B3 -B6B4B6B5B6B6B6B7B6B8B6B9B6BAB6BBB6BCB6BDB6BEB6BFB6C0B6C1B6C20000 -8D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B6C3B6C4B6C5B6C6B6C7B6C8B6C9B6CAB6CBB6CCB6CDB6CEB6CFB6D0B6D1 -B6D2B6D3B6D5B6D6B6D7B6D8B6D9B6DAB6DBB6DCB6DD00000000000000000000 -0000B6DEB6DFB6E0B6E1B6E2B6E3B6E4B6E5B6E6B6E7B6E8B6E9B6EAB6EBB6EC -B6EDB6EEB6EFB6F1B6F2B6F3B6F5B6F6B6F7B6F9B6FA00000000000000000000 -0000B6FBB6FCB6FDB6FEB6FFB702B703B704B706B707B708B709B70AB70BB70C -B70DB70EB70FB710B711B712B713B714B715B716B717B718B719B71AB71BB71C -B71DB71EB71FB720B721B722B723B724B725B726B727B72AB72BB72DB72EB731 -B732B733B734B735B736B737B73AB73CB73DB73EB73FB740B741B742B743B745 -B746B747B749B74AB74BB74DB74EB74FB750B751B752B753B756B757B758B759 -B75AB75BB75CB75DB75EB75FB761B762B763B765B766B767B769B76AB76BB76C -B76DB76EB76FB772B774B776B777B778B779B77AB77BB77EB77FB781B782B783 -B785B786B787B788B789B78AB78BB78EB793B794B795B79AB79BB79DB79E0000 -8E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B79FB7A1B7A2B7A3B7A4B7A5B7A6B7A7B7AAB7AEB7AFB7B0B7B1B7B2B7B3 -B7B6B7B7B7B9B7BAB7BBB7BCB7BDB7BEB7BFB7C0B7C100000000000000000000 -0000B7C2B7C3B7C4B7C5B7C6B7C8B7CAB7CBB7CCB7CDB7CEB7CFB7D0B7D1B7D2 -B7D3B7D4B7D5B7D6B7D7B7D8B7D9B7DAB7DBB7DCB7DD00000000000000000000 -0000B7DEB7DFB7E0B7E1B7E2B7E3B7E4B7E5B7E6B7E7B7E8B7E9B7EAB7EBB7EE -B7EFB7F1B7F2B7F3B7F5B7F6B7F7B7F8B7F9B7FAB7FBB7FEB802B803B804B805 -B806B80AB80BB80DB80EB80FB811B812B813B814B815B816B817B81AB81CB81E -B81FB820B821B822B823B826B827B829B82AB82BB82DB82EB82FB830B831B832 -B833B836B83AB83BB83CB83DB83EB83FB841B842B843B845B846B847B848B849 -B84AB84BB84CB84DB84EB84FB850B852B854B855B856B857B858B859B85AB85B -B85EB85FB861B862B863B865B866B867B868B869B86AB86BB86EB870B872B873 -B874B875B876B877B879B87AB87BB87DB87EB87FB880B881B882B883B8840000 -8F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B885B886B887B888B889B88AB88BB88CB88EB88FB890B891B892B893B894 -B895B896B897B898B899B89AB89BB89CB89DB89EB89F00000000000000000000 -0000B8A0B8A1B8A2B8A3B8A4B8A5B8A6B8A7B8A9B8AAB8ABB8ACB8ADB8AEB8AF -B8B1B8B2B8B3B8B5B8B6B8B7B8B9B8BAB8BBB8BCB8BD00000000000000000000 -0000B8BEB8BFB8C2B8C4B8C6B8C7B8C8B8C9B8CAB8CBB8CDB8CEB8CFB8D1B8D2 -B8D3B8D5B8D6B8D7B8D8B8D9B8DAB8DBB8DCB8DEB8E0B8E2B8E3B8E4B8E5B8E6 -B8E7B8EAB8EBB8EDB8EEB8EFB8F1B8F2B8F3B8F4B8F5B8F6B8F7B8FAB8FCB8FE -B8FFB900B901B902B903B905B906B907B908B909B90AB90BB90CB90DB90EB90F -B910B911B912B913B914B915B916B917B919B91AB91BB91CB91DB91EB91FB921 -B922B923B924B925B926B927B928B929B92AB92BB92CB92DB92EB92FB930B931 -B932B933B934B935B936B937B938B939B93AB93BB93EB93FB941B942B943B945 -B946B947B948B949B94AB94BB94DB94EB950B952B953B954B955B956B9570000 -90 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B95AB95BB95DB95EB95FB961B962B963B964B965B966B967B96AB96CB96E -B96FB970B971B972B973B976B977B979B97AB97BB97D00000000000000000000 -0000B97EB97FB980B981B982B983B986B988B98BB98CB98FB990B991B992B993 -B994B995B996B997B998B999B99AB99BB99CB99DB99E00000000000000000000 -0000B99FB9A0B9A1B9A2B9A3B9A4B9A5B9A6B9A7B9A8B9A9B9AAB9ABB9AEB9AF -B9B1B9B2B9B3B9B5B9B6B9B7B9B8B9B9B9BAB9BBB9BEB9C0B9C2B9C3B9C4B9C5 -B9C6B9C7B9CAB9CBB9CDB9D3B9D4B9D5B9D6B9D7B9DAB9DCB9DFB9E0B9E2B9E6 -B9E7B9E9B9EAB9EBB9EDB9EEB9EFB9F0B9F1B9F2B9F3B9F6B9FBB9FCB9FDB9FE -B9FFBA02BA03BA04BA05BA06BA07BA09BA0ABA0BBA0CBA0DBA0EBA0FBA10BA11 -BA12BA13BA14BA16BA17BA18BA19BA1ABA1BBA1CBA1DBA1EBA1FBA20BA21BA22 -BA23BA24BA25BA26BA27BA28BA29BA2ABA2BBA2CBA2DBA2EBA2FBA30BA31BA32 -BA33BA34BA35BA36BA37BA3ABA3BBA3DBA3EBA3FBA41BA43BA44BA45BA460000 -91 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BA47BA4ABA4CBA4FBA50BA51BA52BA56BA57BA59BA5ABA5BBA5DBA5EBA5F -BA60BA61BA62BA63BA66BA6ABA6BBA6CBA6DBA6EBA6F00000000000000000000 -0000BA72BA73BA75BA76BA77BA79BA7ABA7BBA7CBA7DBA7EBA7FBA80BA81BA82 -BA86BA88BA89BA8ABA8BBA8DBA8EBA8FBA90BA91BA9200000000000000000000 -0000BA93BA94BA95BA96BA97BA98BA99BA9ABA9BBA9CBA9DBA9EBA9FBAA0BAA1 -BAA2BAA3BAA4BAA5BAA6BAA7BAAABAADBAAEBAAFBAB1BAB3BAB4BAB5BAB6BAB7 -BABABABCBABEBABFBAC0BAC1BAC2BAC3BAC5BAC6BAC7BAC9BACABACBBACCBACD -BACEBACFBAD0BAD1BAD2BAD3BAD4BAD5BAD6BAD7BADABADBBADCBADDBADEBADF -BAE0BAE1BAE2BAE3BAE4BAE5BAE6BAE7BAE8BAE9BAEABAEBBAECBAEDBAEEBAEF -BAF0BAF1BAF2BAF3BAF4BAF5BAF6BAF7BAF8BAF9BAFABAFBBAFDBAFEBAFFBB01 -BB02BB03BB05BB06BB07BB08BB09BB0ABB0BBB0CBB0EBB10BB12BB13BB14BB15 -BB16BB17BB19BB1ABB1BBB1DBB1EBB1FBB21BB22BB23BB24BB25BB26BB270000 -92 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BB28BB2ABB2CBB2DBB2EBB2FBB30BB31BB32BB33BB37BB39BB3ABB3FBB40 -BB41BB42BB43BB46BB48BB4ABB4BBB4CBB4EBB51BB5200000000000000000000 -0000BB53BB55BB56BB57BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB62BB64BB65 -BB66BB67BB68BB69BB6ABB6BBB6DBB6EBB6FBB70BB7100000000000000000000 -0000BB72BB73BB74BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB7FBB80 -BB81BB82BB83BB84BB85BB86BB87BB89BB8ABB8BBB8DBB8EBB8FBB91BB92BB93 -BB94BB95BB96BB97BB98BB99BB9ABB9BBB9CBB9DBB9EBB9FBBA0BBA1BBA2BBA3 -BBA5BBA6BBA7BBA9BBAABBABBBADBBAEBBAFBBB0BBB1BBB2BBB3BBB5BBB6BBB8 -BBB9BBBABBBBBBBCBBBDBBBEBBBFBBC1BBC2BBC3BBC5BBC6BBC7BBC9BBCABBCB -BBCCBBCDBBCEBBCFBBD1BBD2BBD4BBD5BBD6BBD7BBD8BBD9BBDABBDBBBDCBBDD -BBDEBBDFBBE0BBE1BBE2BBE3BBE4BBE5BBE6BBE7BBE8BBE9BBEABBEBBBECBBED -BBEEBBEFBBF0BBF1BBF2BBF3BBF4BBF5BBF6BBF7BBFABBFBBBFDBBFEBC010000 -93 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BC03BC04BC05BC06BC07BC0ABC0EBC10BC12BC13BC19BC1ABC20BC21BC22 -BC23BC26BC28BC2ABC2BBC2CBC2EBC2FBC32BC33BC3500000000000000000000 -0000BC36BC37BC39BC3ABC3BBC3CBC3DBC3EBC3FBC42BC46BC47BC48BC4ABC4B -BC4EBC4FBC51BC52BC53BC54BC55BC56BC57BC58BC5900000000000000000000 -0000BC5ABC5BBC5CBC5EBC5FBC60BC61BC62BC63BC64BC65BC66BC67BC68BC69 -BC6ABC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78BC79 -BC7ABC7BBC7CBC7DBC7EBC7FBC80BC81BC82BC83BC86BC87BC89BC8ABC8DBC8F -BC90BC91BC92BC93BC96BC98BC9BBC9CBC9DBC9EBC9FBCA2BCA3BCA5BCA6BCA9 -BCAABCABBCACBCADBCAEBCAFBCB2BCB6BCB7BCB8BCB9BCBABCBBBCBEBCBFBCC1 -BCC2BCC3BCC5BCC6BCC7BCC8BCC9BCCABCCBBCCCBCCEBCD2BCD3BCD4BCD6BCD7 -BCD9BCDABCDBBCDDBCDEBCDFBCE0BCE1BCE2BCE3BCE4BCE5BCE6BCE7BCE8BCE9 -BCEABCEBBCECBCEDBCEEBCEFBCF0BCF1BCF2BCF3BCF7BCF9BCFABCFBBCFD0000 -94 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BCFEBCFFBD00BD01BD02BD03BD06BD08BD0ABD0BBD0CBD0DBD0EBD0FBD11 -BD12BD13BD15BD16BD17BD18BD19BD1ABD1BBD1CBD1D00000000000000000000 -0000BD1EBD1FBD20BD21BD22BD23BD25BD26BD27BD28BD29BD2ABD2BBD2DBD2E -BD2FBD30BD31BD32BD33BD34BD35BD36BD37BD38BD3900000000000000000000 -0000BD3ABD3BBD3CBD3DBD3EBD3FBD41BD42BD43BD44BD45BD46BD47BD4ABD4B -BD4DBD4EBD4FBD51BD52BD53BD54BD55BD56BD57BD5ABD5BBD5CBD5DBD5EBD5F -BD60BD61BD62BD63BD65BD66BD67BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71 -BD72BD73BD74BD75BD76BD77BD78BD79BD7ABD7BBD7CBD7DBD7EBD7FBD82BD83 -BD85BD86BD8BBD8CBD8DBD8EBD8FBD92BD94BD96BD97BD98BD9BBD9DBD9EBD9F -BDA0BDA1BDA2BDA3BDA5BDA6BDA7BDA8BDA9BDAABDABBDACBDADBDAEBDAFBDB1 -BDB2BDB3BDB4BDB5BDB6BDB7BDB9BDBABDBBBDBCBDBDBDBEBDBFBDC0BDC1BDC2 -BDC3BDC4BDC5BDC6BDC7BDC8BDC9BDCABDCBBDCCBDCDBDCEBDCFBDD0BDD10000 -95 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BDD2BDD3BDD6BDD7BDD9BDDABDDBBDDDBDDEBDDFBDE0BDE1BDE2BDE3BDE4 -BDE5BDE6BDE7BDE8BDEABDEBBDECBDEDBDEEBDEFBDF100000000000000000000 -0000BDF2BDF3BDF5BDF6BDF7BDF9BDFABDFBBDFCBDFDBDFEBDFFBE01BE02BE04 -BE06BE07BE08BE09BE0ABE0BBE0EBE0FBE11BE12BE1300000000000000000000 -0000BE15BE16BE17BE18BE19BE1ABE1BBE1EBE20BE21BE22BE23BE24BE25BE26 -BE27BE28BE29BE2ABE2BBE2CBE2DBE2EBE2FBE30BE31BE32BE33BE34BE35BE36 -BE37BE38BE39BE3ABE3BBE3CBE3DBE3EBE3FBE40BE41BE42BE43BE46BE47BE49 -BE4ABE4BBE4DBE4FBE50BE51BE52BE53BE56BE58BE5CBE5DBE5EBE5FBE62BE63 -BE65BE66BE67BE69BE6BBE6CBE6DBE6EBE6FBE72BE76BE77BE78BE79BE7ABE7E -BE7FBE81BE82BE83BE85BE86BE87BE88BE89BE8ABE8BBE8EBE92BE93BE94BE95 -BE96BE97BE9ABE9BBE9CBE9DBE9EBE9FBEA0BEA1BEA2BEA3BEA4BEA5BEA6BEA7 -BEA9BEAABEABBEACBEADBEAEBEAFBEB0BEB1BEB2BEB3BEB4BEB5BEB6BEB70000 -96 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BEB8BEB9BEBABEBBBEBCBEBDBEBEBEBFBEC0BEC1BEC2BEC3BEC4BEC5BEC6 -BEC7BEC8BEC9BECABECBBECCBECDBECEBECFBED2BED300000000000000000000 -0000BED5BED6BED9BEDABEDBBEDCBEDDBEDEBEDFBEE1BEE2BEE6BEE7BEE8BEE9 -BEEABEEBBEEDBEEEBEEFBEF0BEF1BEF2BEF3BEF4BEF500000000000000000000 -0000BEF6BEF7BEF8BEF9BEFABEFBBEFCBEFDBEFEBEFFBF00BF02BF03BF04BF05 -BF06BF07BF0ABF0BBF0CBF0DBF0EBF0FBF10BF11BF12BF13BF14BF15BF16BF17 -BF1ABF1EBF1FBF20BF21BF22BF23BF24BF25BF26BF27BF28BF29BF2ABF2BBF2C -BF2DBF2EBF2FBF30BF31BF32BF33BF34BF35BF36BF37BF38BF39BF3ABF3BBF3C -BF3DBF3EBF3FBF42BF43BF45BF46BF47BF49BF4ABF4BBF4CBF4DBF4EBF4FBF52 -BF53BF54BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63 -BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73 -BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF7FBF80BF81BF820000 -97 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BF83BF84BF85BF86BF87BF88BF89BF8ABF8BBF8CBF8DBF8EBF8FBF90BF91 -BF92BF93BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9D00000000000000000000 -0000BF9EBF9FBFA0BFA1BFA2BFA3BFA4BFA5BFA6BFA7BFA8BFA9BFAABFABBFAC -BFADBFAEBFAFBFB1BFB2BFB3BFB4BFB5BFB6BFB7BFB800000000000000000000 -0000BFB9BFBABFBBBFBCBFBDBFBEBFBFBFC0BFC1BFC2BFC3BFC4BFC6BFC7BFC8 -BFC9BFCABFCBBFCEBFCFBFD1BFD2BFD3BFD5BFD6BFD7BFD8BFD9BFDABFDBBFDD -BFDEBFE0BFE2BFE3BFE4BFE5BFE6BFE7BFE8BFE9BFEABFEBBFECBFEDBFEEBFEF -BFF0BFF1BFF2BFF3BFF4BFF5BFF6BFF7BFF8BFF9BFFABFFBBFFCBFFDBFFEBFFF -C000C001C002C003C004C005C006C007C008C009C00AC00BC00CC00DC00EC00F -C010C011C012C013C014C015C016C017C018C019C01AC01BC01CC01DC01EC01F -C020C021C022C023C024C025C026C027C028C029C02AC02BC02CC02DC02EC02F -C030C031C032C033C034C035C036C037C038C039C03AC03BC03DC03EC03F0000 -98 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04E -C04FC050C052C053C054C055C056C057C059C05AC05B00000000000000000000 -0000C05DC05EC05FC061C062C063C064C065C066C067C06AC06BC06CC06DC06E -C06FC070C071C072C073C074C075C076C077C078C07900000000000000000000 -0000C07AC07BC07CC07DC07EC07FC080C081C082C083C084C085C086C087C088 -C089C08AC08BC08CC08DC08EC08FC092C093C095C096C097C099C09AC09BC09C -C09DC09EC09FC0A2C0A4C0A6C0A7C0A8C0A9C0AAC0ABC0AEC0B1C0B2C0B7C0B8 -C0B9C0BAC0BBC0BEC0C2C0C3C0C4C0C6C0C7C0CAC0CBC0CDC0CEC0CFC0D1C0D2 -C0D3C0D4C0D5C0D6C0D7C0DAC0DEC0DFC0E0C0E1C0E2C0E3C0E6C0E7C0E9C0EA -C0EBC0EDC0EEC0EFC0F0C0F1C0F2C0F3C0F6C0F8C0FAC0FBC0FCC0FDC0FEC0FF -C101C102C103C105C106C107C109C10AC10BC10CC10DC10EC10FC111C112C113 -C114C116C117C118C119C11AC11BC121C122C125C128C129C12AC12BC12E0000 -99 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C132C133C134C135C137C13AC13BC13DC13EC13FC141C142C143C144C145 -C146C147C14AC14EC14FC150C151C152C153C156C15700000000000000000000 -0000C159C15AC15BC15DC15EC15FC160C161C162C163C166C16AC16BC16CC16D -C16EC16FC171C172C173C175C176C177C179C17AC17B00000000000000000000 -0000C17CC17DC17EC17FC180C181C182C183C184C186C187C188C189C18AC18B -C18FC191C192C193C195C197C198C199C19AC19BC19EC1A0C1A2C1A3C1A4C1A6 -C1A7C1AAC1ABC1ADC1AEC1AFC1B1C1B2C1B3C1B4C1B5C1B6C1B7C1B8C1B9C1BA -C1BBC1BCC1BEC1BFC1C0C1C1C1C2C1C3C1C5C1C6C1C7C1C9C1CAC1CBC1CDC1CE -C1CFC1D0C1D1C1D2C1D3C1D5C1D6C1D9C1DAC1DBC1DCC1DDC1DEC1DFC1E1C1E2 -C1E3C1E5C1E6C1E7C1E9C1EAC1EBC1ECC1EDC1EEC1EFC1F2C1F4C1F5C1F6C1F7 -C1F8C1F9C1FAC1FBC1FEC1FFC201C202C203C205C206C207C208C209C20AC20B -C20EC210C212C213C214C215C216C217C21AC21BC21DC21EC221C222C2230000 -9A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C224C225C226C227C22AC22CC22EC230C233C235C236C237C238C239C23A -C23BC23CC23DC23EC23FC240C241C242C243C244C24500000000000000000000 -0000C246C247C249C24AC24BC24CC24DC24EC24FC252C253C255C256C257C259 -C25AC25BC25CC25DC25EC25FC261C262C263C264C26600000000000000000000 -0000C267C268C269C26AC26BC26EC26FC271C272C273C275C276C277C278C279 -C27AC27BC27EC280C282C283C284C285C286C287C28AC28BC28CC28DC28EC28F -C291C292C293C294C295C296C297C299C29AC29CC29EC29FC2A0C2A1C2A2C2A3 -C2A6C2A7C2A9C2AAC2ABC2AEC2AFC2B0C2B1C2B2C2B3C2B6C2B8C2BAC2BBC2BC -C2BDC2BEC2BFC2C0C2C1C2C2C2C3C2C4C2C5C2C6C2C7C2C8C2C9C2CAC2CBC2CC -C2CDC2CEC2CFC2D0C2D1C2D2C2D3C2D4C2D5C2D6C2D7C2D8C2D9C2DAC2DBC2DE -C2DFC2E1C2E2C2E5C2E6C2E7C2E8C2E9C2EAC2EEC2F0C2F2C2F3C2F4C2F5C2F7 -C2FAC2FDC2FEC2FFC301C302C303C304C305C306C307C30AC30BC30EC30F0000 -9B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C310C311C312C316C317C319C31AC31BC31DC31EC31FC320C321C322C323 -C326C327C32AC32BC32CC32DC32EC32FC330C331C33200000000000000000000 -0000C333C334C335C336C337C338C339C33AC33BC33CC33DC33EC33FC340C341 -C342C343C344C346C347C348C349C34AC34BC34CC34D00000000000000000000 -0000C34EC34FC350C351C352C353C354C355C356C357C358C359C35AC35BC35C -C35DC35EC35FC360C361C362C363C364C365C366C367C36AC36BC36DC36EC36F -C371C373C374C375C376C377C37AC37BC37EC37FC380C381C382C383C385C386 -C387C389C38AC38BC38DC38EC38FC390C391C392C393C394C395C396C397C398 -C399C39AC39BC39CC39DC39EC39FC3A0C3A1C3A2C3A3C3A4C3A5C3A6C3A7C3A8 -C3A9C3AAC3ABC3ACC3ADC3AEC3AFC3B0C3B1C3B2C3B3C3B4C3B5C3B6C3B7C3B8 -C3B9C3BAC3BBC3BCC3BDC3BEC3BFC3C1C3C2C3C3C3C4C3C5C3C6C3C7C3C8C3C9 -C3CAC3CBC3CCC3CDC3CEC3CFC3D0C3D1C3D2C3D3C3D4C3D5C3D6C3D7C3DA0000 -9C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C3DBC3DDC3DEC3E1C3E3C3E4C3E5C3E6C3E7C3EAC3EBC3ECC3EEC3EFC3F0 -C3F1C3F2C3F3C3F6C3F7C3F9C3FAC3FBC3FCC3FDC3FE00000000000000000000 -0000C3FFC400C401C402C403C404C405C406C407C409C40AC40BC40CC40DC40E -C40FC411C412C413C414C415C416C417C418C419C41A00000000000000000000 -0000C41BC41CC41DC41EC41FC420C421C422C423C425C426C427C428C429C42A -C42BC42DC42EC42FC431C432C433C435C436C437C438C439C43AC43BC43EC43F -C440C441C442C443C444C445C446C447C449C44AC44BC44CC44DC44EC44FC450 -C451C452C453C454C455C456C457C458C459C45AC45BC45CC45DC45EC45FC460 -C461C462C463C466C467C469C46AC46BC46DC46EC46FC470C471C472C473C476 -C477C478C47AC47BC47CC47DC47EC47FC481C482C483C484C485C486C487C488 -C489C48AC48BC48CC48DC48EC48FC490C491C492C493C495C496C497C498C499 -C49AC49BC49DC49EC49FC4A0C4A1C4A2C4A3C4A4C4A5C4A6C4A7C4A8C4A90000 -9D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C4AAC4ABC4ACC4ADC4AEC4AFC4B0C4B1C4B2C4B3C4B4C4B5C4B6C4B7C4B9 -C4BAC4BBC4BDC4BEC4BFC4C0C4C1C4C2C4C3C4C4C4C500000000000000000000 -0000C4C6C4C7C4C8C4C9C4CAC4CBC4CCC4CDC4CEC4CFC4D0C4D1C4D2C4D3C4D4 -C4D5C4D6C4D7C4D8C4D9C4DAC4DBC4DCC4DDC4DEC4DF00000000000000000000 -0000C4E0C4E1C4E2C4E3C4E4C4E5C4E6C4E7C4E8C4EAC4EBC4ECC4EDC4EEC4EF -C4F2C4F3C4F5C4F6C4F7C4F9C4FBC4FCC4FDC4FEC502C503C504C505C506C507 -C508C509C50AC50BC50DC50EC50FC511C512C513C515C516C517C518C519C51A -C51BC51DC51EC51FC520C521C522C523C524C525C526C527C52AC52BC52DC52E -C52FC531C532C533C534C535C536C537C53AC53CC53EC53FC540C541C542C543 -C546C547C54BC54FC550C551C552C556C55AC55BC55CC55FC562C563C565C566 -C567C569C56AC56BC56CC56DC56EC56FC572C576C577C578C579C57AC57BC57E -C57FC581C582C583C585C586C588C589C58AC58BC58EC590C592C593C5940000 -9E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C596C599C59AC59BC59DC59EC59FC5A1C5A2C5A3C5A4C5A5C5A6C5A7C5A8 -C5AAC5ABC5ACC5ADC5AEC5AFC5B0C5B1C5B2C5B3C5B600000000000000000000 -0000C5B7C5BAC5BFC5C0C5C1C5C2C5C3C5CBC5CDC5CFC5D2C5D3C5D5C5D6C5D7 -C5D9C5DAC5DBC5DCC5DDC5DEC5DFC5E2C5E4C5E6C5E700000000000000000000 -0000C5E8C5E9C5EAC5EBC5EFC5F1C5F2C5F3C5F5C5F8C5F9C5FAC5FBC602C603 -C604C609C60AC60BC60DC60EC60FC611C612C613C614C615C616C617C61AC61D -C61EC61FC620C621C622C623C626C627C629C62AC62BC62FC631C632C636C638 -C63AC63CC63DC63EC63FC642C643C645C646C647C649C64AC64BC64CC64DC64E -C64FC652C656C657C658C659C65AC65BC65EC65FC661C662C663C664C665C666 -C667C668C669C66AC66BC66DC66EC670C672C673C674C675C676C677C67AC67B -C67DC67EC67FC681C682C683C684C685C686C687C68AC68CC68EC68FC690C691 -C692C693C696C697C699C69AC69BC69DC69EC69FC6A0C6A1C6A2C6A3C6A60000 -9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C6A8C6AAC6ABC6ACC6ADC6AEC6AFC6B2C6B3C6B5C6B6C6B7C6BBC6BCC6BD -C6BEC6BFC6C2C6C4C6C6C6C7C6C8C6C9C6CAC6CBC6CE00000000000000000000 -0000C6CFC6D1C6D2C6D3C6D5C6D6C6D7C6D8C6D9C6DAC6DBC6DEC6DFC6E2C6E3 -C6E4C6E5C6E6C6E7C6EAC6EBC6EDC6EEC6EFC6F1C6F200000000000000000000 -0000C6F3C6F4C6F5C6F6C6F7C6FAC6FBC6FCC6FEC6FFC700C701C702C703C706 -C707C709C70AC70BC70DC70EC70FC710C711C712C713C716C718C71AC71BC71C -C71DC71EC71FC722C723C725C726C727C729C72AC72BC72CC72DC72EC72FC732 -C734C736C738C739C73AC73BC73EC73FC741C742C743C745C746C747C748C749 -C74BC74EC750C759C75AC75BC75DC75EC75FC761C762C763C764C765C766C767 -C769C76AC76CC76DC76EC76FC770C771C772C773C776C777C779C77AC77BC77F -C780C781C782C786C78BC78CC78DC78FC792C793C795C799C79BC79CC79DC79E -C79FC7A2C7A7C7A8C7A9C7AAC7ABC7AEC7AFC7B1C7B2C7B3C7B5C7B6C7B70000 -A0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C7B8C7B9C7BAC7BBC7BEC7C2C7C3C7C4C7C5C7C6C7C7C7CAC7CBC7CDC7CF -C7D1C7D2C7D3C7D4C7D5C7D6C7D7C7D9C7DAC7DBC7DC00000000000000000000 -0000C7DEC7DFC7E0C7E1C7E2C7E3C7E5C7E6C7E7C7E9C7EAC7EBC7EDC7EEC7EF -C7F0C7F1C7F2C7F3C7F4C7F5C7F6C7F7C7F8C7F9C7FA00000000000000000000 -0000C7FBC7FCC7FDC7FEC7FFC802C803C805C806C807C809C80BC80CC80DC80E -C80FC812C814C817C818C819C81AC81BC81EC81FC821C822C823C825C826C827 -C828C829C82AC82BC82EC830C832C833C834C835C836C837C839C83AC83BC83D -C83EC83FC841C842C843C844C845C846C847C84AC84BC84EC84FC850C851C852 -C853C855C856C857C858C859C85AC85BC85CC85DC85EC85FC860C861C862C863 -C864C865C866C867C868C869C86AC86BC86CC86DC86EC86FC872C873C875C876 -C877C879C87BC87CC87DC87EC87FC882C884C888C889C88AC88EC88FC890C891 -C892C893C895C896C897C898C899C89AC89BC89CC89EC8A0C8A2C8A3C8A40000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C8A5C8A6C8A7C8A9C8AAC8ABC8ACC8ADC8AEC8AFC8B0C8B1C8B2C8B3C8B4 -C8B5C8B6C8B7C8B8C8B9C8BAC8BBC8BEC8BFC8C0C8C100000000000000000000 -0000C8C2C8C3C8C5C8C6C8C7C8C9C8CAC8CBC8CDC8CEC8CFC8D0C8D1C8D2C8D3 -C8D6C8D8C8DAC8DBC8DCC8DDC8DEC8DFC8E2C8E3C8E500000000000000000000 -0000C8E6C8E7C8E8C8E9C8EAC8EBC8ECC8EDC8EEC8EFC8F0C8F1C8F2C8F3C8F4 -C8F6C8F7C8F8C8F9C8FAC8FBC8FEC8FFC901C902C903C907C908C909C90AC90B -C90E30003001300200B72025202600A8300300AD20152225FF3C223C20182019 -201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 -00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 -222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 -25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D -221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C910C912C913C914C915C916C917C919C91AC91BC91CC91DC91EC91FC920 -C921C922C923C924C925C926C927C928C929C92AC92B00000000000000000000 -0000C92DC92EC92FC930C931C932C933C935C936C937C938C939C93AC93BC93C -C93DC93EC93FC940C941C942C943C944C945C946C94700000000000000000000 -0000C948C949C94AC94BC94CC94DC94EC94FC952C953C955C956C957C959C95A -C95BC95CC95DC95EC95FC962C964C965C966C967C968C969C96AC96BC96DC96E -C96F21D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF -02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 -2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E -261C261E00B62020202121952197219921962198266D2669266A266C327F321C -211633C7212233C233D8212120AC00AE00000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C971C972C973C975C976C977C978C979C97AC97BC97DC97EC97FC980C981 -C982C983C984C985C986C987C98AC98BC98DC98EC98F00000000000000000000 -0000C991C992C993C994C995C996C997C99AC99CC99EC99FC9A0C9A1C9A2C9A3 -C9A4C9A5C9A6C9A7C9A8C9A9C9AAC9ABC9ACC9ADC9AE00000000000000000000 -0000C9AFC9B0C9B1C9B2C9B3C9B4C9B5C9B6C9B7C9B8C9B9C9BAC9BBC9BCC9BD -C9BEC9BFC9C2C9C3C9C5C9C6C9C9C9CBC9CCC9CDC9CEC9CFC9D2C9D4C9D7C9D8 -C9DBFF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C9DEC9DFC9E1C9E3C9E5C9E6C9E8C9E9C9EAC9EBC9EEC9F2C9F3C9F4C9F5 -C9F6C9F7C9FAC9FBC9FDC9FEC9FFCA01CA02CA03CA0400000000000000000000 -0000CA05CA06CA07CA0ACA0ECA0FCA10CA11CA12CA13CA15CA16CA17CA19CA1A -CA1BCA1CCA1DCA1ECA1FCA20CA21CA22CA23CA24CA2500000000000000000000 -0000CA26CA27CA28CA2ACA2BCA2CCA2DCA2ECA2FCA30CA31CA32CA33CA34CA35 -CA36CA37CA38CA39CA3ACA3BCA3CCA3DCA3ECA3FCA40CA41CA42CA43CA44CA45 -CA46313131323133313431353136313731383139313A313B313C313D313E313F -3140314131423143314431453146314731483149314A314B314C314D314E314F -3150315131523153315431553156315731583159315A315B315C315D315E315F -3160316131623163316431653166316731683169316A316B316C316D316E316F -3170317131723173317431753176317731783179317A317B317C317D317E317F -3180318131823183318431853186318731883189318A318B318C318D318E0000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CA47CA48CA49CA4ACA4BCA4ECA4FCA51CA52CA53CA55CA56CA57CA58CA59 -CA5ACA5BCA5ECA62CA63CA64CA65CA66CA67CA69CA6A00000000000000000000 -0000CA6BCA6CCA6DCA6ECA6FCA70CA71CA72CA73CA74CA75CA76CA77CA78CA79 -CA7ACA7BCA7CCA7ECA7FCA80CA81CA82CA83CA85CA8600000000000000000000 -0000CA87CA88CA89CA8ACA8BCA8CCA8DCA8ECA8FCA90CA91CA92CA93CA94CA95 -CA96CA97CA99CA9ACA9BCA9CCA9DCA9ECA9FCAA0CAA1CAA2CAA3CAA4CAA5CAA6 -CAA7217021712172217321742175217621772178217900000000000000000000 -2160216121622163216421652166216721682169000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CAA8CAA9CAAACAABCAACCAADCAAECAAFCAB0CAB1CAB2CAB3CAB4CAB5CAB6 -CAB7CAB8CAB9CABACABBCABECABFCAC1CAC2CAC3CAC500000000000000000000 -0000CAC6CAC7CAC8CAC9CACACACBCACECAD0CAD2CAD4CAD5CAD6CAD7CADACADB -CADCCADDCADECADFCAE1CAE2CAE3CAE4CAE5CAE6CAE700000000000000000000 -0000CAE8CAE9CAEACAEBCAEDCAEECAEFCAF0CAF1CAF2CAF3CAF5CAF6CAF7CAF8 -CAF9CAFACAFBCAFCCAFDCAFECAFFCB00CB01CB02CB03CB04CB05CB06CB07CB09 -CB0A25002502250C251025182514251C252C25242534253C25012503250F2513 -251B251725232533252B253B254B2520252F25282537253F251D253025252538 -254225122511251A251925162515250E250D251E251F25212522252625272529 -252A252D252E25312532253525362539253A253D253E25402541254325442545 -2546254725482549254A00000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CB0BCB0CCB0DCB0ECB0FCB11CB12CB13CB15CB16CB17CB19CB1ACB1BCB1C -CB1DCB1ECB1FCB22CB23CB24CB25CB26CB27CB28CB2900000000000000000000 -0000CB2ACB2BCB2CCB2DCB2ECB2FCB30CB31CB32CB33CB34CB35CB36CB37CB38 -CB39CB3ACB3BCB3CCB3DCB3ECB3FCB40CB42CB43CB4400000000000000000000 -0000CB45CB46CB47CB4ACB4BCB4DCB4ECB4FCB51CB52CB53CB54CB55CB56CB57 -CB5ACB5BCB5CCB5ECB5FCB60CB61CB62CB63CB65CB66CB67CB68CB69CB6ACB6B -CB6C3395339633972113339833C433A333A433A533A63399339A339B339C339D -339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 -33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB -33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 -33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 -0000000000000000000000000000000000000000000000000000000000000000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CB6DCB6ECB6FCB70CB71CB72CB73CB74CB75CB76CB77CB7ACB7BCB7CCB7D -CB7ECB7FCB80CB81CB82CB83CB84CB85CB86CB87CB8800000000000000000000 -0000CB89CB8ACB8BCB8CCB8DCB8ECB8FCB90CB91CB92CB93CB94CB95CB96CB97 -CB98CB99CB9ACB9BCB9DCB9ECB9FCBA0CBA1CBA2CBA300000000000000000000 -0000CBA4CBA5CBA6CBA7CBA8CBA9CBAACBABCBACCBADCBAECBAFCBB0CBB1CBB2 -CBB3CBB4CBB5CBB6CBB7CBB9CBBACBBBCBBCCBBDCBBECBBFCBC0CBC1CBC2CBC3 -CBC400C600D000AA0126000001320000013F014100D8015200BA00DE0166014A -00003260326132623263326432653266326732683269326A326B326C326D326E -326F3270327132723273327432753276327732783279327A327B24D024D124D2 -24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 -24E324E424E524E624E724E824E9246024612462246324642465246624672468 -2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 -A9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CBC5CBC6CBC7CBC8CBC9CBCACBCBCBCCCBCDCBCECBCFCBD0CBD1CBD2CBD3 -CBD5CBD6CBD7CBD8CBD9CBDACBDBCBDCCBDDCBDECBDF00000000000000000000 -0000CBE0CBE1CBE2CBE3CBE5CBE6CBE8CBEACBEBCBECCBEDCBEECBEFCBF0CBF1 -CBF2CBF3CBF4CBF5CBF6CBF7CBF8CBF9CBFACBFBCBFC00000000000000000000 -0000CBFDCBFECBFFCC00CC01CC02CC03CC04CC05CC06CC07CC08CC09CC0ACC0B -CC0ECC0FCC11CC12CC13CC15CC16CC17CC18CC19CC1ACC1BCC1ECC1FCC20CC23 -CC2400E6011100F001270131013301380140014200F8015300DF00FE0167014B -01493200320132023203320432053206320732083209320A320B320C320D320E -320F3210321132123213321432153216321732183219321A321B249C249D249E -249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE -24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C -247D247E247F24802481248200B900B200B32074207F20812082208320840000 -AA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CC25CC26CC2ACC2BCC2DCC2FCC31CC32CC33CC34CC35CC36CC37CC3ACC3F -CC40CC41CC42CC43CC46CC47CC49CC4ACC4BCC4DCC4E00000000000000000000 -0000CC4FCC50CC51CC52CC53CC56CC5ACC5BCC5CCC5DCC5ECC5FCC61CC62CC63 -CC65CC67CC69CC6ACC6BCC6CCC6DCC6ECC6FCC71CC7200000000000000000000 -0000CC73CC74CC76CC77CC78CC79CC7ACC7BCC7CCC7DCC7ECC7FCC80CC81CC82 -CC83CC84CC85CC86CC87CC88CC89CC8ACC8BCC8CCC8DCC8ECC8FCC90CC91CC92 -CC93304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -AB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CC94CC95CC96CC97CC9ACC9BCC9DCC9ECC9FCCA1CCA2CCA3CCA4CCA5CCA6 -CCA7CCAACCAECCAFCCB0CCB1CCB2CCB3CCB6CCB7CCB900000000000000000000 -0000CCBACCBBCCBDCCBECCBFCCC0CCC1CCC2CCC3CCC6CCC8CCCACCCBCCCCCCCD -CCCECCCFCCD1CCD2CCD3CCD5CCD6CCD7CCD8CCD9CCDA00000000000000000000 -0000CCDBCCDCCCDDCCDECCDFCCE0CCE1CCE2CCE3CCE5CCE6CCE7CCE8CCE9CCEA -CCEBCCEDCCEECCEFCCF1CCF2CCF3CCF4CCF5CCF6CCF7CCF8CCF9CCFACCFBCCFC -CCFD30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -AC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CCFECCFFCD00CD02CD03CD04CD05CD06CD07CD0ACD0BCD0DCD0ECD0FCD11 -CD12CD13CD14CD15CD16CD17CD1ACD1CCD1ECD1FCD2000000000000000000000 -0000CD21CD22CD23CD25CD26CD27CD29CD2ACD2BCD2DCD2ECD2FCD30CD31CD32 -CD33CD34CD35CD36CD37CD38CD3ACD3BCD3CCD3DCD3E00000000000000000000 -0000CD3FCD40CD41CD42CD43CD44CD45CD46CD47CD48CD49CD4ACD4BCD4CCD4D -CD4ECD4FCD50CD51CD52CD53CD54CD55CD56CD57CD58CD59CD5ACD5BCD5DCD5E -CD5F04100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -AD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CD61CD62CD63CD65CD66CD67CD68CD69CD6ACD6BCD6ECD70CD72CD73CD74 -CD75CD76CD77CD79CD7ACD7BCD7CCD7DCD7ECD7FCD8000000000000000000000 -0000CD81CD82CD83CD84CD85CD86CD87CD89CD8ACD8BCD8CCD8DCD8ECD8FCD90 -CD91CD92CD93CD96CD97CD99CD9ACD9BCD9DCD9ECD9F00000000000000000000 -0000CDA0CDA1CDA2CDA3CDA6CDA8CDAACDABCDACCDADCDAECDAFCDB1CDB2CDB3 -CDB4CDB5CDB6CDB7CDB8CDB9CDBACDBBCDBCCDBDCDBECDBFCDC0CDC1CDC2CDC3 -CDC5000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -AE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CDC6CDC7CDC8CDC9CDCACDCBCDCDCDCECDCFCDD1CDD2CDD3CDD4CDD5CDD6 -CDD7CDD8CDD9CDDACDDBCDDCCDDDCDDECDDFCDE0CDE100000000000000000000 -0000CDE2CDE3CDE4CDE5CDE6CDE7CDE9CDEACDEBCDEDCDEECDEFCDF1CDF2CDF3 -CDF4CDF5CDF6CDF7CDFACDFCCDFECDFFCE00CE01CE0200000000000000000000 -0000CE03CE05CE06CE07CE09CE0ACE0BCE0DCE0ECE0FCE10CE11CE12CE13CE15 -CE16CE17CE18CE1ACE1BCE1CCE1DCE1ECE1FCE22CE23CE25CE26CE27CE29CE2A -CE2B000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -AF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CE2CCE2DCE2ECE2FCE32CE34CE36CE37CE38CE39CE3ACE3BCE3CCE3DCE3E -CE3FCE40CE41CE42CE43CE44CE45CE46CE47CE48CE4900000000000000000000 -0000CE4ACE4BCE4CCE4DCE4ECE4FCE50CE51CE52CE53CE54CE55CE56CE57CE5A -CE5BCE5DCE5ECE62CE63CE64CE65CE66CE67CE6ACE6C00000000000000000000 -0000CE6ECE6FCE70CE71CE72CE73CE76CE77CE79CE7ACE7BCE7DCE7ECE7FCE80 -CE81CE82CE83CE86CE88CE8ACE8BCE8CCE8DCE8ECE8FCE92CE93CE95CE96CE97 -CE99000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CE9ACE9BCE9CCE9DCE9ECE9FCEA2CEA6CEA7CEA8CEA9CEAACEABCEAECEAF -CEB0CEB1CEB2CEB3CEB4CEB5CEB6CEB7CEB8CEB9CEBA00000000000000000000 -0000CEBBCEBCCEBDCEBECEBFCEC0CEC2CEC3CEC4CEC5CEC6CEC7CEC8CEC9CECA -CECBCECCCECDCECECECFCED0CED1CED2CED3CED4CED500000000000000000000 -0000CED6CED7CED8CED9CEDACEDBCEDCCEDDCEDECEDFCEE0CEE1CEE2CEE3CEE6 -CEE7CEE9CEEACEEDCEEECEEFCEF0CEF1CEF2CEF3CEF6CEFACEFBCEFCCEFDCEFE -CEFFAC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 -AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 -AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 -AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC -ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 -ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CF02CF03CF05CF06CF07CF09CF0ACF0BCF0CCF0DCF0ECF0FCF12CF14CF16 -CF17CF18CF19CF1ACF1BCF1DCF1ECF1FCF21CF22CF2300000000000000000000 -0000CF25CF26CF27CF28CF29CF2ACF2BCF2ECF32CF33CF34CF35CF36CF37CF39 -CF3ACF3BCF3CCF3DCF3ECF3FCF40CF41CF42CF43CF4400000000000000000000 -0000CF45CF46CF47CF48CF49CF4ACF4BCF4CCF4DCF4ECF4FCF50CF51CF52CF53 -CF56CF57CF59CF5ACF5BCF5DCF5ECF5FCF60CF61CF62CF63CF66CF68CF6ACF6B -CF6CAD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 -AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B -AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 -ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B -AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D -AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CF6DCF6ECF6FCF72CF73CF75CF76CF77CF79CF7ACF7BCF7CCF7DCF7ECF7F -CF81CF82CF83CF84CF86CF87CF88CF89CF8ACF8BCF8D00000000000000000000 -0000CF8ECF8FCF90CF91CF92CF93CF94CF95CF96CF97CF98CF99CF9ACF9BCF9C -CF9DCF9ECF9FCFA0CFA2CFA3CFA4CFA5CFA6CFA7CFA900000000000000000000 -0000CFAACFABCFACCFADCFAECFAFCFB1CFB2CFB3CFB4CFB5CFB6CFB7CFB8CFB9 -CFBACFBBCFBCCFBDCFBECFBFCFC0CFC1CFC2CFC3CFC5CFC6CFC7CFC8CFC9CFCA -CFCBAE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF -AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C -AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 -AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 -AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 -B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CFCCCFCDCFCECFCFCFD0CFD1CFD2CFD3CFD4CFD5CFD6CFD7CFD8CFD9CFDA -CFDBCFDCCFDDCFDECFDFCFE2CFE3CFE5CFE6CFE7CFE900000000000000000000 -0000CFEACFEBCFECCFEDCFEECFEFCFF2CFF4CFF6CFF7CFF8CFF9CFFACFFBCFFD -CFFECFFFD001D002D003D005D006D007D008D009D00A00000000000000000000 -0000D00BD00CD00DD00ED00FD010D012D013D014D015D016D017D019D01AD01B -D01CD01DD01ED01FD020D021D022D023D024D025D026D027D028D029D02AD02B -D02CB05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 -B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 -B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 -B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 -B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 -B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D02ED02FD030D031D032D033D036D037D039D03AD03BD03DD03ED03FD040 -D041D042D043D046D048D04AD04BD04CD04DD04ED04F00000000000000000000 -0000D051D052D053D055D056D057D059D05AD05BD05CD05DD05ED05FD061D062 -D063D064D065D066D067D068D069D06AD06BD06ED06F00000000000000000000 -0000D071D072D073D075D076D077D078D079D07AD07BD07ED07FD080D082D083 -D084D085D086D087D088D089D08AD08BD08CD08DD08ED08FD090D091D092D093 -D094B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 -B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 -B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 -B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED -B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 -B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D095D096D097D098D099D09AD09BD09CD09DD09ED09FD0A0D0A1D0A2D0A3 -D0A6D0A7D0A9D0AAD0ABD0ADD0AED0AFD0B0D0B1D0B200000000000000000000 -0000D0B3D0B6D0B8D0BAD0BBD0BCD0BDD0BED0BFD0C2D0C3D0C5D0C6D0C7D0CA -D0CBD0CCD0CDD0CED0CFD0D2D0D6D0D7D0D8D0D9D0DA00000000000000000000 -0000D0DBD0DED0DFD0E1D0E2D0E3D0E5D0E6D0E7D0E8D0E9D0EAD0EBD0EED0F2 -D0F3D0F4D0F5D0F6D0F7D0F9D0FAD0FBD0FCD0FDD0FED0FFD100D101D102D103 -D104B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 -B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 -B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 -B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 -B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 -B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D105D106D107D108D109D10AD10BD10CD10ED10FD110D111D112D113D114 -D115D116D117D118D119D11AD11BD11CD11DD11ED11F00000000000000000000 -0000D120D121D122D123D124D125D126D127D128D129D12AD12BD12CD12DD12E -D12FD132D133D135D136D137D139D13BD13CD13DD13E00000000000000000000 -0000D13FD142D146D147D148D149D14AD14BD14ED14FD151D152D153D155D156 -D157D158D159D15AD15BD15ED160D162D163D164D165D166D167D169D16AD16B -D16DB540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 -B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 -B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 -B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 -B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 -B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D16ED16FD170D171D172D173D174D175D176D177D178D179D17AD17BD17D -D17ED17FD180D181D182D183D185D186D187D189D18A00000000000000000000 -0000D18BD18CD18DD18ED18FD190D191D192D193D194D195D196D197D198D199 -D19AD19BD19CD19DD19ED19FD1A2D1A3D1A5D1A6D1A700000000000000000000 -0000D1A9D1AAD1ABD1ACD1ADD1AED1AFD1B2D1B4D1B6D1B7D1B8D1B9D1BBD1BD -D1BED1BFD1C1D1C2D1C3D1C4D1C5D1C6D1C7D1C8D1C9D1CAD1CBD1CCD1CDD1CE -D1CFB798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC -B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B -B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D -B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 -B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 -B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D1D0D1D1D1D2D1D3D1D4D1D5D1D6D1D7D1D9D1DAD1DBD1DCD1DDD1DED1DF -D1E0D1E1D1E2D1E3D1E4D1E5D1E6D1E7D1E8D1E9D1EA00000000000000000000 -0000D1EBD1ECD1EDD1EED1EFD1F0D1F1D1F2D1F3D1F5D1F6D1F7D1F9D1FAD1FB -D1FCD1FDD1FED1FFD200D201D202D203D204D205D20600000000000000000000 -0000D208D20AD20BD20CD20DD20ED20FD211D212D213D214D215D216D217D218 -D219D21AD21BD21CD21DD21ED21FD220D221D222D223D224D225D226D227D228 -D229B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD -B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 -B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 -BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 -BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C -BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D22AD22BD22ED22FD231D232D233D235D236D237D238D239D23AD23BD23E -D240D242D243D244D245D246D247D249D24AD24BD24C00000000000000000000 -0000D24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25B -D25DD25ED25FD260D261D262D263D265D266D267D26800000000000000000000 -0000D269D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277 -D278D279D27AD27BD27CD27DD27ED27FD282D283D285D286D287D289D28AD28B -D28CBB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B -BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 -BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF -BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C -BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 -BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D28DD28ED28FD292D293D294D296D297D298D299D29AD29BD29DD29ED29F -D2A1D2A2D2A3D2A5D2A6D2A7D2A8D2A9D2AAD2ABD2AD00000000000000000000 -0000D2AED2AFD2B0D2B2D2B3D2B4D2B5D2B6D2B7D2BAD2BBD2BDD2BED2C1D2C3 -D2C4D2C5D2C6D2C7D2CAD2CCD2CDD2CED2CFD2D0D2D100000000000000000000 -0000D2D2D2D3D2D5D2D6D2D7D2D9D2DAD2DBD2DDD2DED2DFD2E0D2E1D2E2D2E3 -D2E6D2E7D2E8D2E9D2EAD2EBD2ECD2EDD2EED2EFD2F2D2F3D2F5D2F6D2F7D2F9 -D2FABC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 -BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 -BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 -BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 -BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D -BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D2FBD2FCD2FDD2FED2FFD302D304D306D307D308D309D30AD30BD30FD311 -D312D313D315D317D318D319D31AD31BD31ED322D32300000000000000000000 -0000D324D326D327D32AD32BD32DD32ED32FD331D332D333D334D335D336D337 -D33AD33ED33FD340D341D342D343D346D347D348D34900000000000000000000 -0000D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358 -D359D35AD35BD35CD35DD35ED35FD360D361D362D363D364D365D366D367D368 -D369BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F -BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 -BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 -BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 -C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC -C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D36AD36BD36CD36DD36ED36FD370D371D372D373D374D375D376D377D378 -D379D37AD37BD37ED37FD381D382D383D385D386D38700000000000000000000 -0000D388D389D38AD38BD38ED392D393D394D395D396D397D39AD39BD39DD39E -D39FD3A1D3A2D3A3D3A4D3A5D3A6D3A7D3AAD3ACD3AE00000000000000000000 -0000D3AFD3B0D3B1D3B2D3B3D3B5D3B6D3B7D3B9D3BAD3BBD3BDD3BED3BFD3C0 -D3C1D3C2D3C3D3C6D3C7D3CAD3CBD3CCD3CDD3CED3CFD3D1D3D2D3D3D3D4D3D5 -D3D6C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E -C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 -C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 -C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC -C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD -C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D3D7D3D9D3DAD3DBD3DCD3DDD3DED3DFD3E0D3E2D3E4D3E5D3E6D3E7D3E8 -D3E9D3EAD3EBD3EED3EFD3F1D3F2D3F3D3F5D3F6D3F700000000000000000000 -0000D3F8D3F9D3FAD3FBD3FED400D402D403D404D405D406D407D409D40AD40B -D40CD40DD40ED40FD410D411D412D413D414D415D41600000000000000000000 -0000D417D418D419D41AD41BD41CD41ED41FD420D421D422D423D424D425D426 -D427D428D429D42AD42BD42CD42DD42ED42FD430D431D432D433D434D435D436 -D437C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 -C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 -C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 -C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 -C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 -C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D438D439D43AD43BD43CD43DD43ED43FD441D442D443D445D446D447D448 -D449D44AD44BD44CD44DD44ED44FD450D451D452D45300000000000000000000 -0000D454D455D456D457D458D459D45AD45BD45DD45ED45FD461D462D463D465 -D466D467D468D469D46AD46BD46CD46ED470D471D47200000000000000000000 -0000D473D474D475D476D477D47AD47BD47DD47ED481D483D484D485D486D487 -D48AD48CD48ED48FD490D491D492D493D495D496D497D498D499D49AD49BD49C -D49DC434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 -C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 -C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 -C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C -C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 -C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D49ED49FD4A0D4A1D4A2D4A3D4A4D4A5D4A6D4A7D4A8D4AAD4ABD4ACD4AD -D4AED4AFD4B0D4B1D4B2D4B3D4B4D4B5D4B6D4B7D4B800000000000000000000 -0000D4B9D4BAD4BBD4BCD4BDD4BED4BFD4C0D4C1D4C2D4C3D4C4D4C5D4C6D4C7 -D4C8D4C9D4CAD4CBD4CDD4CED4CFD4D1D4D2D4D3D4D500000000000000000000 -0000D4D6D4D7D4D8D4D9D4DAD4DBD4DDD4DED4E0D4E1D4E2D4E3D4E4D4E5D4E6 -D4E7D4E9D4EAD4EBD4EDD4EED4EFD4F1D4F2D4F3D4F4D4F5D4F6D4F7D4F9D4FA -D4FCC5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 -C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C -C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 -C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 -C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 -C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D4FED4FFD500D501D502D503D505D506D507D509D50AD50BD50DD50ED50F -D510D511D512D513D516D518D519D51AD51BD51CD51D00000000000000000000 -0000D51ED51FD520D521D522D523D524D525D526D527D528D529D52AD52BD52C -D52DD52ED52FD530D531D532D533D534D535D536D53700000000000000000000 -0000D538D539D53AD53BD53ED53FD541D542D543D545D546D547D548D549D54A -D54BD54ED550D552D553D554D555D556D557D55AD55BD55DD55ED55FD561D562 -D563C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 -C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F -C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C -C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 -C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 -C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D564D566D567D56AD56CD56ED56FD570D571D572D573D576D577D579D57A -D57BD57DD57ED57FD580D581D582D583D586D58AD58B00000000000000000000 -0000D58CD58DD58ED58FD591D592D593D594D595D596D597D598D599D59AD59B -D59CD59DD59ED59FD5A0D5A1D5A2D5A3D5A4D5A6D5A700000000000000000000 -0000D5A8D5A9D5AAD5ABD5ACD5ADD5AED5AFD5B0D5B1D5B2D5B3D5B4D5B5D5B6 -D5B7D5B8D5B9D5BAD5BBD5BCD5BDD5BED5BFD5C0D5C1D5C2D5C3D5C4D5C5D5C6 -D5C7C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C -C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 -C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 -C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 -C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 -C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D5CAD5CBD5CDD5CED5CFD5D1D5D3D5D4D5D5D5D6D5D7D5DAD5DCD5DED5DF -D5E0D5E1D5E2D5E3D5E6D5E7D5E9D5EAD5EBD5EDD5EE00000000000000000000 -0000D5EFD5F0D5F1D5F2D5F3D5F6D5F8D5FAD5FBD5FCD5FDD5FED5FFD602D603 -D605D606D607D609D60AD60BD60CD60DD60ED60FD61200000000000000000000 -0000D616D617D618D619D61AD61BD61DD61ED61FD621D622D623D625D626D627 -D628D629D62AD62BD62CD62ED62FD630D631D632D633D634D635D636D637D63A -D63BC9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 -C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 -CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF -CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 -CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D -CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D63DD63ED63FD641D642D643D644D646D647D64AD64CD64ED64FD650D652 -D653D656D657D659D65AD65BD65DD65ED65FD660D66100000000000000000000 -0000D662D663D664D665D666D668D66AD66BD66CD66DD66ED66FD672D673D675 -D676D677D678D679D67AD67BD67CD67DD67ED67FD68000000000000000000000 -0000D681D682D684D686D687D688D689D68AD68BD68ED68FD691D692D693D695 -D696D697D698D699D69AD69BD69CD69ED6A0D6A2D6A3D6A4D6A5D6A6D6A7D6A9 -D6AACC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 -CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC -CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 -CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 -CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 -CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D6ABD6ADD6AED6AFD6B1D6B2D6B3D6B4D6B5D6B6D6B7D6B8D6BAD6BCD6BD -D6BED6BFD6C0D6C1D6C2D6C3D6C6D6C7D6C9D6CAD6CB00000000000000000000 -0000D6CDD6CED6CFD6D0D6D2D6D3D6D5D6D6D6D8D6DAD6DBD6DCD6DDD6DED6DF -D6E1D6E2D6E3D6E5D6E6D6E7D6E9D6EAD6EBD6ECD6ED00000000000000000000 -0000D6EED6EFD6F1D6F2D6F3D6F4D6F6D6F7D6F8D6F9D6FAD6FBD6FED6FFD701 -D702D703D705D706D707D708D709D70AD70BD70CD70DD70ED70FD710D712D713 -D714CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 -CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 -CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 -CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 -CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 -CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D715D716D717D71AD71BD71DD71ED71FD721D722D723D724D725D726D727 -D72AD72CD72ED72FD730D731D732D733D736D737D73900000000000000000000 -0000D73AD73BD73DD73ED73FD740D741D742D743D745D746D748D74AD74BD74C -D74DD74ED74FD752D753D755D75AD75BD75CD75DD75E00000000000000000000 -0000D75FD762D764D766D767D768D76AD76BD76DD76ED76FD771D772D773D775 -D776D777D778D779D77AD77BD77ED77FD780D782D783D784D785D786D787D78A -D78BD044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 -D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 -D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 -D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 -D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 -D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D78DD78ED78FD791D792D793D794D795D796D797D79AD79CD79ED79FD7A0 -D7A1D7A2D7A30000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 -D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 -D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 -D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C -D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 -D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 -C7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 -D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB -D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 -D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 -D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC -D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 -C8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 -D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 -D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 -D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 -D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 -D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF -6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 -5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 -61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB -95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F -61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 -6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB -4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB -F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E -64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA -61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 -96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 -7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F -577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F -74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 -93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 -53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD -75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 -8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 -660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 -6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 -5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D -62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 -639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 -50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 -854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 -69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC -8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C -570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F -5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 -53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 -903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 -969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 -F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B -53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 -573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 -74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C -8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE -685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 -F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E -F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 -67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 -5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B -F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 -8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 -F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E -7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 -6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D -5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D -5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 -52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 -8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 -7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC -51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C -6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D -5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 -53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C -85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D -5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 -8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD -9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 -65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE -8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 -6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F -7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 -78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 -964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D -622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC -51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C -728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 -541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C -83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C -8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 -671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF -71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF -840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 -9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F -72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 -9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 -82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D -7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C -5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 -610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A -62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 -99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 -76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E -65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 -90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA -88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 -6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 -6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 -4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 -9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C -8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B -99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC -8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 -8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 -9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 -7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C -4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 -6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C -658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D -4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 -5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 -6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 -88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA -715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 -50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 -723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD -55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 -60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 -67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 -657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 -861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C -859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 -71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC -562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 -71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 -90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D -84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E -9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 -74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA -88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 -9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 -5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C -834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F -66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD -662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A -57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 -4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA -85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E -5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 -5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F -6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C -83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 -5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE -5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 -63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A -F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD -9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA -513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 -F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 -582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 -6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 -7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F -71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 -F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD -745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 -F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 -88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 -55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 -761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 -7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 -7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 -6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 -F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E -6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C -6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 -512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 -79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED -6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 -5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 -9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 -617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB -9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 -610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 -8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 -80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 -F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 -4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A -51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 -F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 -F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC -8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A -8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 -93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C -606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE -8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 -68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB -58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 -748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 -8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E -6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 -90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D -7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 -5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F -92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 -5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 -544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 -6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B -7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C -81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 -5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 -722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 -8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 -62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD -80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D -70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E -9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC -710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B -6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A -6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE -907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 -6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 -8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 -75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB -7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 -74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E -50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 -5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC -50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC -7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B -85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F -8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 -7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 -66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 -F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 -8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 -585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 -690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 -939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 -6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 -F6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 -50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE -75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 -98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 -7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD -502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 -F7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 -803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 -6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F -8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 -59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E -722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 -F8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D -5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 -576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 -5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 -80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 -FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 -F9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 -5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 -66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 -608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B -54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 -965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 -FA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 -89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE -73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA -9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 -774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 -5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 -FB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 -99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D -5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 -7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A -93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 -5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 -FC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 -559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 -6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 -6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB -5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 -8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 -FD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 -73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A -8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 -866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 -7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC -5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/cp950.enc b/waypoint_manager/manager_GUI/tcl/encoding/cp950.enc deleted file mode 100644 index f33d785..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/cp950.enc +++ /dev/null @@ -1,1499 +0,0 @@ -# Encoding file: cp950, multi-byte -M -003F 0 88 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3000FF0C30013002FF0E2027FF1BFF1AFF1FFF01FE3020262025FE50FE51FE52 -00B7FE54FE55FE56FE57FF5C2013FE312014FE332574FE34FE4FFF08FF09FE35 -FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D -FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A -203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC -32A3210500AFFFE3FF3F02CDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B -FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63 -FE64FE65FE66FF5E2229222A22A52220221F22BF33D233D1222B222E22352234 -26402642229522992191219321902192219621972199219822252223FF0F0000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FF3C2215FE68FF04FFE53012FFE0FFE1FF05FF2021032109FE69FE6AFE6B33D5 -339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7 -74E97CCE25812582258325842585258625872588258F258E258D258C258B258A -2589253C2534252C2524251C2594250025022595250C251025142518256D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10 -FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166 -216721682169302130223023302430253026302730283029534153445345FF21 -FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31 -FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47 -FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C -039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4 -03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5 -03C603C703C803C931053106310731083109310A310B310C310D310E310F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00003110311131123113311431153116311731183119311A311B311C311D311E -311F312031213122312331243125312631273128312902D902C902CA02C702CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000020AC00000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B -53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E -4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8 -5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1 -4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6 -52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD -58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3 -62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79 -6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4 -4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317 -531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8 -53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01 -5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63 -6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529 -7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB -4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10 -4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5171518D51B0521752115212520E521652A3530853215320537053715409540F -540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD -573357305728572D572C572F57295919591A59375938598459785983597D5979 -598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC -65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F -6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A -7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B -821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57 -4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225 -52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426 -544E542754465443543354485442541B5429544A5439543B5438542E54355436 -5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996 -598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F -5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77 -5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276 -6289626D628A627C627E627962736292626F6298626E62956293629162866539 -653B653865F166F4675F674E674F67506751675C6756675E6749674667600000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70 -6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076 -707C707D707872627261726072C472C27396752C752B75377538768276EF77E3 -79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B -8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E -9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F -4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154 -51525155516951775176517851BD51FD523B52385237523A5230522E52365241 -52BE52BB5352535453535351536653775378537953D653D453D7547354750000 -A9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5496547854955480547B5477548454925486547C549054715476548C549A5462 -5468548B547D548E56FA57835777576A5769576157665764577C591C59495947 -59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF -59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78 -5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD -5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215 -623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB -62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC -62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000 -AA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6607670D670B676D678B67956771679C677367776787679D6797676F6770677F -6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3 -6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9 -6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7 -72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD -793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2 -80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F -82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE -8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000 -AB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD -4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192 -519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B -539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2 -57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA -59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9 -5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B -5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C -606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000 -AC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F -661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF -67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83 -6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB -70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7 -73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2 -75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC -770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F -7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000 -AD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD -81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301 -82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4 -8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C -964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D -50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014 -50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5 -51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8 -55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000 -AE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A -5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0 -5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8 -5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006063606560506055606D6069606F6084609F609A608D6094608C60856096 -624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A -632B6328634D634C65486549659965C165C566426649664F66436652664C6645 -664166F867146715671768216838684868466853683968426854682968B36817 -684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7 -6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000 -AF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9 -70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE -7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B -76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4 -79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A -7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006 -8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108 -80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354 -834A83388350834983358334834F833283398336831783408331832883430000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18 -8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77 -8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095 -90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A -507D505C50475043504C505A504950655076504E5055507550745077504F500F -506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340 -533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F -55645538552E555C552C55635533554155575708570B570957DF5805580A5806 -57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60 -5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2 -5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97 -5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248 -63A063A76372639663A263A563776367639863AA637163A963896383639B636B -63A863846388639963A163AC6392638F6380637B63696368637A655D65566551 -65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A -666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7 -689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB -6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA -6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D -7281731C731B73167313731973877405740A7403740673FE740D74E074F60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4 -76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92 -7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E -7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2 -801C804A8046812F81168123812B81298130812482028235823782368239838E -839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E -888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B -8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019 -900D901A90179023901F901D90109015901E9020900F90229016901B90140000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673 -96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75 -9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274 -5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C -55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589 -55AB5599570D582F582A58345824583058315821581D582058F958FA59600000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C -5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9 -5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1 -610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E -6566656265636591659065AF666E667066746676666F6691667A667E667766FE -66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2 -68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC -6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B -6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C -724C728472807336732573347329743A742A743374227425743574367434742F -741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C -7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F -7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5 -800B8052808581558154814B8151814E81398146813E814C815381748212821C -83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC -83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB -86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB -8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB -8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163 -916591CF9214921592239209921E920D9210920792119594958F958B95910000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000095939592958E968A968E968B967D96859686968D9672968496C196C596C4 -96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD -9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F -5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1 -55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A -5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148 -611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137 -622162226413643E641E642A642D643D642C640F641C6414640D643664166417 -6406656C659F65B06697668966876688669666846698668D67036994696D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000695A697769606954697569306982694A6968696B695E695369796986695D -6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7 -6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159 -7169716471497167715C716C7166714C7165715E714671687156723A72527337 -7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600 -75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891 -7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77 -7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A -7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008179817A81668205824784828477843D843184758466846B8449846C845B -843C8435846184638469846D8446865E865C865F86F9871387088707870086FE -86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2 -899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62 -8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2 -8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E -904191129117916C916A916991C9923792579238923D9240923E925B924B9264 -925192349249924D92459239923F925A959896989694969596CD96CB96C996CA -96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6 -50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600 -561B561755FD561456065609560D560E55F75616561F5608561055F657185716 -5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6 -5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D -5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -613F614B617761626163615F615A61586175622A64876458645464A46478645F -647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995 -69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3 -6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2 -6ECC6EF771947199717D718A71847192723E729272967344735074647463746A -7470746D750475917627760D760B7609761376E176E37784777D777F776178C1 -789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95 -7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD -7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA -82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3 -849084BC84D184CA873F871C873B872287258734871887558737872988F38902 -88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99 -8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B -91199118911E917591789177917492789280928592989296927B9293929C92A8 -927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785 -97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4 -9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -528752885289528D528A52F053B2562E563B56395632563F563456295653564E -565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB -5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2 -5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469 -646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A -64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E -6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F -6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58 -6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C -7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B -7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB -7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513 -851185238521851484EC852584FF850687828774877687608766877887688759 -8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95 -8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0 -8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D -8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8F259069906E9068906D90779130912D9127913191879189918B918392C592BB -92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707 -97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF -99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291 -529352F35659566B5679566956645678566A566856655671566F566C56625676 -58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD -61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF -64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58 -6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8 -71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D -76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E -7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3 -81A981A881FB820882588259854A855985488568856985438549856D856A855E -8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB -8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93 -8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078 -9072907C907A913491929320933692F89333932F932292FC932B9304931A0000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713 -970F975B975C9766979898309838983B9837982D9839982499109928991E991B -9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12 -9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8 -5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6 -64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E -6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80 -6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235 -72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7 -7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B -7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070 -806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2 -87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B -8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B -8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E -919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA -95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2 -569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7 -66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE -70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A -7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076 -81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0 -898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0 -8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0 -9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03 -9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133 -56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5 -6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F -7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9 -85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41 -8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A -8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6 -93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A -9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6 -5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662 -76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815 -896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4 -91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D -9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC -61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3 -7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B -95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D -9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9 -5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61 -9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31 -9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10 -74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463 -946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F -9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA -9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470 -9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5 -947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -C9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E -4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3 -6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723 -5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14 -4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210 -52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B -597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74 -5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E -67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D -897E909990979098909B909496229624962096234F564F3B4F624F494F534F64 -4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD -52AE530953635372538E538F54305437542A545454455419541C542554180000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000543D544F544154285424544756EE56E756E557415745574C5749574B5752 -5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A -5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C -5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3 -5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A -6270628162886277627D62726274653765F065F465F365F265F5674567470000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B -6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A -726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594 -75957681793D80348095809980908092809C8290828F8285828E829182930000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F -962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A -4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE -5235523252335246523152BC530A530B533C539253945487547F548154915482 -5488546B547A547E5465546C54745466548D546F546154605498546354675464 -56F756F9576F5772576D576B57715770577657805775577B5773577457620000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1 -59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF -5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19 -5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006034600A60176033601A601E602C6022600D6010602E60136011600C6009 -601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0 -62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611 -661066F6670A6785676C678E67926776677B6798678667846774678D678C677A -679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC -6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1 -709470987085709370867084709170967082709A7083726A72D672CB72D872C9 -72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8 -753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5 -80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8 -82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD -8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3 -4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC -5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0 -57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4 -590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB -59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9 -5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037 -603960546072605E6045605360476049605B604C60406042605F602460446058 -6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6 -63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C -662666226633662B663A661D66346639662E670F671067C167F267C867BA0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE -67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9 -67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D -6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F -70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4 -72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB -73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4 -7708770377047705770A76F776FB76FA77E777E878067811781278057810780F -780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D -7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9 -80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8 -830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3 -8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8 -91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5 -4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194 -519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E -552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6 -57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15 -5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1 -5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000604160A26088608060926081609D60836095609B60976087609C608E6219 -624662F263106356632C634463456336634363E46339634B634A633C63296341 -6334635863546359632D63476333635A63516338635763406348654A654665C6 -65C365C465C2664A665F6647665167126713681F681A684968326833683B684B -684F68166831681C6835682B682D682F684E68446834681D6812681468266828 -682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F -6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68 -6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39 -70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC -73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5 -7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710 -771377127723771177157719771A772277277823782C78227835782F7828782E -782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0 -79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85 -7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D -7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100 -8201822F82258333832D83448319835183258356833F83418326831C83220000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008342834E831B832A8308833C834D8316832483208337832F832983478345 -834C8353831E832C834B832783488653865286A286A88696868D8691869E8687 -86978686868B869A868586A5869986A186A786958698868E869D869086948843 -8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57 -8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004 -8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E -50605053504B505D50725048504D5041505B504A506250155045505F5069506B -5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D -539C55755576553C554D55505534552A55515562553655355530555255450000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2 -57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5 -57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58 -5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52 -5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72 -5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96 -5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB -60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397 -63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006378638563816391638D6370655365CD66656661665B6659665C66626718 -687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2 -688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4 -6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A -6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6 -6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104 -70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F -731D7317730773117318730A730872FF730F731E738873F673F873F574047401 -73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D -7725773B7735784878527849784D784A784C782678457850796479677969796A -7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30 -7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98 -7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B -7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -801E801B804780438048811881258119811B812D811F812C811E812181158127 -811D8122821182388233823A823482328274839083A383A8838D837A837383A4 -8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E -83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD -86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897 -88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C -8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7 -8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB -90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5 -9997509B50955094509E508B50A35083508C508E509D5068509C509250825087 -515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F -55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005819581E58275823582857F558485825581C581B5833583F5836582E5839 -5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC -5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D -5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35 -5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36 -5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104 -610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5 -63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0 -63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC -68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970 -68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD -68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97 -6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45 -6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64 -6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125 -71227132711F7128713A711B724B725A7288728972867285728B7312730B7330 -73227331733373277332732D732673237335730C742E742C7430742B74160000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7 -75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A -774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868 -785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B -7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56 -7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D -814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423 -83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5 -83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB -83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1 -88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9 -89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52 -8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89 -8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F -9106912C910490FF90FC910890F990FB9101910091079105910391619164915F -916291609201920A92259203921A9226920F920C9200921291FF91FD92069204 -92279202921C92249219921792059216957B958D958C95909687967E96880000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6 -9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA -50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA -55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9 -55C25714585358685864584F584D5849586F5855584E585D58595865585B583D -5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A -5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6 -5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F -612961406220916862236225622463C563F163EB641064126409642064240000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064336443641F641564186439643764226423640C64266430642864416435 -642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686 -668C66956690668B668A66996694667867206966695F6938694E69626971693F -6945696A6939694269576959697A694869496935696C6933693D696568F06978 -693469696940696F69446976695869416974694C693B694B6937695C694F6951 -69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2 -6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92 -6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160 -7141715D716271727178716A7161714271587143714B7170715F715071530000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A -73497444744A744B7452745174577440744F7450744E74427446744D745474E1 -74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610 -75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767 -77547759776D77E07887789A7894788F788478957885788678A1788378797899 -78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70 -7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B -7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB -7FDC8021816481608177815C8169815B816281726721815E81768167816F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081448161821D8249824482408242824584F1843F845684768479848F848D -846584518440848684678430844D847D845A845984748473845D8507845E8437 -843A8434847A8443847884328445842983D9844B842F8442842D845F84708439 -844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454 -846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D -870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81 -8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C -8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2 -8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090449049903D9110910D910F911191169114910B910E916E916F92489252 -9230923A926692339265925E9283922E924A9246926D926C924F92609267926F -92369261927092319254926392509272924E9253924C92569232959F959C959E -959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D -980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD -50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613 -560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A -58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA -5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D -5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43 -5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A -615B6165613B616A6161615662296227622B642B644D645B645D647464766472 -6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C -646B645964656477657365A066A166A0669F67056704672269B169B669C90000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4 -69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2 -69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03 -6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD -6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182 -718F717B718671817197724472537297729572937343734D7351734C74627473 -7471747574727467746E750075027503757D759076167608760C76157611760A -761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8 -787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C -7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF -7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC -7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008024805D805C8189818681838187818D818C818B8215849784A484A1849F -84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7 -84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4 -84D284DB84B084918661873387238728876B8740872E871E87218719871B8743 -872C8741873E874687208732872A872D873C8712873A87318735874287268727 -87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96 -8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06 -8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124 -9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1 -928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D -977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900 -9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60 -9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C -50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF -58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05 -5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D -5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496 -64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579 -657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15 -69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40 -6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16 -6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57 -6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77 -6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA -719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000736274877489748A74867481747D74857488747C747975087507757E7625 -761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788 -78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2 -799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5 -7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE -7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -819E819581A2819981978216824F825382528250824E82518524853B850F8500 -8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2 -851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E -84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000875687638764877787E1877387588754875B87528761875A8751875E876D -876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767 -8769885A8905890C8914890B891789188919890689168911890E890989A289A4 -89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5 -8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0 -8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073 -9070906F9067906B912F912B9129912A91329126912E91859186918A91819182 -9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC -92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702 -975A978A978E978897D097CF981E981D9826982998289820981B982798B29908 -98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB -99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75 -9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04 -9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC -58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1 -5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9 -5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533 -657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66 -6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A -6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54 -6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8 -6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4 -71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365 -736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633 -763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44 -7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9 -7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C -7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43 -7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC -81B481B281B781A781F282558256825785568545856B854D8553856185580000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -854085468564854185628544855185478563853E855B8571854E856E85758555 -85678560858C8566855D85548565856C866386658664879B878F879787938792 -87888781879687988779878787A3878587908791879D87848794879C879A8789 -891E89268930892D892E89278931892289298923892F892C891F89F18AE00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF -8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38 -8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34 -90769079907B908690FA913391359136919391909191918D918F9327931E9308 -931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D -92FA9325931392F992F793349302932492FF932993399335932A9314930C0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9 -96D4970B9712971097999797979497F097F89835982F98329924991F99279929 -999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA -9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88 -9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4 -5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25 -5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3 -61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580 -65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9 -6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2 -71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510 -75117512750F7584764376487649764776A476E977B577AB77B277B777B60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB -79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB -7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8 -7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44 -7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9 -825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8577857C858985A1857A85788557858E85968586858D8599859D858185A28582 -858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5 -87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE -87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13 -8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47 -8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF -936493569347937C9358935C93769349935093519360936D938F934C936A9379 -935793559352934F93719377937B9361935E936393679380934E935995C795C0 -95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -979E979D97D597D497F198419844984A9849984598439925992B992C992A9933 -9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB -99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1 -9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA -9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699 -59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6 -61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD -6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005 -7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657 -765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC -7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56 -7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB -85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB -87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4 -87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35 -8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75 -8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5 -91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395 -93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3 -96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F -9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35 -9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C -9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C -9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4 -56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1 -6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016 -702B702170227023702970177024701C702A720C720A72077202720572A572A6 -72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76 -7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE -807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2 -85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7 -8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958 -895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D -8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD -93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3 -93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948 -9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C -9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4 -9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78 -9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F -9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF -66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034 -703170427038703F703A70397040703B703370417213721472A8737D737C74BA -76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80 -7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604 -86098605860C85FD8819881088118817881388168963896689B989F78B608B6A -8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A -908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410 -94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000 -F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862 -9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36 -9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8 -9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6 -9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91 -513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC -6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A -77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030 -81DD8618862A8626861F8623861C86198627862E862186208629861E86250000 -F6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45 -8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B -94369429943D943C94309439942A9437942C9440943195E595E495E39735973A -97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29 -9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9 -9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18 -9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2 -65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F -74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000 -F7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826 -882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A -8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449 -9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33 -9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF -9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2 -513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB -6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C -863A86408639863C8631863B863E88308832882E883389768974897389FE0000 -F8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4 -97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C -9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC -9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D -7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835 -884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743 -974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03 -9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E -65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000 -F9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5 -8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10 -9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2 -8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874 -98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482 -948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D -7069706A9EA49F7E9F499F98788192B988CF58BB60527CA75AFA255425662557 -2560256C2563255A2569255D255225642555255E256A256125582567255B2553 -25652556255F256B256225592568255C25512550256D256E2570256F25930000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/dingbats.enc b/waypoint_manager/manager_GUI/tcl/encoding/dingbats.enc deleted file mode 100644 index 9729487..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/dingbats.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: dingbats, single-byte -S -003F 1 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -00202701270227032704260E2706270727082709261B261E270C270D270E270F -2710271127122713271427152716271727182719271A271B271C271D271E271F -2720272127222723272427252726272726052729272A272B272C272D272E272F -2730273127322733273427352736273727382739273A273B273C273D273E273F -2740274127422743274427452746274727482749274A274B25CF274D25A0274F -27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000276127622763276427652766276726632666266526602460246124622463 -2464246524662467246824692776277727782779277A277B277C277D277E277F -2780278127822783278427852786278727882789278A278B278C278D278E278F -2790279127922793279421922194219527982799279A279B279C279D279E279F -27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF -000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/ebcdic.enc b/waypoint_manager/manager_GUI/tcl/encoding/ebcdic.enc deleted file mode 100644 index f451de5..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/ebcdic.enc +++ /dev/null @@ -1,19 +0,0 @@ -S -006F 0 1 -00 -0000000100020003008500090086007F0087008D008E000B000C000D000E000F -0010001100120013008F000A0008009700180019009C009D001C001D001E001F -0080008100820083008400920017001B00880089008A008B008C000500060007 -0090009100160093009400950096000400980099009A009B00140015009E001A -002000A000E200E400E000E100E300E500E700F10060002E003C0028002B007C -002600E900EA00EB00E800ED00EE00EF00EC00DF00210024002A0029003B009F -002D002F00C200C400C000C100C300C500C700D1005E002C0025005F003E003F -00F800C900CA00CB00C800CD00CE00CF00CC00A8003A002300400027003D0022 -00D800610062006300640065006600670068006900AB00BB00F000FD00FE00B1 -00B0006A006B006C006D006E006F00700071007200AA00BA00E600B800C600A4 -00B500AF0073007400750076007700780079007A00A100BF00D000DD00DE00AE -00A200A300A500B700A900A700B600BC00BD00BE00AC005B005C005D00B400D7 -00F900410042004300440045004600470048004900AD00F400F600F200F300F5 -00A6004A004B004C004D004E004F00500051005200B900FB00FC00DB00FA00FF -00D900F70053005400550056005700580059005A00B200D400D600D200D300D5 -003000310032003300340035003600370038003900B3007B00DC007D00DA007E diff --git a/waypoint_manager/manager_GUI/tcl/encoding/euc-cn.enc b/waypoint_manager/manager_GUI/tcl/encoding/euc-cn.enc deleted file mode 100644 index 4b2f8c7..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/euc-cn.enc +++ /dev/null @@ -1,1397 +0,0 @@ -# Encoding file: euc-cn, multi-byte -M -003F 0 82 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 -201C201D3014301530083009300A300B300C300D300E300F3016301730103011 -00B100D700F72236222722282211220F222A222922082237221A22A522252220 -23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 -22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 -25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000024882489248A248B248C248D248E248F2490249124922493249424952496 -249724982499249A249B247424752476247724782479247A247B247C247D247E -247F248024812482248324842485248624872460246124622463246424652466 -2467246824690000000032203221322232233224322532263227322832290000 -00002160216121622163216421652166216721682169216A216B000000000000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 -00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 -0000000000000000000031053106310731083109310A310B310C310D310E310F -3110311131123113311431153116311731183119311A311B311C311D311E311F -3120312131223123312431253126312731283129000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000000000002500250125022503250425052506250725082509250A250B -250C250D250E250F2510251125122513251425152516251725182519251A251B -251C251D251E251F2520252125222523252425252526252725282529252A252B -252C252D252E252F2530253125322533253425352536253725382539253A253B -253C253D253E253F2540254125422543254425452546254725482549254A254B -0000000000000000000000000000000000000000000000000000000000000000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 -978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 -888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB -9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 -73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E -6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 -535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 -5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 -6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 -7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B -522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B -82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 -601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 -6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 -4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 -62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D -56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 -5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA -627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A -8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 -4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE -7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF -882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A -847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC -810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE -7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 -86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC -905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA -654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 -63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 -53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 -680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A -72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD -7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 -591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 -5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE -94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F -963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F -6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 -7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 -4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 -8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A -54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 -611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 -818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 -845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E -62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D -4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC -52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF -704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 -684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD -558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E -8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 -76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC -4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 -543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 -8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 -71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C -604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F -79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 -706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 -53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E -796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 -59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C -76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 -62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B -686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 -56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 -53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED -6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 -91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 -666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 -7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 -62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 -8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 -652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A -582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 -577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF -554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F -82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 -7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000998861276E8357646606634656F062EC62695ED39614578362C955878721 -814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD -89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 -4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B -7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC -9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C -6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF -667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 -521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D -62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C -740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 -63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 -541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A -6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B -95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B -541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 -51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF -7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F -772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 -7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 -706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE -964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE -776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 -753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A -6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 -917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 -8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 -722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 -522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA -57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA -787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 -74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 -8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 -83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 -51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 -8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 -C7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 -524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A -62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D -520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 -97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB -4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 -C8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 -529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 -58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 -5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 -63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A -745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 -C9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E -7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D -886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A -5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 -820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 -7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 -62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB -4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F -5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C -67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 -7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 -7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D -6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC -8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 -80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 -635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A -8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD -6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 -7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 -951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 -751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 -687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 -5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 -625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 -889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB -5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 -4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 -536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 -6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C -68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 -52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D -4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 -4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 -95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF -76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 -6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A -90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C -6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 -884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E -673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 -53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 -5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD -7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 -781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 -71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C -4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 -91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 -4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 -501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB -4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE -8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 -5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C -6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 -670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 -4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED -7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 -56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 -5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 -5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 -810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 -8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 -77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B -7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C -62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 -951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA -9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 -804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A -63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 -4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC -7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB -90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 -88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 -684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B -4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 -594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A -5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F -53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C -4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 -5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 -525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB -4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC -4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F -502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 -50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 -6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 -51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF -8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 -8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 -8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 -5369537A961D962296219631962A963D963C964296499654965F9667966C9672 -96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB -90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD -52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF -574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B -574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF -57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 -99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 -82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F -82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 -8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 -839B835E832F834F83478343835F834083178360832D833A8333836683650000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C -8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 -58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 -83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 -843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF -84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 -85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 -86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 -624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 -637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE -645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 -75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 -54435421545754595423543254825494547754715464549A549B548454765466 -549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC -54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 -5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005537555655755576557755335530555C558B55D2558355B155B955885581 -559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB -55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E -5608560C56015624562355FE56005627562D565856395657562C564D56625659 -565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 -56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 -5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 -5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F -5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 -5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 -72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000072FB731773137321730A731E731D7315732273397325732C733873317350 -734D73577360736C736F737E821B592598E7592459029963996799689969996A -996B996C99749977997D998099849987998A998D999099919993999499955E80 -5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA -5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 -60356026601B600F600D6029602B600A603F602160786079607B607A60420000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 -60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 -61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 -9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 -6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 -6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F -6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 -6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E -6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 -6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 -6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 -704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 -8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 -900D9016902190359036902D902F9044905190529050906890589062905B66B9 -9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 -5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 -59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 -80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 -5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 -9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 -9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 -7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 -7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 -7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 -738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C -740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000741B741A7441745C7457745574597477746D747E749C748E748074817487 -748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 -67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 -680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD -6832683368606861684E6862684468646883681D68556866684168676840683E -684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000692468F0690B6901695768E369106971693969606942695D6984696B6980 -69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD -69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 -6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB -733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 -8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C -81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 -6600708566F7661D66346631663666358006665F66546641664F665666616657 -66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 -8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 -726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 -6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F -809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 -80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 -8C5A8136811E812C811881328148814C815381748159815A817181608169817C -817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 -5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C -7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C -716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D -7228706C7118716671B9623E623D624362486249793B794079467949795B795C -7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 -62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C -781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 -7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 -78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 -77077708771A77227719772D7726773577387750775177477743775A77680000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 -754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 -7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 -949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 -94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 -94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 -95079509950A950D950E950F951295139514951595169518951B951D951E951F -9522952A952B9529952C953195329534953695379538953C953E953F95429535 -9544954595469549954C954E954F9552955395549556955795589559955B955E -955F955D95619562956495659566956795689569956A956B956C956F95719572 -9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 -9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 -9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 -9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC -75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB -75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 -765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 -7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 -88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 -8966897B758B80E576B276B477DC801280148016801C80208022802580268027 -802980288031800B803580438046804D80528069807189839878988098830000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 -866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 -86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 -86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B -871E8725872E871A873E87488734873187298737873F87828722877D877E877B -87608770874C876E878B87538763877C876487598765879387AF87A887D20000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 -87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 -7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 -7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E -7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB -7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 -822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 -887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D -7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 -7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 -9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 -F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009162916191709169916F917D917E917291749179918C91859190918D9191 -91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 -8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 -8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 -8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F -8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 -F6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A -972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 -96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F -9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E -9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 -9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 -F7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 -977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA -9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 -990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F -9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 -9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/euc-jp.enc b/waypoint_manager/manager_GUI/tcl/encoding/euc-jp.enc deleted file mode 100644 index db56c88..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/euc-jp.enc +++ /dev/null @@ -1,1353 +0,0 @@ -# Encoding file: euc-jp, multi-byte -M -003F 0 79 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D0000008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F -FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F -FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F -FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8 -FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F -FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D -FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7 -00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 -FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000025C625A125A025B325B225BD25BC203B3012219221902191219330130000 -00000000000000000000000000000000000000002208220B2286228722822283 -222A2229000000000000000000000000000000002227222800AC21D221D42200 -220300000000000000000000000000000000000000000000222022A523122202 -220722612252226A226B221A223D221D2235222B222C00000000000000000000 -00000000212B2030266F266D266A2020202100B6000000000000000025EF0000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000 -0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000 -0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000025002502250C251025182514251C252C25242534253C25012503250F2513 -251B251725232533252B253B254B2520252F25282537253F251D253025252538 -2542000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25 -65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216 -7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2 -593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3 -840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038 -7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11 -789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B -96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E -983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186 -5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 -827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104 -5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55 -4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3 -706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8 -8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5 -4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE -591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9 -57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B -899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B -6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 -53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6 -5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53 -6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266 -839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8 -5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668 -57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77 -8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591 -79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775 -9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551 -673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 -5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37 -5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7 -93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5 -52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F -8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8 -99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B -85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B -59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB -7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8 -5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 -503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063 -9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237 -8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF -6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92 -4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190 -4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7 -5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A -6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1 -8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D -980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B -544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5 -7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396 -88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D -6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728 -67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A -548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652 -4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB -9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB -59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62 -6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C -8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F -5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06 -75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66 -659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235 -914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E -816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490 -884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E -67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F -51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3 -6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 -7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11 -5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2 -6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0 -7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4 -9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38 -60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5 -55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F -795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203 -587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8 -9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F -745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F -6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0 -8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790 -77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D -7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226 -624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE -524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A -72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275 -53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB -64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 -83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7 -5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A -592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806 -5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8 -9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544 -5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0 -4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D -80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730 -5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4 -901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 -8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A -80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715 -6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4 -69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A -91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F -608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2 -5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B -70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21 -767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC -51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF -76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD -52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F -5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A -9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D -594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960 -8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000 -C7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74 -5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF -8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC -4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885 -6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD -67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000 -C8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A -91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD -53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4 -91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87 -5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB -8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000 -C9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C -686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79 -5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7 -8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577 -65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB -6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3 -61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73 -5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86 -504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA -570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023 -4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2 -98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0 -68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8 -64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6 -646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE -9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999 -7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D -660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21 -830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905 -5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25 -77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67 -6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E -8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6 -719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32 -6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A -4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C -74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC -5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B -7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F -985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97 -9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717 -697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332 -8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568 -69006E7E78978155000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A -82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7 -4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B -4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4 -4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006 -504350476703505550505048505A5056506C50785080509A508550B450B20000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102 -511651155114511A5121513A5137513C513B513F51405152514C515451627AF8 -5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2 -51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED -51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C -525E5254526A527452695273527F527D528D529452925271528852918FA80000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5 -52F852F9530653087538530D5310530F5315531A5323532F5331533353385340 -534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6 -53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D -5440542C542D543C542E54365429541D544E548F5475548E545F547154775470 -5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2 -553955405563554C552E555C55455556555755385533555D5599558054AF558A -559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC -55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638 -566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 -56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005708570B570D57135718571655C7571C572657375738574E573B5740574F -576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2 -57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879 -588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5 -58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C -592D59325938593E7AD259555950594E595A5958596259605967596C59690000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F -5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2 -5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E -5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80 -5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 -5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6 -5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C -5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87 -5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB -5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54 -5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8 -5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F -5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E -5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060 -601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F -604A6046604D6063604360646042606C606B60596081608D60E76083609A0000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6 -60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E -6147613E61286127614A613F613C612C6134613D614261446173617761586159 -615A616B6174616F61656171615F615D6153617561996196618761AC6194619A -618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6 -61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000621E6221622A622E6230623262336241624E625E6263625B62606268627C -62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4 -62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5 -6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B -636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 -651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF -652C64F664F464F264FA650064FD6518651C650565246523652B653465356537 -65366538754B654865566555654D6558655E655D65726578658265838B8A659B -659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A -660365FB6773663566366634661C664F664466496641665E665D666466676668 -665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726 -67279738672E673F67366741673867376746675E676067596763676467896770 -67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4 -67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E -68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 -68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A -6923692168C669796977695C6978696B6954697E696E69396974693D69596930 -6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD -69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9 -69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72 -6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB -6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50 -6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4 -6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF -9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B -6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12 -6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7 -6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D -6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24 -6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F -6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58 -6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8 -6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F -7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD -70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 -719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246 -724B72587274727E7282728172877292729672A272A772B972B272C372C672C4 -72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329 -7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE -73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459 -7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E -750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564 -7567756B756D75787576758675877574758A758975827594759A759D75A575A3 -75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF -75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 -7630763B764776487646765C76587661766276687669766A7667766C76700000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000767276767678767C768076837688768B768E769676937699769A76B076B4 -76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707 -770477297724771E77257726771B773777387747775A7768776B775B7765777F -777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD -77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C -789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000078E778DA78FD78F47907791279117919792C792B794079607957795F795A -79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7 -79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57 -7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0 -7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 -7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D -7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6 -7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23 -7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56 -7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9 -7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72 -7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD -7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05 -7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37 -7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D -8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78 -7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6 -7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B -801280188019801C80218028803F803B804A804680528058805A805F80628068 -80738072807080768079807D807F808480868085809B8093809A80AD519080AC -80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000968B8146813E8153815180FC8171816E81658166817481838188818A8180 -818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA -81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205 -8207820A820D821082168229822B82388233824082598258825D825A825F8264 -82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 -82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000833583348316833283318340833983508345832F832B831783188385839A -83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4 -841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD -8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C -846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6 -84A1852184FF84F485178518852C851F8515851484FC85408563855885480000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587 -859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613 -860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3 -86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC -86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F -8737873B87258729871A8760875F8778874C874E877487578768876E87590000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4 -87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816 -8815882288218831883688398827883B8844884288528859885E8862886B8881 -887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF -88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A -89138943891E8925892A892B89418944893B89368938894C891D8960895E0000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000089668964896D896A896F89748977897E89838988898A8993899889A189A9 -89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16 -8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85 -8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7 -8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 -8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41 -8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E -8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA -8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67 -8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB -8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81 -8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE -8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C -8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C -8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 -90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000904F905090519052900E9049903E90569058905E9068906F907696A89072 -9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102 -9112911991329130914A9156915891639165916991739172918B9189918291A2 -91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC -91F591F6921E91FF9214922C92159211925E925792459249926492489295923F -924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD -939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403 -940794109436942B94359421943A944194529444945B94609462945E946A9229 -947094759477947D945A947C947E9481947F95829587958A9594959695989599 -95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 -95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4 -96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713 -970E9711970F971697199724972A97309739973D973E97449746974897429749 -975C976097649766976852D2976B977197799785977C9781977A9786978B978F -9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF -97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912 -991499189921991D991E99249920992C992E993D993E9942994999459950994B -99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED -99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43 -9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 -9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32 -9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8 -9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1 -9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21 -9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB -9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9 -9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD -9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9 -9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF -9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 -9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000582F69C79059746451DC7199000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -R -A1C1 301C FF5E -A1C2 2016 2225 -A1DD 2212 FF0D -A1F1 00A2 FFE0 -A1F2 00A3 FFE1 -A2CC 00AC FFE2 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/euc-kr.enc b/waypoint_manager/manager_GUI/tcl/encoding/euc-kr.enc deleted file mode 100644 index 5e9bb93..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/euc-kr.enc +++ /dev/null @@ -1,1533 +0,0 @@ -# Encoding file: euc-kr, multi-byte -M -003F 0 90 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030003001300200B72025202600A8300300AD20152225FF3C223C20182019 -201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 -00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 -222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 -25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D -221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF -02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 -2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E -261C261E00B62020202121952197219921962198266D2669266A266C327F321C -211633C7212233C233D821210000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000313131323133313431353136313731383139313A313B313C313D313E313F -3140314131423143314431453146314731483149314A314B314C314D314E314F -3150315131523153315431553156315731583159315A315B315C315D315E315F -3160316131623163316431653166316731683169316A316B316C316D316E316F -3170317131723173317431753176317731783179317A317B317C317D317E317F -3180318131823183318431853186318731883189318A318B318C318D318E0000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000217021712172217321742175217621772178217900000000000000000000 -2160216121622163216421652166216721682169000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000025002502250C251025182514251C252C25242534253C25012503250F2513 -251B251725232533252B253B254B2520252F25282537253F251D253025252538 -254225122511251A251925162515250E250D251E251F25212522252625272529 -252A252D252E25312532253525362539253A253D253E25402541254325442545 -2546254725482549254A00000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00003395339633972113339833C433A333A433A533A63399339A339B339C339D -339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 -33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB -33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 -33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 -0000000000000000000000000000000000000000000000000000000000000000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A -00003260326132623263326432653266326732683269326A326B326C326D326E -326F3270327132723273327432753276327732783279327A327B24D024D124D2 -24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 -24E324E424E524E624E724E824E9246024612462246324642465246624672468 -2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 -A9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000E6011100F001270131013301380140014200F8015300DF00FE0167014B -01493200320132023203320432053206320732083209320A320B320C320D320E -320F3210321132123213321432153216321732183219321A321B249C249D249E -249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE -24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C -247D247E247F24802481248200B900B200B32074207F20812082208320840000 -AA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -AB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -AC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 -AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 -AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 -AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC -ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 -ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 -AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B -AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 -ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B -AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D -AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF -AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C -AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 -AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 -AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 -B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 -B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 -B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 -B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 -B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 -B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 -B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 -B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 -B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED -B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 -B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 -B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 -B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 -B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 -B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 -B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 -B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 -B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 -B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 -B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 -B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC -B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B -B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D -B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 -B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 -B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD -B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 -B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 -BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 -BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C -BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B -BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 -BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF -BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C -BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 -BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 -BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 -BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 -BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 -BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D -BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F -BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 -BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 -BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 -C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC -C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E -C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 -C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 -C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC -C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD -C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 -C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 -C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 -C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 -C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 -C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 -C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 -C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 -C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C -C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 -C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 -C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C -C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 -C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 -C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 -C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 -C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F -C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C -C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 -C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 -C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C -C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 -C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 -C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 -C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 -C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 -C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 -CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF -CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 -CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D -CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 -CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC -CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 -CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 -CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 -CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 -CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 -CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 -CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 -CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 -CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 -D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 -D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 -D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 -D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 -D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 -D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 -D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 -D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C -D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 -D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 -C7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 -D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB -D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 -D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 -D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC -D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 -C8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 -D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 -D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 -D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 -D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 -D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF -6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 -5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 -61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB -95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F -61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 -6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB -4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB -F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E -64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA -61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 -96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 -7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F -577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F -74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 -93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 -53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD -75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 -8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 -660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 -6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 -5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D -62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 -639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 -50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 -854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 -69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC -8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C -570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F -5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 -53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 -903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 -969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 -F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B -53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 -573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 -74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C -8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE -685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 -F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E -F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 -67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 -5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B -F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 -8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 -F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E -7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 -6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D -5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D -5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 -52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 -8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 -7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC -51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C -6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D -5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 -53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C -85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D -5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 -8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD -9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 -65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE -8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 -6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F -7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 -78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 -964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D -622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC -51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C -728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 -541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C -83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C -8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 -671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF -71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF -840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 -9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F -72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 -9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 -82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D -7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C -5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 -610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A -62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 -99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 -76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E -65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 -90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA -88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 -6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 -6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 -4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 -9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C -8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B -99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC -8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 -8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 -9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 -7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C -4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 -6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C -658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D -4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 -5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 -6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 -88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA -715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 -50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 -723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD -55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 -60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 -67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 -657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 -861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C -859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 -71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC -562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 -71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 -90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D -84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E -9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 -74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA -88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 -9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 -5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C -834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F -66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD -662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A -57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 -4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA -85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E -5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 -5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F -6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C -83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 -5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE -5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 -63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A -F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD -9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA -513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 -F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 -582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 -6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 -7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F -71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 -F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD -745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 -F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 -88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 -55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 -761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 -7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 -7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 -6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 -F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E -6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C -6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 -512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 -79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED -6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 -5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 -9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 -617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB -9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 -610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 -8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 -80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 -F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 -4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A -51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 -F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 -F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC -8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A -8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 -93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C -606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE -8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 -68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB -58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 -748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 -8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E -6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 -90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D -7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 -5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F -92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 -5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 -544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 -6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B -7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C -81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 -5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 -722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 -8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 -62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD -80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D -70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E -9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC -710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B -6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A -6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE -907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 -6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 -8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 -75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB -7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 -74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E -50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 -5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC -50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC -7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B -85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F -8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 -7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 -66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 -F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 -8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 -585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 -690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 -939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 -6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 -F6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 -50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE -75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 -98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 -7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD -502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 -F7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 -803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 -6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F -8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 -59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E -722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 -F8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D -5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 -576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 -5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 -80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 -FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 -F9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 -5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 -66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 -608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B -54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 -965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 -FA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 -89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE -73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA -9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 -774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 -5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 -FB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 -99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D -5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 -7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A -93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 -5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 -FC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 -559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 -6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 -6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB -5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 -8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 -FD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 -73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A -8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 -866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 -7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC -5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/gb12345.enc b/waypoint_manager/manager_GUI/tcl/encoding/gb12345.enc deleted file mode 100644 index 3f3f4d2..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/gb12345.enc +++ /dev/null @@ -1,1414 +0,0 @@ -# Encoding file: gb12345, double-byte -D -233F 0 83 -21 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 -201C201D3014301530083009300A300B300C300D300E300F3016301730103011 -00B100D700F72236222722282211220F222A222922082237221A22A522252220 -23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 -22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 -25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -22 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000024882489248A248B248C248D248E248F2490249124922493249424952496 -249724982499249A249B247424752476247724782479247A247B247C247D247E -247F248024812482248324842485248624872460246124622463246424652466 -2467246824690000000032203221322232233224322532263227322832290000 -00002160216121622163216421652166216721682169216A216B000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -23 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -24 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -25 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -26 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -27 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -28 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 -00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 -0000000000000000000031053106310731083109310A310B310C310D310E310F -3110311131123113311431153116311731183119311A311B311C311D311E311F -3120312131223123312431253126312731283129000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -29 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000000000002500250125022503250425052506250725082509250A250B -250C250D250E250F2510251125122513251425152516251725182519251A251B -251C251D251E251F2520252125222523252425252526252725282529252A252B -252C252D252E252F2530253125322533253425352536253725382539253A253B -253C253D253E253F2540254125422543254425452546254725482549254A254B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000554A963F57C3632854CE550954C0769A764C85F977EE827E7919611B9698 -978D6C285B894FFA630966975CB880FA68489AAF660276CE51F9655671AC7FF1 -895650B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB -9776628A801958E997387F777238767D67CF767E64FA4F70655762DC7A176591 -73ED642C6273822C9812677F7248626E62CC4F3474E3534A8FA67D4690A65E6B -6886699C81807D8168D278C5868C938A508D8B1782DE80DE5305891252650000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -31 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000858496F94FDD582198FD5BF662B1583166B48C799B917206676F789160B2 -535153178F2980CC8C9D92C7500D72FD5099618A711988AB595482EF672C7B28 -5D297DB3752D6CF58E668FF8903C9F3B6BD491197B465F7C78A784D6853D7562 -65836BD65E635E8775F99589655D5F0A5FC58F9F58C181C2907F965B97AD908A -7DE88CB662414FBF8B8A535E8FA88FAF8FAE904D6A195F6A819888689C49618B -522B765F5F6C658C70156FF18CD364EF517551B067C44E1979C9990570B30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -32 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075C55E7673BB83E064AD64A592626CE2535A52C3640F92517B944F2F5E1B -82368116818A6E246CCA99C16355535C54FA88DC57E04E0D5E036B657C3F90E8 -601664E6731C88C16750624D8CA1776C8E2991C75F6983DC8521991053C38836 -6B98615A615871E684BC825950096EC485CF64CD7CD969FD66F9834953A07B56 -5074518C6E2C5C648E6D63D253C9832C833667E578B4643D5BDF5C945DEE8A6B -62C667F48C7A6519647B87EC995E8B927E8F93DF752395E1986B660C73160000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -33 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000583456175E389577511F81785EE0655E66A2553150218D8562849214671D -56326F6E5DE2543570928ECA626F64A463A35FB96F8890F481E38FB058756668 -5FF16C8996738D81896F64917A3157CE6A59621054484E587A0B61F26F848AA0 -627F901E9A0179E4540375F4630153196C6090725F1B99B3803B9F524F885C3A -8D647FC565A571BE5145885D87F25D075BF562BD916C75878E8A7A2061017C4C -4EC77DA27785919C81ED521D51FA6A7153A88E8792E496DB6EC19664695A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -34 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000790E513277D7641089F8865563E35DDD7A7F693D50B3823955984E327621 -7A975E625E8A95D652755439708A6376931857826625693F918755076DF37D14 -882262337DBD75B5832878C196CC8FAD614874F78A5E6B64523A8CDC6B218070 -847156F153065F9E53E251D17C97918B7C074FC38EA57BE17AC464675D1450AC -810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B932F642D9054 -7B5476296253592754466B7950A362345E366B864EE38CB8888B5F85902E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -35 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006020803D64D44E3955AE913264A381BD65E66C2E4F46619A6DE18A955F48 -86CB757664CB9EE885696A94520064178E4850125CF679B15C0E52307A3B60BC -905376D75FB75F9776848E6C71C8767B7B4977AA51F3912758244F4E6EF48FEA -65757B1B72C46ECC7FDF5AE162B55E95573084827B2C5E1D5F1F905E7DE0985B -63826EC778989EDE5178975B588A96FB4F4375385E9760E659606FB16BBF7889 -53FC96D551CB52016389540A91E38ABF8DCC7239789F87768FED8ADC758A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -36 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E0176EF53EE91D898029F0E93205B9A8A024E22677151AC846361C252D5 -68DF4F97606B51CD6D1E515C62969B2596618C46901775D890FD77636BD272A2 -73688B80583577798CED675C934D809A5EA66E2159927AEF77ED935B6BB565B7 -7DDE58065151968A5C0D58A956788E726566981356E4920D76FE9041638754C6 -591A596A579B8EB267358DFA8235524160F058AE86FE5CE89D5D4FC4984D8A1B -5A2560E15384627C904F910299136069800C51528033723E990C6D314E8C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -37 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008CB3767C7F707B4F4F104E4F95A56CD573D085E95E06756A7FFB6A0A792C -91E97E4151E1716953CD8FD47BC48CA972AF98EF6CDB574A82B365B980AA623F -963259A84EFF8A2A7D21653E83F2975E556198DB80A5532A8AB9542080BA5EE2 -6CB88CBB82AC915A54296C1B52067D1B58B3711A6C7E7C89596E4EFD5FFF61A4 -7CDE8C505C01695387025CF092D298A8760B70FD902299AE7E2B8AF759499CF3 -4F5B5426592B6577819A5B75627662C28F3B5E456C1F7B264F0F4FD8670D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -38 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D6E6DAA798F88B15F17752B64AB8F144FEF91DC65A7812F81515E9C8150 -8D74526F89868CE65FA950854ED8961C723681798CA05BCC8A0396445A667E1B -54905676560E8A7265396982922384CB6E895E797518674667D17AFF809D8D95 -611F79C665628D1B5CA1525B92FC7F38809B7DB15D176E2F67607BD9768B9AD8 -818F7F947CD5641E93AC7A3F544A54E56B4C64F162089D3F80F3759952729769 -845B683C86E495A39694927B500B54047D6668398DDF801566F45E9A7FB90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -39 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000057C2803F68975DE5653B529F606D9F944F9B8EAC516C5BAB5F13978F6C5E -62F18CA25171920E52FE6E9D82DF72D757A269CB8CFC591F8F9C83C754957B8D -4F306CBD5B6459D19F1353E488319AA88C3780A16545986756FA96C7522E74DC -526E5BE1630289024E5662D0602A68FA95DC5B9851A089C07BA199287F506163 -704C8CAB51495EE3901B7470898F572D78456B789F9C95A88ECC9B3C8A6D7678 -68426AC38DEA8CB4528A8F256EDA68CD934B90ED570B679C88F9904E54C80000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009AB85B696D776C264EA55BB399ED916361A890AF97D3542B6DB55BD251FD -558A7F557FF064BC634D65F161BE608D710A6C576F22592F676D822A58D5568E -8C6A6BEB90DD597D8017865F6D695475559D837783CF683879BE548C4F555408 -76D28C8995A16CB36DB88D6B89109DB48CC0563F9ED175D55F8872E0606854FC -4EA86A2A886160528F5F54C470D886799D3B6D2A5B8F5F187D0555894FAF7334 -543C539A50195F8C547C4E4E5FFD745A58FA846B80E1877472D07CCA6E560000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F27864E552C8B774E926EEC623782B1562983EF733E6ED1756B52835316 -8A7169D05F8A61F76DEE58DE6B6174B0685390847DE963DB60A3559A76138C62 -71656E195BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C -604D8B0A707063EE8F1D5FBD606286D456DE6BC160946167534960E066668CC4 -7A62670371F4532F8AF18AA87E6A8477660F5A5A9B426E3E6DF78C416D3B4F19 -706B7372621660D1970D8CA8798D64CA573E57FA6A5F75787A3D7A4D7B950000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000808C99518FF96FC08B4F9DC459EC7E3E7DDD5409697568D88F2F7C4D96C6 -53CA602575BE6C7253735AC97D1A64E05E7E810A5DF1858A628051805B634F0E -796D529160B86FDF5BC45BC28A088A1865E25FCC969B59937E7C7D00560967B7 -593E4F735BB652A083A298308CC87532924050477A3C50F967B699D55AC16BB2 -76E358055C167B8B9593714E517C80A9827159787DD87E6D6AA267EC78B19E7C -63C064BF7C215109526A51CF85A66ABB94528E108CE4898B93757BAD4EF60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000050658266528D991E6F386FFA6F975EFA50F559DC5C076F3F6C5F75868523 -69F3596C8B1B532091AC964D854969127901712681A04EA490CA6F869A555B0C -56BC652A927877EF50E5811A72E189D299037E737D5E527F655991758F4E8F03 -53EB7A9663ED63A5768679F88857968E622A52AB7BC0685467706377776B7AED -6F547D5089E359D0621285C982A5754C501F4ECB75A58AA15C4A5DFE7B4B65A4 -91D14ECA6D25895F7DCA932650C58B3990329773664979818FD171FC6D780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000076E152C1834651628396775B66769BE84EAC9A5A7CBE7CB37D934E958B66 -666F9838975C5883656C93E15F9175D997567ADF7AF651C870AF7A9863EA7A76 -7CFE739697ED4E4570784E5D915253A96551820A81FC8205548E5C31759A97A0 -62D872D975BD5C4599D283CA5C40548077E982096CAE805A62D264DA5DE85177 -8DDD8E1E92F84FF153E561FC70AC528763509D515A1F5026773753777D796485 -652B628963985014723589BA51B38A237D76574783CC921E8ECD541B5CFB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004FCA7AE36D5A90E199FF55805496536154AF958B63E9697751F16168520A -582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 -577782DB67EF68F578D5984679D16BBB54B353EF6E34514B523B5BA28AB280AF -554358BE61C75751542D7A7A60505B5463A7647353E362635BC767AF54ED7A9F -82E691775EAB89328A8757AE630E8DE880EF584A7B7751085FEB5BEC6B3E5321 -7B5072C268467926773666E051B5866776D45DCB7ABA8475594E9B4150800000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -40 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000994B61276F7057646606634656F062EC64F45ED395CA578362C95587881F -81D88FA35566840A4F868CF485CD5A6A6B0465147C4395CC862D703E8B95652C -89BD61F67E9C721B6FEB7405699472FC5ECA90CE67176D6A648852DE72628001 -4F6C59E5916A70D96F8752D26A0296F79433857E78CA7D2F512158D864C2808B -985E6CEA68F1695E51B7539868A872819ECE7C6C72F896E270557406674E88CF -9BC979AE83898354540F68179E9753B252F5792B6B77522950884F8B4FD00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -41 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075E27ACB7C92701D96B8529B748354E95006806F84EE9023942E5EC96190 -6F237C3E658281C993C8620071497DF47CE751C968817CB1826F51698F1B91CF -667E4EAE8AD264A9804A50DA764271CE5BE5907C6F664E86648294105ED66599 -521788C270C852A373757433679778F7971681E891309C576DCB51DB8CC3541D -62CE73B283F196F69F6192344F367F9A51CC974896755DBA981853E64EE46E9C -740969B4786B993E7559528976246D4167F3516D9F8D807E56A87C607ABF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -42 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000968658DF650F96B46A135A41645F7C0D6F0F964B860676E798715EEC7210 -64C46EF7865C9B6F9E93788C97328DEF8CC29E7F6F5E798493329678622E9A62 -541592C14FA365C55C655C627E37616E6C2F5F8B73876FFE7DD15DD265235B7F -706453754E8263A0756563848F2A502B4F966DEA7DB88AD6863F87BA7F85908F -947C7C6E9A3E88F8843D6D1B99F17D615ABD9EBB746A78BC879E99AC99E1561B -55CE57CB8CB79EA58CE390818109779E9945883B6EFF851366FC61626F2B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -43 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B3E8292832B76F26C135FD983BD732B830593286BDB77DB925A536F8302 -51925E3D8C8C8CBF9EBD73AB679A68859176970971646CA177095A9293826BCF -7F8E66275BD059B95A9A958060B65011840C84996AAC76DF9333731B59225B5F -772F919A97617CDC8FF78B0E5F4C7C7379D889936CCC871C5BC65E4268C97720 -7DBF5195514D52C95A297DEC976282D763CF778485D079D26E3A5EDF59998511 -6EC56C1162BF76BF654F61AB95A9660E879F9CF49298540D547D8B2C64780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -44 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE -964C8B00725F67D062C77261755D59C66BCD589366AE5E5552DF6155672876EE -776672677A4662FF54EA5450920990A35A1C7D0D6C164E435976801059485357 -753796E356CA6493816660F19B276DD65462991251855AE980FD59AE9713502A -6CE55C3C64EC4F60533F81A990066EBA852B62C85E7478BE6506637B5FF55A18 -91C09CE55C3F634F80765B7D5699947793B36D8560A86AB8737051DD5BE70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -45 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064F06FD8725B626D92157D1081BF6FC38FB25F04597452AA601259736696 -86507627632A61E67CEF8AFE54E66B509DD76BC685D5561450766F1A556A8DB4 -722C5E156015743662CD6392724C5F986E436D3E65006F5876E478D076FC7554 -522453DB4E539F9065C1802A80D6629B5486522870AE888D8DD16CE1547880DA -57F988F48CE0966A914D4F696C9B567476C6783062A870F96F8E5F6D84EC68DA -787C7BF781A8670B9D6C636778B0576F78129739627962AB528874356BD70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -46 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A1998C46F02 -74E27968648777A562FC983B8CA754C180584E52576A860B840D5E73619174F6 -8A555C4F57616F5198175A4678349B448FEB7C95525664B292EA50D583868461 -83E984B257D46A385703666E6D668B5C66DD7011671F6B3A68F2621A59BB4E03 -51C46F0667D26C8F517668CB59476B6775665D0E81CD9F4A65D7794879419A0E -8D778C484E5E4F0155535951780C56686C238FC468C46C7D6CE38A1663900000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -47 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060706D3D727D626691FA925B534390777C3D4EDF8B194E7E9ED493229257 -524D6F5B90636DFA8B7458795D4C6B206B4969CD55C681547F8C58BB85945F3A -64366A47936C657260846A4B77A755AC50D15DE7979864AC7FF95CED4FCF7AC5 -520783044E14602F7ACA6B3D4FB589AA79E6743452E482B964D279BD5BE26C81 -97528F156C2B50BE537F6E0564CE66746C3060C598038ACB617674CA7AAE79CB -4E1890B174036C4256DA914B6CC58DA8534086C666F28EC05C489A456E200000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -48 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053D65A369F728DA353BB570898746B0A919B6CC9516875CA62F372AC5238 -52F87F3A7094763853749D7269B778BA96C088D97FA4713671C3518967D374E4 -58E4651856B78B93995264FE7E5E60F971B158EC4EC14EBA5FCD97CC4EFB8A8D -5203598A7D0962544ECD65E5620E833884C969AE878D71946EB65BB97D685197 -63C967D480898339881551125B7A59828FB14E736C5D516589258EDF962E854A -745E92ED958F6F6482E55F316492705185A9816E9C13585E8CFD4E0953C10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -49 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000050986563685155D355AA64149A3763835AC2745F82726F8068EE50E7838E -78026BBA52396C997D1750BB5565715E7BE966EC73CA82EB67495C715220717D -886B9583965D64C58D0D81B355846C5562477E55589250B755468CDE664C4E0A -5C1A88F368A2634E7A0D71D2828D52FA97F65C1154E890B57D3959628CD286C7 -820C63688D66651D5C0461FE6D89793E8A2D78377533547B4F388EAB6DF15A20 -7D33795E6C885BE95B38751A814E614E6EF28072751F7525727253477E690000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000770176DB526952DD80565E2B5931734565BD6FD58A695C388671534177F3 -62FE66424EC098DF87555BE68B5853F277E24F7F5C4E99DB59CB5F0F793A58EB -4E1667FF4E8B62ED8A93901D52E2662F55DC566C90694ED54F8D91CB98FE6C0F -5E0260435BA489968A666536624B99965B8858FD6388552E53D776267378852C -6A1E68B36B8A62928F3853D482126DD1758F66F88D165B70719F85AF669166D9 -7F7287009ECD9F205C6C88538FF06A39675F620D7AEA58855EB665786F310000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060555237800D6454887075295E25681362F4971C96D9723D8AB06C347761 -7A0E542E77AC9806821C8AAC78A96714720D65AF64955636601D79C153F87D72 -6B7B80865BFA55E356DB4F3A4F3C98FC5DF39B068073616B980C90015B8B8A1F -8AA6641C825864FB55FD860791654FD77D20901F7C9F50F358516EAF5BBF8A34 -80859178849C7B9796D6968B96A87D8F9AD3788E6B727A57904296A7795F5B6B -640D7B0B84D168AD55067E2E74637D2293966240584C4ED65B83597958540000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000737A64BB8E4B8E0F80CE82D462AC81FA6CF0915E592A614B6C70574D6524 -8CAA7671705858C76A8075F06F6D8B5A8AC757666BEF889278B363A2560670AD -6E6F5858642A580268E0819B55107CD650188EBA6DCC8D9F71D9638F6FE46ED4 -7E278404684390036DD896768A0E5957727985E49A3075BC8B0468AF52548E22 -92BB63D0984C8E44557C9AD466FF568F60D56D9552435C4959296DFB586B7530 -751C606C821481466311689D8FE2773A8DF38CBC94355E165EF3807D70F40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C92855F647AE5 -687663457B527D7175DB50776295982D900F51F879C37A8157165F9290145857 -5C60571F541051546E4D571863A8983D817F8715892A9000541E5C6F81C062D6 -625881319D15964099B199DD6A6259A562D3553E631654C786D97AAA5A0374E6 -896A6B6A59168C4C5F4E706373A998114E3870F75B8C7897633D665A769660CB -5B9B5A49842C81556C6A738B4EA167897DB25F8065FA671B5FD859845A010000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005DCD5FAE537197CB90556845570D552F60DF72326FF07DAD8466840E59D4 -504950DE5C3E7DEF672A851A5473754F80C355829B4F4F4D6E2D8B025C096170 -885B761F6E29868A6587805E7D0B543B7A697D0A554F55E17FC174EE64BE8778 -6E267AA9621165A1536763E16C835DEB55DA93A270CF6C618AA35C4B7121856A -68A7543E54346BCB6B664E9463425348821E4F0D4FAE5862620A972766647269 -52FF52D9609F8AA4661471996790897F785277FD6670563B5438932B72A70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8489725E2D -7FD25AB3559C92916D177CFB969962327D30778E87665323971E8F4466875CFD -4FE072F94E0B53A6590F56876380934151484ED99BAE7E9654B88CE2929C8237 -95916D8E5F265ACC986F96AA73FE737B7E23817A99217FA161B2967796507DAB -76F853A2947299997BB189446E5891097FD479658A7360F397FF4EAB98055DF7 -6A6150CF54118C61856D785D9704524A54EE56C292B76D885BB56DC666C90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C0F5B5D68218096562F7B11654869544E9B6B47874E978B5354633E643A -90AA659C81058AE75BEB68B0537887F961C86CC470098B1D5C5185AA82AF92C5 -6B238F9B65B05FFB5FC34FE191C1661F8165732960FA82085211578B5F6290A2 -884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E -673D55C592B979C088967D89589F620C9700865A561898085F908A3184C49157 -53D965ED5E8F755C60647D6E5A7F7DD27E8C8ED255A75BA361F865CB73840000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009078766C77297D629774859B5B787A7496EA884052DB718F5FAA65EC8A62 -5C0B99B45DE16B896C5B8A138A0A905C8FC558D362BC9D099D2854404E2B82BD -7259869C5D1688596DAF96C5555E4E9E8A1D710954BD95B970DF6DF99E7D56B4 -781487125CA95EF68A00985495BB708E6CBF594463A9773C884D6F1482775830 -71D553AD786F96C155015F6671305BB48AFA9A576B83592E9D2679E7694A63DA -4F6F760D7F8A6D0B967D6C274EF07662990A6A236F3E90808170599674760000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -52 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006447582F90657A918B2159DA54AC820085E5898180006930564E8036723A -91CE51B64E5F98016396696D844966F3814B591C6DB24E0058F991AB63D692A5 -4F9D4F0A886398245937907A79FB510080F075916C825B9C59E85F5D690587FB -501A5DF24E5977E34EE585DD6291661390915C7951045F7981C69038808475AB -4EA688D4610F6BC561B67FA976CA6EA28A638B708ABC8B6F5F027FFC7FCC7E79 -8335852D56E06BB797F3967059FB541F92806DEB5BC598F25C395F1596B10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000537082F16AFB5B309DF961C97E93746987A271DF719288058FCE8D0F76C8 -5F717A4E786C662055B264C150AD81C376705EB896CD8E3486F9548F6CF36D8C -6C38607F52C775285E7D512A60A061825C24753190F5923E73366CB96E389149 -670953CB53F34F5191C98A9853C85E7C8FC26DE44E8E76C26986865E611A8F3F -99184FDE903E9B5A61096E1D6F0196854E885A3196E882075DBC79B95B878A9E -7FBD738957DF828B9B315401904755BB5CEA5FA161086B32734480B28B7D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D745BD388D598108C6B99AD9D1B6DF551A4514357A38881539F63F48F45 -571254E15713733F6E907DE3906082D198586028966266F07D048D8A8E8D9470 -5CB37CA4670860A695B2801896F29116530096955141904B85F49196668897F5 -5B55531D783896DC683D54C9707E5BB08F09518D572854B1652266AB8D0A8D1C -81DF846C906D7CDF947F85FB68D765E96FA186A48E81566A902076827AC871E5 -8CAC64C752476FA48CCA600E589E618E66FE8D08624E55B36E23672D8ECB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -55 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000935895987728680569A8548B4E4D70B88A5064589F4B5B857A8450B55BE8 -77BB6C088A797C986CBE76DE65AC8F3E5D845C55863868E7536062307AD96E5B -7DBB6A1F7AE05F706F335F35638C6F3267564E085E338CEC4ED781397634969C -62DB662D627E6CBC8D9971677F695146808753EC906E629854F287C48F4D8005 -937A851790196D5973CD659F771F7504782781FB8C9E91DD5075679575B98A3A -9707632F93AE966384B86399775C5F817319722D6014657462EF6B63653F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E407665912D8B49829D679D652F5431871877E580A281026C414E4B7E54 -807776F4690D6B9657F7503C4F84574063076B628DBE887965E87D195FD7646F -64F281F381F47F6E5E5F5CD95236667A79E97A1A8CEA709975D46EEF6CBB7A92 -4E2D76C55FE0941888777D427A2E816B91CD4EF28846821F54685DDE6D328B05 -7CA58EF880985E1A549276BA5B99665D9A5F73E0682A86DB6731732A8AF88A85 -90107AF971ED716E62C477DA56D14E3B845767F152A986C08CAF94447BC90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -57 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F4F6CE8795D99D06293722A62FD5C0878DA8F4964B08CFA7BC66A01838A -88DD599D649E58EF72C0690E93108FFD8D05589C7DB48AC46E96634962D95353 -684C74228301914C55447740707C6FC1517954A88CC759FF6ECB6DC45B5C7D2B -4ED47C7D6ED35B5081EA6F2C5B579B0368D58E2A5B977D9C7E3D7E3191128D70 -594F63CD79DF8DB3535265CF79568A5B963B7D44947D7E825634918967007F6A -5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -58 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F -53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C -4E694E9382885B5B55C7560F4EC45399539D53B453A553AE97688D0B531A53F5 -532D5331533E8CFE5366536352025208520E52445233528C5274524C525E5261 -525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB -4EDE50B44EF34F224F644EF5500050964F094F474F5E4F6765384F5A4F5D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B51154F7C5102 -4F945114513C51374FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F -502E502D4FFE501C500C5025502850E8504350555048504E506C50C2513B5110 -513A50BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F5850C94FCE9FA0 -6C467CF4516E5DFD9ECC999856C5591452F9530D8A0753109CEC591951554EA0 -51564EB3886E88A4893B81E088D279805B3488037FB851AB51B151BD51BC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000051C7519651A251A58A018A108A0C8A158B338A4E8A258A418A368A468A54 -8A588A528A868A848A7F8A708A7C8A758A6C8A6E8ACD8AE28A618A9A8AA58A91 -8A928ACF8AD18AC98ADB8AD78AC28AB68AF68AEB8B148B018AE48AED8AFC8AF3 -8AE68AEE8ADE8B288B9C8B168B1A8B108B2B8B2D8B568B598B4E8B9E8B6B8B96 -5369537A961D962296219631962A963D963C964296589654965F9689966C9672 -96749688968D969796B09097909B913A9099911490A190B490B390B691340000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090B890B090DF90C590BE913690C490C79106914890E290DC90D790DB90EB -90EF90FE91049122911E91239131912F91399143914682BB595052F152AC52AD -52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DF0 -574C580A57A1587E58BC58C558D15729572C572A573358D9572E572F58E2573B -5742576958E0576B58DA577C577B5768576D5776577357E157A4578C584F57CF -57A75816579357A057D55852581D586457D257B857F457EF57F857E457DD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 -99A89F1961FF8279827D827F828F828A82A88284828E8291858C829982AB8553 -82BE82B085F682CA82E3829882B782AE83A7840784EF82A982B482A182AA829F -82C482E782A482E1830982F782E48622830782DC82F482D282D8830C82FB82D3 -8526831A8306584B716282E082D5831C8351855884FD83088392833C83348331 -839B854E832F834F8347834385888340831785BA832D833A833372966ECE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008541831B85CE855284C08452846483B083788494843583A083AA8393839C -8385837C859F83A9837D8555837B8398839E83A89DAF849383C1840183E583D8 -58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 -83EA83C583C07E0883F083E1845C8451845A8459847385468488847A85628478 -843C844684698476851E848E8431846D84C184CD84D09A4084BD84D384CA84BF -84BA863A84A184B984B4849793A38577850C750D853884F0861E851F85FA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008556853B84FF84FC8559854885688564855E857A77A285438604857B85A4 -85A88587858F857985EA859C858585B985B785B0861A85C185DC85FF86278605 -86298616863C5EFE5F08593C596980375955595A5958530F5C225C255C2C5C37 -624C636B647662BB62CA62DA62D762EE649F62F66339634B634363AD63F66371 -637A638E6451636D63AC638A636963AE645C63F263F863E064B363C463DE63CE -645263C663BE65046441640B641B6420640C64266421645E6516646D64960000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647A64F764FC6499651B64C064D064D764E464E265096525652E5F0B5FD2 -75195F11535F53F1563053E953E853FB541254165406544B563856C8545456A6 -54435421550454BC5423543254825494547754715464549A5680548454765466 -565D54D054AD54C254B4566054A754A6563555F6547254A3566654BB54BF54CC -567254DA568C54A954AA54A4566554CF54DE561C54E7562E54FD551454F355E9 -5523550F55115527552A5616558F55B5554956C055415555553F5550553C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005537555655755576557755335530555C558B55D2558355B155B955885581 -559F557E55D65591557B55DF560D56B35594559955EA55F755C9561F55D156C1 -55EC55D455E655DD55C455EF55E555F2566F55CC55CD55E855F555E48F61561E -5608560C560156B6562355FE56005627562D565856395657562C564D56625659 -5695564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 -570756EB56F956FF5704570A5709571C5E435E195E145E115E6C5E585E570000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -61 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905D875C885CF45C995C91 -5D505C9C5CB55CA25D2C5CAC5CAB5CB15CA35CC15CB75DA75CD25DA05CCB5D22 -5D975D0D5D275D265D2E5D245D1E5D065D1B5DB85D3E5D345D3D5D6C5D5B5D6F -5D815D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DD45F735F775F825F87 -5F89540E5FA05F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B473777341 -72C372C172CE72CD72D272E8736A72E9733B72F472F7730172F3736B72FA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000072FB731773137380730A731E731D737C732273397325732C733873317350 -734D73577360736C736F737E821B592598E75924590298E0993398E9993C98EA -98EB98ED98F4990999114F59991B9937993F994399489949994A994C99625E80 -5EE15E8B5E965EA55EA05EB95EB55EBE5EB38CE15ED25ED15EDB5EE85EEA81BA -5FC45FC95FD661FA61AE5FEE616A5FE15FE4613E60B561345FEA5FED5FF86019 -60356026601B600F600D6029602B600A61CC6021615F61E860FB613760420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000606A60F26096609A6173609D60836092608C609B611C60BB60B160DD60D8 -60C660DA60B4612061926115612360F46100610E612B614A617561AC619461A7 -61B761D461F55FDD96B39582958695C8958E9594958C95E595AD95AB9B2E95AC -95BE95B69B2995BF95BD95BC95C395CB95D495D095D595DE4E2C723F62156C35 -6C546C5C6C4A70436C856C906C946C8C6C686C696C746C766C866F596CD06CD4 -6CAD702770186CF16CD76CB26CE06CD66FFC6CEB6CEE6CB16CD36CEF6D870000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -64 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D396D276D0C6D796E5E6D076D046D196D0E6D2B6FAE6D2E6D356D1A700F -6EF86F6F6D336D916D6F6DF66F7F6D5E6D936D946D5C6D606D7C6D636E1A6DC7 -6DC56DDE70066DBF6DE06FA06DE66DDD6DD9700B6DAB6E0C6DAE6E2B6E6E6E4E -6E6B6EB26E5F6E866E536E546E326E256E4470676EB16E9870446F2D70056EA5 -6EA76EBD6EBB6EB76F776EB46ECF6E8F6EC26E9F6F627020701F6F246F156EF9 -6F2F6F3670326F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A70280000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -65 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 -705D705E5B805B845B955B935BA55BB8752F9A2B64345BE45BEE89305BF08E47 -8B078FB68FD38FD58FE58FEE8FE490878FE690158FE890059004900B90909011 -900D9016902190359036902D902F9044905190529050906890589062905B66B9 -9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 -5C687FBC5F335F295F2D82745F3C9B3B5C6E59815983598D5AF55AD759A30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000599759CA5B00599E59A459D259B259AF59D759BE5A6D5B0859DD5B4C59E3 -59D859F95A0C5A095AA75AFB5A115A235A135A405A675A4A5A555A3C5A625B0B -80EC5AAA5A9B5A775A7A5ABE5AEB5AB25B215B2A5AB85AE05AE35B195AD65AE6 -5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 -99D499DF99D99A369A5B99D199D89A4D9A4A99E29A6A9A0F9A0D9A059A429A2D -9A169A419A2E9A389A439A449A4F9A659A647CF97D067D027D077D087E8A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007D1C7D157D137D3A7D327D317E107D3C7D407D3F7D5D7D4E7D737D867D83 -7D887DBE7DBA7DCB7DD47DC47D9E7DAC7DB97DA37DB07DC77DD97DD77DF97DF2 -7E627DE67DF67DF17E0B7DE17E097E1D7E1F7E1E7E2D7E0A7E117E7D7E397E35 -7E327E467E457E887E5A7E527E6E7E7E7E707E6F7E985E7A757F5DDB753E9095 -738E74A3744B73A2739F73CF73C274CF73B773B373C073C973C873E573D9980A -740A73E973E773DE74BD743F7489742A745B7426742574287430742E742C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -68 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000741B741A7441745C74577455745974A6746D747E749C74D4748074817487 -748B749E74A874A9749074A774DA74BA97D997DE97DC674C6753675E674869AA -6AEA6787676A677367986898677568D66A05689F678B6777677C67F06ADB67D8 -6AF367E967B06AE867D967B567DA67B367DD680067C367B867E26ADF67C16A89 -68326833690F6A48684E6968684469BF6883681D68556A3A68416A9C68406B12 -684A6849682968B5688F687468776893686B6B1E696E68FC6ADD69E768F90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -69 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006B0F68F0690B6901695768E369106971693969606942695D6B16696B6980 -69986978693469CC6AEC6ADA69CE6AF8696669636979699B69A769BB69AB69AD -69D469B169C169CA6AB369956AE7698D69FF6AA369ED6A176A186A6569F26A44 -6A3E6AA06A506A5B6A356A8E6AD36A3D6A286A586ADE6A916A906AA96A976AAB -733773526B816B826BA46B846B9E6BAE6B8D6BAB6B9B6BAF6BAA8ED48EDB8EF2 -8EFB8F648EF98EFC8EEB8EE48F628EFA8EFE8F0A8F078F058F128F268F1E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008F1F8F1C8F338F468F548ECE62146227621B621F62226221622562246229 -81E7750C74F474FF750F75117513653465EE65EF65F0660A66C7677266036615 -6600708566F7661D66346631663666358006665F66C46641664F668966616657 -66776684668C66D6669D66BE66DB66DC66E666E98CC18CB08CBA8CBD8D048CB2 -8CC58D108CD18CDA8CD58CEB8CE78CFB899889AC89A189BF89A689AF89B289B7 -726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000643F64D880046BEA6BF36BFD6BFF6BF96C056C0C6C066C0D6C156C186C19 -6C1A6C216C2C6C246C2A6C3265356555656B725872527256723086625216809F -809C809380BC670A80BD80B180AB80AD80B480B76727815680E981DA80DB80C2 -80C480D980CD80D7671080DD811B80F180F480ED81BE810E80F280FC67158112 -8C5A8161811E812C811881328148814C815381748159815A817181608169817C -817D816D8167584D5AB58188818281CF6ED581A381AA81CC672681CA81BB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081C181A66B5F6B376B396B436B466B5998AE98AF98B698BC98C698C86BB3 -5F408F4289F365909F4F659565BC65C665C465C365CC65CE65D265D6716C7152 -7096719770BB70C070B770AB70B171C170CA7110711371DC712F71317173715C -716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D -7228706C71FE716671B9623E623D624362486249793B794079467949795B795C -7953795A79B079577960798E7967797A79AA798A799A79A779B35FD15FD00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000061DF605D605A606760416059606361646106610D615D61A9619D61CB61E3 -62078080807F6C936FA96DFC78EF77F878AD780978687818781165AB782D78B8 -781D7839792A7931781F783C7825782C78237829784E786D786478FD78267850 -7847784C786A78E77893789A788778E378A178A378B278B978A578D478D978C9 -78EC78F2790578F479137924791E79349F959EF99EFB9EFC76F17704779876F9 -77077708771A77227719772D772677357738775E77BC77477743775A77680000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 -754E754B7548755B7572757975837F587F617F5F8A487F687F867F717F797F88 -7F7E76CD76E5883291D291D391D491D991D791D591F791E791E4934691F591F9 -9208922692459211921092019227920492259200923A9266923792339255923D -9238925E926C926D923F9460923092499248924D922E9239943892AC92A0927A -92AA92EE92CF940392E3943A92B192A693A7929692CC92A993F59293927F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000093A9929A931A92AB9283940B92A892A39412933892F193D792E592F092EF -92E892BC92DD92F69426942792C392DF92E6931293069369931B934093019315 -932E934393079308931F93199365934793769354936493AA9370938493E493D8 -9428938793CC939893B893BF93A693B093B5944C93E293DC93DD93CD93DE93C3 -93C793D19414941D93F794659413946D9420947993F99419944A9432943F9454 -9463937E77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -70 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A397A377A619ECF99A57A707688768E7693769976A474DE74E0752C9CE9 -9CF69D079D069D239D879E159D1D9D1F9DE59D2F9DD99D309D429E1E9D539E1D -9D609D529DF39D5C9D619D939D6A9D6F9D899D989D9A9DC09DA59DA99DC29DBC -9E1A9DD39DDA9DEF9DE69DF29DF89E0C9DFA9E1B7592759476647658759D7667 -75A375B375B475B875C475B175B075C375C2760275CD75E3764675E675E47647 -75E7760375F175FC75FF761076007649760C761E760A7625763B761576190000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -71 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000761B763C762276207640762D7630766D76357643766E7633764D76697654 -765C76567672766F7FCA7AE67A787A797A807A867A887A957AC77AA07AAC7AA8 -7AB67AB3886488698872887D887F888288A2896088B788BC88C9893388CE895D -894788F1891A88FC88E888FE88F08921891989138938890A8964892B89368941 -8966897B758B80E576B876B477DC801280148016801C8020802E80258026802C -802980288031800B803580438046807980528075807189839807980E980F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -72 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009821981C6F4198269837984E98539873986298599865986C9870864D8654 -866C87E38806867A867C867B86A8868D868B8706869D86A786A386AA869386A9 -86B686C486B5882386B086BA86B186AF86C987F686B486E986FA87EF86ED8784 -86D0871386DE881086DF86D886D18703870786F88708870A870D87098723873B -871E8725872E871A873E87C88734873187298737873F87828722877D8811877B -87608770874C876E878B8753876387BB876487598765879387AF87CE87D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -73 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 -87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F4C -7F447F4582107AFA7AFD7B087BE47B047B677B0A7B2B7B0F7B477B387B2A7B19 -7B2E7B317B207B257B247B337C697B1E7B587BF37B457B757B4C7B8F7B607B6E -7B7B7B627B727B717B907C007BCB7BB87BAC7B9D7C5C7B857C1E7B9C7BA27C2B -7BB47C237BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C6A7C0B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007C1F7C2A7C267C387C5F7C4081FE82018202820481EC8844822182228264 -822D822F8228822B8238826B82338234823E82448249824B824F825A825F8268 -887E88CA888888D888DF895E7F9D7FA57FA77FAF7FB07FB27C7C65497C917CF2 -7CF67C9E7CA27CB27CBC7CBD7CDD7CC77CCC7CCD7CC87CC57CD77CE8826E66A8 -7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87E367DA67DAE7E477E9B9EA9 -9EB48D738D848D948D918DB28D678D6D8C478C49914A9150914E914F91640000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -75 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009162916191709169916F91C591C3917291749179918C91859190918D9191 -91A291A391AA91AD91AE91AF91B591B491BA8C559E7A8E898DEB8E058E598E69 -8DB58DBF8DBC8DBA8E4C8DD68DD78DDA8E928DCE8DCF8DDB8DC68DEC8E7A8E55 -8DE38E9A8E8B8DE48E098DFD8E148E1D8E1F8E938E2E8E238E918E3A8E408E39 -8E358E3D8E318E498E418E428EA18E638E4A8E708E768E7C8E6F8E748E858EAA -8E948E908EA68E9E8C788C828C8A8C858C988C94659B89D689F489DA89DC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -76 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000089E589EB89F68A3E8B26975A96E9974296EF9706973D9708970F970E972A -97449730973E9F549F5F9F599F609F5C9F669F6C9F6A9F779EFD9EFF9F0996B9 -96BC96BD96CE96D277BF8B8E928E947E92C893E8936A93CA938F943E946B9B77 -9B749B819B839B8E9C787A4C9B929C5F9B909BAD9B9A9BAA9B9E9C6D9BAB9B9D -9C589BC19C7A9C319C399C239C379BC09BCA9BC79BFD9BD69BEA9BEB9BE19BE4 -9BE79BDD9BE29BF09BDB9BF49BD49C5D9C089C109C0D9C129C099BFF9C200000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -77 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009C329C2D9C289C259C299C339C3E9C489C3B9C359C459C569C549C529C67 -977C978597C397BD979497C997AB97A397B297B49AB19AB09AB79DBB9AB69ABA -9ABC9AC19AC09ACF9AC29AD69AD59AD19B459B439B589B4E9B489B4D9B519957 -995C992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B229B1F -9B234E489EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 -9EDF9EE29EF79EE79EE59EF29EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -78 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000896C95C693365F4685147E94538251B24E119F635679515A6DC09F156597 -56419AEE83034E3089075E727A4098B35E7F95A49B0D52128FF45F597A6B98E2 -51E050A24EF7835085915118636E6372524B5938774F8721814A7E8D91CC66C6 -5E1877AD9E7556C99EF46FDB61DE77C770309EB5884A95E282F951ED62514EC6 -673497C67C647E3497A69EAF786E820D672F677E56CC53F098B16AAF7F4E6D82 -7CF04E074FC27E6B9E7956AE9B1A846F53F690C179A67C72613F4E919AD20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -79 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075C796BB53EA7DFB88FD79CD78437B5151C6000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/gb1988.enc b/waypoint_manager/manager_GUI/tcl/encoding/gb1988.enc deleted file mode 100644 index 298732c..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/gb1988.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: gb1988, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -002000210022002300A500250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D203E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F -FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F -FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F -FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/gb2312-raw.enc b/waypoint_manager/manager_GUI/tcl/encoding/gb2312-raw.enc deleted file mode 100644 index 813d7a6..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/gb2312-raw.enc +++ /dev/null @@ -1,1380 +0,0 @@ -# Encoding file: gb2312, double-byte -D -233F 0 81 -21 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 -201C201D3014301530083009300A300B300C300D300E300F3016301730103011 -00B100D700F72236222722282211220F222A222922082237221A22A522252220 -23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 -22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 -25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -22 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000024882489248A248B248C248D248E248F2490249124922493249424952496 -249724982499249A249B247424752476247724782479247A247B247C247D247E -247F248024812482248324842485248624872460246124622463246424652466 -2467246824690000000032203221322232233224322532263227322832290000 -00002160216121622163216421652166216721682169216A216B000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -23 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -24 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -25 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -26 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -27 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -28 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 -00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 -0000000000000000000031053106310731083109310A310B310C310D310E310F -3110311131123113311431153116311731183119311A311B311C311D311E311F -3120312131223123312431253126312731283129000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -29 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000000000002500250125022503250425052506250725082509250A250B -250C250D250E250F2510251125122513251425152516251725182519251A251B -251C251D251E251F2520252125222523252425252526252725282529252A252B -252C252D252E252F2530253125322533253425352536253725382539253A253B -253C253D253E253F2540254125422543254425452546254725482549254A254B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 -978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 -888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB -9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 -73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E -6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -31 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 -535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 -5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 -6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 -7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B -522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -32 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B -82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 -601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 -6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 -4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 -62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -33 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D -56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 -5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA -627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A -8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 -4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -34 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE -7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF -882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A -847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC -810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE -7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -35 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 -86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC -905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA -654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 -63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 -53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -36 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 -680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A -72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD -7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 -591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 -5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -37 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE -94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F -963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F -6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 -7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 -4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -38 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 -8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A -54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 -611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 -818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 -845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -39 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E -62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D -4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC -52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF -704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 -684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD -558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E -8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 -76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC -4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 -543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 -8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 -71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C -604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F -79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 -706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 -53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E -796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 -59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C -76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 -62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B -686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 -56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 -53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED -6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 -91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 -666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 -7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 -62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 -8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 -652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A -582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 -577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF -554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F -82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 -7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -40 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000998861276E8357646606634656F062EC62695ED39614578362C955878721 -814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD -89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 -4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B -7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC -9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -41 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C -6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF -667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 -521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D -62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C -740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -42 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 -63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 -541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A -6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B -95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B -541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -43 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 -51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF -7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F -772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 -7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 -706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -44 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE -964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE -776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 -753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A -6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 -917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -45 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 -8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 -722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 -522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA -57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA -787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -46 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 -74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 -8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 -83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 -51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 -8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -47 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 -524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A -62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D -520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 -97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB -4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -48 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 -529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 -58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 -5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 -63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A -745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -49 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E -7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D -886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A -5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 -820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 -7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 -62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB -4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F -5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C -67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 -7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 -7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D -6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC -8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 -80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 -635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A -8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD -6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 -7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 -951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 -751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 -687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 -5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 -625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 -889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB -5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 -4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 -536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 -6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C -68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 -52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D -4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 -4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 -95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF -76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 -6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A -90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C -6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 -884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E -673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 -53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 -5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD -7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 -781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 -71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C -4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -52 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 -91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 -4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 -501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB -4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE -8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 -5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C -6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 -670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 -4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED -7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 -56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 -5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 -5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 -810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 -8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -55 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 -77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B -7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C -62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 -951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA -9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 -804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A -63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 -4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC -7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB -90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -57 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 -88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 -684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B -4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 -594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A -5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -58 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F -53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C -4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 -5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 -525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB -4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC -4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F -502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 -50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 -6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 -51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF -8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 -8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 -8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 -5369537A961D962296219631962A963D963C964296499654965F9667966C9672 -96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB -90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD -52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF -574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B -574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF -57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 -99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 -82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F -82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 -8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 -839B835E832F834F83478343835F834083178360832D833A8333836683650000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C -8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 -58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 -83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 -843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF -84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 -85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 -86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 -624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 -637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE -645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 -75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 -54435421545754595423543254825494547754715464549A549B548454765466 -549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC -54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 -5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005537555655755576557755335530555C558B55D2558355B155B955885581 -559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB -55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E -5608560C56015624562355FE56005627562D565856395657562C564D56625659 -565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 -56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -61 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 -5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 -5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F -5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 -5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 -72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000072FB731773137321730A731E731D7315732273397325732C733873317350 -734D73577360736C736F737E821B592598E7592459029963996799689969996A -996B996C99749977997D998099849987998A998D999099919993999499955E80 -5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA -5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 -60356026601B600F600D6029602B600A603F602160786079607B607A60420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 -60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 -61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 -9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 -6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 -6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -64 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F -6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 -6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E -6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 -6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 -6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -65 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 -704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 -8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 -900D9016902190359036902D902F9044905190529050906890589062905B66B9 -9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 -5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 -59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 -80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 -5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 -9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 -9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 -7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 -7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 -7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 -738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C -740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -68 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000741B741A7441745C7457745574597477746D747E749C748E748074817487 -748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 -67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 -680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD -6832683368606861684E6862684468646883681D68556866684168676840683E -684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -69 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000692468F0690B6901695768E369106971693969606942695D6984696B6980 -69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD -69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 -6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB -733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 -8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C -81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 -6600708566F7661D66346631663666358006665F66546641664F665666616657 -66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 -8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 -726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 -6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F -809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 -80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 -8C5A8136811E812C811881328148814C815381748159815A817181608169817C -817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 -5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C -7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C -716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D -7228706C7118716671B9623E623D624362486249793B794079467949795B795C -7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 -62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C -781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 -7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 -78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 -77077708771A77227719772D7726773577387750775177477743775A77680000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 -754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 -7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 -949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 -94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 -94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 -95079509950A950D950E950F951295139514951595169518951B951D951E951F -9522952A952B9529952C953195329534953695379538953C953E953F95429535 -9544954595469549954C954E954F9552955395549556955795589559955B955E -955F955D95619562956495659566956795689569956A956B956C956F95719572 -9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -70 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 -9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 -9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 -9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC -75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB -75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -71 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 -765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 -7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 -88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 -8966897B758B80E576B276B477DC801280148016801C80208022802580268027 -802980288031800B803580438046804D80528069807189839878988098830000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -72 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 -866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 -86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 -86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B -871E8725872E871A873E87488734873187298737873F87828722877D877E877B -87608770874C876E878B87538763877C876487598765879387AF87A887D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -73 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 -87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 -7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 -7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E -7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB -7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 -822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 -887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D -7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 -7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 -9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -75 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009162916191709169916F917D917E917291749179918C91859190918D9191 -91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 -8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 -8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 -8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F -8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -76 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A -972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 -96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F -9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E -9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 -9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -77 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 -977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA -9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 -990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F -9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 -9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/gb2312.enc b/waypoint_manager/manager_GUI/tcl/encoding/gb2312.enc deleted file mode 100644 index 4b2f8c7..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/gb2312.enc +++ /dev/null @@ -1,1397 +0,0 @@ -# Encoding file: euc-cn, multi-byte -M -003F 0 82 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 -201C201D3014301530083009300A300B300C300D300E300F3016301730103011 -00B100D700F72236222722282211220F222A222922082237221A22A522252220 -23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 -22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 -25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 -A2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000024882489248A248B248C248D248E248F2490249124922493249424952496 -249724982499249A249B247424752476247724782479247A247B247C247D247E -247F248024812482248324842485248624872460246124622463246424652466 -2467246824690000000032203221322232233224322532263227322832290000 -00002160216121622163216421652166216721682169216A216B000000000000 -A3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -A4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -A5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -A8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 -00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 -0000000000000000000031053106310731083109310A310B310C310D310E310F -3110311131123113311431153116311731183119311A311B311C311D311E311F -3120312131223123312431253126312731283129000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -A9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000000000002500250125022503250425052506250725082509250A250B -250C250D250E250F2510251125122513251425152516251725182519251A251B -251C251D251E251F2520252125222523252425252526252725282529252A252B -252C252D252E252F2530253125322533253425352536253725382539253A253B -253C253D253E253F2540254125422543254425452546254725482549254A254B -0000000000000000000000000000000000000000000000000000000000000000 -B0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 -978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 -888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB -9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 -73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E -6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 -B1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 -535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 -5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 -6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 -7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B -522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 -B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B -82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 -601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 -6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 -4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 -62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 -B3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D -56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 -5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA -627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A -8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 -4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 -B4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE -7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF -882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A -847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC -810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE -7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 -B5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 -86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC -905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA -654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 -63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 -53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 -B6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 -680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A -72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD -7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 -591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 -5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 -B7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE -94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F -963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F -6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 -7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 -4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 -B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 -8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A -54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 -611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 -818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 -845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 -B9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E -62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D -4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC -52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF -704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 -684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 -BA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD -558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E -8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 -76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC -4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 -543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 -BB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 -8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 -71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C -604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F -79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 -706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 -BC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 -53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E -796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 -59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C -76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 -62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 -BD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B -686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 -56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 -53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED -6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 -91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 -BE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 -666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 -7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 -62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 -8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 -652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 -BF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A -582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 -577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF -554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F -82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 -7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 -C0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000998861276E8357646606634656F062EC62695ED39614578362C955878721 -814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD -89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 -4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B -7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC -9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 -C1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C -6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF -667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 -521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D -62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C -740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 -C2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 -63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 -541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A -6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B -95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B -541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 -C3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 -51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF -7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F -772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 -7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 -706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 -C4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE -964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE -776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 -753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A -6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 -917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 -C5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 -8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 -722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 -522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA -57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA -787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 -C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 -74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 -8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 -83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 -51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 -8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 -C7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 -524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A -62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D -520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 -97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB -4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 -C8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 -529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 -58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 -5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 -63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A -745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 -C9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E -7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D -886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A -5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 -820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 -7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 -CA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 -62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB -4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F -5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C -67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 -7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 -CB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 -7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D -6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC -8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 -80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 -635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 -CC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A -8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD -6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 -7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 -951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 -751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 -CD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 -687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 -5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 -625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 -889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB -5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 -CE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 -4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 -536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 -6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C -68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 -52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 -CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D -4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 -4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 -95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF -76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 -6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 -D0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A -90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C -6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 -884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E -673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 -53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 -D1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 -5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD -7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 -781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 -71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C -4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 -D2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 -91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 -4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 -501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB -4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE -8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 -D3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 -5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C -6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 -670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 -4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED -7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 -D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 -56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 -5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 -5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 -810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 -8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 -D5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 -77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B -7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C -62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 -951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA -9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 -D6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 -804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A -63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 -4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC -7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB -90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 -D7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 -88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 -684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B -4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 -594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A -5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 -D8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F -53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C -4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 -5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 -525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB -4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 -D9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC -4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F -502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 -50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 -6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 -51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 -DA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF -8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 -8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 -8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 -5369537A961D962296219631962A963D963C964296499654965F9667966C9672 -96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 -DB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB -90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD -52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF -574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B -574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF -57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 -DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 -99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 -82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F -82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 -8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 -839B835E832F834F83478343835F834083178360832D833A8333836683650000 -DD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C -8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 -58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 -83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 -843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF -84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 -DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 -85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 -86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 -624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 -637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE -645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 -DF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 -75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 -54435421545754595423543254825494547754715464549A549B548454765466 -549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC -54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 -5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005537555655755576557755335530555C558B55D2558355B155B955885581 -559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB -55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E -5608560C56015624562355FE56005627562D565856395657562C564D56625659 -565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 -56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 -5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 -5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F -5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 -5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 -72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000072FB731773137321730A731E731D7315732273397325732C733873317350 -734D73577360736C736F737E821B592598E7592459029963996799689969996A -996B996C99749977997D998099849987998A998D999099919993999499955E80 -5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA -5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 -60356026601B600F600D6029602B600A603F602160786079607B607A60420000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 -60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 -61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 -9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 -6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 -6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F -6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 -6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E -6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 -6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 -6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 -704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 -8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 -900D9016902190359036902D902F9044905190529050906890589062905B66B9 -9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 -5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 -59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 -80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 -5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 -9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 -9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 -7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 -7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 -7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 -738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C -740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000741B741A7441745C7457745574597477746D747E749C748E748074817487 -748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 -67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 -680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD -6832683368606861684E6862684468646883681D68556866684168676840683E -684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000692468F0690B6901695768E369106971693969606942695D6984696B6980 -69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD -69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 -6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB -733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 -8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C -81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 -6600708566F7661D66346631663666358006665F66546641664F665666616657 -66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 -8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 -726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 -6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F -809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 -80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 -8C5A8136811E812C811881328148814C815381748159815A817181608169817C -817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 -5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C -7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C -716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D -7228706C7118716671B9623E623D624362486249793B794079467949795B795C -7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 -62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C -781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 -7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 -78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 -77077708771A77227719772D7726773577387750775177477743775A77680000 -EE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 -754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 -7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 -949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 -94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 -94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 -EF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 -95079509950A950D950E950F951295139514951595169518951B951D951E951F -9522952A952B9529952C953195329534953695379538953C953E953F95429535 -9544954595469549954C954E954F9552955395549556955795589559955B955E -955F955D95619562956495659566956795689569956A956B956C956F95719572 -9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 -F0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 -9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 -9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 -9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC -75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB -75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 -F1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 -765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 -7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 -88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 -8966897B758B80E576B276B477DC801280148016801C80208022802580268027 -802980288031800B803580438046804D80528069807189839878988098830000 -F2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 -866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 -86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 -86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B -871E8725872E871A873E87488734873187298737873F87828722877D877E877B -87608770874C876E878B87538763877C876487598765879387AF87A887D20000 -F3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 -87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 -7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 -7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E -7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB -7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 -F4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 -822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 -887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D -7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 -7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 -9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 -F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009162916191709169916F917D917E917291749179918C91859190918D9191 -91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 -8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 -8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 -8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F -8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 -F6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A -972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 -96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F -9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E -9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 -9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 -F7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 -977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA -9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 -990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F -9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 -9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso2022-jp.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso2022-jp.enc deleted file mode 100644 index f6dabe5..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso2022-jp.enc +++ /dev/null @@ -1,12 +0,0 @@ -# Encoding file: iso2022-jp, escape-driven -E -name iso2022-jp -init {} -final {} -ascii \x1b(B -jis0201 \x1b(J -jis0208 \x1b$B -jis0208 \x1b$@ -jis0212 \x1b$(D -gb2312 \x1b$A -ksc5601 \x1b$(C diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso2022-kr.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso2022-kr.enc deleted file mode 100644 index d20ce2b..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso2022-kr.enc +++ /dev/null @@ -1,7 +0,0 @@ -# Encoding file: iso2022-kr, escape-driven -E -name iso2022-kr -init \x1b$)C -final {} -iso8859-1 \x0f -ksc5601 \x0e diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso2022.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso2022.enc deleted file mode 100644 index a58f8e3..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso2022.enc +++ /dev/null @@ -1,14 +0,0 @@ -# Encoding file: iso2022, escape-driven -E -name iso2022 -init {} -final {} -iso8859-1 \x1b(B -jis0201 \x1b(J -gb1988 \x1b(T -jis0208 \x1b$B -jis0208 \x1b$@ -jis0212 \x1b$(D -gb2312 \x1b$A -ksc5601 \x1b$(C -jis0208 \x1b&@\x1b$B diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-1.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-1.enc deleted file mode 100644 index 045d8fa..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-1.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-1, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF -00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF -00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF -00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF -00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-10.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-10.enc deleted file mode 100644 index 934b3b9..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-10.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-10, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A0010401120122012A0128013600A7013B011001600166017D00AD016A014A -00B0010501130123012B0129013700B7013C011101610167017E2015016B014B -010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE00CF -00D00145014C00D300D400D500D6016800D8017200DA00DB00DC00DD00DE00DF -010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE00EF -00F00146014D00F300F400F500F6016900F8017300FA00FB00FC00FD00FE0138 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-13.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-13.enc deleted file mode 100644 index b7edcaf..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-13.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-13, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A0201D00A200A300A4201E00A600A700D800A9015600AB00AC00AD00AE00C6 -00B000B100B200B3201C00B500B600B700F800B9015700BB00BC00BD00BE00E6 -0104012E0100010600C400C501180112010C00C90179011601220136012A013B -01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF -0105012F0101010700E400E501190113010D00E9017A011701230137012B013C -01610144014600F3014D00F500F600F701730142015B016B00FC017C017E2019 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-14.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-14.enc deleted file mode 100644 index a65ba05..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-14.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-14, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A01E021E0300A3010A010B1E0A00A71E8000A91E821E0B1EF200AD00AE0178 -1E1E1E1F012001211E401E4100B61E561E811E571E831E601EF31E841E851E61 -00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF -017400D100D200D300D400D500D61E6A00D800D900DA00DB00DC00DD017600DF -00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF -017500F100F200F300F400F500F61E6B00F800F900FA00FB00FC00FD017700FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-15.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-15.enc deleted file mode 100644 index 823af46..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-15.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-15, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A000A100A200A320AC00A5016000A7016100A900AA00AB00AC00AD00AE00AF -00B000B100B200B3017D00B500B600B7017E00B900BA00BB01520153017800BF -00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF -00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF -00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF -00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-16.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-16.enc deleted file mode 100644 index da33709..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-16.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-16, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A001040105014120AC201E016000A7016100A9021800AB017900AD017A017B -00B000B1010C0142017D201D00B600B7017E010D021900BB015201530178017C -00C000C100C2010200C4010600C600C700C800C900CA00CB00CC00CD00CE00CF -0110014300D200D300D4015000D6015A017000D900DA00DB00DC0118021A00DF -00E000E100E2010300E4010700E600E700E800E900EA00EB00EC00ED00EE00EF -0111014400F200F300F4015100F6015B017100F900FA00FB00FC0119021B00FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-2.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-2.enc deleted file mode 100644 index 16faab6..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-2.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-2, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A0010402D8014100A4013D015A00A700A80160015E0164017900AD017D017B -00B0010502DB014200B4013E015B02C700B80161015F0165017A02DD017E017C -015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E -01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF -015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F -01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-3.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-3.enc deleted file mode 100644 index c914bce..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-3.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-3, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A0012602D800A300A40000012400A700A80130015E011E013400AD0000017B -00B0012700B200B300B400B5012500B700B80131015F011F013500BD0000017C -00C000C100C2000000C4010A010800C700C800C900CA00CB00CC00CD00CE00CF -000000D100D200D300D4012000D600D7011C00D900DA00DB00DC016C015C00DF -00E000E100E2000000E4010B010900E700E800E900EA00EB00EC00ED00EE00EF -000000F100F200F300F4012100F600F7011D00F900FA00FB00FC016D015D02D9 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-4.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-4.enc deleted file mode 100644 index ef5c5a9..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-4.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-4, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A001040138015600A40128013B00A700A8016001120122016600AD017D00AF -00B0010502DB015700B40129013C02C700B80161011301230167014A017E014B -010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE012A -01100145014C013600D400D500D600D700D8017200DA00DB00DC0168016A00DF -010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE012B -01110146014D013700F400F500F600F700F8017300FA00FB00FC0169016B02D9 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-5.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-5.enc deleted file mode 100644 index bf4ee82..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-5.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-5, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A0040104020403040404050406040704080409040A040B040C00AD040E040F -0410041104120413041404150416041704180419041A041B041C041D041E041F -0420042104220423042404250426042704280429042A042B042C042D042E042F -0430043104320433043404350436043704380439043A043B043C043D043E043F -0440044104420443044404450446044704480449044A044B044C044D044E044F -2116045104520453045404550456045704580459045A045B045C00A7045E045F diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-6.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-6.enc deleted file mode 100644 index 19ddefb..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-6.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-6, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A000000000000000A40000000000000000000000000000060C00AD00000000 -00000000000000000000000000000000000000000000061B000000000000061F -0000062106220623062406250626062706280629062A062B062C062D062E062F -0630063106320633063406350636063706380639063A00000000000000000000 -0640064106420643064406450646064706480649064A064B064C064D064E064F -0650065106520000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-7.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-7.enc deleted file mode 100644 index 0f93ac8..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-7.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-7, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A02018201900A30000000000A600A700A800A9000000AB00AC00AD00002015 -00B000B100B200B303840385038600B703880389038A00BB038C00BD038E038F -0390039103920393039403950396039703980399039A039B039C039D039E039F -03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF -03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-8.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-8.enc deleted file mode 100644 index 579fa5b..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-8.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-8, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A0000000A200A300A400A500A600A700A800A900D700AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000002017 -05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF -05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-9.enc b/waypoint_manager/manager_GUI/tcl/encoding/iso8859-9.enc deleted file mode 100644 index 6eed3f1..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/iso8859-9.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: iso8859-9, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF -00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF -00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF -011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF -00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF -011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF diff --git a/waypoint_manager/manager_GUI/tcl/encoding/jis0201.enc b/waypoint_manager/manager_GUI/tcl/encoding/jis0201.enc deleted file mode 100644 index 64f423f..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/jis0201.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: jis0201, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D203E007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F -FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F -FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F -FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/jis0208.enc b/waypoint_manager/manager_GUI/tcl/encoding/jis0208.enc deleted file mode 100644 index 11c49a4..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/jis0208.enc +++ /dev/null @@ -1,1319 +0,0 @@ -# Encoding file: jis0208, double-byte -D -2129 0 77 -21 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8 -FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F -FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D -FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7 -00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 -FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -22 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000025C625A125A025B325B225BD25BC203B3012219221902191219330130000 -00000000000000000000000000000000000000002208220B2286228722822283 -222A2229000000000000000000000000000000002227222800AC21D221D42200 -220300000000000000000000000000000000000000000000222022A523122202 -220722612252226A226B221A223D221D2235222B222C00000000000000000000 -00000000212B2030266F266D266A2020202100B6000000000000000025EF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -23 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000 -0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000 -0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -24 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -25 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -26 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -27 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -28 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000025002502250C251025182514251C252C25242534253C25012503250F2513 -251B251725232533252B253B254B2520252F25282537253F251D253025252538 -2542000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25 -65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216 -7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2 -593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3 -840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038 -7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -31 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11 -789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B -96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E -983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186 -5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 -827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -32 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104 -5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55 -4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3 -706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8 -8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5 -4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -33 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE -591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9 -57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B -899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B -6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 -53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -34 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6 -5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53 -6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266 -839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8 -5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668 -57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -35 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77 -8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591 -79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775 -9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551 -673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 -5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -36 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37 -5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7 -93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5 -52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F -8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8 -99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -37 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B -85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B -59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB -7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8 -5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 -503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -38 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063 -9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237 -8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF -6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92 -4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190 -4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -39 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7 -5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A -6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1 -8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D -980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B -544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5 -7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396 -88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D -6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728 -67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A -548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652 -4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB -9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB -59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62 -6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C -8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F -5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06 -75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66 -659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235 -914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E -816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490 -884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E -67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F -51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3 -6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 -7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11 -5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2 -6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0 -7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4 -9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38 -60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5 -55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F -795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203 -587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8 -9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F -745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -40 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F -6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0 -8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790 -77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D -7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226 -624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -41 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE -524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A -72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275 -53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB -64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 -83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -42 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7 -5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A -592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806 -5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8 -9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544 -5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -43 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0 -4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D -80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730 -5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4 -901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 -8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -44 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A -80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715 -6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4 -69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A -91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F -608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -45 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2 -5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B -70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21 -767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC -51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF -76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -46 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD -52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F -5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A -9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D -594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960 -8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -47 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74 -5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF -8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC -4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885 -6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD -67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -48 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A -91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD -53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4 -91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87 -5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB -8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -49 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C -686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79 -5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7 -8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577 -65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB -6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3 -61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73 -5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86 -504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA -570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023 -4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2 -98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0 -68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8 -64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6 -646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE -9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999 -7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D -660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21 -830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905 -5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25 -77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67 -6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E -8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6 -719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32 -6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A -4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C -74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC -5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B -7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F -985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97 -9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717 -697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332 -8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568 -69006E7E78978155000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A -82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7 -4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B -4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4 -4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006 -504350476703505550505048505A5056506C50785080509A508550B450B20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102 -511651155114511A5121513A5137513C513B513F51405152514C515451627AF8 -5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2 -51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED -51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C -525E5254526A527452695273527F527D528D529452925271528852918FA80000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -52 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5 -52F852F9530653087538530D5310530F5315531A5323532F5331533353385340 -534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6 -53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D -5440542C542D543C542E54365429541D544E548F5475548E545F547154775470 -5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2 -553955405563554C552E555C55455556555755385533555D5599558054AF558A -559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC -55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638 -566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 -56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005708570B570D57135718571655C7571C572657375738574E573B5740574F -576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2 -57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879 -588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5 -58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C -592D59325938593E7AD259555950594E595A5958596259605967596C59690000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -55 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F -5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2 -5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E -5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80 -5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 -5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6 -5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C -5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87 -5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB -5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54 -5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -57 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8 -5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F -5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E -5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060 -601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F -604A6046604D6063604360646042606C606B60596081608D60E76083609A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -58 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6 -60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E -6147613E61286127614A613F613C612C6134613D614261446173617761586159 -615A616B6174616F61656171615F615D6153617561996196618761AC6194619A -618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6 -61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000621E6221622A622E6230623262336241624E625E6263625B62606268627C -62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4 -62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5 -6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B -636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 -651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF -652C64F664F464F264FA650064FD6518651C650565246523652B653465356537 -65366538754B654865566555654D6558655E655D65726578658265838B8A659B -659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A -660365FB6773663566366634661C664F664466496641665E665D666466676668 -665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726 -67279738672E673F67366741673867376746675E676067596763676467896770 -67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4 -67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E -68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 -68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A -6923692168C669796977695C6978696B6954697E696E69396974693D69596930 -6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD -69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9 -69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72 -6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB -6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50 -6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4 -6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF -9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B -6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12 -6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7 -6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D -6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24 -6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F -6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58 -6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8 -6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F -7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD -70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 -719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246 -724B72587274727E7282728172877292729672A272A772B972B272C372C672C4 -72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329 -7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE -73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459 -7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -61 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E -750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564 -7567756B756D75787576758675877574758A758975827594759A759D75A575A3 -75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF -75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 -7630763B764776487646765C76587661766276687669766A7667766C76700000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000767276767678767C768076837688768B768E769676937699769A76B076B4 -76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707 -770477297724771E77257726771B773777387747775A7768776B775B7765777F -777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD -77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C -789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000078E778DA78FD78F47907791279117919792C792B794079607957795F795A -79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7 -79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57 -7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0 -7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 -7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -64 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D -7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6 -7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23 -7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56 -7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9 -7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -65 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72 -7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD -7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05 -7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37 -7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D -8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78 -7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6 -7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B -801280188019801C80218028803F803B804A804680528058805A805F80628068 -80738072807080768079807D807F808480868085809B8093809A80AD519080AC -80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000968B8146813E8153815180FC8171816E81658166817481838188818A8180 -818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA -81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205 -8207820A820D821082168229822B82388233824082598258825D825A825F8264 -82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 -82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -68 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000833583348316833283318340833983508345832F832B831783188385839A -83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4 -841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD -8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C -846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6 -84A1852184FF84F485178518852C851F8515851484FC85408563855885480000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -69 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587 -859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613 -860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3 -86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC -86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F -8737873B87258729871A8760875F8778874C874E877487578768876E87590000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4 -87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816 -8815882288218831883688398827883B8844884288528859885E8862886B8881 -887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF -88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A -89138943891E8925892A892B89418944893B89368938894C891D8960895E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000089668964896D896A896F89748977897E89838988898A8993899889A189A9 -89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16 -8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85 -8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7 -8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 -8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41 -8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E -8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA -8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67 -8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB -8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81 -8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE -8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C -8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C -8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 -90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000904F905090519052900E9049903E90569058905E9068906F907696A89072 -9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102 -9112911991329130914A9156915891639165916991739172918B9189918291A2 -91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC -91F591F6921E91FF9214922C92159211925E925792459249926492489295923F -924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD -939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403 -940794109436942B94359421943A944194529444945B94609462945E946A9229 -947094759477947D945A947C947E9481947F95829587958A9594959695989599 -95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 -95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -70 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4 -96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713 -970E9711970F971697199724972A97309739973D973E97449746974897429749 -975C976097649766976852D2976B977197799785977C9781977A9786978B978F -9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF -97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -71 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912 -991499189921991D991E99249920992C992E993D993E9942994999459950994B -99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED -99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43 -9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 -9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -72 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32 -9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8 -9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1 -9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21 -9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB -9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -73 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9 -9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD -9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9 -9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF -9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 -9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000582F69C79059746451DC7199000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -R -2141 301C FF5E -2142 2016 2225 -215D 2212 FF0D -2171 00A2 FFE0 -2172 00A3 FFE1 -224C 00AC FFE2 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/jis0212.enc b/waypoint_manager/manager_GUI/tcl/encoding/jis0212.enc deleted file mode 100644 index cddbbba..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/jis0212.enc +++ /dev/null @@ -1,1159 +0,0 @@ -# Encoding file: jis0212, double-byte -D -2244 0 68 -22 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000002D8 -02C700B802D902DD00AF02DB02DA007E03840385000000000000000000000000 -0000000000A100A600BF00000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000BA00AA00A900AE2122 -00A4211600000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -26 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000038603880389038A03AA0000038C0000038E03AB0000038F000000000000 -000003AC03AD03AE03AF03CA039003CC03C203CD03CB03B003CE000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -27 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000004020403040404050406040704080409040A040B040C040E040F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000004520453045404550456045704580459045A045B045C045E045F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -29 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000C60110000001260000013200000141013F0000014A00D8015200000166 -00DE000000000000000000000000000000000000000000000000000000000000 -000000E6011100F00127013101330138014201400149014B00F8015300DF0167 -00FE000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000C100C000C400C2010201CD0100010400C500C301060108010C00C7010A -010E00C900C800CB00CA011A0116011201180000011C011E01220120012400CD -00CC00CF00CE01CF0130012A012E0128013401360139013D013B014301470145 -00D100D300D200D600D401D10150014C00D5015401580156015A015C0160015E -0164016200DA00D900DC00DB016C01D30170016A0172016E016801D701DB01D9 -01D5017400DD017801760179017D017B00000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000E100E000E400E2010301CE0101010500E500E301070109010D00E7010B -010F00E900E800EB00EA011B01170113011901F5011D011F00000121012500ED -00EC00EF00EE01D00000012B012F012901350137013A013E013C014401480146 -00F100F300F200F600F401D20151014D00F5015501590157015B015D0161015F -0165016300FA00F900FC00FB016D01D40171016B0173016F016901D801DC01DA -01D6017500FD00FF0177017A017E017C00000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E024E044E054E0C4E124E1F4E234E244E284E2B4E2E4E2F4E304E354E40 -4E414E444E474E514E5A4E5C4E634E684E694E744E754E794E7F4E8D4E964E97 -4E9D4EAF4EB94EC34ED04EDA4EDB4EE04EE14EE24EE84EEF4EF14EF34EF54EFD -4EFE4EFF4F004F024F034F084F0B4F0C4F124F154F164F174F194F2E4F314F60 -4F334F354F374F394F3B4F3E4F404F424F484F494F4B4F4C4F524F544F564F58 -4F5F4F634F6A4F6C4F6E4F714F774F784F794F7A4F7D4F7E4F814F824F840000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -31 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F854F894F8A4F8C4F8E4F904F924F934F944F974F994F9A4F9E4F9F4FB2 -4FB74FB94FBB4FBC4FBD4FBE4FC04FC14FC54FC64FC84FC94FCB4FCC4FCD4FCF -4FD24FDC4FE04FE24FF04FF24FFC4FFD4FFF5000500150045007500A500C500E -5010501350175018501B501C501D501E50225027502E50305032503350355040 -5041504250455046504A504C504E50515052505350575059505F506050625063 -50665067506A506D50705071503B5081508350845086508A508E508F50900000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -32 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005092509350945096509B509C509E509F50A050A150A250AA50AF50B050B9 -50BA50BD50C050C350C450C750CC50CE50D050D350D450D850DC50DD50DF50E2 -50E450E650E850E950EF50F150F650FA50FE5103510651075108510B510C510D -510E50F2511051175119511B511C511D511E512351275128512C512D512F5131 -513351345135513851395142514A514F5153515551575158515F51645166517E -51835184518B518E5198519D51A151A351AD51B851BA51BC51BE51BF51C20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -33 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000051C851CF51D151D251D351D551D851DE51E251E551EE51F251F351F451F7 -5201520252055212521352155216521852225228523152325235523C52455249 -525552575258525A525C525F526052615266526E527752785279528052825285 -528A528C52935295529652975298529A529C52A452A552A652A752AF52B052B6 -52B752B852BA52BB52BD52C052C452C652C852CC52CF52D152D452D652DB52DC -52E152E552E852E952EA52EC52F052F152F452F652F753005303530A530B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -34 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000530C531153135318531B531C531E531F5325532753285329532B532C532D -533053325335533C533D533E5342534C534B5359535B536153635365536C536D -53725379537E538353875388538E539353945399539D53A153A453AA53AB53AF -53B253B453B553B753B853BA53BD53C053C553CF53D253D353D553DA53DD53DE -53E053E653E753F554025413541A542154275428542A542F5431543454355443 -54445447544D544F545E54625464546654675469546B546D546E5474547F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -35 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054815483548554885489548D549154955496549C549F54A154A654A754A9 -54AA54AD54AE54B154B754B954BA54BB54BF54C654CA54CD54CE54E054EA54EC -54EF54F654FC54FE54FF55005501550555085509550C550D550E5515552A552B -553255355536553B553C553D554155475549554A554D555055515558555A555B -555E5560556155645566557F5581558255865588558E558F5591559255935594 -559755A355A455AD55B255BF55C155C355C655C955CB55CC55CE55D155D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -36 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000055D355D755D855DB55DE55E255E955F655FF56055608560A560D560E560F -5610561156125619562C56305633563556375639563B563C563D563F56405641 -5643564456465649564B564D564F5654565E566056615662566356665669566D -566F567156725675568456855688568B568C56955699569A569D569E569F56A6 -56A756A856A956AB56AC56AD56B156B356B756BE56C556C956CA56CB56CF56D0 -56CC56CD56D956DC56DD56DF56E156E456E556E656E756E856F156EB56ED0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -37 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000056F656F7570157025707570A570C57115715571A571B571D572057225723 -572457255729572A572C572E572F57335734573D573E573F57455746574C574D -57525762576557675768576B576D576E576F5770577157735774577557775779 -577A577B577C577E57815783578C579457975799579A579C579D579E579F57A1 -579557A757A857A957AC57B857BD57C757C857CC57CF57D557DD57DE57E457E6 -57E757E957ED57F057F557F657F857FD57FE57FF580358045808580957E10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -38 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000580C580D581B581E581F582058265827582D58325839583F5849584C584D -584F58505855585F58615864586758685878587C587F58805881588758885889 -588A588C588D588F589058945896589D58A058A158A258A658A958B158B258C4 -58BC58C258C858CD58CE58D058D258D458D658DA58DD58E158E258E958F35905 -5906590B590C5912591359148641591D5921592359245928592F593059335935 -5936593F59435946595259535959595B595D595E595F59615963596B596D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -39 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000596F5972597559765979597B597C598B598C598E599259955997599F59A4 -59A759AD59AE59AF59B059B359B759BA59BC59C159C359C459C859CA59CD59D2 -59DD59DE59DF59E359E459E759EE59EF59F159F259F459F75A005A045A0C5A0D -5A0E5A125A135A1E5A235A245A275A285A2A5A2D5A305A445A455A475A485A4C -5A505A555A5E5A635A655A675A6D5A775A7A5A7B5A7E5A8B5A905A935A965A99 -5A9C5A9E5A9F5AA05AA25AA75AAC5AB15AB25AB35AB55AB85ABA5ABB5ABF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005AC45AC65AC85ACF5ADA5ADC5AE05AE55AEA5AEE5AF55AF65AFD5B005B01 -5B085B175B345B195B1B5B1D5B215B255B2D5B385B415B4B5B4C5B525B565B5E -5B685B6E5B6F5B7C5B7D5B7E5B7F5B815B845B865B8A5B8E5B905B915B935B94 -5B965BA85BA95BAC5BAD5BAF5BB15BB25BB75BBA5BBC5BC05BC15BCD5BCF5BD6 -5BD75BD85BD95BDA5BE05BEF5BF15BF45BFD5C0C5C175C1E5C1F5C235C265C29 -5C2B5C2C5C2E5C305C325C355C365C595C5A5C5C5C625C635C675C685C690000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005C6D5C705C745C755C7A5C7B5C7C5C7D5C875C885C8A5C8F5C925C9D5C9F -5CA05CA25CA35CA65CAA5CB25CB45CB55CBA5CC95CCB5CD25CDD5CD75CEE5CF1 -5CF25CF45D015D065D0D5D125D2B5D235D245D265D275D315D345D395D3D5D3F -5D425D435D465D485D555D515D595D4A5D5F5D605D615D625D645D6A5D6D5D70 -5D795D7A5D7E5D7F5D815D835D885D8A5D925D935D945D955D995D9B5D9F5DA0 -5DA75DAB5DB05DB45DB85DB95DC35DC75DCB5DD05DCE5DD85DD95DE05DE40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005DE95DF85DF95E005E075E0D5E125E145E155E185E1F5E205E2E5E285E32 -5E355E3E5E4B5E505E495E515E565E585E5B5E5C5E5E5E685E6A5E6B5E6C5E6D -5E6E5E705E805E8B5E8E5EA25EA45EA55EA85EAA5EAC5EB15EB35EBD5EBE5EBF -5EC65ECC5ECB5ECE5ED15ED25ED45ED55EDC5EDE5EE55EEB5F025F065F075F08 -5F0E5F195F1C5F1D5F215F225F235F245F285F2B5F2C5F2E5F305F345F365F3B -5F3D5F3F5F405F445F455F475F4D5F505F545F585F5B5F605F635F645F670000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F6F5F725F745F755F785F7A5F7D5F7E5F895F8D5F8F5F965F9C5F9D5FA2 -5FA75FAB5FA45FAC5FAF5FB05FB15FB85FC45FC75FC85FC95FCB5FD05FD15FD2 -5FD35FD45FDE5FE15FE25FE85FE95FEA5FEC5FED5FEE5FEF5FF25FF35FF65FFA -5FFC6007600A600D6013601460176018601A601F6024602D6033603560406047 -60486049604C6051605460566057605D606160676071607E607F608260866088 -608A608E6091609360956098609D609E60A260A460A560A860B060B160B70000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000060BB60BE60C260C460C860C960CA60CB60CE60CF60D460D560D960DB60DD -60DE60E260E560F260F560F860FC60FD61026107610A610C6110611161126113 -6114611661176119611C611E6122612A612B6130613161356136613761396141 -614561466149615E6160616C61726178617B617C617F6180618161836184618B -618D6192619361976198619C619D619F61A061A561A861AA61AD61B861B961BC -61C061C161C261CE61CF61D561DC61DD61DE61DF61E161E261E761E961E50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000061EC61ED61EF620162036204620762136215621C62206222622362276229 -622B6239623D6242624362446246624C62506251625262546256625A625C6264 -626D626F6273627A627D628D628E628F629062A662A862B362B662B762BA62BE -62BF62C462CE62D562D662DA62EA62F262F462FC62FD63036304630A630B630D -63106313631663186329632A632D633563366339633C63416342634363446346 -634A634B634E6352635363546358635B63656366636C636D6371637463750000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -40 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006378637C637D637F638263846387638A6390639463956399639A639E63A4 -63A663AD63AE63AF63BD63C163C563C863CE63D163D363D463D563DC63E063E5 -63EA63EC63F263F363F563F863F96409640A6410641264146418641E64206422 -642464256429642A642F64306435643D643F644B644F6451645264536454645A -645B645C645D645F646064616463646D64736474647B647D64856487648F6490 -649164986499649B649D649F64A164A364A664A864AC64B364BD64BE64BF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -41 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000064C464C964CA64CB64CC64CE64D064D164D564D764E464E564E964EA64ED -64F064F564F764FB64FF6501650465086509650A650F6513651465166519651B -651E651F652265266529652E6531653A653C653D654365476549655065526554 -655F65606567656B657A657D65816585658A659265956598659D65A065A365A6 -65AE65B265B365B465BF65C265C865C965CE65D065D465D665D865DF65F065F2 -65F465F565F965FE65FF6600660466086609660D6611661266156616661D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -42 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000661E662166226623662466266629662A662B662C662E6630663166336639 -6637664066456646664A664C6651664E665766586659665B665C6660666166FB -666A666B666C667E66736675667F667766786679667B6680667C668B668C668D -669066926699669A669B669C669F66A066A466AD66B166B266B566BB66BF66C0 -66C266C366C866CC66CE66CF66D466DB66DF66E866EB66EC66EE66FA67056707 -670E67136719671C672067226733673E674567476748674C67546755675D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -43 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006766676C676E67746776677B67816784678E678F67916793679667986799 -679B67B067B167B267B567BB67BC67BD67F967C067C267C367C567C867C967D2 -67D767D967DC67E167E667F067F267F667F7685268146819681D681F68286827 -682C682D682F683068316833683B683F68446845684A684C685568576858685B -686B686E686F68706871687268756879687A687B687C68826884688668886896 -6898689A689C68A168A368A568A968AA68AE68B268BB68C568C868CC68CF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -44 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068D068D168D368D668D968DC68DD68E568E868EA68EB68EC68ED68F068F1 -68F568F668FB68FC68FD69066909690A69106911691369166917693169336935 -6938693B694269456949694E6957695B696369646965696669686969696C6970 -69716972697A697B697F6980698D69926996699869A169A569A669A869AB69AD -69AF69B769B869BA69BC69C569C869D169D669D769E269E569EE69EF69F169F3 -69F569FE6A006A016A036A0F6A116A156A1A6A1D6A206A246A286A306A320000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -45 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006A346A376A3B6A3E6A3F6A456A466A496A4A6A4E6A506A516A526A556A56 -6A5B6A646A676A6A6A716A736A7E6A816A836A866A876A896A8B6A916A9B6A9D -6A9E6A9F6AA56AAB6AAF6AB06AB16AB46ABD6ABE6ABF6AC66AC96AC86ACC6AD0 -6AD46AD56AD66ADC6ADD6AE46AE76AEC6AF06AF16AF26AFC6AFD6B026B036B06 -6B076B096B0F6B106B116B176B1B6B1E6B246B286B2B6B2C6B2F6B356B366B3B -6B3F6B466B4A6B4D6B526B566B586B5D6B606B676B6B6B6E6B706B756B7D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -46 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006B7E6B826B856B976B9B6B9F6BA06BA26BA36BA86BA96BAC6BAD6BAE6BB0 -6BB86BB96BBD6BBE6BC36BC46BC96BCC6BD66BDA6BE16BE36BE66BE76BEE6BF1 -6BF76BF96BFF6C026C046C056C096C0D6C0E6C106C126C196C1F6C266C276C28 -6C2C6C2E6C336C356C366C3A6C3B6C3F6C4A6C4B6C4D6C4F6C526C546C596C5B -6C5C6C6B6C6D6C6F6C746C766C786C796C7B6C856C866C876C896C946C956C97 -6C986C9C6C9F6CB06CB26CB46CC26CC66CCD6CCF6CD06CD16CD26CD46CD60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -47 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006CDA6CDC6CE06CE76CE96CEB6CEC6CEE6CF26CF46D046D076D0A6D0E6D0F -6D116D136D1A6D266D276D286C676D2E6D2F6D316D396D3C6D3F6D576D5E6D5F -6D616D656D676D6F6D706D7C6D826D876D916D926D946D966D976D986DAA6DAC -6DB46DB76DB96DBD6DBF6DC46DC86DCA6DCE6DCF6DD66DDB6DDD6DDF6DE06DE2 -6DE56DE96DEF6DF06DF46DF66DFC6E006E046E1E6E226E276E326E366E396E3B -6E3C6E446E456E486E496E4B6E4F6E516E526E536E546E576E5C6E5D6E5E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -48 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006E626E636E686E736E7B6E7D6E8D6E936E996EA06EA76EAD6EAE6EB16EB3 -6EBB6EBF6EC06EC16EC36EC76EC86ECA6ECD6ECE6ECF6EEB6EED6EEE6EF96EFB -6EFD6F046F086F0A6F0C6F0D6F166F186F1A6F1B6F266F296F2A6F2F6F306F33 -6F366F3B6F3C6F2D6F4F6F516F526F536F576F596F5A6F5D6F5E6F616F626F68 -6F6C6F7D6F7E6F836F876F886F8B6F8C6F8D6F906F926F936F946F966F9A6F9F -6FA06FA56FA66FA76FA86FAE6FAF6FB06FB56FB66FBC6FC56FC76FC86FCA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -49 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FDA6FDE6FE86FE96FF06FF56FF96FFC6FFD7000700570067007700D7017 -70207023702F703470377039703C7043704470487049704A704B70547055705D -705E704E70647065706C706E70757076707E7081708570867094709570967097 -7098709B70A470AB70B070B170B470B770CA70D170D370D470D570D670D870DC -70E470FA71037104710571067107710B710C710F711E7120712B712D712F7130 -713171387141714571467147714A714B715071527157715A715C715E71600000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000071687179718071857187718C7192719A719B71A071A271AF71B071B271B3 -71BA71BF71C071C171C471CB71CC71D371D671D971DA71DC71F871FE72007207 -7208720972137217721A721D721F7224722B722F723472387239724172427243 -7245724E724F7250725372557256725A725C725E726072637268726B726E726F -727172777278727B727C727F72847289728D728E7293729B72A872AD72AE72B1 -72B472BE72C172C772C972CC72D572D672D872DF72E572F372F472FA72FB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000072FE7302730473057307730B730D7312731373187319731E732273247327 -7328732C733173327335733A733B733D7343734D7350735273567358735D735E -735F7360736673677369736B736C736E736F737173777379737C738073817383 -73857386738E73907393739573977398739C739E739F73A073A273A573A673AA -73AB73AD73B573B773B973BC73BD73BF73C573C673C973CB73CC73CF73D273D3 -73D673D973DD73E173E373E673E773E973F473F573F773F973FA73FB73FD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000073FF7400740174047407740A7411741A741B7424742674287429742A742B -742C742D742E742F74307431743974407443744474467447744B744D74517452 -7457745D7462746674677468746B746D746E7471747274807481748574867487 -7489748F74907491749274987499749A749C749F74A074A174A374A674A874A9 -74AA74AB74AE74AF74B174B274B574B974BB74BF74C874C974CC74D074D374D8 -74DA74DB74DE74DF74E474E874EA74EB74EF74F474FA74FB74FC74FF75060000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000075127516751775207521752475277529752A752F75367539753D753E753F -7540754375477548754E755075527557755E755F7561756F75717579757A757B -757C757D757E7581758575907592759375957599759C75A275A475B475BA75BF -75C075C175C475C675CC75CE75CF75D775DC75DF75E075E175E475E775EC75EE -75EF75F175F9760076027603760476077608760A760C760F7612761376157616 -7619761B761C761D761E7623762576267629762D763276337635763876390000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000763A763C764A764076417643764476457649764B76557659765F76647665 -766D766E766F7671767476817685768C768D7695769B769C769D769F76A076A2 -76A376A476A576A676A776A876AA76AD76BD76C176C576C976CB76CC76CE76D4 -76D976E076E676E876EC76F076F176F676F976FC77007706770A770E77127714 -771577177719771A771C77227728772D772E772F7734773577367739773D773E -774277457746774A774D774E774F775277567757775C775E775F776077620000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077647767776A776C7770777277737774777A777D77807784778C778D7794 -77957796779A779F77A277A777AA77AE77AF77B177B577BE77C377C977D177D2 -77D577D977DE77DF77E077E477E677EA77EC77F077F177F477F877FB78057806 -7809780D780E7811781D782178227823782D782E783078357837784378447847 -7848784C784E7852785C785E78607861786378647868786A786E787A787E788A -788F7894789878A1789D789E789F78A478A878AC78AD78B078B178B278B30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000078BB78BD78BF78C778C878C978CC78CE78D278D378D578D678E478DB78DF -78E078E178E678EA78F278F3790078F678F778FA78FB78FF7906790C7910791A -791C791E791F7920792579277929792D793179347935793B793D793F79447945 -7946794A794B794F795179547958795B795C79677969796B79727979797B797C -797E798B798C799179937994799579967998799B799C79A179A879A979AB79AF -79B179B479B879BB79C279C479C779C879CA79CF79D479D679DA79DD79DE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079E079E279E579EA79EB79ED79F179F879FC7A027A037A077A097A0A7A0C -7A117A157A1B7A1E7A217A277A2B7A2D7A2F7A307A347A357A387A397A3A7A44 -7A457A477A487A4C7A557A567A597A5C7A5D7A5F7A607A657A677A6A7A6D7A75 -7A787A7E7A807A827A857A867A8A7A8B7A907A917A947A9E7AA07AA37AAC7AB3 -7AB57AB97ABB7ABC7AC67AC97ACC7ACE7AD17ADB7AE87AE97AEB7AEC7AF17AF4 -7AFB7AFD7AFE7B077B147B1F7B237B277B297B2A7B2B7B2D7B2E7B2F7B300000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -52 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007B317B347B3D7B3F7B407B417B477B4E7B557B607B647B667B697B6A7B6D -7B6F7B727B737B777B847B897B8E7B907B917B967B9B7B9E7BA07BA57BAC7BAF -7BB07BB27BB57BB67BBA7BBB7BBC7BBD7BC27BC57BC87BCA7BD47BD67BD77BD9 -7BDA7BDB7BE87BEA7BF27BF47BF57BF87BF97BFA7BFC7BFE7C017C027C037C04 -7C067C097C0B7C0C7C0E7C0F7C197C1B7C207C257C267C287C2C7C317C337C34 -7C367C397C3A7C467C4A7C557C517C527C537C597C5A7C5B7C5C7C5D7C5E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007C617C637C677C697C6D7C6E7C707C727C797C7C7C7D7C867C877C8F7C94 -7C9E7CA07CA67CB07CB67CB77CBA7CBB7CBC7CBF7CC47CC77CC87CC97CCD7CCF -7CD37CD47CD57CD77CD97CDA7CDD7CE67CE97CEB7CF57D037D077D087D097D0F -7D117D127D137D167D1D7D1E7D237D267D2A7D2D7D317D3C7D3D7D3E7D407D41 -7D477D487D4D7D517D537D577D597D5A7D5C7D5D7D657D677D6A7D707D787D7A -7D7B7D7F7D817D827D837D857D867D887D8B7D8C7D8D7D917D967D977D9D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007D9E7DA67DA77DAA7DB37DB67DB77DB97DC27DC37DC47DC57DC67DCC7DCD -7DCE7DD77DD97E007DE27DE57DE67DEA7DEB7DED7DF17DF57DF67DF97DFA7E08 -7E107E117E157E177E1C7E1D7E207E277E287E2C7E2D7E2F7E337E367E3F7E44 -7E457E477E4E7E507E527E587E5F7E617E627E657E6B7E6E7E6F7E737E787E7E -7E817E867E877E8A7E8D7E917E957E987E9A7E9D7E9E7F3C7F3B7F3D7F3E7F3F -7F437F447F477F4F7F527F537F5B7F5C7F5D7F617F637F647F657F667F6D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -55 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007F717F7D7F7E7F7F7F807F8B7F8D7F8F7F907F917F967F977F9C7FA17FA2 -7FA67FAA7FAD7FB47FBC7FBF7FC07FC37FC87FCE7FCF7FDB7FDF7FE37FE57FE8 -7FEC7FEE7FEF7FF27FFA7FFD7FFE7FFF80078008800A800D800E800F80118013 -80148016801D801E801F802080248026802C802E80308034803580378039803A -803C803E80408044806080648066806D8071807580818088808E809C809E80A6 -80A780AB80B880B980C880CD80CF80D280D480D580D780D880E080ED80EE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000080F080F280F380F680F980FA80FE8103810B811681178118811C811E8120 -81248127812C81308135813A813C81458147814A814C81528157816081618167 -81688169816D816F817781818190818481858186818B818E81968198819B819E -81A281AE81B281B481BB81CB81C381C581CA81CE81CF81D581D781DB81DD81DE -81E181E481EB81EC81F081F181F281F581F681F881F981FD81FF82008203820F -821382148219821A821D82218222822882328234823A82438244824582460000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -57 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000824B824E824F82518256825C826082638267826D8274827B827D827F8280 -82818283828482878289828A828E8291829482968298829A829B82A082A182A3 -82A482A782A882A982AA82AE82B082B282B482B782BA82BC82BE82BF82C682D0 -82D582DA82E082E282E482E882EA82ED82EF82F682F782FD82FE830083018307 -8308830A830B8354831B831D831E831F83218322832C832D832E833083338337 -833A833C833D8342834383448347834D834E8351835583568357837083780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -58 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000837D837F8380838283848386838D83928394839583988399839B839C839D -83A683A783A983AC83BE83BF83C083C783C983CF83D083D183D483DD835383E8 -83EA83F683F883F983FC84018406840A840F84118415841983AD842F84398445 -84478448844A844D844F84518452845684588459845A845C8460846484658467 -846A84708473847484768478847C847D84818485849284938495849E84A684A8 -84A984AA84AF84B184B484BA84BD84BE84C084C284C784C884CC84CF84D30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000084DC84E784EA84EF84F084F184F284F7853284FA84FB84FD850285038507 -850C850E8510851C851E85228523852485258527852A852B852F853385348536 -853F8546854F855085518552855385568559855C855D855E855F856085618562 -8564856B856F8579857A857B857D857F8581858585868589858B858C858F8593 -8598859D859F85A085A285A585A785B485B685B785B885BC85BD85BE85BF85C2 -85C785CA85CB85CE85AD85D885DA85DF85E085E685E885ED85F385F685FC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000085FF860086048605860D860E86108611861286188619861B861E86218627 -862986368638863A863C863D864086428646865286538656865786588659865D -866086618662866386648669866C866F867586768677867A868D869186968698 -869A869C86A186A686A786A886AD86B186B386B486B586B786B886B986BF86C0 -86C186C386C586D186D286D586D786DA86DC86E086E386E586E7868886FA86FC -86FD870487058707870B870E870F8710871387148719871E871F872187230000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008728872E872F873187328739873A873C873D873E874087438745874D8758 -875D876187648765876F87718772877B8783878487858786878787888789878B -878C879087938795879787988799879E87A087A387A787AC87AD87AE87B187B5 -87BE87BF87C187C887C987CA87CE87D587D687D987DA87DC87DF87E287E387E4 -87EA87EB87ED87F187F387F887FA87FF8801880388068809880A880B88108819 -8812881388148818881A881B881C881E881F8828882D882E8830883288350000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000883A883C88418843884588488849884A884B884E8851885588568858885A -885C885F88608864886988718879887B88808898889A889B889C889F88A088A8 -88AA88BA88BD88BE88C088CA88CB88CC88CD88CE88D188D288D388DB88DE88E7 -88EF88F088F188F588F789018906890D890E890F8915891689188919891A891C -892089268927892889308931893289358939893A893E89408942894589468949 -894F89528957895A895B895C896189628963896B896E897089738975897A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000897B897C897D8989898D899089948995899B899C899F89A089A589B089B4 -89B589B689B789BC89D489D589D689D789D889E589E989EB89ED89F189F389F6 -89F989FD89FF8A048A058A078A0F8A118A128A148A158A1E8A208A228A248A26 -8A2B8A2C8A2F8A358A378A3D8A3E8A408A438A458A478A498A4D8A4E8A538A56 -8A578A588A5C8A5D8A618A658A678A758A768A778A798A7A8A7B8A7E8A7F8A80 -8A838A868A8B8A8F8A908A928A968A978A998A9F8AA78AA98AAE8AAF8AB30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008AB68AB78ABB8ABE8AC38AC68AC88AC98ACA8AD18AD38AD48AD58AD78ADD -8ADF8AEC8AF08AF48AF58AF68AFC8AFF8B058B068B0B8B118B1C8B1E8B1F8B0A -8B2D8B308B378B3C8B428B438B448B458B468B488B528B538B548B598B4D8B5E -8B638B6D8B768B788B798B7C8B7E8B818B848B858B8B8B8D8B8F8B948B958B9C -8B9E8B9F8C388C398C3D8C3E8C458C478C498C4B8C4F8C518C538C548C578C58 -8C5B8C5D8C598C638C648C668C688C698C6D8C738C758C768C7B8C7E8C860000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008C878C8B8C908C928C938C998C9B8C9C8CA48CB98CBA8CC58CC68CC98CCB -8CCF8CD68CD58CD98CDD8CE18CE88CEC8CEF8CF08CF28CF58CF78CF88CFE8CFF -8D018D038D098D128D178D1B8D658D698D6C8D6E8D7F8D828D848D888D8D8D90 -8D918D958D9E8D9F8DA08DA68DAB8DAC8DAF8DB28DB58DB78DB98DBB8DC08DC5 -8DC68DC78DC88DCA8DCE8DD18DD48DD58DD78DD98DE48DE58DE78DEC8DF08DBC -8DF18DF28DF48DFD8E018E048E058E068E0B8E118E148E168E208E218E220000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008E238E268E278E318E338E368E378E388E398E3D8E408E418E4B8E4D8E4E -8E4F8E548E5B8E5C8E5D8E5E8E618E628E698E6C8E6D8E6F8E708E718E798E7A -8E7B8E828E838E898E908E928E958E9A8E9B8E9D8E9E8EA28EA78EA98EAD8EAE -8EB38EB58EBA8EBB8EC08EC18EC38EC48EC78ECF8ED18ED48EDC8EE88EEE8EF0 -8EF18EF78EF98EFA8EED8F008F028F078F088F0F8F108F168F178F188F1E8F20 -8F218F238F258F278F288F2C8F2D8F2E8F348F358F368F378F3A8F408F410000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -61 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008F438F478F4F8F518F528F538F548F558F588F5D8F5E8F658F9D8FA08FA1 -8FA48FA58FA68FB58FB68FB88FBE8FC08FC18FC68FCA8FCB8FCD8FD08FD28FD3 -8FD58FE08FE38FE48FE88FEE8FF18FF58FF68FFB8FFE900290049008900C9018 -901B90289029902F902A902C902D903390349037903F90439044904C905B905D -906290669067906C90709074907990859088908B908C908E9090909590979098 -9099909B90A090A190A290A590B090B290B390B490B690BD90CC90BE90C30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000090C490C590C790C890D590D790D890D990DC90DD90DF90E590D290F690EB -90EF90F090F490FE90FF91009104910591069108910D91109114911691179118 -911A911C911E912091259122912391279129912E912F91319134913691379139 -913A913C913D914391479148914F915391579159915A915B916191649167916D -91749179917A917B9181918391859186918A918E91919193919491959198919E -91A191A691A891AC91AD91AE91B091B191B291B391B691BB91BC91BD91BF0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000091C291C391C591D391D491D791D991DA91DE91E491E591E991EA91EC91ED -91EE91EF91F091F191F791F991FB91FD9200920192049205920692079209920A -920C92109212921392169218921C921D92239224922592269228922E922F9230 -92339235923692389239923A923C923E92409242924392469247924A924D924E -924F925192589259925C925D926092619265926792689269926E926F92709275 -9276927792789279927B927C927D927F92889289928A928D928E929292970000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -64 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009299929F92A092A492A592A792A892AB92AF92B292B692B892BA92BB92BC -92BD92BF92C092C192C292C392C592C692C792C892CB92CC92CD92CE92D092D3 -92D592D792D892D992DC92DD92DF92E092E192E392E592E792E892EC92EE92F0 -92F992FB92FF930093029308930D931193149315931C931D931E931F93219324 -932593279329932A933393349336933793479348934993509351935293559357 -9358935A935E9364936593679369936A936D936F937093719373937493760000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -65 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000937A937D937F9380938193829388938A938B938D938F939293959398939B -939E93A193A393A493A693A893AB93B493B593B693BA93A993C193C493C593C6 -93C793C993CA93CB93CC93CD93D393D993DC93DE93DF93E293E693E793F993F7 -93F893FA93FB93FD94019402940494089409940D940E940F941594169417941F -942E942F9431943294339434943B943F943D944394459448944A944C94559459 -945C945F946194639468946B946D946E946F9471947294849483957895790000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000957E95849588958C958D958E959D959E959F95A195A695A995AB95AC95B4 -95B695BA95BD95BF95C695C895C995CB95D095D195D295D395D995DA95DD95DE -95DF95E095E495E6961D961E9622962496259626962C96319633963796389639 -963A963C963D9641965296549656965796589661966E9674967B967C967E967F -9681968296839684968996919696969A969D969F96A496A596A696A996AE96AF -96B396BA96CA96D25DB296D896DA96DD96DE96DF96E996EF96F196FA97020000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000970397059709971A971B971D97219722972397289731973397419743974A -974E974F975597579758975A975B97639767976A976E9773977697779778977B -977D977F978097899795979697979799979A979E979F97A297AC97AE97B197B2 -97B597B697B897B997BA97BC97BE97BF97C197C497C597C797C997CA97CC97CD -97CE97D097D197D497D797D897D997DD97DE97E097DB97E197E497EF97F197F4 -97F797F897FA9807980A9819980D980E98149816981C981E9820982398260000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -68 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000982B982E982F98309832983398359825983E98449847984A985198529853 -985698579859985A9862986398659866986A986C98AB98AD98AE98B098B498B7 -98B898BA98BB98BF98C298C598C898CC98E198E398E598E698E798EA98F398F6 -9902990799089911991599169917991A991B991C991F992299269927992B9931 -99329933993499359939993A993B993C99409941994699479948994D994E9954 -99589959995B995C995E995F9960999B999D999F99A699B099B199B299B50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -69 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000099B999BA99BD99BF99C399C999D399D499D999DA99DC99DE99E799EA99EB -99EC99F099F499F599F999FD99FE9A029A039A049A0B9A0C9A109A119A169A1E -9A209A229A239A249A279A2D9A2E9A339A359A369A389A479A419A449A4A9A4B -9A4C9A4E9A519A549A569A5D9AAA9AAC9AAE9AAF9AB29AB49AB59AB69AB99ABB -9ABE9ABF9AC19AC39AC69AC89ACE9AD09AD29AD59AD69AD79ADB9ADC9AE09AE4 -9AE59AE79AE99AEC9AF29AF39AF59AF99AFA9AFD9AFF9B009B019B029B030000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B049B059B089B099B0B9B0C9B0D9B0E9B109B129B169B199B1B9B1C9B20 -9B269B2B9B2D9B339B349B359B379B399B3A9B3D9B489B4B9B4C9B559B569B57 -9B5B9B5E9B619B639B659B669B689B6A9B6B9B6C9B6D9B6E9B739B759B779B78 -9B799B7F9B809B849B859B869B879B899B8A9B8B9B8D9B8F9B909B949B9A9B9D -9B9E9BA69BA79BA99BAC9BB09BB19BB29BB79BB89BBB9BBC9BBE9BBF9BC19BC7 -9BC89BCE9BD09BD79BD89BDD9BDF9BE59BE79BEA9BEB9BEF9BF39BF79BF80000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009BF99BFA9BFD9BFF9C009C029C0B9C0F9C119C169C189C199C1A9C1C9C1E -9C229C239C269C279C289C299C2A9C319C359C369C379C3D9C419C439C449C45 -9C499C4A9C4E9C4F9C509C539C549C569C589C5B9C5D9C5E9C5F9C639C699C6A -9C5C9C6B9C689C6E9C709C729C759C779C7B9CE69CF29CF79CF99D0B9D029D11 -9D179D189D1C9D1D9D1E9D2F9D309D329D339D349D3A9D3C9D459D3D9D429D43 -9D479D4A9D539D549D5F9D639D629D659D699D6A9D6B9D709D769D779D7B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009D7C9D7E9D839D849D869D8A9D8D9D8E9D929D939D959D969D979D989DA1 -9DAA9DAC9DAE9DB19DB59DB99DBC9DBF9DC39DC79DC99DCA9DD49DD59DD69DD7 -9DDA9DDE9DDF9DE09DE59DE79DE99DEB9DEE9DF09DF39DF49DFE9E0A9E029E07 -9E0E9E109E119E129E159E169E199E1C9E1D9E7A9E7B9E7C9E809E829E839E84 -9E859E879E8E9E8F9E969E989E9B9E9E9EA49EA89EAC9EAE9EAF9EB09EB39EB4 -9EB59EC69EC89ECB9ED59EDF9EE49EE79EEC9EED9EEE9EF09EF19EF29EF50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009EF89EFF9F029F039F099F0F9F109F119F129F149F169F179F199F1A9F1B -9F1F9F229F269F2A9F2B9F2F9F319F329F349F379F399F3A9F3C9F3D9F3F9F41 -9F439F449F459F469F479F539F559F569F579F589F5A9F5D9F5E9F689F699F6D -9F6E9F6F9F709F719F739F759F7A9F7D9F8F9F909F919F929F949F969F979F9E -9FA19FA29FA39FA5000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/koi8-r.enc b/waypoint_manager/manager_GUI/tcl/encoding/koi8-r.enc deleted file mode 100644 index 49bf2ea..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/koi8-r.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: koi8-r, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -25002502250C251025142518251C2524252C2534253C258025842588258C2590 -259125922593232025A02219221A22482264226500A0232100B000B200B700F7 -25502551255204512553255425552556255725582559255A255B255C255D255E -255F25602561040125622563256425652566256725682569256A256B256C00A9 -044E0430043104460434043504440433044504380439043A043B043C043D043E -043F044F044004410442044304360432044C044B04370448044D04490447044A -042E0410041104260414041504240413042504180419041A041B041C041D041E -041F042F042004210422042304160412042C042B04170428042D04290427042A diff --git a/waypoint_manager/manager_GUI/tcl/encoding/koi8-u.enc b/waypoint_manager/manager_GUI/tcl/encoding/koi8-u.enc deleted file mode 100644 index e4eeb84..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/koi8-u.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: koi8-u, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -25002502250C251025142518251C2524252C2534253C258025842588258C2590 -259125922593232025A02219221A22482264226500A0232100B000B200B700F7 -25502551255204510454255404560457255725582559255A255B0491255D255E -255F25602561040104032563040604072566256725682569256A0490256C00A9 -044E0430043104460434043504440433044504380439043A043B043C043D043E -043F044F044004410442044304360432044C044B04370448044D04490447044A -042E0410041104260414041504240413042504180419041A041B041C041D041E -041F042F042004210422042304160412042C042B04170428042D04290427042A diff --git a/waypoint_manager/manager_GUI/tcl/encoding/ksc5601.enc b/waypoint_manager/manager_GUI/tcl/encoding/ksc5601.enc deleted file mode 100644 index bec61d0..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/ksc5601.enc +++ /dev/null @@ -1,1516 +0,0 @@ -# Encoding file: ksc5601, double-byte -D -233F 0 89 -21 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030003001300200B72025202600A8300300AD20152225FF3C223C20182019 -201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 -00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 -222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 -25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D -221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -22 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF -02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 -2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E -261C261E00B62020202121952197219921962198266D2669266A266C327F321C -211633C7212233C233D821210000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -23 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F -FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F -FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F -FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F -FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -24 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000313131323133313431353136313731383139313A313B313C313D313E313F -3140314131423143314431453146314731483149314A314B314C314D314E314F -3150315131523153315431553156315731583159315A315B315C315D315E315F -3160316131623163316431653166316731683169316A316B316C316D316E316F -3170317131723173317431753176317731783179317A317B317C317D317E317F -3180318131823183318431853186318731883189318A318B318C318D318E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -25 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000217021712172217321742175217621772178217900000000000000000000 -2160216121622163216421652166216721682169000000000000000000000000 -0000039103920393039403950396039703980399039A039B039C039D039E039F -03A003A103A303A403A503A603A703A803A90000000000000000000000000000 -000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF -03C003C103C303C403C503C603C703C803C90000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -26 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000025002502250C251025182514251C252C25242534253C25012503250F2513 -251B251725232533252B253B254B2520252F25282537253F251D253025252538 -254225122511251A251925162515250E250D251E251F25212522252625272529 -252A252D252E25312532253525362539253A253D253E25402541254325442545 -2546254725482549254A00000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -27 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00003395339633972113339833C433A333A433A533A63399339A339B339C339D -339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 -33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB -33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 -33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -28 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A -00003260326132623263326432653266326732683269326A326B326C326D326E -326F3270327132723273327432753276327732783279327A327B24D024D124D2 -24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 -24E324E424E524E624E724E824E9246024612462246324642465246624672468 -2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -29 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000E6011100F001270131013301380140014200F8015300DF00FE0167014B -01493200320132023203320432053206320732083209320A320B320C320D320E -320F3210321132123213321432153216321732183219321A321B249C249D249E -249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE -24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C -247D247E247F24802481248200B900B200B32074207F20812082208320840000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000304130423043304430453046304730483049304A304B304C304D304E304F -3050305130523053305430553056305730583059305A305B305C305D305E305F -3060306130623063306430653066306730683069306A306B306C306D306E306F -3070307130723073307430753076307730783079307A307B307C307D307E307F -3080308130823083308430853086308730883089308A308B308C308D308E308F -3090309130923093000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF -30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF -30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF -30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000004100411041204130414041504010416041704180419041A041B041C041D -041E041F0420042104220423042404250426042704280429042A042B042C042D -042E042F00000000000000000000000000000000000000000000000000000000 -000004300431043204330434043504510436043704380439043A043B043C043D -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 -AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 -AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 -AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC -ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 -ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -31 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 -AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B -AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 -ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B -AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D -AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -32 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF -AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C -AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 -AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 -AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 -B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -33 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 -B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 -B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 -B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 -B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 -B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -34 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 -B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 -B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 -B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED -B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 -B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -35 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 -B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 -B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 -B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 -B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 -B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -36 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 -B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 -B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 -B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 -B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 -B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -37 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC -B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B -B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D -B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 -B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 -B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -38 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD -B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 -B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 -BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 -BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C -BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -39 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B -BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 -BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF -BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C -BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 -BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 -BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 -BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 -BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 -BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D -BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F -BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 -BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 -BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 -C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC -C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E -C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 -C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 -C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC -C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD -C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 -C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 -C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 -C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 -C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 -C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 -C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 -C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 -C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C -C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 -C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 -C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C -C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 -C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 -C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 -C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -40 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 -C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F -C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C -C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 -C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 -C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -41 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C -C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 -C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 -C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 -C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 -C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -42 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 -C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 -CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF -CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 -CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D -CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -43 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 -CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC -CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 -CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 -CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 -CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -44 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 -CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 -CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 -CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 -CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 -CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -45 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 -D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 -D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 -D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 -D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 -D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -46 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 -D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 -D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 -D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C -D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 -D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -47 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 -D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB -D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 -D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 -D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC -D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -48 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 -D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 -D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 -D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 -D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 -D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF -6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 -5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 -61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB -95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F -61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 -6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB -4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB -F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E -64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA -61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 -96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 -7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F -577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F -74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 -93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 -53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD -75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 -8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 -660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 -6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 -5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D -62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 -639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 -50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 -854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -4F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 -69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC -8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C -570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F -5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 -53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 -903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 -969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 -F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B -53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 -573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -51 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 -74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C -8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE -685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 -F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E -F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -52 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 -67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 -5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B -F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 -8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 -F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E -7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 -6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D -5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D -5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 -52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 -8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 -7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC -51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C -6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D -5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -55 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 -53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C -85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D -5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 -8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD -9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -56 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 -65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE -8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 -6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F -7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 -78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -57 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 -964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D -622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC -51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C -728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 -541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -58 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C -83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C -8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 -671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF -71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF -840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 -9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F -72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 -9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 -82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D -7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C -5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 -610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A -62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 -99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 -76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E -65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 -90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA -88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 -6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 -6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 -4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 -9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C -8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B -99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC -8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 -8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 -9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 -7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C -4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 -6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C -658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D -4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 -5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 -6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 -88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA -715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 -50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 -723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD -55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 -60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -60 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 -67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 -657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 -861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C -859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 -71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -61 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC -562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 -71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 -90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D -84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E -9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 -74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA -88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 -9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 -5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C -834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F -66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD -662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A -57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 -4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA -85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -64 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E -5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 -5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F -6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C -83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 -5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -65 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE -5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 -63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A -F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD -9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA -513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 -F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 -582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 -6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 -7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F -71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -67 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 -F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD -745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 -F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 -88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 -55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -68 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 -761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 -7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 -7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 -6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 -F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -69 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E -6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C -6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 -512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 -79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED -6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 -5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 -9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 -617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB -9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 -610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 -8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 -80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 -F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 -4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A -51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 -F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 -F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC -8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A -8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 -93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C -606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE -8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 -68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB -58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 -748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 -8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E -6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 -90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D -7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 -5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F -92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 -5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 -544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 -6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B -7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -70 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C -81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 -5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 -722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 -8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 -62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -71 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD -80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D -70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E -9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC -710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B -6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -72 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A -6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE -907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 -6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 -8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 -75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -73 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB -7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 -74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E -50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 -5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC -50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC -7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B -85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F -8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 -7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 -66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -75 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 -8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 -585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 -690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 -939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 -6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -76 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 -50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE -75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 -98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 -7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD -502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -77 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 -803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 -6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F -8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 -59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E -722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -78 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D -5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 -576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 -5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 -80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 -FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -79 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 -5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 -66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 -608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B -54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 -965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 -89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE -73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA -9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 -774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 -5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 -99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D -5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 -7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A -93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 -5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 -559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 -6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 -6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB -5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 -8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 -73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A -8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 -866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 -7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC -5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macCentEuro.enc b/waypoint_manager/manager_GUI/tcl/encoding/macCentEuro.enc deleted file mode 100644 index dde616a..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macCentEuro.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macCentEuro, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C40100010100C9010400D600DC00E10105010C00E4010D0106010700E90179 -017A010E00ED010F01120113011600F3011700F400F600F500FA011A011B00FC -202000B0011800A300A7202200B600DF00AE00A92122011900A822600123012E -012F012A22642265012B0136220222110142013B013C013D013E0139013A0145 -0146014300AC221A01440147220600AB00BB202600A00148015000D50151014C -20132014201C201D2018201900F725CA014D0154015501582039203A01590156 -01570160201A201E0161015A015B00C10164016500CD017D017E016A00D300D4 -016B016E00DA016F017001710172017300DD00FD0137017B0141017C012202C7 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macCroatian.enc b/waypoint_manager/manager_GUI/tcl/encoding/macCroatian.enc deleted file mode 100644 index c23d0f0..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macCroatian.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macCroatian, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 -00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC -202000B000A200A300A7202200B600DF00AE0160212200B400A82260017D00D8 -221E00B122642265220600B522022211220F0161222B00AA00BA03A9017E00F8 -00BF00A100AC221A01922248010600AB010C202600A000C000C300D501520153 -01102014201C201D2018201900F725CAF8FF00A9204420AC2039203A00C600BB -201300B7201A201E203000C2010700C1010D00C800CD00CE00CF00CC00D300D4 -011100D200DA00DB00D9013102C602DC00AF03C000CB02DA00B800CA00E602C7 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macCyrillic.enc b/waypoint_manager/manager_GUI/tcl/encoding/macCyrillic.enc deleted file mode 100644 index e657739..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macCyrillic.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macCyrillic, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0410041104120413041404150416041704180419041A041B041C041D041E041F -0420042104220423042404250426042704280429042A042B042C042D042E042F -202000B0049000A300A7202200B6040600AE00A9212204020452226004030453 -221E00B122642265045600B504910408040404540407045704090459040A045A -0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455 -20132014201C201D2018201900F7201E040E045E040F045F211604010451044F -0430043104320433043404350436043704380439043A043B043C043D043E043F -0440044104420443044404450446044704480449044A044B044C044D044E20AC diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macDingbats.enc b/waypoint_manager/manager_GUI/tcl/encoding/macDingbats.enc deleted file mode 100644 index 28449cd..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macDingbats.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macDingbats, single-byte -S -003F 1 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -00202701270227032704260E2706270727082709261B261E270C270D270E270F -2710271127122713271427152716271727182719271A271B271C271D271E271F -2720272127222723272427252726272726052729272A272B272C272D272E272F -2730273127322733273427352736273727382739273A273B273C273D273E273F -2740274127422743274427452746274727482749274A274B25CF274D25A0274F -27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F -F8D7F8D8F8D9F8DAF8DBF8DCF8DDF8DEF8DFF8E0F8E1F8E2F8E3F8E4008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -0000276127622763276427652766276726632666266526602460246124622463 -2464246524662467246824692776277727782779277A277B277C277D277E277F -2780278127822783278427852786278727882789278A278B278C278D278E278F -2790279127922793279421922194219527982799279A279B279C279D279E279F -27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF -000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macGreek.enc b/waypoint_manager/manager_GUI/tcl/encoding/macGreek.enc deleted file mode 100644 index 67b9953..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macGreek.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macGreek, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C400B900B200C900B300D600DC038500E000E200E4038400A800E700E900E8 -00EA00EB00A3212200EE00EF202200BD203000F400F600A600AD00F900FB00FC -2020039303940398039B039E03A000DF00AE00A903A303AA00A7226000B000B7 -039100B12264226500A503920395039603970399039A039C03A603AB03A803A9 -03AC039D00AC039F03A1224803A400AB00BB202600A003A503A7038603880153 -20132015201C201D2018201900F70389038A038C038E03AD03AE03AF03CC038F -03CD03B103B203C803B403B503C603B303B703B903BE03BA03BB03BC03BD03BF -03C003CE03C103C303C403B803C903C203C703C503B603CA03CB039003B0F8A0 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macIceland.enc b/waypoint_manager/manager_GUI/tcl/encoding/macIceland.enc deleted file mode 100644 index c636069..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macIceland.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macIceland, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 -00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC -00DD00B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 -221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 -00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 -20132014201C201D2018201900F725CA00FF0178204420AC00D000F000DE00FE -00FD00B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 -F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macJapan.enc b/waypoint_manager/manager_GUI/tcl/encoding/macJapan.enc deleted file mode 100644 index dba24bd..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macJapan.enc +++ /dev/null @@ -1,785 +0,0 @@ -# Encoding file: macJapan, multi-byte -M -003F 0 46 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00A0FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F -FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F -FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F -FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F -0000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000A921222026 -81 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E -203EFF3F30FD30FE309D309E30034EDD30053006300730FC20142010FF0FFF3C -301C2016FF5C22EF202520182019201C201DFF08FF0930143015FF3BFF3DFF5B -FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000 -00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 -FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 -25A125A025B325B225BD25BC203B301221922190219121933013000000000000 -000000000000000000000000000000002208220B2286228722822283222A2229 -000000000000000000000000000000002227222800AC21D221D4220022030000 -0000000000000000000000000000000000000000222022A52312220222072261 -2252226A226B221A223D221D2235222B222C0000000000000000000000000000 -212B2030266F266D266A2020202100B6000000000000000025EF000000000000 -82 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000FF10 -FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 -FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 -FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 -0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 -30423043304430453046304730483049304A304B304C304D304E304F30503051 -30523053305430553056305730583059305A305B305C305D305E305F30603061 -30623063306430653066306730683069306A306B306C306D306E306F30703071 -30723073307430753076307730783079307A307B307C307D307E307F30803081 -30823083308430853086308730883089308A308B308C308D308E308F30903091 -3092309300000000000000000000000000000000000000000000000000000000 -83 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 -30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 -30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 -30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000391 -03920393039403950396039703980399039A039B039C039D039E039F03A003A1 -03A303A403A503A603A703A803A90000000000000000000000000000000003B1 -03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 -03C303C403C503C603C703C803C9000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -84 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -04100411041204130414041504010416041704180419041A041B041C041D041E -041F0420042104220423042404250426042704280429042A042B042C042D042E -042F000000000000000000000000000000000000000000000000000000000000 -04300431043204330434043504510436043704380439043A043B043C043D0000 -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000002500 -2502250C251025182514251C252C25242534253C25012503250F2513251B2517 -25232533252B253B254B2520252F25282537253F251D25302525253825420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -85 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -2460246124622463246424652466246724682469246A246B246C246D246E246F -2470247124722473000000000000000000000000000000000000000024742475 -2476247724782479247A247B247C247D247E247F248024812482248324842485 -2486248700000000000000000000000000000000000000002776277727780000 -2779277A277B277C277D277E0000000000000000000000000000000000000000 -0000F8A124882489248A248B248C248D248E248F249000000000000000002160 -216121622163216421652166216721682169216A216BF8A2F8A3F8A400000000 -0000000000002170217121722173217421752176217721782179217A217BF8A5 -F8A6F8A700000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000249C249D249E249F24A0 -24A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE24AF24B0 -24B124B224B324B424B500000000000000000000000000000000000000000000 -86 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -339C339F339D33A033A4F8A833A133A5339E33A2338EF8A9338F33C433963397 -F8AA339833B333B233B133B0210933D433CB3390338533863387F8AB00000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000211633CD2121F8AC2664 -2667266126622660266326652666000000000000000000000000000000000000 -0000000000003020260E30040000000000000000000000000000000000000000 -0000000000000000000000000000261E261C261D261F21C621C421C5F8AD21E8 -21E621E721E9F8AEF8AFF8B0F8B1000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -87 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -3230322A322B322C322D322E322F32403237324232433239323A3231323E3234 -3232323B323632333235323C323D323F32380000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000059275C0F32A432A532A632A732A832A93296329D3298329E63A732993349 -3322334D3314331633053333334E330333363318331533273351334A33393357 -330D334233233326333B332B00000000000000000000000000003300331E332A -3331334700000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000337E337D337C337B0000000000000000000000000000 -0000000000000000000000000000000000000000337FF8B2F8B3000000000000 -88 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -222E221F22BF0000000000000000000000000000000000000000000000000000 -0000000000000000301DF8B40000000000000000000000000000000000000000 -000000000000000000000000000000003094000030F730F830F930FA00000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000004E9C -55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 -82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 -5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 -5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 -8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 -828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 -89 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 -81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 -834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 -82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 -5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 -827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC -65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 -81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 -4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 -798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E -971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A -89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 -8A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 -54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 -67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A -89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 -6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 -53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 -520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 -5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 -6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 -8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 -764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 -5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 -8B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC -8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 -7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD -53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 -673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 -5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B -4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F -6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF -99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 -5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 -91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 -611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 -8C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB -8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 -5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C -7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 -5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 -503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C -6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A -98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA -96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 -7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 -5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 -4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 -8D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 -6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 -6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 -818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 -980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B -544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 -98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E -9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 -5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 -707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A -8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E -6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 -8E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 -509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 -991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 -59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 -6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C -8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 -6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 -9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA -5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E -793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 -932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 -91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 -8F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 -89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 -6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA -88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 -6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 -7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD -5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 -5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 -6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 -7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E -9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE -676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 -90 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 -5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E -79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 -58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 -9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F -745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 -647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F -667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB -901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D -7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 -8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 -681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 -91 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D -55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 -758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC -53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 -64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 -83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 -85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA -65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 -8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 -5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E -968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 -629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 -92 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 -53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 -86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B -6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 -901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 -8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 -5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 -817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD -8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 -6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 -4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 -633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 -93 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 -64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 -4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B -83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 -51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF -76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 -856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C -58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 -6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB -5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 -51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 -6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 -94 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 -637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 -899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 -5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 -6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD -67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD -7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA -4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 -642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 -981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 -6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB -907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 -95 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 -59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF -63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 -983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 -65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB -6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F -8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E -711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 -4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 -72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 -6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 -5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 -96 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD -9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 -51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 -6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 -646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE -9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B -85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 -772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF -8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 -5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B -7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 -5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000 -97 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C -733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 -8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 -75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 -6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A -4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 -88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 -786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 -68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B -539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 -4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 -6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 -98 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C -69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 -502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 -6E7E789781550000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000005F0C -4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D -4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED -4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 -4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A -50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 -6703505550505048505A5056506C50785080509A508550B450B2000000000000 -99 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 -51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 -516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 -51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 -51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C -525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 -52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 -530653087538530D5310530F5315531A5323532F533153335338534053465345 -4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE -53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C -542D543C542E54365429541D544E548F5475548E545F5471547754705492547B -5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 -9A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 -55405563554C552E555C55455556555755385533555D5599558054AF558A559F -557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 -55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 -566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 -56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 -570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 -57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A -57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 -589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 -58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 -5938593E7AD259555950594E595A5958596259605967596C5969000000000000 -9B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 -5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD -5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 -5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 -5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 -5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 -5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 -5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B -5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 -5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 -5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 -5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 -9C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE -5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 -5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 -5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 -601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F -604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 -609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 -614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E -61286127614A613F613C612C6134613D614261446173617761586159615A616B -6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 -61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 -61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 -9D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 -6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 -62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 -633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 -636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 -651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA -64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 -64F464F264FA650064FD6518651C650565246523652B65346535653765366538 -754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB -65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB -6773663566366634661C664F664466496641665E665D666466676668665F6662 -667066836688668E668966846698669D66C166B966C966BE66BC000000000000 -9E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 -9738672E673F67366741673867376746675E67606759676367646789677067A9 -677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE -67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 -68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 -68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 -68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 -68C669796977695C6978696B6954697E696E69396974693D695969306961695E -695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 -69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 -6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 -6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 -9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 -86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 -6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA -6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 -9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B -6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA -6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 -6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 -6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E -6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D -6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 -6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E -6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 -6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 -703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 -70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 -719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 -71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 -7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 -72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E -734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 -73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C -746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D -75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 -756B756D75787576758675877574758A758975827594759A759D75A575A375C2 -75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 -75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 -7630763B764776487646765C76587661766276687669766A7667766C76707672 -76767678767C768076837688768B768E769676937699769A76B076B476B876B9 -76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 -7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 -778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA -77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C -78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 -7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC -79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 -7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 -7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 -7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A -7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F -7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 -7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A -7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C -7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 -7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 -7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB -7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A -7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 -7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D -8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 -7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 -7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 -7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 -8019801C80218028803F803B804A804680528058805A805F8062806880738072 -807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 -80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -968B8146813E8153815180FC8171816E81658166817481838188818A81808182 -81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 -81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 -820A820D821082168229822B82388233824082598258825D825A825F82640000 -82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 -82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 -83348316833283318340833983508345832F832B831783188385839A83AA839F -83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB -83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 -83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 -843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 -84FF84F485178518852C851F8515851484FC8540856385588548000000000000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C -8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B -85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 -86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 -86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F -8737873B87258729871A8760875F8778874C874E877487578768876E87598753 -8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 -87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 -88218831883688398827883B8844884288528859885E8862886B8881887E889E -8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 -88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 -891E8925892A892B89418944893B89368938894C891D8960895E000000000000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 -89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 -8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 -8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 -8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 -8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F -8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 -8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C -8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA -8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 -8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 -8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 -8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 -8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F -8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 -8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 -90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F -905090519052900E9049903E90569058905E9068906F907696A890729082907D -90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 -91329130914A9156915891639165916991739172918B9189918291A291AB91AF -91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 -921E91FF9214922C92159211925E925792459249926492489295923F924B9250 -929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 -93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 -94109436942B94359421943A944194529444945B94609462945E946A92299470 -94759477947D945A947C947E9481947F95829587958A95949596959895990000 -95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 -95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D -965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 -96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 -970F971697199724972A97309739973D973E97449746974897429749975C9760 -97649766976852D2976B977197799785977C9781977A9786978B978F9790979C -97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 -980F980C9838982498219837983D9846984F984B986B986F9870000000000000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 -99189921991D991E99249920992C992E993D993E9942994999459950994B9951 -9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE -99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 -9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 -9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB -9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 -9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 -9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 -9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 -9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 -9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 -9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A -9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 -9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 -9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 -9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F -69C79059746451DC719900000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -EB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F8B5F8B60000000000000000000000000000000000000000000000000000 -F8B7FE33000000000000000000000000000000000000F8B8FE31F8B900000000 -F8BAF8BBF8BCF8BDFE300000000000000000FE35FE36FE39FE3AF8BEF8BFFE37 -FE38FE3FFE40FE3DFE3EFE41FE42FE43FE44FE3BFE3C00000000000000000000 -0000F8C000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -EC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000F8C1 -0000F8C20000F8C30000F8C40000F8C500000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F8C600000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000F8C70000F8C80000F8C9000000000000000000000000F8CA000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -ED -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -F8CB0000F8CC0000F8CD0000F8CE0000F8CF0000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000000F8D00000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000000000F8D10000F8D20000F8D3000000000000000000000000F8D40000 -00000000000000000000F8D5F8D6000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macRoman.enc b/waypoint_manager/manager_GUI/tcl/encoding/macRoman.enc deleted file mode 100644 index 15de266..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macRoman.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macRoman, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 -00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC -202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 -221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 -00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 -20132014201C201D2018201900F725CA00FF0178204420AC2039203AFB01FB02 -202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 -F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macRomania.enc b/waypoint_manager/manager_GUI/tcl/encoding/macRomania.enc deleted file mode 100644 index ce41cf4..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macRomania.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macRomania, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 -00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC -202000B000A200A300A7202200B600DF00AE00A9212200B400A822600102015E -221E00B12264226500A500B522022211220F03C0222B00AA00BA21260103015F -00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 -20132014201C201D2018201900F725CA00FF0178204400A42039203A01620163 -202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 -F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macThai.enc b/waypoint_manager/manager_GUI/tcl/encoding/macThai.enc deleted file mode 100644 index 7d9c8ad..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macThai.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macThai, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00AB00BB2026F88CF88FF892F895F898F88BF88EF891F894F897201C201DF899 -FFFD2022F884F889F885F886F887F888F88AF88DF890F893F89620182019FFFD -00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F -0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F -0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F -0E300E310E320E330E340E350E360E370E380E390E3AFEFF200B201320140E3F -0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D21220E4F -0E500E510E520E530E540E550E560E570E580E5900AE00A9FFFDFFFDFFFDFFFD diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macTurkish.enc b/waypoint_manager/manager_GUI/tcl/encoding/macTurkish.enc deleted file mode 100644 index f9542ae..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macTurkish.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macTurkish, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 -00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC -202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 -221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 -00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 -20132014201C201D2018201900F725CA00FF0178011E011F01300131015E015F -202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 -F8FF00D200DA00DB00D9F8A002C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/macUkraine.enc b/waypoint_manager/manager_GUI/tcl/encoding/macUkraine.enc deleted file mode 100644 index 643cc45..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/macUkraine.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: macUkraine, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0410041104120413041404150416041704180419041A041B041C041D041E041F -0420042104220423042404250426042704280429042A042B042C042D042E042F -202000B0049000A300A7202200B6040600AE00A9212204020452226004030453 -221E00B122642265045600B504910408040404540407045704090459040A045A -0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455 -20132014201C201D2018201900F7201E040E045E040F045F211604010451044F -0430043104320433043404350436043704380439043A043B043C043D043E043F -0440044104420443044404450446044704480449044A044B044C044D044E00A4 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/shiftjis.enc b/waypoint_manager/manager_GUI/tcl/encoding/shiftjis.enc deleted file mode 100644 index 140aec4..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/shiftjis.enc +++ /dev/null @@ -1,690 +0,0 @@ -# Encoding file: shiftjis, multi-byte -M -003F 0 40 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E007F -0080000000000000000000850086008700000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F -FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F -FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F -FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -81 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E -FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C -301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B -FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000 -00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 -FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 -25A125A025B325B225BD25BC203B301221922190219121933013000000000000 -000000000000000000000000000000002208220B2286228722822283222A2229 -000000000000000000000000000000002227222800AC21D221D4220022030000 -0000000000000000000000000000000000000000222022A52312220222072261 -2252226A226B221A223D221D2235222B222C0000000000000000000000000000 -212B2030266F266D266A2020202100B6000000000000000025EF000000000000 -82 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000FF10 -FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 -FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 -FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 -0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F -FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 -30423043304430453046304730483049304A304B304C304D304E304F30503051 -30523053305430553056305730583059305A305B305C305D305E305F30603061 -30623063306430653066306730683069306A306B306C306D306E306F30703071 -30723073307430753076307730783079307A307B307C307D307E307F30803081 -30823083308430853086308730883089308A308B308C308D308E308F30903091 -3092309300000000000000000000000000000000000000000000000000000000 -83 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 -30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 -30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 -30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 -30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF -30F030F130F230F330F430F530F6000000000000000000000000000000000391 -03920393039403950396039703980399039A039B039C039D039E039F03A003A1 -03A303A403A503A603A703A803A90000000000000000000000000000000003B1 -03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 -03C303C403C503C603C703C803C9000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -84 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -04100411041204130414041504010416041704180419041A041B041C041D041E -041F0420042104220423042404250426042704280429042A042B042C042D042E -042F000000000000000000000000000000000000000000000000000000000000 -04300431043204330434043504510436043704380439043A043B043C043D0000 -043E043F0440044104420443044404450446044704480449044A044B044C044D -044E044F00000000000000000000000000000000000000000000000000002500 -2502250C251025182514251C252C25242534253C25012503250F2513251B2517 -25232533252B253B254B2520252F25282537253F251D25302525253825420000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -88 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000004E9C -55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 -82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 -5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 -5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 -8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 -828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 -89 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 -81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 -834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 -82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 -5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 -827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC -65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 -81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 -4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 -798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E -971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A -89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 -8A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 -54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 -67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A -89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 -6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 -53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 -520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 -5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 -6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 -8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 -764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 -5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 -8B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC -8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 -7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD -53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 -673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 -5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B -4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F -6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF -99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 -5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 -91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 -611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 -8C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB -8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 -5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C -7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 -5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 -503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C -6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A -98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA -96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 -7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 -5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 -4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 -8D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 -6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 -6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 -818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 -980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B -544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 -98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E -9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 -5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 -707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A -8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E -6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 -8E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 -509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 -991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 -59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 -6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C -8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 -6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 -9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA -5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E -793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 -932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 -91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 -8F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 -89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 -6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA -88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 -6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 -7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD -5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 -5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 -6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 -7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E -9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE -676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 -90 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 -5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E -79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 -58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 -9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F -745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 -647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F -667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB -901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D -7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 -8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 -681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 -91 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D -55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 -758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC -53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 -64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 -83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 -85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA -65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 -8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 -5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E -968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 -629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 -92 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 -53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 -86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B -6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 -901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 -8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 -5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 -817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD -8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 -6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 -4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 -633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 -93 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 -64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 -4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B -83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 -51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF -76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 -856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C -58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 -6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB -5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 -51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 -6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 -94 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 -637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 -899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 -5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 -6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD -67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD -7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA -4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 -642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 -981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 -6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB -907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 -95 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 -59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF -63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 -983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 -65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB -6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F -8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E -711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 -4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 -72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 -6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 -5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 -96 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD -9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 -51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 -6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 -646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE -9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B -85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 -772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF -8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 -5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B -7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 -5F797D0485AC8A338E8D975667F385AE9453610961086CB9765200000000FF5E -97 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C -733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 -8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 -75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 -6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A -4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 -88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 -786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 -68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B -539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 -4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 -6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 -98 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C -69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 -502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 -6E7E789781550000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000005F0C -4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D -4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED -4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 -4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A -50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 -6703505550505048505A5056506C50785080509A508550B450B2000000000000 -99 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 -51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 -516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 -51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 -51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C -525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 -52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 -530653087538530D5310530F5315531A5323532F533153335338534053465345 -4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE -53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C -542D543C542E54365429541D544E548F5475548E545F5471547754705492547B -5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 -9A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 -55405563554C552E555C55455556555755385533555D5599558054AF558A559F -557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 -55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 -566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 -56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 -570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 -57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A -57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 -589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 -58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 -5938593E7AD259555950594E595A5958596259605967596C5969000000000000 -9B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 -5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD -5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 -5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 -5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 -5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 -5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 -5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B -5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 -5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 -5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 -5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 -9C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE -5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 -5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 -5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 -601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F -604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 -609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 -614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E -61286127614A613F613C612C6134613D614261446173617761586159615A616B -6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 -61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 -61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 -9D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 -6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 -62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 -633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 -636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 -651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA -64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 -64F464F264FA650064FD6518651C650565246523652B65346535653765366538 -754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB -65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB -6773663566366634661C664F664466496641665E665D666466676668665F6662 -667066836688668E668966846698669D66C166B966C966BE66BC000000000000 -9E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 -9738672E673F67366741673867376746675E67606759676367646789677067A9 -677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE -67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 -68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 -68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 -68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 -68C669796977695C6978696B6954697E696E69396974693D695969306961695E -695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 -69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 -6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 -6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 -9F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 -86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 -6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA -6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 -9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B -6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA -6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 -6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 -6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E -6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D -6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 -6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 -E0 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E -6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 -6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 -703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 -70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 -719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 -71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 -7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 -72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E -734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 -73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C -746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 -E1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D -75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 -756B756D75787576758675877574758A758975827594759A759D75A575A375C2 -75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 -75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 -7630763B764776487646765C76587661766276687669766A7667766C76707672 -76767678767C768076837688768B768E769676937699769A76B076B476B876B9 -76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 -7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 -778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA -77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C -78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 -E2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 -7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC -79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 -7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 -7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 -7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A -7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F -7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 -7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A -7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C -7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 -7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 -E3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 -7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB -7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A -7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 -7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D -8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 -7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 -7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 -7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 -8019801C80218028803F803B804A804680528058805A805F8062806880738072 -807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 -80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 -E4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -968B8146813E8153815180FC8171816E81658166817481838188818A81808182 -81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 -81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 -820A820D821082168229822B82388233824082598258825D825A825F82640000 -82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 -82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 -83348316833283318340833983508345832F832B831783188385839A83AA839F -83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB -83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 -83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 -843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 -84FF84F485178518852C851F8515851484FC8540856385588548000000000000 -E5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C -8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B -85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 -86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 -86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F -8737873B87258729871A8760875F8778874C874E877487578768876E87598753 -8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 -87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 -88218831883688398827883B8844884288528859885E8862886B8881887E889E -8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 -88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 -891E8925892A892B89418944893B89368938894C891D8960895E000000000000 -E6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 -89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 -8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 -8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 -8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 -8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F -8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 -8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C -8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA -8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 -8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 -8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 -E7 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 -8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 -8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F -8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 -8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 -90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F -905090519052900E9049903E90569058905E9068906F907696A890729082907D -90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 -91329130914A9156915891639165916991739172918B9189918291A291AB91AF -91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 -921E91FF9214922C92159211925E925792459249926492489295923F924B9250 -929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 -E8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 -93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 -94109436942B94359421943A944194529444945B94609462945E946A92299470 -94759477947D945A947C947E9481947F95829587958A95949596959895990000 -95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 -95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D -965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 -96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 -970F971697199724972A97309739973D973E97449746974897429749975C9760 -97649766976852D2976B977197799785977C9781977A9786978B978F9790979C -97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 -980F980C9838982498219837983D9846984F984B986B986F9870000000000000 -E9 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 -99189921991D991E99249920992C992E993D993E9942994999459950994B9951 -9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE -99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 -9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 -9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB -9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 -9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 -9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 -9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 -9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 -9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 -EA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 -9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A -9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 -9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 -9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 -9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F -69C79059746451DC719900000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -R -8160 301C FF5E -8161 2016 2225 -817C 2212 FF0D -8191 00A2 FFE0 -8192 00A3 FFE1 -81CA 00AC FFE2 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/symbol.enc b/waypoint_manager/manager_GUI/tcl/encoding/symbol.enc deleted file mode 100644 index ffda9e3..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/symbol.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: symbol, single-byte -S -003F 1 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002122000023220300250026220D002800292217002B002C2212002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -22450391039203A70394039503A603930397039903D1039A039B039C039D039F -03A0039803A103A303A403A503C203A9039E03A80396005B2234005D22A5005F -F8E503B103B203C703B403B503C603B303B703B903D503BA03BB03BC03BD03BF -03C003B803C103C303C403C503D603C903BE03C803B6007B007C007D223C007F -0080008100820083008400850086008700880089008A008B008C008D008E008F -0090009100920093009400950096009700980099009A009B009C009D009E009F -000003D2203222642044221E0192266326662665266021942190219121922193 -00B000B12033226500D7221D2202202200F72260226122482026F8E6F8E721B5 -21352111211C21182297229522052229222A2283228722842282228622082209 -2220220700AE00A92122220F221A22C500AC2227222821D421D021D121D221D3 -22C42329F8E8F8E9F8EA2211F8EBF8ECF8EDF8EEF8EFF8F0F8F1F8F2F8F3F8F4 -F8FF232A222B2320F8F52321F8F6F8F7F8F8F8F9F8FAF8FBF8FCF8FDF8FE0000 diff --git a/waypoint_manager/manager_GUI/tcl/encoding/tis-620.enc b/waypoint_manager/manager_GUI/tcl/encoding/tis-620.enc deleted file mode 100644 index c233be5..0000000 --- a/waypoint_manager/manager_GUI/tcl/encoding/tis-620.enc +++ /dev/null @@ -1,20 +0,0 @@ -# Encoding file: tis-620, single-byte -S -003F 0 1 -00 -0000000100020003000400050006000700080009000A000B000C000D000E000F -0010001100120013001400150016001700180019001A001B001C001D001E001F -0020002100220023002400250026002700280029002A002B002C002D002E002F -0030003100320033003400350036003700380039003A003B003C003D003E003F -0040004100420043004400450046004700480049004A004B004C004D004E004F -0050005100520053005400550056005700580059005A005B005C005D005E005F -0060006100620063006400650066006700680069006A006B006C006D006E006F -0070007100720073007400750076007700780079007A007B007C007D007E0000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00000E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F -0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F -0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F -0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F -0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F -0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 \ No newline at end of file diff --git a/waypoint_manager/manager_GUI/tcl/history.tcl b/waypoint_manager/manager_GUI/tcl/history.tcl deleted file mode 100644 index ef9099b..0000000 --- a/waypoint_manager/manager_GUI/tcl/history.tcl +++ /dev/null @@ -1,335 +0,0 @@ -# history.tcl -- -# -# Implementation of the history command. -# -# Copyright (c) 1997 Sun Microsystems, Inc. -# -# See the file "license.terms" for information on usage and redistribution of -# this file, and for a DISCLAIMER OF ALL WARRANTIES. -# - -# The tcl::history array holds the history list and some additional -# bookkeeping variables. -# -# nextid the index used for the next history list item. -# keep the max size of the history list -# oldest the index of the oldest item in the history. - -namespace eval ::tcl { - variable history - if {![info exists history]} { - array set history { - nextid 0 - keep 20 - oldest -20 - } - } - - namespace ensemble create -command ::tcl::history -map { - add ::tcl::HistAdd - change ::tcl::HistChange - clear ::tcl::HistClear - event ::tcl::HistEvent - info ::tcl::HistInfo - keep ::tcl::HistKeep - nextid ::tcl::HistNextID - redo ::tcl::HistRedo - } -} - -# history -- -# -# This is the main history command. See the man page for its interface. -# This does some argument checking and calls the helper ensemble in the -# tcl namespace. - -proc ::history {args} { - # If no command given, we're doing 'history info'. Can't be done with an - # ensemble unknown handler, as those don't fire when no subcommand is - # given at all. - - if {![llength $args]} { - set args info - } - - # Tricky stuff needed to make stack and errors come out right! - tailcall apply {arglist {tailcall history {*}$arglist} ::tcl} $args -} - -# (unnamed) -- -# -# Callback when [::history] is destroyed. Destroys the implementation. -# -# Parameters: -# oldName what the command was called. -# newName what the command is now called (an empty string). -# op the operation (= delete). -# -# Results: -# none -# -# Side Effects: -# The implementation of the [::history] command ceases to exist. - -trace add command ::history delete [list apply {{oldName newName op} { - variable history - unset -nocomplain history - foreach c [info procs ::tcl::Hist*] { - rename $c {} - } - rename ::tcl::history {} -} ::tcl}] - -# tcl::HistAdd -- -# -# Add an item to the history, and optionally eval it at the global scope -# -# Parameters: -# event the command to add -# exec (optional) a substring of "exec" causes the command to -# be evaled. -# Results: -# If executing, then the results of the command are returned -# -# Side Effects: -# Adds to the history list - -proc ::tcl::HistAdd {event {exec {}}} { - variable history - - if { - [prefix longest {exec {}} $exec] eq "" - && [llength [info level 0]] == 3 - } then { - return -code error "bad argument \"$exec\": should be \"exec\"" - } - - # Do not add empty commands to the history - if {[string trim $event] eq ""} { - return "" - } - - # Maintain the history - set history([incr history(nextid)]) $event - unset -nocomplain history([incr history(oldest)]) - - # Only execute if 'exec' (or non-empty prefix of it) given - if {$exec eq ""} { - return "" - } - tailcall eval $event -} - -# tcl::HistKeep -- -# -# Set or query the limit on the length of the history list -# -# Parameters: -# limit (optional) the length of the history list -# -# Results: -# If no limit is specified, the current limit is returned -# -# Side Effects: -# Updates history(keep) if a limit is specified - -proc ::tcl::HistKeep {{count {}}} { - variable history - if {[llength [info level 0]] == 1} { - return $history(keep) - } - if {![string is integer -strict $count] || ($count < 0)} { - return -code error "illegal keep count \"$count\"" - } - set oldold $history(oldest) - set history(oldest) [expr {$history(nextid) - $count}] - for {} {$oldold <= $history(oldest)} {incr oldold} { - unset -nocomplain history($oldold) - } - set history(keep) $count -} - -# tcl::HistClear -- -# -# Erase the history list -# -# Parameters: -# none -# -# Results: -# none -# -# Side Effects: -# Resets the history array, except for the keep limit - -proc ::tcl::HistClear {} { - variable history - set keep $history(keep) - unset history - array set history [list \ - nextid 0 \ - keep $keep \ - oldest -$keep \ - ] -} - -# tcl::HistInfo -- -# -# Return a pretty-printed version of the history list -# -# Parameters: -# num (optional) the length of the history list to return -# -# Results: -# A formatted history list - -proc ::tcl::HistInfo {{count {}}} { - variable history - if {[llength [info level 0]] == 1} { - set count [expr {$history(keep) + 1}] - } elseif {![string is integer -strict $count]} { - return -code error "bad integer \"$count\"" - } - set result {} - set newline "" - for {set i [expr {$history(nextid) - $count + 1}]} \ - {$i <= $history(nextid)} {incr i} { - if {![info exists history($i)]} { - continue - } - set cmd [string map [list \n \n\t] [string trimright $history($i) \ \n]] - append result $newline[format "%6d %s" $i $cmd] - set newline \n - } - return $result -} - -# tcl::HistRedo -- -# -# Fetch the previous or specified event, execute it, and then replace -# the current history item with that event. -# -# Parameters: -# event (optional) index of history item to redo. Defaults to -1, -# which means the previous event. -# -# Results: -# Those of the command being redone. -# -# Side Effects: -# Replaces the current history list item with the one being redone. - -proc ::tcl::HistRedo {{event -1}} { - variable history - - set i [HistIndex $event] - if {$i == $history(nextid)} { - return -code error "cannot redo the current event" - } - set cmd $history($i) - HistChange $cmd 0 - tailcall eval $cmd -} - -# tcl::HistIndex -- -# -# Map from an event specifier to an index in the history list. -# -# Parameters: -# event index of history item to redo. -# If this is a positive number, it is used directly. -# If it is a negative number, then it counts back to a previous -# event, where -1 is the most recent event. -# A string can be matched, either by being the prefix of a -# command or by matching a command with string match. -# -# Results: -# The index into history, or an error if the index didn't match. - -proc ::tcl::HistIndex {event} { - variable history - if {![string is integer -strict $event]} { - for {set i [expr {$history(nextid)-1}]} {[info exists history($i)]} \ - {incr i -1} { - if {[string match $event* $history($i)]} { - return $i - } - if {[string match $event $history($i)]} { - return $i - } - } - return -code error "no event matches \"$event\"" - } elseif {$event <= 0} { - set i [expr {$history(nextid) + $event}] - } else { - set i $event - } - if {$i <= $history(oldest)} { - return -code error "event \"$event\" is too far in the past" - } - if {$i > $history(nextid)} { - return -code error "event \"$event\" hasn't occured yet" - } - return $i -} - -# tcl::HistEvent -- -# -# Map from an event specifier to the value in the history list. -# -# Parameters: -# event index of history item to redo. See index for a description of -# possible event patterns. -# -# Results: -# The value from the history list. - -proc ::tcl::HistEvent {{event -1}} { - variable history - set i [HistIndex $event] - if {![info exists history($i)]} { - return "" - } - return [string trimright $history($i) \ \n] -} - -# tcl::HistChange -- -# -# Replace a value in the history list. -# -# Parameters: -# newValue The new value to put into the history list. -# event (optional) index of history item to redo. See index for a -# description of possible event patterns. This defaults to 0, -# which specifies the current event. -# -# Side Effects: -# Changes the history list. - -proc ::tcl::HistChange {newValue {event 0}} { - variable history - set i [HistIndex $event] - set history($i) $newValue -} - -# tcl::HistNextID -- -# -# Returns the number of the next history event. -# -# Parameters: -# None. -# -# Side Effects: -# None. - -proc ::tcl::HistNextID {} { - variable history - return [expr {$history(nextid) + 1}] -} - -return - -# Local Variables: -# mode: tcl -# fill-column: 78 -# End: diff --git a/waypoint_manager/manager_GUI/tcl/http1.0/http.tcl b/waypoint_manager/manager_GUI/tcl/http1.0/http.tcl deleted file mode 100644 index 8329de4..0000000 --- a/waypoint_manager/manager_GUI/tcl/http1.0/http.tcl +++ /dev/null @@ -1,377 +0,0 @@ -# http.tcl -# Client-side HTTP for GET, POST, and HEAD commands. -# These routines can be used in untrusted code that uses the Safesock -# security policy. -# These procedures use a callback interface to avoid using vwait, -# which is not defined in the safe base. -# -# See the http.n man page for documentation - -package provide http 1.0 - -array set http { - -accept */* - -proxyhost {} - -proxyport {} - -useragent {Tcl http client package 1.0} - -proxyfilter httpProxyRequired -} -proc http_config {args} { - global http - set options [lsort [array names http -*]] - set usage [join $options ", "] - if {[llength $args] == 0} { - set result {} - foreach name $options { - lappend result $name $http($name) - } - return $result - } - regsub -all -- - $options {} options - set pat ^-([join $options |])$ - if {[llength $args] == 1} { - set flag [lindex $args 0] - if {[regexp -- $pat $flag]} { - return $http($flag) - } else { - return -code error "Unknown option $flag, must be: $usage" - } - } else { - foreach {flag value} $args { - if {[regexp -- $pat $flag]} { - set http($flag) $value - } else { - return -code error "Unknown option $flag, must be: $usage" - } - } - } -} - - proc httpFinish { token {errormsg ""} } { - upvar #0 $token state - global errorInfo errorCode - if {[string length $errormsg] != 0} { - set state(error) [list $errormsg $errorInfo $errorCode] - set state(status) error - } - catch {close $state(sock)} - catch {after cancel $state(after)} - if {[info exists state(-command)]} { - if {[catch {eval $state(-command) {$token}} err]} { - if {[string length $errormsg] == 0} { - set state(error) [list $err $errorInfo $errorCode] - set state(status) error - } - } - unset state(-command) - } -} -proc http_reset { token {why reset} } { - upvar #0 $token state - set state(status) $why - catch {fileevent $state(sock) readable {}} - httpFinish $token - if {[info exists state(error)]} { - set errorlist $state(error) - unset state(error) - eval error $errorlist - } -} -proc http_get { url args } { - global http - if {![info exists http(uid)]} { - set http(uid) 0 - } - set token http#[incr http(uid)] - upvar #0 $token state - http_reset $token - array set state { - -blocksize 8192 - -validate 0 - -headers {} - -timeout 0 - state header - meta {} - currentsize 0 - totalsize 0 - type text/html - body {} - status "" - } - set options {-blocksize -channel -command -handler -headers \ - -progress -query -validate -timeout} - set usage [join $options ", "] - regsub -all -- - $options {} options - set pat ^-([join $options |])$ - foreach {flag value} $args { - if {[regexp $pat $flag]} { - # Validate numbers - if {[info exists state($flag)] && \ - [regexp {^[0-9]+$} $state($flag)] && \ - ![regexp {^[0-9]+$} $value]} { - return -code error "Bad value for $flag ($value), must be integer" - } - set state($flag) $value - } else { - return -code error "Unknown option $flag, can be: $usage" - } - } - if {! [regexp -nocase {^(http://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \ - x proto host y port srvurl]} { - error "Unsupported URL: $url" - } - if {[string length $port] == 0} { - set port 80 - } - if {[string length $srvurl] == 0} { - set srvurl / - } - if {[string length $proto] == 0} { - set url http://$url - } - set state(url) $url - if {![catch {$http(-proxyfilter) $host} proxy]} { - set phost [lindex $proxy 0] - set pport [lindex $proxy 1] - } - if {$state(-timeout) > 0} { - set state(after) [after $state(-timeout) [list http_reset $token timeout]] - } - if {[info exists phost] && [string length $phost]} { - set srvurl $url - set s [socket $phost $pport] - } else { - set s [socket $host $port] - } - set state(sock) $s - - # Send data in cr-lf format, but accept any line terminators - - fconfigure $s -translation {auto crlf} -buffersize $state(-blocksize) - - # The following is disallowed in safe interpreters, but the socket - # is already in non-blocking mode in that case. - - catch {fconfigure $s -blocking off} - set len 0 - set how GET - if {[info exists state(-query)]} { - set len [string length $state(-query)] - if {$len > 0} { - set how POST - } - } elseif {$state(-validate)} { - set how HEAD - } - puts $s "$how $srvurl HTTP/1.0" - puts $s "Accept: $http(-accept)" - puts $s "Host: $host" - puts $s "User-Agent: $http(-useragent)" - foreach {key value} $state(-headers) { - regsub -all \[\n\r\] $value {} value - set key [string trim $key] - if {[string length $key]} { - puts $s "$key: $value" - } - } - if {$len > 0} { - puts $s "Content-Length: $len" - puts $s "Content-Type: application/x-www-form-urlencoded" - puts $s "" - fconfigure $s -translation {auto binary} - puts -nonewline $s $state(-query) - } else { - puts $s "" - } - flush $s - fileevent $s readable [list httpEvent $token] - if {! [info exists state(-command)]} { - http_wait $token - } - return $token -} -proc http_data {token} { - upvar #0 $token state - return $state(body) -} -proc http_status {token} { - upvar #0 $token state - return $state(status) -} -proc http_code {token} { - upvar #0 $token state - return $state(http) -} -proc http_size {token} { - upvar #0 $token state - return $state(currentsize) -} - - proc httpEvent {token} { - upvar #0 $token state - set s $state(sock) - - if {[eof $s]} { - httpEof $token - return - } - if {$state(state) == "header"} { - set n [gets $s line] - if {$n == 0} { - set state(state) body - if {![regexp -nocase ^text $state(type)]} { - # Turn off conversions for non-text data - fconfigure $s -translation binary - if {[info exists state(-channel)]} { - fconfigure $state(-channel) -translation binary - } - } - if {[info exists state(-channel)] && - ![info exists state(-handler)]} { - # Initiate a sequence of background fcopies - fileevent $s readable {} - httpCopyStart $s $token - } - } elseif {$n > 0} { - if {[regexp -nocase {^content-type:(.+)$} $line x type]} { - set state(type) [string trim $type] - } - if {[regexp -nocase {^content-length:(.+)$} $line x length]} { - set state(totalsize) [string trim $length] - } - if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} { - lappend state(meta) $key $value - } elseif {[regexp ^HTTP $line]} { - set state(http) $line - } - } - } else { - if {[catch { - if {[info exists state(-handler)]} { - set n [eval $state(-handler) {$s $token}] - } else { - set block [read $s $state(-blocksize)] - set n [string length $block] - if {$n >= 0} { - append state(body) $block - } - } - if {$n >= 0} { - incr state(currentsize) $n - } - } err]} { - httpFinish $token $err - } else { - if {[info exists state(-progress)]} { - eval $state(-progress) {$token $state(totalsize) $state(currentsize)} - } - } - } -} - proc httpCopyStart {s token} { - upvar #0 $token state - if {[catch { - fcopy $s $state(-channel) -size $state(-blocksize) -command \ - [list httpCopyDone $token] - } err]} { - httpFinish $token $err - } -} - proc httpCopyDone {token count {error {}}} { - upvar #0 $token state - set s $state(sock) - incr state(currentsize) $count - if {[info exists state(-progress)]} { - eval $state(-progress) {$token $state(totalsize) $state(currentsize)} - } - if {([string length $error] != 0)} { - httpFinish $token $error - } elseif {[eof $s]} { - httpEof $token - } else { - httpCopyStart $s $token - } -} - proc httpEof {token} { - upvar #0 $token state - if {$state(state) == "header"} { - # Premature eof - set state(status) eof - } else { - set state(status) ok - } - set state(state) eof - httpFinish $token -} -proc http_wait {token} { - upvar #0 $token state - if {![info exists state(status)] || [string length $state(status)] == 0} { - vwait $token\(status) - } - if {[info exists state(error)]} { - set errorlist $state(error) - unset state(error) - eval error $errorlist - } - return $state(status) -} - -# Call http_formatQuery with an even number of arguments, where the first is -# a name, the second is a value, the third is another name, and so on. - -proc http_formatQuery {args} { - set result "" - set sep "" - foreach i $args { - append result $sep [httpMapReply $i] - if {$sep != "="} { - set sep = - } else { - set sep & - } - } - return $result -} - -# do x-www-urlencoded character mapping -# The spec says: "non-alphanumeric characters are replaced by '%HH'" -# 1 leave alphanumerics characters alone -# 2 Convert every other character to an array lookup -# 3 Escape constructs that are "special" to the tcl parser -# 4 "subst" the result, doing all the array substitutions - - proc httpMapReply {string} { - global httpFormMap - set alphanumeric a-zA-Z0-9 - if {![info exists httpFormMap]} { - - for {set i 1} {$i <= 256} {incr i} { - set c [format %c $i] - if {![string match \[$alphanumeric\] $c]} { - set httpFormMap($c) %[format %.2x $i] - } - } - # These are handled specially - array set httpFormMap { - " " + \n %0d%0a - } - } - regsub -all \[^$alphanumeric\] $string {$httpFormMap(&)} string - regsub -all \n $string {\\n} string - regsub -all \t $string {\\t} string - regsub -all {[][{})\\]\)} $string {\\&} string - return [subst $string] -} - -# Default proxy filter. - proc httpProxyRequired {host} { - global http - if {[info exists http(-proxyhost)] && [string length $http(-proxyhost)]} { - if {![info exists http(-proxyport)] || ![string length $http(-proxyport)]} { - set http(-proxyport) 8080 - } - return [list $http(-proxyhost) $http(-proxyport)] - } else { - return {} - } -} diff --git a/waypoint_manager/manager_GUI/tcl/http1.0/pkgIndex.tcl b/waypoint_manager/manager_GUI/tcl/http1.0/pkgIndex.tcl deleted file mode 100644 index ab6170f..0000000 --- a/waypoint_manager/manager_GUI/tcl/http1.0/pkgIndex.tcl +++ /dev/null @@ -1,11 +0,0 @@ -# Tcl package index file, version 1.0 -# This file is generated by the "pkg_mkIndex" command -# and sourced either when an application starts up or -# by a "package unknown" script. It invokes the -# "package ifneeded" command to set up package-related -# information so that packages will be loaded automatically -# in response to "package require" commands. When this -# script is sourced, the variable $dir must contain the -# full path name of this file's directory. - -package ifneeded http 1.0 [list tclPkgSetup $dir http 1.0 {{http.tcl source {httpCopyDone httpCopyStart httpEof httpEvent httpFinish httpMapReply httpProxyRequired http_code http_config http_data http_formatQuery http_get http_reset http_size http_status http_wait}}}] diff --git a/waypoint_manager/manager_GUI/tcl/init.tcl b/waypoint_manager/manager_GUI/tcl/init.tcl deleted file mode 100644 index 5cda0d9..0000000 --- a/waypoint_manager/manager_GUI/tcl/init.tcl +++ /dev/null @@ -1,821 +0,0 @@ -# init.tcl -- -# -# Default system startup file for Tcl-based applications. Defines -# "unknown" procedure and auto-load facilities. -# -# Copyright (c) 1991-1993 The Regents of the University of California. -# Copyright (c) 1994-1996 Sun Microsystems, Inc. -# Copyright (c) 1998-1999 Scriptics Corporation. -# Copyright (c) 2004 by Kevin B. Kenny. All rights reserved. -# -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -# - -# This test intentionally written in pre-7.5 Tcl -if {[info commands package] == ""} { - error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]" -} -package require -exact Tcl 8.6.10 - -# Compute the auto path to use in this interpreter. -# The values on the path come from several locations: -# -# The environment variable TCLLIBPATH -# -# tcl_library, which is the directory containing this init.tcl script. -# [tclInit] (Tcl_Init()) searches around for the directory containing this -# init.tcl and defines tcl_library to that location before sourcing it. -# -# The parent directory of tcl_library. Adding the parent -# means that packages in peer directories will be found automatically. -# -# Also add the directory ../lib relative to the directory where the -# executable is located. This is meant to find binary packages for the -# same architecture as the current executable. -# -# tcl_pkgPath, which is set by the platform-specific initialization routines -# On UNIX it is compiled in -# On Windows, it is not used - -if {![info exists auto_path]} { - if {[info exists env(TCLLIBPATH)]} { - set auto_path $env(TCLLIBPATH) - } else { - set auto_path "" - } -} -namespace eval tcl { - variable Dir - foreach Dir [list $::tcl_library [file dirname $::tcl_library]] { - if {$Dir ni $::auto_path} { - lappend ::auto_path $Dir - } - } - set Dir [file join [file dirname [file dirname \ - [info nameofexecutable]]] lib] - if {$Dir ni $::auto_path} { - lappend ::auto_path $Dir - } - catch { - foreach Dir $::tcl_pkgPath { - if {$Dir ni $::auto_path} { - lappend ::auto_path $Dir - } - } - } - - if {![interp issafe]} { - variable Path [encoding dirs] - set Dir [file join $::tcl_library encoding] - if {$Dir ni $Path} { - lappend Path $Dir - encoding dirs $Path - } - } - - # TIP #255 min and max functions - namespace eval mathfunc { - proc min {args} { - if {![llength $args]} { - return -code error \ - "too few arguments to math function \"min\"" - } - set val Inf - foreach arg $args { - # This will handle forcing the numeric value without - # ruining the internal type of a numeric object - if {[catch {expr {double($arg)}} err]} { - return -code error $err - } - if {$arg < $val} {set val $arg} - } - return $val - } - proc max {args} { - if {![llength $args]} { - return -code error \ - "too few arguments to math function \"max\"" - } - set val -Inf - foreach arg $args { - # This will handle forcing the numeric value without - # ruining the internal type of a numeric object - if {[catch {expr {double($arg)}} err]} { - return -code error $err - } - if {$arg > $val} {set val $arg} - } - return $val - } - namespace export min max - } -} - -# Windows specific end of initialization - -if {(![interp issafe]) && ($tcl_platform(platform) eq "windows")} { - namespace eval tcl { - proc EnvTraceProc {lo n1 n2 op} { - global env - set x $env($n2) - set env($lo) $x - set env([string toupper $lo]) $x - } - proc InitWinEnv {} { - global env tcl_platform - foreach p [array names env] { - set u [string toupper $p] - if {$u ne $p} { - switch -- $u { - COMSPEC - - PATH { - set temp $env($p) - unset env($p) - set env($u) $temp - trace add variable env($p) write \ - [namespace code [list EnvTraceProc $p]] - trace add variable env($u) write \ - [namespace code [list EnvTraceProc $p]] - } - } - } - } - if {![info exists env(COMSPEC)]} { - set env(COMSPEC) cmd.exe - } - } - InitWinEnv - } -} - -# Setup the unknown package handler - - -if {[interp issafe]} { - package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} -} else { - # Set up search for Tcl Modules (TIP #189). - # and setup platform specific unknown package handlers - if {$tcl_platform(os) eq "Darwin" - && $tcl_platform(platform) eq "unix"} { - package unknown {::tcl::tm::UnknownHandler \ - {::tcl::MacOSXPkgUnknown ::tclPkgUnknown}} - } else { - package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} - } - - # Set up the 'clock' ensemble - - namespace eval ::tcl::clock [list variable TclLibDir $::tcl_library] - - proc ::tcl::initClock {} { - # Auto-loading stubs for 'clock.tcl' - - foreach cmd {add format scan} { - proc ::tcl::clock::$cmd args { - variable TclLibDir - source -encoding utf-8 [file join $TclLibDir clock.tcl] - return [uplevel 1 [info level 0]] - } - } - - rename ::tcl::initClock {} - } - ::tcl::initClock -} - -# Conditionalize for presence of exec. - -if {[namespace which -command exec] eq ""} { - - # Some machines do not have exec. Also, on all - # platforms, safe interpreters do not have exec. - - set auto_noexec 1 -} - -# Define a log command (which can be overwitten to log errors -# differently, specially when stderr is not available) - -if {[namespace which -command tclLog] eq ""} { - proc tclLog {string} { - catch {puts stderr $string} - } -} - -# unknown -- -# This procedure is called when a Tcl command is invoked that doesn't -# exist in the interpreter. It takes the following steps to make the -# command available: -# -# 1. See if the autoload facility can locate the command in a -# Tcl script file. If so, load it and execute it. -# 2. If the command was invoked interactively at top-level: -# (a) see if the command exists as an executable UNIX program. -# If so, "exec" the command. -# (b) see if the command requests csh-like history substitution -# in one of the common forms !!, !, or ^old^new. If -# so, emulate csh's history substitution. -# (c) see if the command is a unique abbreviation for another -# command. If so, invoke the command. -# -# Arguments: -# args - A list whose elements are the words of the original -# command, including the command name. - -proc unknown args { - variable ::tcl::UnknownPending - global auto_noexec auto_noload env tcl_interactive errorInfo errorCode - - if {[info exists errorInfo]} { - set savedErrorInfo $errorInfo - } - if {[info exists errorCode]} { - set savedErrorCode $errorCode - } - - set name [lindex $args 0] - if {![info exists auto_noload]} { - # - # Make sure we're not trying to load the same proc twice. - # - if {[info exists UnknownPending($name)]} { - return -code error "self-referential recursion\ - in \"unknown\" for command \"$name\"" - } - set UnknownPending($name) pending - set ret [catch { - auto_load $name [uplevel 1 {::namespace current}] - } msg opts] - unset UnknownPending($name) - if {$ret != 0} { - dict append opts -errorinfo "\n (autoloading \"$name\")" - return -options $opts $msg - } - if {![array size UnknownPending]} { - unset UnknownPending - } - if {$msg} { - if {[info exists savedErrorCode]} { - set ::errorCode $savedErrorCode - } else { - unset -nocomplain ::errorCode - } - if {[info exists savedErrorInfo]} { - set errorInfo $savedErrorInfo - } else { - unset -nocomplain errorInfo - } - set code [catch {uplevel 1 $args} msg opts] - if {$code == 1} { - # - # Compute stack trace contribution from the [uplevel]. - # Note the dependence on how Tcl_AddErrorInfo, etc. - # construct the stack trace. - # - set errInfo [dict get $opts -errorinfo] - set errCode [dict get $opts -errorcode] - set cinfo $args - if {[string bytelength $cinfo] > 150} { - set cinfo [string range $cinfo 0 150] - while {[string bytelength $cinfo] > 150} { - set cinfo [string range $cinfo 0 end-1] - } - append cinfo ... - } - set tail "\n (\"uplevel\" body line 1)\n invoked\ - from within\n\"uplevel 1 \$args\"" - set expect "$msg\n while executing\n\"$cinfo\"$tail" - if {$errInfo eq $expect} { - # - # The stack has only the eval from the expanded command - # Do not generate any stack trace here. - # - dict unset opts -errorinfo - dict incr opts -level - return -options $opts $msg - } - # - # Stack trace is nested, trim off just the contribution - # from the extra "eval" of $args due to the "catch" above. - # - set last [string last $tail $errInfo] - if {$last + [string length $tail] != [string length $errInfo]} { - # Very likely cannot happen - return -options $opts $msg - } - set errInfo [string range $errInfo 0 $last-1] - set tail "\"$cinfo\"" - set last [string last $tail $errInfo] - if {$last + [string length $tail] != [string length $errInfo]} { - return -code error -errorcode $errCode \ - -errorinfo $errInfo $msg - } - set errInfo [string range $errInfo 0 $last-1] - set tail "\n invoked from within\n" - set last [string last $tail $errInfo] - if {$last + [string length $tail] == [string length $errInfo]} { - return -code error -errorcode $errCode \ - -errorinfo [string range $errInfo 0 $last-1] $msg - } - set tail "\n while executing\n" - set last [string last $tail $errInfo] - if {$last + [string length $tail] == [string length $errInfo]} { - return -code error -errorcode $errCode \ - -errorinfo [string range $errInfo 0 $last-1] $msg - } - return -options $opts $msg - } else { - dict incr opts -level - return -options $opts $msg - } - } - } - - if {([info level] == 1) && ([info script] eq "") - && [info exists tcl_interactive] && $tcl_interactive} { - if {![info exists auto_noexec]} { - set new [auto_execok $name] - if {$new ne ""} { - set redir "" - if {[namespace which -command console] eq ""} { - set redir ">&@stdout <@stdin" - } - uplevel 1 [list ::catch \ - [concat exec $redir $new [lrange $args 1 end]] \ - ::tcl::UnknownResult ::tcl::UnknownOptions] - dict incr ::tcl::UnknownOptions -level - return -options $::tcl::UnknownOptions $::tcl::UnknownResult - } - } - if {$name eq "!!"} { - set newcmd [history event] - } elseif {[regexp {^!(.+)$} $name -> event]} { - set newcmd [history event $event] - } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name -> old new]} { - set newcmd [history event -1] - catch {regsub -all -- $old $newcmd $new newcmd} - } - if {[info exists newcmd]} { - tclLog $newcmd - history change $newcmd 0 - uplevel 1 [list ::catch $newcmd \ - ::tcl::UnknownResult ::tcl::UnknownOptions] - dict incr ::tcl::UnknownOptions -level - return -options $::tcl::UnknownOptions $::tcl::UnknownResult - } - - set ret [catch {set candidates [info commands $name*]} msg] - if {$name eq "::"} { - set name "" - } - if {$ret != 0} { - dict append opts -errorinfo \ - "\n (expanding command prefix \"$name\" in unknown)" - return -options $opts $msg - } - # Filter out bogus matches when $name contained - # a glob-special char [Bug 946952] - if {$name eq ""} { - # Handle empty $name separately due to strangeness - # in [string first] (See RFE 1243354) - set cmds $candidates - } else { - set cmds [list] - foreach x $candidates { - if {[string first $name $x] == 0} { - lappend cmds $x - } - } - } - if {[llength $cmds] == 1} { - uplevel 1 [list ::catch [lreplace $args 0 0 [lindex $cmds 0]] \ - ::tcl::UnknownResult ::tcl::UnknownOptions] - dict incr ::tcl::UnknownOptions -level - return -options $::tcl::UnknownOptions $::tcl::UnknownResult - } - if {[llength $cmds]} { - return -code error "ambiguous command name \"$name\": [lsort $cmds]" - } - } - return -code error -errorcode [list TCL LOOKUP COMMAND $name] \ - "invalid command name \"$name\"" -} - -# auto_load -- -# Checks a collection of library directories to see if a procedure -# is defined in one of them. If so, it sources the appropriate -# library file to create the procedure. Returns 1 if it successfully -# loaded the procedure, 0 otherwise. -# -# Arguments: -# cmd - Name of the command to find and load. -# namespace (optional) The namespace where the command is being used - must be -# a canonical namespace as returned [namespace current] -# for instance. If not given, namespace current is used. - -proc auto_load {cmd {namespace {}}} { - global auto_index auto_path - - if {$namespace eq ""} { - set namespace [uplevel 1 [list ::namespace current]] - } - set nameList [auto_qualify $cmd $namespace] - # workaround non canonical auto_index entries that might be around - # from older auto_mkindex versions - lappend nameList $cmd - foreach name $nameList { - if {[info exists auto_index($name)]} { - namespace eval :: $auto_index($name) - # There's a couple of ways to look for a command of a given - # name. One is to use - # info commands $name - # Unfortunately, if the name has glob-magic chars in it like * - # or [], it may not match. For our purposes here, a better - # route is to use - # namespace which -command $name - if {[namespace which -command $name] ne ""} { - return 1 - } - } - } - if {![info exists auto_path]} { - return 0 - } - - if {![auto_load_index]} { - return 0 - } - foreach name $nameList { - if {[info exists auto_index($name)]} { - namespace eval :: $auto_index($name) - if {[namespace which -command $name] ne ""} { - return 1 - } - } - } - return 0 -} - -# auto_load_index -- -# Loads the contents of tclIndex files on the auto_path directory -# list. This is usually invoked within auto_load to load the index -# of available commands. Returns 1 if the index is loaded, and 0 if -# the index is already loaded and up to date. -# -# Arguments: -# None. - -proc auto_load_index {} { - variable ::tcl::auto_oldpath - global auto_index auto_path - - if {[info exists auto_oldpath] && ($auto_oldpath eq $auto_path)} { - return 0 - } - set auto_oldpath $auto_path - - # Check if we are a safe interpreter. In that case, we support only - # newer format tclIndex files. - - set issafe [interp issafe] - for {set i [expr {[llength $auto_path] - 1}]} {$i >= 0} {incr i -1} { - set dir [lindex $auto_path $i] - set f "" - if {$issafe} { - catch {source [file join $dir tclIndex]} - } elseif {[catch {set f [open [file join $dir tclIndex]]}]} { - continue - } else { - set error [catch { - set id [gets $f] - if {$id eq "# Tcl autoload index file, version 2.0"} { - eval [read $f] - } elseif {$id eq "# Tcl autoload index file: each line identifies a Tcl"} { - while {[gets $f line] >= 0} { - if {([string index $line 0] eq "#") \ - || ([llength $line] != 2)} { - continue - } - set name [lindex $line 0] - set auto_index($name) \ - "source [file join $dir [lindex $line 1]]" - } - } else { - error "[file join $dir tclIndex] isn't a proper Tcl index file" - } - } msg opts] - if {$f ne ""} { - close $f - } - if {$error} { - return -options $opts $msg - } - } - } - return 1 -} - -# auto_qualify -- -# -# Compute a fully qualified names list for use in the auto_index array. -# For historical reasons, commands in the global namespace do not have leading -# :: in the index key. The list has two elements when the command name is -# relative (no leading ::) and the namespace is not the global one. Otherwise -# only one name is returned (and searched in the auto_index). -# -# Arguments - -# cmd The command name. Can be any name accepted for command -# invocations (Like "foo::::bar"). -# namespace The namespace where the command is being used - must be -# a canonical namespace as returned by [namespace current] -# for instance. - -proc auto_qualify {cmd namespace} { - - # count separators and clean them up - # (making sure that foo:::::bar will be treated as foo::bar) - set n [regsub -all {::+} $cmd :: cmd] - - # Ignore namespace if the name starts with :: - # Handle special case of only leading :: - - # Before each return case we give an example of which category it is - # with the following form : - # (inputCmd, inputNameSpace) -> output - - if {[string match ::* $cmd]} { - if {$n > 1} { - # (::foo::bar , *) -> ::foo::bar - return [list $cmd] - } else { - # (::global , *) -> global - return [list [string range $cmd 2 end]] - } - } - - # Potentially returning 2 elements to try : - # (if the current namespace is not the global one) - - if {$n == 0} { - if {$namespace eq "::"} { - # (nocolons , ::) -> nocolons - return [list $cmd] - } else { - # (nocolons , ::sub) -> ::sub::nocolons nocolons - return [list ${namespace}::$cmd $cmd] - } - } elseif {$namespace eq "::"} { - # (foo::bar , ::) -> ::foo::bar - return [list ::$cmd] - } else { - # (foo::bar , ::sub) -> ::sub::foo::bar ::foo::bar - return [list ${namespace}::$cmd ::$cmd] - } -} - -# auto_import -- -# -# Invoked during "namespace import" to make see if the imported commands -# reside in an autoloaded library. If so, the commands are loaded so -# that they will be available for the import links. If not, then this -# procedure does nothing. -# -# Arguments - -# pattern The pattern of commands being imported (like "foo::*") -# a canonical namespace as returned by [namespace current] - -proc auto_import {pattern} { - global auto_index - - # If no namespace is specified, this will be an error case - - if {![string match *::* $pattern]} { - return - } - - set ns [uplevel 1 [list ::namespace current]] - set patternList [auto_qualify $pattern $ns] - - auto_load_index - - foreach pattern $patternList { - foreach name [array names auto_index $pattern] { - if {([namespace which -command $name] eq "") - && ([namespace qualifiers $pattern] eq [namespace qualifiers $name])} { - namespace eval :: $auto_index($name) - } - } - } -} - -# auto_execok -- -# -# Returns string that indicates name of program to execute if -# name corresponds to a shell builtin or an executable in the -# Windows search path, or "" otherwise. Builds an associative -# array auto_execs that caches information about previous checks, -# for speed. -# -# Arguments: -# name - Name of a command. - -if {$tcl_platform(platform) eq "windows"} { -# Windows version. -# -# Note that file executable doesn't work under Windows, so we have to -# look for files with .exe, .com, or .bat extensions. Also, the path -# may be in the Path or PATH environment variables, and path -# components are separated with semicolons, not colons as under Unix. -# -proc auto_execok name { - global auto_execs env tcl_platform - - if {[info exists auto_execs($name)]} { - return $auto_execs($name) - } - set auto_execs($name) "" - - set shellBuiltins [list assoc cls copy date del dir echo erase ftype \ - md mkdir mklink move rd ren rename rmdir start time type ver vol] - if {[info exists env(PATHEXT)]} { - # Add an initial ; to have the {} extension check first. - set execExtensions [split ";$env(PATHEXT)" ";"] - } else { - set execExtensions [list {} .com .exe .bat .cmd] - } - - if {[string tolower $name] in $shellBuiltins} { - # When this is command.com for some reason on Win2K, Tcl won't - # exec it unless the case is right, which this corrects. COMSPEC - # may not point to a real file, so do the check. - set cmd $env(COMSPEC) - if {[file exists $cmd]} { - set cmd [file attributes $cmd -shortname] - } - return [set auto_execs($name) [list $cmd /c $name]] - } - - if {[llength [file split $name]] != 1} { - foreach ext $execExtensions { - set file ${name}${ext} - if {[file exists $file] && ![file isdirectory $file]} { - return [set auto_execs($name) [list $file]] - } - } - return "" - } - - set path "[file dirname [info nameof]];.;" - if {[info exists env(SystemRoot)]} { - set windir $env(SystemRoot) - } elseif {[info exists env(WINDIR)]} { - set windir $env(WINDIR) - } - if {[info exists windir]} { - if {$tcl_platform(os) eq "Windows NT"} { - append path "$windir/system32;" - } - append path "$windir/system;$windir;" - } - - foreach var {PATH Path path} { - if {[info exists env($var)]} { - append path ";$env($var)" - } - } - - foreach ext $execExtensions { - unset -nocomplain checked - foreach dir [split $path {;}] { - # Skip already checked directories - if {[info exists checked($dir)] || ($dir eq "")} { - continue - } - set checked($dir) {} - set file [file join $dir ${name}${ext}] - if {[file exists $file] && ![file isdirectory $file]} { - return [set auto_execs($name) [list $file]] - } - } - } - return "" -} - -} else { -# Unix version. -# -proc auto_execok name { - global auto_execs env - - if {[info exists auto_execs($name)]} { - return $auto_execs($name) - } - set auto_execs($name) "" - if {[llength [file split $name]] != 1} { - if {[file executable $name] && ![file isdirectory $name]} { - set auto_execs($name) [list $name] - } - return $auto_execs($name) - } - foreach dir [split $env(PATH) :] { - if {$dir eq ""} { - set dir . - } - set file [file join $dir $name] - if {[file executable $file] && ![file isdirectory $file]} { - set auto_execs($name) [list $file] - return $auto_execs($name) - } - } - return "" -} - -} - -# ::tcl::CopyDirectory -- -# -# This procedure is called by Tcl's core when attempts to call the -# filesystem's copydirectory function fail. The semantics of the call -# are that 'dest' does not yet exist, i.e. dest should become the exact -# image of src. If dest does exist, we throw an error. -# -# Note that making changes to this procedure can change the results -# of running Tcl's tests. -# -# Arguments: -# action - "renaming" or "copying" -# src - source directory -# dest - destination directory -proc tcl::CopyDirectory {action src dest} { - set nsrc [file normalize $src] - set ndest [file normalize $dest] - - if {$action eq "renaming"} { - # Can't rename volumes. We could give a more precise - # error message here, but that would break the test suite. - if {$nsrc in [file volumes]} { - return -code error "error $action \"$src\" to\ - \"$dest\": trying to rename a volume or move a directory\ - into itself" - } - } - if {[file exists $dest]} { - if {$nsrc eq $ndest} { - return -code error "error $action \"$src\" to\ - \"$dest\": trying to rename a volume or move a directory\ - into itself" - } - if {$action eq "copying"} { - # We used to throw an error here, but, looking more closely - # at the core copy code in tclFCmd.c, if the destination - # exists, then we should only call this function if -force - # is true, which means we just want to over-write. So, - # the following code is now commented out. - # - # return -code error "error $action \"$src\" to\ - # \"$dest\": file already exists" - } else { - # Depending on the platform, and on the current - # working directory, the directories '.', '..' - # can be returned in various combinations. Anyway, - # if any other file is returned, we must signal an error. - set existing [glob -nocomplain -directory $dest * .*] - lappend existing {*}[glob -nocomplain -directory $dest \ - -type hidden * .*] - foreach s $existing { - if {[file tail $s] ni {. ..}} { - return -code error "error $action \"$src\" to\ - \"$dest\": file already exists" - } - } - } - } else { - if {[string first $nsrc $ndest] != -1} { - set srclen [expr {[llength [file split $nsrc]] - 1}] - set ndest [lindex [file split $ndest] $srclen] - if {$ndest eq [file tail $nsrc]} { - return -code error "error $action \"$src\" to\ - \"$dest\": trying to rename a volume or move a directory\ - into itself" - } - } - file mkdir $dest - } - # Have to be careful to capture both visible and hidden files. - # We will also be more generous to the file system and not - # assume the hidden and non-hidden lists are non-overlapping. - # - # On Unix 'hidden' files begin with '.'. On other platforms - # or filesystems hidden files may have other interpretations. - set filelist [concat [glob -nocomplain -directory $src *] \ - [glob -nocomplain -directory $src -types hidden *]] - - foreach s [lsort -unique $filelist] { - if {[file tail $s] ni {. ..}} { - file copy -force -- $s [file join $dest [file tail $s]] - } - } - return -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/af.msg b/waypoint_manager/manager_GUI/tcl/msgs/af.msg deleted file mode 100644 index 0892615..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/af.msg +++ /dev/null @@ -1,49 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset af DAYS_OF_WEEK_ABBREV [list \ - "So"\ - "Ma"\ - "Di"\ - "Wo"\ - "Do"\ - "Vr"\ - "Sa"] - ::msgcat::mcset af DAYS_OF_WEEK_FULL [list \ - "Sondag"\ - "Maandag"\ - "Dinsdag"\ - "Woensdag"\ - "Donderdag"\ - "Vrydag"\ - "Saterdag"] - ::msgcat::mcset af MONTHS_ABBREV [list \ - "Jan"\ - "Feb"\ - "Mar"\ - "Apr"\ - "Mei"\ - "Jun"\ - "Jul"\ - "Aug"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Des"\ - ""] - ::msgcat::mcset af MONTHS_FULL [list \ - "Januarie"\ - "Februarie"\ - "Maart"\ - "April"\ - "Mei"\ - "Junie"\ - "Julie"\ - "Augustus"\ - "September"\ - "Oktober"\ - "November"\ - "Desember"\ - ""] - ::msgcat::mcset af AM "VM" - ::msgcat::mcset af PM "NM" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/af_za.msg b/waypoint_manager/manager_GUI/tcl/msgs/af_za.msg deleted file mode 100644 index fef48ad..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/af_za.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset af_ZA DATE_FORMAT "%d %B %Y" - ::msgcat::mcset af_ZA TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset af_ZA DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ar.msg b/waypoint_manager/manager_GUI/tcl/msgs/ar.msg deleted file mode 100644 index 257157f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ar.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ar DAYS_OF_WEEK_ABBREV [list \ - "\u062d"\ - "\u0646"\ - "\u062b"\ - "\u0631"\ - "\u062e"\ - "\u062c"\ - "\u0633"] - ::msgcat::mcset ar DAYS_OF_WEEK_FULL [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] - ::msgcat::mcset ar MONTHS_ABBREV [list \ - "\u064a\u0646\u0627"\ - "\u0641\u0628\u0631"\ - "\u0645\u0627\u0631"\ - "\u0623\u0628\u0631"\ - "\u0645\u0627\u064a"\ - "\u064a\u0648\u0646"\ - "\u064a\u0648\u0644"\ - "\u0623\u063a\u0633"\ - "\u0633\u0628\u062a"\ - "\u0623\u0643\u062a"\ - "\u0646\u0648\u0641"\ - "\u062f\u064a\u0633"\ - ""] - ::msgcat::mcset ar MONTHS_FULL [list \ - "\u064a\u0646\u0627\u064a\u0631"\ - "\u0641\u0628\u0631\u0627\u064a\u0631"\ - "\u0645\u0627\u0631\u0633"\ - "\u0623\u0628\u0631\u064a\u0644"\ - "\u0645\u0627\u064a\u0648"\ - "\u064a\u0648\u0646\u064a\u0648"\ - "\u064a\u0648\u0644\u064a\u0648"\ - "\u0623\u063a\u0633\u0637\u0633"\ - "\u0633\u0628\u062a\u0645\u0628\u0631"\ - "\u0623\u0643\u062a\u0648\u0628\u0631"\ - "\u0646\u0648\u0641\u0645\u0628\u0631"\ - "\u062f\u064a\u0633\u0645\u0628\u0631"\ - ""] - ::msgcat::mcset ar BCE "\u0642.\u0645" - ::msgcat::mcset ar CE "\u0645" - ::msgcat::mcset ar AM "\u0635" - ::msgcat::mcset ar PM "\u0645" - ::msgcat::mcset ar DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset ar TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset ar DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ar_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/ar_in.msg deleted file mode 100644 index 185e49c..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ar_in.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ar_IN DATE_FORMAT "%A %d %B %Y" - ::msgcat::mcset ar_IN TIME_FORMAT_12 "%I:%M:%S %z" - ::msgcat::mcset ar_IN DATE_TIME_FORMAT "%A %d %B %Y %I:%M:%S %z %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ar_jo.msg b/waypoint_manager/manager_GUI/tcl/msgs/ar_jo.msg deleted file mode 100644 index 0f5e269..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ar_jo.msg +++ /dev/null @@ -1,39 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ar_JO DAYS_OF_WEEK_ABBREV [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] - ::msgcat::mcset ar_JO MONTHS_ABBREV [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ - ""] - ::msgcat::mcset ar_JO MONTHS_FULL [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ar_lb.msg b/waypoint_manager/manager_GUI/tcl/msgs/ar_lb.msg deleted file mode 100644 index e62acd3..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ar_lb.msg +++ /dev/null @@ -1,39 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ar_LB DAYS_OF_WEEK_ABBREV [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] - ::msgcat::mcset ar_LB MONTHS_ABBREV [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ - ""] - ::msgcat::mcset ar_LB MONTHS_FULL [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ar_sy.msg b/waypoint_manager/manager_GUI/tcl/msgs/ar_sy.msg deleted file mode 100644 index d5e1c87..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ar_sy.msg +++ /dev/null @@ -1,39 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ar_SY DAYS_OF_WEEK_ABBREV [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] - ::msgcat::mcset ar_SY MONTHS_ABBREV [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ - ""] - ::msgcat::mcset ar_SY MONTHS_FULL [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631\u0627\u0646"\ - "\u062d\u0632\u064a\u0631"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/be.msg b/waypoint_manager/manager_GUI/tcl/msgs/be.msg deleted file mode 100644 index 379a1d7..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/be.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset be DAYS_OF_WEEK_ABBREV [list \ - "\u043d\u0434"\ - "\u043f\u043d"\ - "\u0430\u0442"\ - "\u0441\u0440"\ - "\u0447\u0446"\ - "\u043f\u0442"\ - "\u0441\u0431"] - ::msgcat::mcset be DAYS_OF_WEEK_FULL [list \ - "\u043d\u044f\u0434\u0437\u0435\u043b\u044f"\ - "\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a"\ - "\u0430\u045e\u0442\u043e\u0440\u0430\u043a"\ - "\u0441\u0435\u0440\u0430\u0434\u0430"\ - "\u0447\u0430\u0446\u0432\u0435\u0440"\ - "\u043f\u044f\u0442\u043d\u0456\u0446\u0430"\ - "\u0441\u0443\u0431\u043e\u0442\u0430"] - ::msgcat::mcset be MONTHS_ABBREV [list \ - "\u0441\u0442\u0434"\ - "\u043b\u044e\u0442"\ - "\u0441\u043a\u0432"\ - "\u043a\u0440\u0441"\ - "\u043c\u0430\u0439"\ - "\u0447\u0440\u0432"\ - "\u043b\u043f\u043d"\ - "\u0436\u043d\u0432"\ - "\u0432\u0440\u0441"\ - "\u043a\u0441\u0442"\ - "\u043b\u0441\u0442"\ - "\u0441\u043d\u0436"\ - ""] - ::msgcat::mcset be MONTHS_FULL [list \ - "\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f"\ - "\u043b\u044e\u0442\u0430\u0433\u0430"\ - "\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430"\ - "\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430"\ - "\u043c\u0430\u044f"\ - "\u0447\u0440\u0432\u0435\u043d\u044f"\ - "\u043b\u0456\u043f\u0435\u043d\u044f"\ - "\u0436\u043d\u0456\u045e\u043d\u044f"\ - "\u0432\u0435\u0440\u0430\u0441\u043d\u044f"\ - "\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430"\ - "\u043b\u0438\u0441\u0442\u0430\u043f\u0430\u0434\u0430"\ - "\u0441\u043d\u0435\u0436\u043d\u044f"\ - ""] - ::msgcat::mcset be BCE "\u0434\u0430 \u043d.\u0435." - ::msgcat::mcset be CE "\u043d.\u0435." - ::msgcat::mcset be DATE_FORMAT "%e.%m.%Y" - ::msgcat::mcset be TIME_FORMAT "%k.%M.%S" - ::msgcat::mcset be DATE_TIME_FORMAT "%e.%m.%Y %k.%M.%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/bg.msg b/waypoint_manager/manager_GUI/tcl/msgs/bg.msg deleted file mode 100644 index ff17759..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/bg.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset bg DAYS_OF_WEEK_ABBREV [list \ - "\u041d\u0434"\ - "\u041f\u043d"\ - "\u0412\u0442"\ - "\u0421\u0440"\ - "\u0427\u0442"\ - "\u041f\u0442"\ - "\u0421\u0431"] - ::msgcat::mcset bg DAYS_OF_WEEK_FULL [list \ - "\u041d\u0435\u0434\u0435\u043b\u044f"\ - "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ - "\u0412\u0442\u043e\u0440\u043d\u0438\u043a"\ - "\u0421\u0440\u044f\u0434\u0430"\ - "\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a"\ - "\u041f\u0435\u0442\u044a\u043a"\ - "\u0421\u044a\u0431\u043e\u0442\u0430"] - ::msgcat::mcset bg MONTHS_ABBREV [list \ - "I"\ - "II"\ - "III"\ - "IV"\ - "V"\ - "VI"\ - "VII"\ - "VIII"\ - "IX"\ - "X"\ - "XI"\ - "XII"\ - ""] - ::msgcat::mcset bg MONTHS_FULL [list \ - "\u042f\u043d\u0443\u0430\u0440\u0438"\ - "\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ - "\u041c\u0430\u0440\u0442"\ - "\u0410\u043f\u0440\u0438\u043b"\ - "\u041c\u0430\u0439"\ - "\u042e\u043d\u0438"\ - "\u042e\u043b\u0438"\ - "\u0410\u0432\u0433\u0443\u0441\u0442"\ - "\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ - "\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ - "\u041d\u043e\u0435\u043c\u0432\u0440\u0438"\ - "\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ - ""] - ::msgcat::mcset bg BCE "\u043f\u0440.\u043d.\u0435." - ::msgcat::mcset bg CE "\u043d.\u0435." - ::msgcat::mcset bg DATE_FORMAT "%Y-%m-%e" - ::msgcat::mcset bg TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset bg DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/bn.msg b/waypoint_manager/manager_GUI/tcl/msgs/bn.msg deleted file mode 100644 index 664b9d8..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/bn.msg +++ /dev/null @@ -1,49 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset bn DAYS_OF_WEEK_ABBREV [list \ - "\u09b0\u09ac\u09bf"\ - "\u09b8\u09cb\u09ae"\ - "\u09ae\u0999\u0997\u09b2"\ - "\u09ac\u09c1\u09a7"\ - "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf"\ - "\u09b6\u09c1\u0995\u09cd\u09b0"\ - "\u09b6\u09a8\u09bf"] - ::msgcat::mcset bn DAYS_OF_WEEK_FULL [list \ - "\u09b0\u09ac\u09bf\u09ac\u09be\u09b0"\ - "\u09b8\u09cb\u09ae\u09ac\u09be\u09b0"\ - "\u09ae\u0999\u0997\u09b2\u09ac\u09be\u09b0"\ - "\u09ac\u09c1\u09a7\u09ac\u09be\u09b0"\ - "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0"\ - "\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0"\ - "\u09b6\u09a8\u09bf\u09ac\u09be\u09b0"] - ::msgcat::mcset bn MONTHS_ABBREV [list \ - "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ae\u09be\u09b0\u09cd\u099a"\ - "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ - "\u09ae\u09c7"\ - "\u099c\u09c1\u09a8"\ - "\u099c\u09c1\u09b2\u09be\u0987"\ - "\u0986\u0997\u09b8\u09cd\u099f"\ - "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ - "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ - ""] - ::msgcat::mcset bn MONTHS_FULL [list \ - "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ae\u09be\u09b0\u09cd\u099a"\ - "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ - "\u09ae\u09c7"\ - "\u099c\u09c1\u09a8"\ - "\u099c\u09c1\u09b2\u09be\u0987"\ - "\u0986\u0997\u09b8\u09cd\u099f"\ - "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ - "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ - ""] - ::msgcat::mcset bn AM "\u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09b9\u09cd\u09a3" - ::msgcat::mcset bn PM "\u0985\u09aa\u09b0\u09be\u09b9\u09cd\u09a3" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/bn_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/bn_in.msg deleted file mode 100644 index 28c000f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/bn_in.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset bn_IN DATE_FORMAT "%A %d %b %Y" - ::msgcat::mcset bn_IN TIME_FORMAT_12 "%I:%M:%S %z" - ::msgcat::mcset bn_IN DATE_TIME_FORMAT "%A %d %b %Y %I:%M:%S %z %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ca.msg b/waypoint_manager/manager_GUI/tcl/msgs/ca.msg deleted file mode 100644 index 36c9772..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ca.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ca DAYS_OF_WEEK_ABBREV [list \ - "dg."\ - "dl."\ - "dt."\ - "dc."\ - "dj."\ - "dv."\ - "ds."] - ::msgcat::mcset ca DAYS_OF_WEEK_FULL [list \ - "diumenge"\ - "dilluns"\ - "dimarts"\ - "dimecres"\ - "dijous"\ - "divendres"\ - "dissabte"] - ::msgcat::mcset ca MONTHS_ABBREV [list \ - "gen."\ - "feb."\ - "mar\u00e7"\ - "abr."\ - "maig"\ - "juny"\ - "jul."\ - "ag."\ - "set."\ - "oct."\ - "nov."\ - "des."\ - ""] - ::msgcat::mcset ca MONTHS_FULL [list \ - "gener"\ - "febrer"\ - "mar\u00e7"\ - "abril"\ - "maig"\ - "juny"\ - "juliol"\ - "agost"\ - "setembre"\ - "octubre"\ - "novembre"\ - "desembre"\ - ""] - ::msgcat::mcset ca DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset ca TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset ca DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/cs.msg b/waypoint_manager/manager_GUI/tcl/msgs/cs.msg deleted file mode 100644 index 8db8bdd..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/cs.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset cs DAYS_OF_WEEK_ABBREV [list \ - "Ne"\ - "Po"\ - "\u00dat"\ - "St"\ - "\u010ct"\ - "P\u00e1"\ - "So"] - ::msgcat::mcset cs DAYS_OF_WEEK_FULL [list \ - "Ned\u011ble"\ - "Pond\u011bl\u00ed"\ - "\u00dater\u00fd"\ - "St\u0159eda"\ - "\u010ctvrtek"\ - "P\u00e1tek"\ - "Sobota"] - ::msgcat::mcset cs MONTHS_ABBREV [list \ - "I"\ - "II"\ - "III"\ - "IV"\ - "V"\ - "VI"\ - "VII"\ - "VIII"\ - "IX"\ - "X"\ - "XI"\ - "XII"\ - ""] - ::msgcat::mcset cs MONTHS_FULL [list \ - "leden"\ - "\u00fanor"\ - "b\u0159ezen"\ - "duben"\ - "kv\u011bten"\ - "\u010derven"\ - "\u010dervenec"\ - "srpen"\ - "z\u00e1\u0159\u00ed"\ - "\u0159\u00edjen"\ - "listopad"\ - "prosinec"\ - ""] - ::msgcat::mcset cs BCE "p\u0159.Kr." - ::msgcat::mcset cs CE "po Kr." - ::msgcat::mcset cs AM "dop." - ::msgcat::mcset cs PM "odp." - ::msgcat::mcset cs DATE_FORMAT "%e.%m.%Y" - ::msgcat::mcset cs TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset cs DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/da.msg b/waypoint_manager/manager_GUI/tcl/msgs/da.msg deleted file mode 100644 index e4fec7f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/da.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset da DAYS_OF_WEEK_ABBREV [list \ - "s\u00f8"\ - "ma"\ - "ti"\ - "on"\ - "to"\ - "fr"\ - "l\u00f8"] - ::msgcat::mcset da DAYS_OF_WEEK_FULL [list \ - "s\u00f8ndag"\ - "mandag"\ - "tirsdag"\ - "onsdag"\ - "torsdag"\ - "fredag"\ - "l\u00f8rdag"] - ::msgcat::mcset da MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "maj"\ - "jun"\ - "jul"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "dec"\ - ""] - ::msgcat::mcset da MONTHS_FULL [list \ - "januar"\ - "februar"\ - "marts"\ - "april"\ - "maj"\ - "juni"\ - "juli"\ - "august"\ - "september"\ - "oktober"\ - "november"\ - "december"\ - ""] - ::msgcat::mcset da BCE "f.Kr." - ::msgcat::mcset da CE "e.Kr." - ::msgcat::mcset da DATE_FORMAT "%d-%m-%Y" - ::msgcat::mcset da TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset da DATE_TIME_FORMAT "%d-%m-%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/de.msg b/waypoint_manager/manager_GUI/tcl/msgs/de.msg deleted file mode 100644 index 9eb3145..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/de.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset de DAYS_OF_WEEK_ABBREV [list \ - "So"\ - "Mo"\ - "Di"\ - "Mi"\ - "Do"\ - "Fr"\ - "Sa"] - ::msgcat::mcset de DAYS_OF_WEEK_FULL [list \ - "Sonntag"\ - "Montag"\ - "Dienstag"\ - "Mittwoch"\ - "Donnerstag"\ - "Freitag"\ - "Samstag"] - ::msgcat::mcset de MONTHS_ABBREV [list \ - "Jan"\ - "Feb"\ - "Mrz"\ - "Apr"\ - "Mai"\ - "Jun"\ - "Jul"\ - "Aug"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Dez"\ - ""] - ::msgcat::mcset de MONTHS_FULL [list \ - "Januar"\ - "Februar"\ - "M\u00e4rz"\ - "April"\ - "Mai"\ - "Juni"\ - "Juli"\ - "August"\ - "September"\ - "Oktober"\ - "November"\ - "Dezember"\ - ""] - ::msgcat::mcset de BCE "v. Chr." - ::msgcat::mcset de CE "n. Chr." - ::msgcat::mcset de AM "vorm." - ::msgcat::mcset de PM "nachm." - ::msgcat::mcset de DATE_FORMAT "%d.%m.%Y" - ::msgcat::mcset de TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset de DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/de_at.msg b/waypoint_manager/manager_GUI/tcl/msgs/de_at.msg deleted file mode 100644 index 61bc266..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/de_at.msg +++ /dev/null @@ -1,35 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset de_AT MONTHS_ABBREV [list \ - "J\u00e4n"\ - "Feb"\ - "M\u00e4r"\ - "Apr"\ - "Mai"\ - "Jun"\ - "Jul"\ - "Aug"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Dez"\ - ""] - ::msgcat::mcset de_AT MONTHS_FULL [list \ - "J\u00e4nner"\ - "Februar"\ - "M\u00e4rz"\ - "April"\ - "Mai"\ - "Juni"\ - "Juli"\ - "August"\ - "September"\ - "Oktober"\ - "November"\ - "Dezember"\ - ""] - ::msgcat::mcset de_AT DATE_FORMAT "%Y-%m-%d" - ::msgcat::mcset de_AT TIME_FORMAT "%T" - ::msgcat::mcset de_AT TIME_FORMAT_12 "%T" - ::msgcat::mcset de_AT DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/de_be.msg b/waypoint_manager/manager_GUI/tcl/msgs/de_be.msg deleted file mode 100644 index 3614763..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/de_be.msg +++ /dev/null @@ -1,53 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset de_BE DAYS_OF_WEEK_ABBREV [list \ - "Son"\ - "Mon"\ - "Die"\ - "Mit"\ - "Don"\ - "Fre"\ - "Sam"] - ::msgcat::mcset de_BE DAYS_OF_WEEK_FULL [list \ - "Sonntag"\ - "Montag"\ - "Dienstag"\ - "Mittwoch"\ - "Donnerstag"\ - "Freitag"\ - "Samstag"] - ::msgcat::mcset de_BE MONTHS_ABBREV [list \ - "Jan"\ - "Feb"\ - "M\u00e4r"\ - "Apr"\ - "Mai"\ - "Jun"\ - "Jul"\ - "Aug"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Dez"\ - ""] - ::msgcat::mcset de_BE MONTHS_FULL [list \ - "Januar"\ - "Februar"\ - "M\u00e4rz"\ - "April"\ - "Mai"\ - "Juni"\ - "Juli"\ - "August"\ - "September"\ - "Oktober"\ - "November"\ - "Dezember"\ - ""] - ::msgcat::mcset de_BE AM "vorm" - ::msgcat::mcset de_BE PM "nachm" - ::msgcat::mcset de_BE DATE_FORMAT "%Y-%m-%d" - ::msgcat::mcset de_BE TIME_FORMAT "%T" - ::msgcat::mcset de_BE TIME_FORMAT_12 "%T" - ::msgcat::mcset de_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/el.msg b/waypoint_manager/manager_GUI/tcl/msgs/el.msg deleted file mode 100644 index ac19f62..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/el.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset el DAYS_OF_WEEK_ABBREV [list \ - "\u039a\u03c5\u03c1"\ - "\u0394\u03b5\u03c5"\ - "\u03a4\u03c1\u03b9"\ - "\u03a4\u03b5\u03c4"\ - "\u03a0\u03b5\u03bc"\ - "\u03a0\u03b1\u03c1"\ - "\u03a3\u03b1\u03b2"] - ::msgcat::mcset el DAYS_OF_WEEK_FULL [list \ - "\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae"\ - "\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1"\ - "\u03a4\u03c1\u03af\u03c4\u03b7"\ - "\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7"\ - "\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7"\ - "\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae"\ - "\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf"] - ::msgcat::mcset el MONTHS_ABBREV [list \ - "\u0399\u03b1\u03bd"\ - "\u03a6\u03b5\u03b2"\ - "\u039c\u03b1\u03c1"\ - "\u0391\u03c0\u03c1"\ - "\u039c\u03b1\u03ca"\ - "\u0399\u03bf\u03c5\u03bd"\ - "\u0399\u03bf\u03c5\u03bb"\ - "\u0391\u03c5\u03b3"\ - "\u03a3\u03b5\u03c0"\ - "\u039f\u03ba\u03c4"\ - "\u039d\u03bf\u03b5"\ - "\u0394\u03b5\u03ba"\ - ""] - ::msgcat::mcset el MONTHS_FULL [list \ - "\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ - "\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ - "\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2"\ - "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2"\ - "\u039c\u03ac\u03ca\u03bf\u03c2"\ - "\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2"\ - "\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2"\ - "\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2"\ - "\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ - "\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2"\ - "\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ - "\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ - ""] - ::msgcat::mcset el AM "\u03c0\u03bc" - ::msgcat::mcset el PM "\u03bc\u03bc" - ::msgcat::mcset el DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset el TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset el DATE_TIME_FORMAT "%e/%m/%Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_au.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_au.msg deleted file mode 100644 index 7f9870c..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_au.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_AU DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset en_AU TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset en_AU TIME_FORMAT_12 "%I:%M:%S %P %z" - ::msgcat::mcset en_AU DATE_TIME_FORMAT "%e/%m/%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_be.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_be.msg deleted file mode 100644 index 5072986..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_be.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_BE DATE_FORMAT "%d %b %Y" - ::msgcat::mcset en_BE TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset en_BE TIME_FORMAT_12 "%k h %M min %S s %z" - ::msgcat::mcset en_BE DATE_TIME_FORMAT "%d %b %Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_bw.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_bw.msg deleted file mode 100644 index 8fd20c7..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_bw.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_BW DATE_FORMAT "%d %B %Y" - ::msgcat::mcset en_BW TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset en_BW DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_ca.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_ca.msg deleted file mode 100644 index 278efe7..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_ca.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_CA DATE_FORMAT "%d/%m/%y" - ::msgcat::mcset en_CA TIME_FORMAT "%r" - ::msgcat::mcset en_CA TIME_FORMAT_12 "%I:%M:%S %p" - ::msgcat::mcset en_CA DATE_TIME_FORMAT "%a %d %b %Y %r %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_gb.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_gb.msg deleted file mode 100644 index 5c61c43..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_gb.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_GB DATE_FORMAT "%d/%m/%y" - ::msgcat::mcset en_GB TIME_FORMAT "%T" - ::msgcat::mcset en_GB TIME_FORMAT_12 "%T" - ::msgcat::mcset en_GB DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_hk.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_hk.msg deleted file mode 100644 index 8b33bc0..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_hk.msg +++ /dev/null @@ -1,8 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_HK AM "AM" - ::msgcat::mcset en_HK PM "PM" - ::msgcat::mcset en_HK DATE_FORMAT "%B %e, %Y" - ::msgcat::mcset en_HK TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset en_HK DATE_TIME_FORMAT "%B %e, %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_ie.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_ie.msg deleted file mode 100644 index ba621cf..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_ie.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_IE DATE_FORMAT "%d/%m/%y" - ::msgcat::mcset en_IE TIME_FORMAT "%T" - ::msgcat::mcset en_IE TIME_FORMAT_12 "%T" - ::msgcat::mcset en_IE DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_in.msg deleted file mode 100644 index a1f155d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_in.msg +++ /dev/null @@ -1,8 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_IN AM "AM" - ::msgcat::mcset en_IN PM "PM" - ::msgcat::mcset en_IN DATE_FORMAT "%d %B %Y" - ::msgcat::mcset en_IN TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset en_IN DATE_TIME_FORMAT "%d %B %Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_nz.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_nz.msg deleted file mode 100644 index b419017..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_nz.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_NZ DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset en_NZ TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset en_NZ TIME_FORMAT_12 "%I:%M:%S %P %z" - ::msgcat::mcset en_NZ DATE_TIME_FORMAT "%e/%m/%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_ph.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_ph.msg deleted file mode 100644 index 682666d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_ph.msg +++ /dev/null @@ -1,8 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_PH AM "AM" - ::msgcat::mcset en_PH PM "PM" - ::msgcat::mcset en_PH DATE_FORMAT "%B %e, %Y" - ::msgcat::mcset en_PH TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset en_PH DATE_TIME_FORMAT "%B %e, %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_sg.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_sg.msg deleted file mode 100644 index 4dc5b1d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_sg.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_SG DATE_FORMAT "%d %b %Y" - ::msgcat::mcset en_SG TIME_FORMAT_12 "%P %I:%M:%S" - ::msgcat::mcset en_SG DATE_TIME_FORMAT "%d %b %Y %P %I:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_za.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_za.msg deleted file mode 100644 index fe43797..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_za.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_ZA DATE_FORMAT "%Y/%m/%d" - ::msgcat::mcset en_ZA TIME_FORMAT_12 "%I:%M:%S" - ::msgcat::mcset en_ZA DATE_TIME_FORMAT "%Y/%m/%d %I:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/en_zw.msg b/waypoint_manager/manager_GUI/tcl/msgs/en_zw.msg deleted file mode 100644 index 2a5804f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/en_zw.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset en_ZW DATE_FORMAT "%d %B %Y" - ::msgcat::mcset en_ZW TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset en_ZW DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/eo.msg b/waypoint_manager/manager_GUI/tcl/msgs/eo.msg deleted file mode 100644 index 1d2a24f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/eo.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset eo DAYS_OF_WEEK_ABBREV [list \ - "di"\ - "lu"\ - "ma"\ - "me"\ - "\u0135a"\ - "ve"\ - "sa"] - ::msgcat::mcset eo DAYS_OF_WEEK_FULL [list \ - "diman\u0109o"\ - "lundo"\ - "mardo"\ - "merkredo"\ - "\u0135a\u016ddo"\ - "vendredo"\ - "sabato"] - ::msgcat::mcset eo MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "maj"\ - "jun"\ - "jul"\ - "a\u016dg"\ - "sep"\ - "okt"\ - "nov"\ - "dec"\ - ""] - ::msgcat::mcset eo MONTHS_FULL [list \ - "januaro"\ - "februaro"\ - "marto"\ - "aprilo"\ - "majo"\ - "junio"\ - "julio"\ - "a\u016dgusto"\ - "septembro"\ - "oktobro"\ - "novembro"\ - "decembro"\ - ""] - ::msgcat::mcset eo BCE "aK" - ::msgcat::mcset eo CE "pK" - ::msgcat::mcset eo AM "atm" - ::msgcat::mcset eo PM "ptm" - ::msgcat::mcset eo DATE_FORMAT "%Y-%b-%d" - ::msgcat::mcset eo TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset eo DATE_TIME_FORMAT "%Y-%b-%d %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es.msg b/waypoint_manager/manager_GUI/tcl/msgs/es.msg deleted file mode 100644 index a24f0a1..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es DAYS_OF_WEEK_ABBREV [list \ - "dom"\ - "lun"\ - "mar"\ - "mi\u00e9"\ - "jue"\ - "vie"\ - "s\u00e1b"] - ::msgcat::mcset es DAYS_OF_WEEK_FULL [list \ - "domingo"\ - "lunes"\ - "martes"\ - "mi\u00e9rcoles"\ - "jueves"\ - "viernes"\ - "s\u00e1bado"] - ::msgcat::mcset es MONTHS_ABBREV [list \ - "ene"\ - "feb"\ - "mar"\ - "abr"\ - "may"\ - "jun"\ - "jul"\ - "ago"\ - "sep"\ - "oct"\ - "nov"\ - "dic"\ - ""] - ::msgcat::mcset es MONTHS_FULL [list \ - "enero"\ - "febrero"\ - "marzo"\ - "abril"\ - "mayo"\ - "junio"\ - "julio"\ - "agosto"\ - "septiembre"\ - "octubre"\ - "noviembre"\ - "diciembre"\ - ""] - ::msgcat::mcset es BCE "a.C." - ::msgcat::mcset es CE "d.C." - ::msgcat::mcset es DATE_FORMAT "%e de %B de %Y" - ::msgcat::mcset es TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset es DATE_TIME_FORMAT "%e de %B de %Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_ar.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_ar.msg deleted file mode 100644 index 7d35027..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_ar.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_AR DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset es_AR TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset es_AR DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_bo.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_bo.msg deleted file mode 100644 index 498ad0d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_bo.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_BO DATE_FORMAT "%d-%m-%Y" - ::msgcat::mcset es_BO TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_BO DATE_TIME_FORMAT "%d-%m-%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_cl.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_cl.msg deleted file mode 100644 index 31d465c..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_cl.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_CL DATE_FORMAT "%d-%m-%Y" - ::msgcat::mcset es_CL TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_CL DATE_TIME_FORMAT "%d-%m-%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_co.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_co.msg deleted file mode 100644 index 77e57f0..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_co.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_CO DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset es_CO TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_CO DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_cr.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_cr.msg deleted file mode 100644 index 7a652fa..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_cr.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_CR DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset es_CR TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_CR DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_do.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_do.msg deleted file mode 100644 index 0e283da..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_do.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_DO DATE_FORMAT "%m/%d/%Y" - ::msgcat::mcset es_DO TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_DO DATE_TIME_FORMAT "%m/%d/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_ec.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_ec.msg deleted file mode 100644 index 9e921e0..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_ec.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_EC DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset es_EC TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_EC DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_gt.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_gt.msg deleted file mode 100644 index ecd6faf..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_gt.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_GT DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset es_GT TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_GT DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_hn.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_hn.msg deleted file mode 100644 index a758ca2..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_hn.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_HN DATE_FORMAT "%m-%d-%Y" - ::msgcat::mcset es_HN TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_HN DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_mx.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_mx.msg deleted file mode 100644 index 7cfb545..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_mx.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_MX DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset es_MX TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_MX DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_ni.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_ni.msg deleted file mode 100644 index 7c39495..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_ni.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_NI DATE_FORMAT "%m-%d-%Y" - ::msgcat::mcset es_NI TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_NI DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_pa.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_pa.msg deleted file mode 100644 index cecacdc..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_pa.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_PA DATE_FORMAT "%m/%d/%Y" - ::msgcat::mcset es_PA TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_PA DATE_TIME_FORMAT "%m/%d/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_pe.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_pe.msg deleted file mode 100644 index 9f90595..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_pe.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_PE DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset es_PE TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_PE DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_pr.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_pr.msg deleted file mode 100644 index 8511b12..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_pr.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_PR DATE_FORMAT "%m-%d-%Y" - ::msgcat::mcset es_PR TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_PR DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_py.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_py.msg deleted file mode 100644 index aa93d36..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_py.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_PY DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset es_PY TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_PY DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_sv.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_sv.msg deleted file mode 100644 index fc7954d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_sv.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_SV DATE_FORMAT "%m-%d-%Y" - ::msgcat::mcset es_SV TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_SV DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_uy.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_uy.msg deleted file mode 100644 index b33525c..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_uy.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_UY DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset es_UY TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_UY DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/es_ve.msg b/waypoint_manager/manager_GUI/tcl/msgs/es_ve.msg deleted file mode 100644 index 7c2a7b0..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/es_ve.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset es_VE DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset es_VE TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset es_VE DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/et.msg b/waypoint_manager/manager_GUI/tcl/msgs/et.msg deleted file mode 100644 index 8d32e9e..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/et.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset et DAYS_OF_WEEK_ABBREV [list \ - "P"\ - "E"\ - "T"\ - "K"\ - "N"\ - "R"\ - "L"] - ::msgcat::mcset et DAYS_OF_WEEK_FULL [list \ - "p\u00fchap\u00e4ev"\ - "esmasp\u00e4ev"\ - "teisip\u00e4ev"\ - "kolmap\u00e4ev"\ - "neljap\u00e4ev"\ - "reede"\ - "laup\u00e4ev"] - ::msgcat::mcset et MONTHS_ABBREV [list \ - "Jaan"\ - "Veebr"\ - "M\u00e4rts"\ - "Apr"\ - "Mai"\ - "Juuni"\ - "Juuli"\ - "Aug"\ - "Sept"\ - "Okt"\ - "Nov"\ - "Dets"\ - ""] - ::msgcat::mcset et MONTHS_FULL [list \ - "Jaanuar"\ - "Veebruar"\ - "M\u00e4rts"\ - "Aprill"\ - "Mai"\ - "Juuni"\ - "Juuli"\ - "August"\ - "September"\ - "Oktoober"\ - "November"\ - "Detsember"\ - ""] - ::msgcat::mcset et BCE "e.m.a." - ::msgcat::mcset et CE "m.a.j." - ::msgcat::mcset et DATE_FORMAT "%e-%m-%Y" - ::msgcat::mcset et TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset et DATE_TIME_FORMAT "%e-%m-%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/eu.msg b/waypoint_manager/manager_GUI/tcl/msgs/eu.msg deleted file mode 100644 index cf708b6..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/eu.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset eu DAYS_OF_WEEK_ABBREV [list \ - "igandea"\ - "astelehena"\ - "asteartea"\ - "asteazkena"\ - "osteguna"\ - "ostirala"\ - "larunbata"] - ::msgcat::mcset eu DAYS_OF_WEEK_FULL [list \ - "igandea"\ - "astelehena"\ - "asteartea"\ - "asteazkena"\ - "osteguna"\ - "ostirala"\ - "larunbata"] - ::msgcat::mcset eu MONTHS_ABBREV [list \ - "urt"\ - "ots"\ - "mar"\ - "api"\ - "mai"\ - "eka"\ - "uzt"\ - "abu"\ - "ira"\ - "urr"\ - "aza"\ - "abe"\ - ""] - ::msgcat::mcset eu MONTHS_FULL [list \ - "urtarrila"\ - "otsaila"\ - "martxoa"\ - "apirila"\ - "maiatza"\ - "ekaina"\ - "uztaila"\ - "abuztua"\ - "iraila"\ - "urria"\ - "azaroa"\ - "abendua"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/eu_es.msg b/waypoint_manager/manager_GUI/tcl/msgs/eu_es.msg deleted file mode 100644 index 2694418..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/eu_es.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset eu_ES DATE_FORMAT "%a, %Yeko %bren %da" - ::msgcat::mcset eu_ES TIME_FORMAT "%T" - ::msgcat::mcset eu_ES TIME_FORMAT_12 "%T" - ::msgcat::mcset eu_ES DATE_TIME_FORMAT "%y-%m-%d %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fa.msg b/waypoint_manager/manager_GUI/tcl/msgs/fa.msg deleted file mode 100644 index 89b2f90..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fa.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fa DAYS_OF_WEEK_ABBREV [list \ - "\u06cc\u2214"\ - "\u062f\u2214"\ - "\u0633\u2214"\ - "\u0686\u2214"\ - "\u067e\u2214"\ - "\u062c\u2214"\ - "\u0634\u2214"] - ::msgcat::mcset fa DAYS_OF_WEEK_FULL [list \ - "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ - "\u062f\u0648\u0634\u0646\u0628\u0647"\ - "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ - "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ - "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ - "\u062c\u0645\u0639\u0647"\ - "\u0634\u0646\u0628\u0647"] - ::msgcat::mcset fa MONTHS_ABBREV [list \ - "\u0698\u0627\u0646"\ - "\u0641\u0648\u0631"\ - "\u0645\u0627\u0631"\ - "\u0622\u0648\u0631"\ - "\u0645\u0640\u0647"\ - "\u0698\u0648\u0646"\ - "\u0698\u0648\u06cc"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a"\ - "\u0627\u0643\u062a"\ - "\u0646\u0648\u0627"\ - "\u062f\u0633\u0627"\ - ""] - ::msgcat::mcset fa MONTHS_FULL [list \ - "\u0698\u0627\u0646\u0648\u06cc\u0647"\ - "\u0641\u0648\u0631\u0648\u06cc\u0647"\ - "\u0645\u0627\u0631\u0633"\ - "\u0622\u0648\u0631\u06cc\u0644"\ - "\u0645\u0647"\ - "\u0698\u0648\u0626\u0646"\ - "\u0698\u0648\u0626\u06cc\u0647"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ - "\u0627\u0643\u062a\u0628\u0631"\ - "\u0646\u0648\u0627\u0645\u0628\u0631"\ - "\u062f\u0633\u0627\u0645\u0628\u0631"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fa_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/fa_in.msg deleted file mode 100644 index adc9e91..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fa_in.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fa_IN DAYS_OF_WEEK_ABBREV [list \ - "\u06cc\u2214"\ - "\u062f\u2214"\ - "\u0633\u2214"\ - "\u0686\u2214"\ - "\u067e\u2214"\ - "\u062c\u2214"\ - "\u0634\u2214"] - ::msgcat::mcset fa_IN DAYS_OF_WEEK_FULL [list \ - "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ - "\u062f\u0648\u0634\u0646\u0628\u0647"\ - "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ - "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ - "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ - "\u062c\u0645\u0639\u0647"\ - "\u0634\u0646\u0628\u0647"] - ::msgcat::mcset fa_IN MONTHS_ABBREV [list \ - "\u0698\u0627\u0646"\ - "\u0641\u0648\u0631"\ - "\u0645\u0627\u0631"\ - "\u0622\u0648\u0631"\ - "\u0645\u0640\u0647"\ - "\u0698\u0648\u0646"\ - "\u0698\u0648\u06cc"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a"\ - "\u0627\u0643\u062a"\ - "\u0646\u0648\u0627"\ - "\u062f\u0633\u0627"\ - ""] - ::msgcat::mcset fa_IN MONTHS_FULL [list \ - "\u0698\u0627\u0646\u0648\u06cc\u0647"\ - "\u0641\u0648\u0631\u0648\u06cc\u0647"\ - "\u0645\u0627\u0631\u0633"\ - "\u0622\u0648\u0631\u06cc\u0644"\ - "\u0645\u0647"\ - "\u0698\u0648\u0626\u0646"\ - "\u0698\u0648\u0626\u06cc\u0647"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ - "\u0627\u0643\u062a\u0628\u0631"\ - "\u0646\u0648\u0627\u0645\u0628\u0631"\ - "\u062f\u0633\u0627\u0645\u0628\u0631"\ - ""] - ::msgcat::mcset fa_IN AM "\u0635\u0628\u062d" - ::msgcat::mcset fa_IN PM "\u0639\u0635\u0631" - ::msgcat::mcset fa_IN DATE_FORMAT "%A %d %B %Y" - ::msgcat::mcset fa_IN TIME_FORMAT_12 "%I:%M:%S %z" - ::msgcat::mcset fa_IN DATE_TIME_FORMAT "%A %d %B %Y %I:%M:%S %z %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fa_ir.msg b/waypoint_manager/manager_GUI/tcl/msgs/fa_ir.msg deleted file mode 100644 index 597ce9d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fa_ir.msg +++ /dev/null @@ -1,9 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fa_IR AM "\u0635\u0628\u062d" - ::msgcat::mcset fa_IR PM "\u0639\u0635\u0631" - ::msgcat::mcset fa_IR DATE_FORMAT "%d\u2044%m\u2044%Y" - ::msgcat::mcset fa_IR TIME_FORMAT "%S:%M:%H" - ::msgcat::mcset fa_IR TIME_FORMAT_12 "%S:%M:%l %P" - ::msgcat::mcset fa_IR DATE_TIME_FORMAT "%d\u2044%m\u2044%Y %S:%M:%H %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fi.msg b/waypoint_manager/manager_GUI/tcl/msgs/fi.msg deleted file mode 100644 index acabba0..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fi.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fi DAYS_OF_WEEK_ABBREV [list \ - "su"\ - "ma"\ - "ti"\ - "ke"\ - "to"\ - "pe"\ - "la"] - ::msgcat::mcset fi DAYS_OF_WEEK_FULL [list \ - "sunnuntai"\ - "maanantai"\ - "tiistai"\ - "keskiviikko"\ - "torstai"\ - "perjantai"\ - "lauantai"] - ::msgcat::mcset fi MONTHS_ABBREV [list \ - "tammi"\ - "helmi"\ - "maalis"\ - "huhti"\ - "touko"\ - "kes\u00e4"\ - "hein\u00e4"\ - "elo"\ - "syys"\ - "loka"\ - "marras"\ - "joulu"\ - ""] - ::msgcat::mcset fi MONTHS_FULL [list \ - "tammikuu"\ - "helmikuu"\ - "maaliskuu"\ - "huhtikuu"\ - "toukokuu"\ - "kes\u00e4kuu"\ - "hein\u00e4kuu"\ - "elokuu"\ - "syyskuu"\ - "lokakuu"\ - "marraskuu"\ - "joulukuu"\ - ""] - ::msgcat::mcset fi DATE_FORMAT "%e.%m.%Y" - ::msgcat::mcset fi TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset fi DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fo.msg b/waypoint_manager/manager_GUI/tcl/msgs/fo.msg deleted file mode 100644 index 4696e62..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fo.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fo DAYS_OF_WEEK_ABBREV [list \ - "sun"\ - "m\u00e1n"\ - "t\u00fds"\ - "mik"\ - "h\u00f3s"\ - "fr\u00ed"\ - "ley"] - ::msgcat::mcset fo DAYS_OF_WEEK_FULL [list \ - "sunnudagur"\ - "m\u00e1nadagur"\ - "t\u00fdsdagur"\ - "mikudagur"\ - "h\u00f3sdagur"\ - "fr\u00edggjadagur"\ - "leygardagur"] - ::msgcat::mcset fo MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "mai"\ - "jun"\ - "jul"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "des"\ - ""] - ::msgcat::mcset fo MONTHS_FULL [list \ - "januar"\ - "februar"\ - "mars"\ - "apr\u00edl"\ - "mai"\ - "juni"\ - "juli"\ - "august"\ - "september"\ - "oktober"\ - "november"\ - "desember"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fo_fo.msg b/waypoint_manager/manager_GUI/tcl/msgs/fo_fo.msg deleted file mode 100644 index 2392b8e..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fo_fo.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fo_FO DATE_FORMAT "%d/%m-%Y" - ::msgcat::mcset fo_FO TIME_FORMAT "%T" - ::msgcat::mcset fo_FO TIME_FORMAT_12 "%T" - ::msgcat::mcset fo_FO DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fr.msg b/waypoint_manager/manager_GUI/tcl/msgs/fr.msg deleted file mode 100644 index 55b19bf..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fr.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fr DAYS_OF_WEEK_ABBREV [list \ - "dim."\ - "lun."\ - "mar."\ - "mer."\ - "jeu."\ - "ven."\ - "sam."] - ::msgcat::mcset fr DAYS_OF_WEEK_FULL [list \ - "dimanche"\ - "lundi"\ - "mardi"\ - "mercredi"\ - "jeudi"\ - "vendredi"\ - "samedi"] - ::msgcat::mcset fr MONTHS_ABBREV [list \ - "janv."\ - "f\u00e9vr."\ - "mars"\ - "avr."\ - "mai"\ - "juin"\ - "juil."\ - "ao\u00fbt"\ - "sept."\ - "oct."\ - "nov."\ - "d\u00e9c."\ - ""] - ::msgcat::mcset fr MONTHS_FULL [list \ - "janvier"\ - "f\u00e9vrier"\ - "mars"\ - "avril"\ - "mai"\ - "juin"\ - "juillet"\ - "ao\u00fbt"\ - "septembre"\ - "octobre"\ - "novembre"\ - "d\u00e9cembre"\ - ""] - ::msgcat::mcset fr BCE "av. J.-C." - ::msgcat::mcset fr CE "ap. J.-C." - ::msgcat::mcset fr DATE_FORMAT "%e %B %Y" - ::msgcat::mcset fr TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset fr DATE_TIME_FORMAT "%e %B %Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fr_be.msg b/waypoint_manager/manager_GUI/tcl/msgs/fr_be.msg deleted file mode 100644 index cdb13bd..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fr_be.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fr_BE DATE_FORMAT "%d/%m/%y" - ::msgcat::mcset fr_BE TIME_FORMAT "%T" - ::msgcat::mcset fr_BE TIME_FORMAT_12 "%T" - ::msgcat::mcset fr_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fr_ca.msg b/waypoint_manager/manager_GUI/tcl/msgs/fr_ca.msg deleted file mode 100644 index 00ccfff..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fr_ca.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fr_CA DATE_FORMAT "%Y-%m-%d" - ::msgcat::mcset fr_CA TIME_FORMAT "%T" - ::msgcat::mcset fr_CA TIME_FORMAT_12 "%T" - ::msgcat::mcset fr_CA DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/fr_ch.msg b/waypoint_manager/manager_GUI/tcl/msgs/fr_ch.msg deleted file mode 100644 index 7e2bac7..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/fr_ch.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset fr_CH DATE_FORMAT "%d. %m. %y" - ::msgcat::mcset fr_CH TIME_FORMAT "%T" - ::msgcat::mcset fr_CH TIME_FORMAT_12 "%T" - ::msgcat::mcset fr_CH DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ga.msg b/waypoint_manager/manager_GUI/tcl/msgs/ga.msg deleted file mode 100644 index 6edf13a..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ga.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ga DAYS_OF_WEEK_ABBREV [list \ - "Domh"\ - "Luan"\ - "M\u00e1irt"\ - "C\u00e9ad"\ - "D\u00e9ar"\ - "Aoine"\ - "Sath"] - ::msgcat::mcset ga DAYS_OF_WEEK_FULL [list \ - "D\u00e9 Domhnaigh"\ - "D\u00e9 Luain"\ - "D\u00e9 M\u00e1irt"\ - "D\u00e9 C\u00e9adaoin"\ - "D\u00e9ardaoin"\ - "D\u00e9 hAoine"\ - "D\u00e9 Sathairn"] - ::msgcat::mcset ga MONTHS_ABBREV [list \ - "Ean"\ - "Feabh"\ - "M\u00e1rta"\ - "Aib"\ - "Beal"\ - "Meith"\ - "I\u00fail"\ - "L\u00fan"\ - "MF\u00f3mh"\ - "DF\u00f3mh"\ - "Samh"\ - "Noll"\ - ""] - ::msgcat::mcset ga MONTHS_FULL [list \ - "Ean\u00e1ir"\ - "Feabhra"\ - "M\u00e1rta"\ - "Aibre\u00e1n"\ - "M\u00ed na Bealtaine"\ - "Meith"\ - "I\u00fail"\ - "L\u00fanasa"\ - "Me\u00e1n F\u00f3mhair"\ - "Deireadh F\u00f3mhair"\ - "M\u00ed na Samhna"\ - "M\u00ed na Nollag"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ga_ie.msg b/waypoint_manager/manager_GUI/tcl/msgs/ga_ie.msg deleted file mode 100644 index b6acbbc..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ga_ie.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ga_IE DATE_FORMAT "%d.%m.%y" - ::msgcat::mcset ga_IE TIME_FORMAT "%T" - ::msgcat::mcset ga_IE TIME_FORMAT_12 "%T" - ::msgcat::mcset ga_IE DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/gl.msg b/waypoint_manager/manager_GUI/tcl/msgs/gl.msg deleted file mode 100644 index 4b869e8..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/gl.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset gl DAYS_OF_WEEK_ABBREV [list \ - "Dom"\ - "Lun"\ - "Mar"\ - "M\u00e9r"\ - "Xov"\ - "Ven"\ - "S\u00e1b"] - ::msgcat::mcset gl DAYS_OF_WEEK_FULL [list \ - "Domingo"\ - "Luns"\ - "Martes"\ - "M\u00e9rcores"\ - "Xoves"\ - "Venres"\ - "S\u00e1bado"] - ::msgcat::mcset gl MONTHS_ABBREV [list \ - "Xan"\ - "Feb"\ - "Mar"\ - "Abr"\ - "Mai"\ - "Xu\u00f1"\ - "Xul"\ - "Ago"\ - "Set"\ - "Out"\ - "Nov"\ - "Dec"\ - ""] - ::msgcat::mcset gl MONTHS_FULL [list \ - "Xaneiro"\ - "Febreiro"\ - "Marzo"\ - "Abril"\ - "Maio"\ - "Xu\u00f1o"\ - "Xullo"\ - "Agosto"\ - "Setembro"\ - "Outubro"\ - "Novembro"\ - "Decembro"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/gl_es.msg b/waypoint_manager/manager_GUI/tcl/msgs/gl_es.msg deleted file mode 100644 index d4ed270..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/gl_es.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset gl_ES DATE_FORMAT "%d %B %Y" - ::msgcat::mcset gl_ES TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset gl_ES DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/gv.msg b/waypoint_manager/manager_GUI/tcl/msgs/gv.msg deleted file mode 100644 index 7d332ad..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/gv.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset gv DAYS_OF_WEEK_ABBREV [list \ - "Jed"\ - "Jel"\ - "Jem"\ - "Jerc"\ - "Jerd"\ - "Jeh"\ - "Jes"] - ::msgcat::mcset gv DAYS_OF_WEEK_FULL [list \ - "Jedoonee"\ - "Jelhein"\ - "Jemayrt"\ - "Jercean"\ - "Jerdein"\ - "Jeheiney"\ - "Jesarn"] - ::msgcat::mcset gv MONTHS_ABBREV [list \ - "J-guer"\ - "T-arree"\ - "Mayrnt"\ - "Avrril"\ - "Boaldyn"\ - "M-souree"\ - "J-souree"\ - "Luanistyn"\ - "M-fouyir"\ - "J-fouyir"\ - "M.Houney"\ - "M.Nollick"\ - ""] - ::msgcat::mcset gv MONTHS_FULL [list \ - "Jerrey-geuree"\ - "Toshiaght-arree"\ - "Mayrnt"\ - "Averil"\ - "Boaldyn"\ - "Mean-souree"\ - "Jerrey-souree"\ - "Luanistyn"\ - "Mean-fouyir"\ - "Jerrey-fouyir"\ - "Mee Houney"\ - "Mee ny Nollick"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/gv_gb.msg b/waypoint_manager/manager_GUI/tcl/msgs/gv_gb.msg deleted file mode 100644 index 5e96e6f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/gv_gb.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset gv_GB DATE_FORMAT "%d %B %Y" - ::msgcat::mcset gv_GB TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset gv_GB DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/he.msg b/waypoint_manager/manager_GUI/tcl/msgs/he.msg deleted file mode 100644 index 4fd921d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/he.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset he DAYS_OF_WEEK_ABBREV [list \ - "\u05d0"\ - "\u05d1"\ - "\u05d2"\ - "\u05d3"\ - "\u05d4"\ - "\u05d5"\ - "\u05e9"] - ::msgcat::mcset he DAYS_OF_WEEK_FULL [list \ - "\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df"\ - "\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9"\ - "\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9"\ - "\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9"\ - "\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9"\ - "\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9"\ - "\u05e9\u05d1\u05ea"] - ::msgcat::mcset he MONTHS_ABBREV [list \ - "\u05d9\u05e0\u05d5"\ - "\u05e4\u05d1\u05e8"\ - "\u05de\u05e8\u05e5"\ - "\u05d0\u05e4\u05e8"\ - "\u05de\u05d0\u05d9"\ - "\u05d9\u05d5\u05e0"\ - "\u05d9\u05d5\u05dc"\ - "\u05d0\u05d5\u05d2"\ - "\u05e1\u05e4\u05d8"\ - "\u05d0\u05d5\u05e7"\ - "\u05e0\u05d5\u05d1"\ - "\u05d3\u05e6\u05de"\ - ""] - ::msgcat::mcset he MONTHS_FULL [list \ - "\u05d9\u05e0\u05d5\u05d0\u05e8"\ - "\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8"\ - "\u05de\u05e8\u05e5"\ - "\u05d0\u05e4\u05e8\u05d9\u05dc"\ - "\u05de\u05d0\u05d9"\ - "\u05d9\u05d5\u05e0\u05d9"\ - "\u05d9\u05d5\u05dc\u05d9"\ - "\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8"\ - "\u05e1\u05e4\u05d8\u05de\u05d1\u05e8"\ - "\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8"\ - "\u05e0\u05d5\u05d1\u05de\u05d1\u05e8"\ - "\u05d3\u05e6\u05de\u05d1\u05e8"\ - ""] - ::msgcat::mcset he BCE "\u05dc\u05e1\u05d4\u0022\u05e0" - ::msgcat::mcset he CE "\u05dc\u05e4\u05e1\u05d4\u0022\u05e0" - ::msgcat::mcset he DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset he TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset he DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/hi.msg b/waypoint_manager/manager_GUI/tcl/msgs/hi.msg deleted file mode 100644 index 50c9fb8..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/hi.msg +++ /dev/null @@ -1,39 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset hi DAYS_OF_WEEK_FULL [list \ - "\u0930\u0935\u093f\u0935\u093e\u0930"\ - "\u0938\u094b\u092e\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0932\u0935\u093e\u0930"\ - "\u092c\u0941\u0927\u0935\u093e\u0930"\ - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ - "\u0936\u0928\u093f\u0935\u093e\u0930"] - ::msgcat::mcset hi MONTHS_ABBREV [list \ - "\u091c\u0928\u0935\u0930\u0940"\ - "\u092b\u093c\u0930\u0935\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u0905\u092a\u094d\u0930\u0947\u0932"\ - "\u092e\u0908"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u093e\u0908"\ - "\u0905\u0917\u0938\u094d\u0924"\ - "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ - "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ - "\u0928\u0935\u092e\u094d\u092c\u0930"\ - "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] - ::msgcat::mcset hi MONTHS_FULL [list \ - "\u091c\u0928\u0935\u0930\u0940"\ - "\u092b\u093c\u0930\u0935\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u0905\u092a\u094d\u0930\u0947\u0932"\ - "\u092e\u0908"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u093e\u0908"\ - "\u0905\u0917\u0938\u094d\u0924"\ - "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ - "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ - "\u0928\u0935\u092e\u094d\u092c\u0930"\ - "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] - ::msgcat::mcset hi AM "\u0908\u0938\u093e\u092a\u0942\u0930\u094d\u0935" - ::msgcat::mcset hi PM "." -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/hi_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/hi_in.msg deleted file mode 100644 index 239793f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/hi_in.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset hi_IN DATE_FORMAT "%d %M %Y" - ::msgcat::mcset hi_IN TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset hi_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/hr.msg b/waypoint_manager/manager_GUI/tcl/msgs/hr.msg deleted file mode 100644 index cec145b..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/hr.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset hr DAYS_OF_WEEK_ABBREV [list \ - "ned"\ - "pon"\ - "uto"\ - "sri"\ - "\u010det"\ - "pet"\ - "sub"] - ::msgcat::mcset hr DAYS_OF_WEEK_FULL [list \ - "nedjelja"\ - "ponedjeljak"\ - "utorak"\ - "srijeda"\ - "\u010detvrtak"\ - "petak"\ - "subota"] - ::msgcat::mcset hr MONTHS_ABBREV [list \ - "sij"\ - "vel"\ - "o\u017eu"\ - "tra"\ - "svi"\ - "lip"\ - "srp"\ - "kol"\ - "ruj"\ - "lis"\ - "stu"\ - "pro"\ - ""] - ::msgcat::mcset hr MONTHS_FULL [list \ - "sije\u010danj"\ - "velja\u010da"\ - "o\u017eujak"\ - "travanj"\ - "svibanj"\ - "lipanj"\ - "srpanj"\ - "kolovoz"\ - "rujan"\ - "listopad"\ - "studeni"\ - "prosinac"\ - ""] - ::msgcat::mcset hr DATE_FORMAT "%Y.%m.%d" - ::msgcat::mcset hr TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset hr DATE_TIME_FORMAT "%Y.%m.%d %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/hu.msg b/waypoint_manager/manager_GUI/tcl/msgs/hu.msg deleted file mode 100644 index e5e68d9..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/hu.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset hu DAYS_OF_WEEK_ABBREV [list \ - "V"\ - "H"\ - "K"\ - "Sze"\ - "Cs"\ - "P"\ - "Szo"] - ::msgcat::mcset hu DAYS_OF_WEEK_FULL [list \ - "vas\u00e1rnap"\ - "h\u00e9tf\u0151"\ - "kedd"\ - "szerda"\ - "cs\u00fct\u00f6rt\u00f6k"\ - "p\u00e9ntek"\ - "szombat"] - ::msgcat::mcset hu MONTHS_ABBREV [list \ - "jan."\ - "febr."\ - "m\u00e1rc."\ - "\u00e1pr."\ - "m\u00e1j."\ - "j\u00fan."\ - "j\u00fal."\ - "aug."\ - "szept."\ - "okt."\ - "nov."\ - "dec."\ - ""] - ::msgcat::mcset hu MONTHS_FULL [list \ - "janu\u00e1r"\ - "febru\u00e1r"\ - "m\u00e1rcius"\ - "\u00e1prilis"\ - "m\u00e1jus"\ - "j\u00fanius"\ - "j\u00falius"\ - "augusztus"\ - "szeptember"\ - "okt\u00f3ber"\ - "november"\ - "december"\ - ""] - ::msgcat::mcset hu BCE "i.e." - ::msgcat::mcset hu CE "i.u." - ::msgcat::mcset hu AM "DE" - ::msgcat::mcset hu PM "DU" - ::msgcat::mcset hu DATE_FORMAT "%Y.%m.%d." - ::msgcat::mcset hu TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset hu DATE_TIME_FORMAT "%Y.%m.%d. %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/id.msg b/waypoint_manager/manager_GUI/tcl/msgs/id.msg deleted file mode 100644 index 17c6bb5..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/id.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset id DAYS_OF_WEEK_ABBREV [list \ - "Min"\ - "Sen"\ - "Sel"\ - "Rab"\ - "Kam"\ - "Jum"\ - "Sab"] - ::msgcat::mcset id DAYS_OF_WEEK_FULL [list \ - "Minggu"\ - "Senin"\ - "Selasa"\ - "Rabu"\ - "Kamis"\ - "Jumat"\ - "Sabtu"] - ::msgcat::mcset id MONTHS_ABBREV [list \ - "Jan"\ - "Peb"\ - "Mar"\ - "Apr"\ - "Mei"\ - "Jun"\ - "Jul"\ - "Agu"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Des"\ - ""] - ::msgcat::mcset id MONTHS_FULL [list \ - "Januari"\ - "Pebruari"\ - "Maret"\ - "April"\ - "Mei"\ - "Juni"\ - "Juli"\ - "Agustus"\ - "September"\ - "Oktober"\ - "November"\ - "Desember"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/id_id.msg b/waypoint_manager/manager_GUI/tcl/msgs/id_id.msg deleted file mode 100644 index bb672c1..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/id_id.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset id_ID DATE_FORMAT "%d %B %Y" - ::msgcat::mcset id_ID TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset id_ID DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/is.msg b/waypoint_manager/manager_GUI/tcl/msgs/is.msg deleted file mode 100644 index adc2d2a..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/is.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset is DAYS_OF_WEEK_ABBREV [list \ - "sun."\ - "m\u00e1n."\ - "\u00feri."\ - "mi\u00f0."\ - "fim."\ - "f\u00f6s."\ - "lau."] - ::msgcat::mcset is DAYS_OF_WEEK_FULL [list \ - "sunnudagur"\ - "m\u00e1nudagur"\ - "\u00feri\u00f0judagur"\ - "mi\u00f0vikudagur"\ - "fimmtudagur"\ - "f\u00f6studagur"\ - "laugardagur"] - ::msgcat::mcset is MONTHS_ABBREV [list \ - "jan."\ - "feb."\ - "mar."\ - "apr."\ - "ma\u00ed"\ - "j\u00fan."\ - "j\u00fal."\ - "\u00e1g\u00fa."\ - "sep."\ - "okt."\ - "n\u00f3v."\ - "des."\ - ""] - ::msgcat::mcset is MONTHS_FULL [list \ - "jan\u00faar"\ - "febr\u00faar"\ - "mars"\ - "apr\u00edl"\ - "ma\u00ed"\ - "j\u00fan\u00ed"\ - "j\u00fal\u00ed"\ - "\u00e1g\u00fast"\ - "september"\ - "okt\u00f3ber"\ - "n\u00f3vember"\ - "desember"\ - ""] - ::msgcat::mcset is DATE_FORMAT "%e.%m.%Y" - ::msgcat::mcset is TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset is DATE_TIME_FORMAT "%e.%m.%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/it.msg b/waypoint_manager/manager_GUI/tcl/msgs/it.msg deleted file mode 100644 index b641cde..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/it.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset it DAYS_OF_WEEK_ABBREV [list \ - "dom"\ - "lun"\ - "mar"\ - "mer"\ - "gio"\ - "ven"\ - "sab"] - ::msgcat::mcset it DAYS_OF_WEEK_FULL [list \ - "domenica"\ - "luned\u00ec"\ - "marted\u00ec"\ - "mercoled\u00ec"\ - "gioved\u00ec"\ - "venerd\u00ec"\ - "sabato"] - ::msgcat::mcset it MONTHS_ABBREV [list \ - "gen"\ - "feb"\ - "mar"\ - "apr"\ - "mag"\ - "giu"\ - "lug"\ - "ago"\ - "set"\ - "ott"\ - "nov"\ - "dic"\ - ""] - ::msgcat::mcset it MONTHS_FULL [list \ - "gennaio"\ - "febbraio"\ - "marzo"\ - "aprile"\ - "maggio"\ - "giugno"\ - "luglio"\ - "agosto"\ - "settembre"\ - "ottobre"\ - "novembre"\ - "dicembre"\ - ""] - ::msgcat::mcset it BCE "aC" - ::msgcat::mcset it CE "dC" - ::msgcat::mcset it AM "m." - ::msgcat::mcset it PM "p." - ::msgcat::mcset it DATE_FORMAT "%d %B %Y" - ::msgcat::mcset it TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset it DATE_TIME_FORMAT "%d %B %Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/it_ch.msg b/waypoint_manager/manager_GUI/tcl/msgs/it_ch.msg deleted file mode 100644 index b36ed36..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/it_ch.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset it_CH DATE_FORMAT "%e. %B %Y" - ::msgcat::mcset it_CH TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset it_CH DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ja.msg b/waypoint_manager/manager_GUI/tcl/msgs/ja.msg deleted file mode 100644 index cf70c2f..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ja.msg +++ /dev/null @@ -1,44 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ja DAYS_OF_WEEK_ABBREV [list \ - "\u65e5"\ - "\u6708"\ - "\u706b"\ - "\u6c34"\ - "\u6728"\ - "\u91d1"\ - "\u571f"] - ::msgcat::mcset ja DAYS_OF_WEEK_FULL [list \ - "\u65e5\u66dc\u65e5"\ - "\u6708\u66dc\u65e5"\ - "\u706b\u66dc\u65e5"\ - "\u6c34\u66dc\u65e5"\ - "\u6728\u66dc\u65e5"\ - "\u91d1\u66dc\u65e5"\ - "\u571f\u66dc\u65e5"] - ::msgcat::mcset ja MONTHS_FULL [list \ - "1\u6708"\ - "2\u6708"\ - "3\u6708"\ - "4\u6708"\ - "5\u6708"\ - "6\u6708"\ - "7\u6708"\ - "8\u6708"\ - "9\u6708"\ - "10\u6708"\ - "11\u6708"\ - "12\u6708"] - ::msgcat::mcset ja BCE "\u7d00\u5143\u524d" - ::msgcat::mcset ja CE "\u897f\u66a6" - ::msgcat::mcset ja AM "\u5348\u524d" - ::msgcat::mcset ja PM "\u5348\u5f8c" - ::msgcat::mcset ja DATE_FORMAT "%Y/%m/%d" - ::msgcat::mcset ja TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset ja TIME_FORMAT_12 "%P %I:%M:%S" - ::msgcat::mcset ja DATE_TIME_FORMAT "%Y/%m/%d %k:%M:%S %z" - ::msgcat::mcset ja LOCALE_DATE_FORMAT "%EY\u5e74%m\u6708%d\u65e5" - ::msgcat::mcset ja LOCALE_TIME_FORMAT "%H\u6642%M\u5206%S\u79d2" - ::msgcat::mcset ja LOCALE_DATE_TIME_FORMAT "%EY\u5e74%m\u6708%d\u65e5 (%a) %H\u6642%M\u5206%S\u79d2 %z" - ::msgcat::mcset ja LOCALE_ERAS "{-9223372036854775808 \u897f\u66a6 0} {-3061011600 \u660e\u6cbb 1867} {-1812186000 \u5927\u6b63 1911} {-1357635600 \u662d\u548c 1925} {600220800 \u5e73\u6210 1988} {1556668800 \u4ee4\u548c 2018}" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/kl.msg b/waypoint_manager/manager_GUI/tcl/msgs/kl.msg deleted file mode 100644 index d877bfe..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/kl.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset kl DAYS_OF_WEEK_ABBREV [list \ - "sab"\ - "ata"\ - "mar"\ - "pin"\ - "sis"\ - "tal"\ - "arf"] - ::msgcat::mcset kl DAYS_OF_WEEK_FULL [list \ - "sabaat"\ - "ataasinngorneq"\ - "marlunngorneq"\ - "pingasunngorneq"\ - "sisamanngorneq"\ - "tallimanngorneq"\ - "arfininngorneq"] - ::msgcat::mcset kl MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "maj"\ - "jun"\ - "jul"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "dec"\ - ""] - ::msgcat::mcset kl MONTHS_FULL [list \ - "januari"\ - "februari"\ - "martsi"\ - "aprili"\ - "maji"\ - "juni"\ - "juli"\ - "augustusi"\ - "septemberi"\ - "oktoberi"\ - "novemberi"\ - "decemberi"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/kl_gl.msg b/waypoint_manager/manager_GUI/tcl/msgs/kl_gl.msg deleted file mode 100644 index 403aa10..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/kl_gl.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset kl_GL DATE_FORMAT "%d %b %Y" - ::msgcat::mcset kl_GL TIME_FORMAT "%T" - ::msgcat::mcset kl_GL TIME_FORMAT_12 "%T" - ::msgcat::mcset kl_GL DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ko.msg b/waypoint_manager/manager_GUI/tcl/msgs/ko.msg deleted file mode 100644 index 0cd17a1..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ko.msg +++ /dev/null @@ -1,55 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ko DAYS_OF_WEEK_ABBREV [list \ - "\uc77c"\ - "\uc6d4"\ - "\ud654"\ - "\uc218"\ - "\ubaa9"\ - "\uae08"\ - "\ud1a0"] - ::msgcat::mcset ko DAYS_OF_WEEK_FULL [list \ - "\uc77c\uc694\uc77c"\ - "\uc6d4\uc694\uc77c"\ - "\ud654\uc694\uc77c"\ - "\uc218\uc694\uc77c"\ - "\ubaa9\uc694\uc77c"\ - "\uae08\uc694\uc77c"\ - "\ud1a0\uc694\uc77c"] - ::msgcat::mcset ko MONTHS_ABBREV [list \ - "1\uc6d4"\ - "2\uc6d4"\ - "3\uc6d4"\ - "4\uc6d4"\ - "5\uc6d4"\ - "6\uc6d4"\ - "7\uc6d4"\ - "8\uc6d4"\ - "9\uc6d4"\ - "10\uc6d4"\ - "11\uc6d4"\ - "12\uc6d4"\ - ""] - ::msgcat::mcset ko MONTHS_FULL [list \ - "1\uc6d4"\ - "2\uc6d4"\ - "3\uc6d4"\ - "4\uc6d4"\ - "5\uc6d4"\ - "6\uc6d4"\ - "7\uc6d4"\ - "8\uc6d4"\ - "9\uc6d4"\ - "10\uc6d4"\ - "11\uc6d4"\ - "12\uc6d4"\ - ""] - ::msgcat::mcset ko AM "\uc624\uc804" - ::msgcat::mcset ko PM "\uc624\ud6c4" - ::msgcat::mcset ko DATE_FORMAT "%Y-%m-%d" - ::msgcat::mcset ko TIME_FORMAT_12 "%P %l:%M:%S" - ::msgcat::mcset ko DATE_TIME_FORMAT "%Y-%m-%d %P %l:%M:%S %z" - ::msgcat::mcset ko LOCALE_DATE_FORMAT "%Y\ub144%B%Od\uc77c" - ::msgcat::mcset ko LOCALE_TIME_FORMAT "%H\uc2dc%M\ubd84%S\ucd08" - ::msgcat::mcset ko LOCALE_DATE_TIME_FORMAT "%A %Y\ub144%B%Od\uc77c%H\uc2dc%M\ubd84%S\ucd08 %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ko_kr.msg b/waypoint_manager/manager_GUI/tcl/msgs/ko_kr.msg deleted file mode 100644 index ea5bbd7..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ko_kr.msg +++ /dev/null @@ -1,8 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ko_KR BCE "\uae30\uc6d0\uc804" - ::msgcat::mcset ko_KR CE "\uc11c\uae30" - ::msgcat::mcset ko_KR DATE_FORMAT "%Y.%m.%d" - ::msgcat::mcset ko_KR TIME_FORMAT_12 "%P %l:%M:%S" - ::msgcat::mcset ko_KR DATE_TIME_FORMAT "%Y.%m.%d %P %l:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/kok.msg b/waypoint_manager/manager_GUI/tcl/msgs/kok.msg deleted file mode 100644 index 0869f20..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/kok.msg +++ /dev/null @@ -1,39 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset kok DAYS_OF_WEEK_FULL [list \ - "\u0906\u0926\u093f\u0924\u094d\u092f\u0935\u093e\u0930"\ - "\u0938\u094b\u092e\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0933\u093e\u0930"\ - "\u092c\u0941\u0927\u0935\u093e\u0930"\ - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ - "\u0936\u0928\u093f\u0935\u093e\u0930"] - ::msgcat::mcset kok MONTHS_ABBREV [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] - ::msgcat::mcset kok MONTHS_FULL [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] - ::msgcat::mcset kok AM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u092a\u0942\u0930\u094d\u0935" - ::msgcat::mcset kok PM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u0936\u0916\u093e" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/kok_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/kok_in.msg deleted file mode 100644 index abcb1ff..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/kok_in.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset kok_IN DATE_FORMAT "%d %M %Y" - ::msgcat::mcset kok_IN TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset kok_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/kw.msg b/waypoint_manager/manager_GUI/tcl/msgs/kw.msg deleted file mode 100644 index aaf79b3..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/kw.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset kw DAYS_OF_WEEK_ABBREV [list \ - "Sul"\ - "Lun"\ - "Mth"\ - "Mhr"\ - "Yow"\ - "Gwe"\ - "Sad"] - ::msgcat::mcset kw DAYS_OF_WEEK_FULL [list \ - "De Sul"\ - "De Lun"\ - "De Merth"\ - "De Merher"\ - "De Yow"\ - "De Gwener"\ - "De Sadorn"] - ::msgcat::mcset kw MONTHS_ABBREV [list \ - "Gen"\ - "Whe"\ - "Mer"\ - "Ebr"\ - "Me"\ - "Evn"\ - "Gor"\ - "Est"\ - "Gwn"\ - "Hed"\ - "Du"\ - "Kev"\ - ""] - ::msgcat::mcset kw MONTHS_FULL [list \ - "Mys Genver"\ - "Mys Whevrel"\ - "Mys Merth"\ - "Mys Ebrel"\ - "Mys Me"\ - "Mys Evan"\ - "Mys Gortheren"\ - "Mye Est"\ - "Mys Gwyngala"\ - "Mys Hedra"\ - "Mys Du"\ - "Mys Kevardhu"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/kw_gb.msg b/waypoint_manager/manager_GUI/tcl/msgs/kw_gb.msg deleted file mode 100644 index 2967680..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/kw_gb.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset kw_GB DATE_FORMAT "%d %B %Y" - ::msgcat::mcset kw_GB TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset kw_GB DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/lt.msg b/waypoint_manager/manager_GUI/tcl/msgs/lt.msg deleted file mode 100644 index 27b0985..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/lt.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset lt DAYS_OF_WEEK_ABBREV [list \ - "Sk"\ - "Pr"\ - "An"\ - "Tr"\ - "Kt"\ - "Pn"\ - "\u0160t"] - ::msgcat::mcset lt DAYS_OF_WEEK_FULL [list \ - "Sekmadienis"\ - "Pirmadienis"\ - "Antradienis"\ - "Tre\u010diadienis"\ - "Ketvirtadienis"\ - "Penktadienis"\ - "\u0160e\u0161tadienis"] - ::msgcat::mcset lt MONTHS_ABBREV [list \ - "Sau"\ - "Vas"\ - "Kov"\ - "Bal"\ - "Geg"\ - "Bir"\ - "Lie"\ - "Rgp"\ - "Rgs"\ - "Spa"\ - "Lap"\ - "Grd"\ - ""] - ::msgcat::mcset lt MONTHS_FULL [list \ - "Sausio"\ - "Vasario"\ - "Kovo"\ - "Baland\u017eio"\ - "Gegu\u017e\u0117s"\ - "Bir\u017eelio"\ - "Liepos"\ - "Rugpj\u016b\u010dio"\ - "Rugs\u0117jo"\ - "Spalio"\ - "Lapkri\u010dio"\ - "Gruod\u017eio"\ - ""] - ::msgcat::mcset lt BCE "pr.Kr." - ::msgcat::mcset lt CE "po.Kr." - ::msgcat::mcset lt DATE_FORMAT "%Y.%m.%e" - ::msgcat::mcset lt TIME_FORMAT "%H.%M.%S" - ::msgcat::mcset lt DATE_TIME_FORMAT "%Y.%m.%e %H.%M.%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/lv.msg b/waypoint_manager/manager_GUI/tcl/msgs/lv.msg deleted file mode 100644 index a037b15..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/lv.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset lv DAYS_OF_WEEK_ABBREV [list \ - "Sv"\ - "P"\ - "O"\ - "T"\ - "C"\ - "Pk"\ - "S"] - ::msgcat::mcset lv DAYS_OF_WEEK_FULL [list \ - "sv\u0113tdiena"\ - "pirmdiena"\ - "otrdiena"\ - "tre\u0161diena"\ - "ceturdien"\ - "piektdiena"\ - "sestdiena"] - ::msgcat::mcset lv MONTHS_ABBREV [list \ - "Jan"\ - "Feb"\ - "Mar"\ - "Apr"\ - "Maijs"\ - "J\u016bn"\ - "J\u016bl"\ - "Aug"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Dec"\ - ""] - ::msgcat::mcset lv MONTHS_FULL [list \ - "janv\u0101ris"\ - "febru\u0101ris"\ - "marts"\ - "apr\u012blis"\ - "maijs"\ - "j\u016bnijs"\ - "j\u016blijs"\ - "augusts"\ - "septembris"\ - "oktobris"\ - "novembris"\ - "decembris"\ - ""] - ::msgcat::mcset lv BCE "pm\u0113" - ::msgcat::mcset lv CE "m\u0113" - ::msgcat::mcset lv DATE_FORMAT "%Y.%e.%m" - ::msgcat::mcset lv TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset lv DATE_TIME_FORMAT "%Y.%e.%m %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/mk.msg b/waypoint_manager/manager_GUI/tcl/msgs/mk.msg deleted file mode 100644 index 41cf60d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/mk.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset mk DAYS_OF_WEEK_ABBREV [list \ - "\u043d\u0435\u0434."\ - "\u043f\u043e\u043d."\ - "\u0432\u0442."\ - "\u0441\u0440\u0435."\ - "\u0447\u0435\u0442."\ - "\u043f\u0435\u0442."\ - "\u0441\u0430\u0431."] - ::msgcat::mcset mk DAYS_OF_WEEK_FULL [list \ - "\u043d\u0435\u0434\u0435\u043b\u0430"\ - "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ - "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ - "\u0441\u0440\u0435\u0434\u0430"\ - "\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a"\ - "\u043f\u0435\u0442\u043e\u043a"\ - "\u0441\u0430\u0431\u043e\u0442\u0430"] - ::msgcat::mcset mk MONTHS_ABBREV [list \ - "\u0458\u0430\u043d."\ - "\u0444\u0435\u0432."\ - "\u043c\u0430\u0440."\ - "\u0430\u043f\u0440."\ - "\u043c\u0430\u0458."\ - "\u0458\u0443\u043d."\ - "\u0458\u0443\u043b."\ - "\u0430\u0432\u0433."\ - "\u0441\u0435\u043f\u0442."\ - "\u043e\u043a\u0442."\ - "\u043d\u043e\u0435\u043c."\ - "\u0434\u0435\u043a\u0435\u043c."\ - ""] - ::msgcat::mcset mk MONTHS_FULL [list \ - "\u0458\u0430\u043d\u0443\u0430\u0440\u0438"\ - "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ - "\u043c\u0430\u0440\u0442"\ - "\u0430\u043f\u0440\u0438\u043b"\ - "\u043c\u0430\u0458"\ - "\u0458\u0443\u043d\u0438"\ - "\u0458\u0443\u043b\u0438"\ - "\u0430\u0432\u0433\u0443\u0441\u0442"\ - "\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ - "\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ - "\u043d\u043e\u0435\u043c\u0432\u0440\u0438"\ - "\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ - ""] - ::msgcat::mcset mk BCE "\u043f\u0440.\u043d.\u0435." - ::msgcat::mcset mk CE "\u0430\u0435." - ::msgcat::mcset mk DATE_FORMAT "%e.%m.%Y" - ::msgcat::mcset mk TIME_FORMAT "%H:%M:%S %z" - ::msgcat::mcset mk DATE_TIME_FORMAT "%e.%m.%Y %H:%M:%S %z %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/mr.msg b/waypoint_manager/manager_GUI/tcl/msgs/mr.msg deleted file mode 100644 index cea427a..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/mr.msg +++ /dev/null @@ -1,39 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset mr DAYS_OF_WEEK_FULL [list \ - "\u0930\u0935\u093f\u0935\u093e\u0930"\ - "\u0938\u094b\u092e\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ - "\u0936\u0928\u093f\u0935\u093e\u0930"] - ::msgcat::mcset mr MONTHS_ABBREV [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] - ::msgcat::mcset mr MONTHS_FULL [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] - ::msgcat::mcset mr AM "BC" - ::msgcat::mcset mr PM "AD" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/mr_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/mr_in.msg deleted file mode 100644 index 1889da5..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/mr_in.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset mr_IN DATE_FORMAT "%d %M %Y" - ::msgcat::mcset mr_IN TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset mr_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ms.msg b/waypoint_manager/manager_GUI/tcl/msgs/ms.msg deleted file mode 100644 index e954431..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ms.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ms DAYS_OF_WEEK_ABBREV [list \ - "Aha"\ - "Isn"\ - "Sei"\ - "Rab"\ - "Kha"\ - "Jum"\ - "Sab"] - ::msgcat::mcset ms DAYS_OF_WEEK_FULL [list \ - "Ahad"\ - "Isnin"\ - "Selasa"\ - "Rahu"\ - "Khamis"\ - "Jumaat"\ - "Sabtu"] - ::msgcat::mcset ms MONTHS_ABBREV [list \ - "Jan"\ - "Feb"\ - "Mac"\ - "Apr"\ - "Mei"\ - "Jun"\ - "Jul"\ - "Ogos"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Dis"\ - ""] - ::msgcat::mcset ms MONTHS_FULL [list \ - "Januari"\ - "Februari"\ - "Mac"\ - "April"\ - "Mei"\ - "Jun"\ - "Julai"\ - "Ogos"\ - "September"\ - "Oktober"\ - "November"\ - "Disember"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ms_my.msg b/waypoint_manager/manager_GUI/tcl/msgs/ms_my.msg deleted file mode 100644 index c1f93d4..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ms_my.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ms_MY DATE_FORMAT "%A %d %b %Y" - ::msgcat::mcset ms_MY TIME_FORMAT_12 "%I:%M:%S %z" - ::msgcat::mcset ms_MY DATE_TIME_FORMAT "%A %d %b %Y %I:%M:%S %z %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/mt.msg b/waypoint_manager/manager_GUI/tcl/msgs/mt.msg deleted file mode 100644 index ddd5446..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/mt.msg +++ /dev/null @@ -1,27 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset mt DAYS_OF_WEEK_ABBREV [list \ - "\u0126ad"\ - "Tne"\ - "Tli"\ - "Erb"\ - "\u0126am"\ - "\u0120im"] - ::msgcat::mcset mt MONTHS_ABBREV [list \ - "Jan"\ - "Fra"\ - "Mar"\ - "Apr"\ - "Mej"\ - "\u0120un"\ - "Lul"\ - "Awi"\ - "Set"\ - "Ott"\ - "Nov"] - ::msgcat::mcset mt BCE "QK" - ::msgcat::mcset mt CE "" - ::msgcat::mcset mt DATE_FORMAT "%A, %e ta %B, %Y" - ::msgcat::mcset mt TIME_FORMAT_12 "%l:%M:%S %P" - ::msgcat::mcset mt DATE_TIME_FORMAT "%A, %e ta %B, %Y %l:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/nb.msg b/waypoint_manager/manager_GUI/tcl/msgs/nb.msg deleted file mode 100644 index 90d49a3..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/nb.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset nb DAYS_OF_WEEK_ABBREV [list \ - "s\u00f8"\ - "ma"\ - "ti"\ - "on"\ - "to"\ - "fr"\ - "l\u00f8"] - ::msgcat::mcset nb DAYS_OF_WEEK_FULL [list \ - "s\u00f8ndag"\ - "mandag"\ - "tirsdag"\ - "onsdag"\ - "torsdag"\ - "fredag"\ - "l\u00f8rdag"] - ::msgcat::mcset nb MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "mai"\ - "jun"\ - "jul"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "des"\ - ""] - ::msgcat::mcset nb MONTHS_FULL [list \ - "januar"\ - "februar"\ - "mars"\ - "april"\ - "mai"\ - "juni"\ - "juli"\ - "august"\ - "september"\ - "oktober"\ - "november"\ - "desember"\ - ""] - ::msgcat::mcset nb BCE "f.Kr." - ::msgcat::mcset nb CE "e.Kr." - ::msgcat::mcset nb DATE_FORMAT "%e. %B %Y" - ::msgcat::mcset nb TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset nb DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/nl.msg b/waypoint_manager/manager_GUI/tcl/msgs/nl.msg deleted file mode 100644 index 4c5c675..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/nl.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset nl DAYS_OF_WEEK_ABBREV [list \ - "zo"\ - "ma"\ - "di"\ - "wo"\ - "do"\ - "vr"\ - "za"] - ::msgcat::mcset nl DAYS_OF_WEEK_FULL [list \ - "zondag"\ - "maandag"\ - "dinsdag"\ - "woensdag"\ - "donderdag"\ - "vrijdag"\ - "zaterdag"] - ::msgcat::mcset nl MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mrt"\ - "apr"\ - "mei"\ - "jun"\ - "jul"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "dec"\ - ""] - ::msgcat::mcset nl MONTHS_FULL [list \ - "januari"\ - "februari"\ - "maart"\ - "april"\ - "mei"\ - "juni"\ - "juli"\ - "augustus"\ - "september"\ - "oktober"\ - "november"\ - "december"\ - ""] - ::msgcat::mcset nl DATE_FORMAT "%e %B %Y" - ::msgcat::mcset nl TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset nl DATE_TIME_FORMAT "%e %B %Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/nl_be.msg b/waypoint_manager/manager_GUI/tcl/msgs/nl_be.msg deleted file mode 100644 index 4b19670..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/nl_be.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset nl_BE DATE_FORMAT "%d-%m-%y" - ::msgcat::mcset nl_BE TIME_FORMAT "%T" - ::msgcat::mcset nl_BE TIME_FORMAT_12 "%T" - ::msgcat::mcset nl_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/nn.msg b/waypoint_manager/manager_GUI/tcl/msgs/nn.msg deleted file mode 100644 index bd61ac9..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/nn.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset nn DAYS_OF_WEEK_ABBREV [list \ - "su"\ - "m\u00e5"\ - "ty"\ - "on"\ - "to"\ - "fr"\ - "lau"] - ::msgcat::mcset nn DAYS_OF_WEEK_FULL [list \ - "sundag"\ - "m\u00e5ndag"\ - "tysdag"\ - "onsdag"\ - "torsdag"\ - "fredag"\ - "laurdag"] - ::msgcat::mcset nn MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "mai"\ - "jun"\ - "jul"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "des"\ - ""] - ::msgcat::mcset nn MONTHS_FULL [list \ - "januar"\ - "februar"\ - "mars"\ - "april"\ - "mai"\ - "juni"\ - "juli"\ - "august"\ - "september"\ - "oktober"\ - "november"\ - "desember"\ - ""] - ::msgcat::mcset nn BCE "f.Kr." - ::msgcat::mcset nn CE "e.Kr." - ::msgcat::mcset nn DATE_FORMAT "%e. %B %Y" - ::msgcat::mcset nn TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset nn DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/pl.msg b/waypoint_manager/manager_GUI/tcl/msgs/pl.msg deleted file mode 100644 index d206f4b..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/pl.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset pl DAYS_OF_WEEK_ABBREV [list \ - "N"\ - "Pn"\ - "Wt"\ - "\u015ar"\ - "Cz"\ - "Pt"\ - "So"] - ::msgcat::mcset pl DAYS_OF_WEEK_FULL [list \ - "niedziela"\ - "poniedzia\u0142ek"\ - "wtorek"\ - "\u015broda"\ - "czwartek"\ - "pi\u0105tek"\ - "sobota"] - ::msgcat::mcset pl MONTHS_ABBREV [list \ - "sty"\ - "lut"\ - "mar"\ - "kwi"\ - "maj"\ - "cze"\ - "lip"\ - "sie"\ - "wrz"\ - "pa\u017a"\ - "lis"\ - "gru"\ - ""] - ::msgcat::mcset pl MONTHS_FULL [list \ - "stycze\u0144"\ - "luty"\ - "marzec"\ - "kwiecie\u0144"\ - "maj"\ - "czerwiec"\ - "lipiec"\ - "sierpie\u0144"\ - "wrzesie\u0144"\ - "pa\u017adziernik"\ - "listopad"\ - "grudzie\u0144"\ - ""] - ::msgcat::mcset pl BCE "p.n.e." - ::msgcat::mcset pl CE "n.e." - ::msgcat::mcset pl DATE_FORMAT "%Y-%m-%d" - ::msgcat::mcset pl TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset pl DATE_TIME_FORMAT "%Y-%m-%d %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/pt.msg b/waypoint_manager/manager_GUI/tcl/msgs/pt.msg deleted file mode 100644 index 96fdb35..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/pt.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset pt DAYS_OF_WEEK_ABBREV [list \ - "Dom"\ - "Seg"\ - "Ter"\ - "Qua"\ - "Qui"\ - "Sex"\ - "S\u00e1b"] - ::msgcat::mcset pt DAYS_OF_WEEK_FULL [list \ - "Domingo"\ - "Segunda-feira"\ - "Ter\u00e7a-feira"\ - "Quarta-feira"\ - "Quinta-feira"\ - "Sexta-feira"\ - "S\u00e1bado"] - ::msgcat::mcset pt MONTHS_ABBREV [list \ - "Jan"\ - "Fev"\ - "Mar"\ - "Abr"\ - "Mai"\ - "Jun"\ - "Jul"\ - "Ago"\ - "Set"\ - "Out"\ - "Nov"\ - "Dez"\ - ""] - ::msgcat::mcset pt MONTHS_FULL [list \ - "Janeiro"\ - "Fevereiro"\ - "Mar\u00e7o"\ - "Abril"\ - "Maio"\ - "Junho"\ - "Julho"\ - "Agosto"\ - "Setembro"\ - "Outubro"\ - "Novembro"\ - "Dezembro"\ - ""] - ::msgcat::mcset pt DATE_FORMAT "%d-%m-%Y" - ::msgcat::mcset pt TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset pt DATE_TIME_FORMAT "%d-%m-%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/pt_br.msg b/waypoint_manager/manager_GUI/tcl/msgs/pt_br.msg deleted file mode 100644 index 8684327..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/pt_br.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset pt_BR DATE_FORMAT "%d-%m-%Y" - ::msgcat::mcset pt_BR TIME_FORMAT "%T" - ::msgcat::mcset pt_BR TIME_FORMAT_12 "%T" - ::msgcat::mcset pt_BR DATE_TIME_FORMAT "%a %d %b %Y %T %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ro.msg b/waypoint_manager/manager_GUI/tcl/msgs/ro.msg deleted file mode 100644 index bdd7c61..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ro.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ro DAYS_OF_WEEK_ABBREV [list \ - "D"\ - "L"\ - "Ma"\ - "Mi"\ - "J"\ - "V"\ - "S"] - ::msgcat::mcset ro DAYS_OF_WEEK_FULL [list \ - "duminic\u0103"\ - "luni"\ - "mar\u0163i"\ - "miercuri"\ - "joi"\ - "vineri"\ - "s\u00eemb\u0103t\u0103"] - ::msgcat::mcset ro MONTHS_ABBREV [list \ - "Ian"\ - "Feb"\ - "Mar"\ - "Apr"\ - "Mai"\ - "Iun"\ - "Iul"\ - "Aug"\ - "Sep"\ - "Oct"\ - "Nov"\ - "Dec"\ - ""] - ::msgcat::mcset ro MONTHS_FULL [list \ - "ianuarie"\ - "februarie"\ - "martie"\ - "aprilie"\ - "mai"\ - "iunie"\ - "iulie"\ - "august"\ - "septembrie"\ - "octombrie"\ - "noiembrie"\ - "decembrie"\ - ""] - ::msgcat::mcset ro BCE "d.C." - ::msgcat::mcset ro CE "\u00ee.d.C." - ::msgcat::mcset ro DATE_FORMAT "%d.%m.%Y" - ::msgcat::mcset ro TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset ro DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ru.msg b/waypoint_manager/manager_GUI/tcl/msgs/ru.msg deleted file mode 100644 index 65b075d..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ru.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ru DAYS_OF_WEEK_ABBREV [list \ - "\u0412\u0441"\ - "\u041f\u043d"\ - "\u0412\u0442"\ - "\u0421\u0440"\ - "\u0427\u0442"\ - "\u041f\u0442"\ - "\u0421\u0431"] - ::msgcat::mcset ru DAYS_OF_WEEK_FULL [list \ - "\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435"\ - "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a"\ - "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ - "\u0441\u0440\u0435\u0434\u0430"\ - "\u0447\u0435\u0442\u0432\u0435\u0440\u0433"\ - "\u043f\u044f\u0442\u043d\u0438\u0446\u0430"\ - "\u0441\u0443\u0431\u0431\u043e\u0442\u0430"] - ::msgcat::mcset ru MONTHS_ABBREV [list \ - "\u044f\u043d\u0432"\ - "\u0444\u0435\u0432"\ - "\u043c\u0430\u0440"\ - "\u0430\u043f\u0440"\ - "\u043c\u0430\u0439"\ - "\u0438\u044e\u043d"\ - "\u0438\u044e\u043b"\ - "\u0430\u0432\u0433"\ - "\u0441\u0435\u043d"\ - "\u043e\u043a\u0442"\ - "\u043d\u043e\u044f"\ - "\u0434\u0435\u043a"\ - ""] - ::msgcat::mcset ru MONTHS_FULL [list \ - "\u042f\u043d\u0432\u0430\u0440\u044c"\ - "\u0424\u0435\u0432\u0440\u0430\u043b\u044c"\ - "\u041c\u0430\u0440\u0442"\ - "\u0410\u043f\u0440\u0435\u043b\u044c"\ - "\u041c\u0430\u0439"\ - "\u0418\u044e\u043d\u044c"\ - "\u0418\u044e\u043b\u044c"\ - "\u0410\u0432\u0433\u0443\u0441\u0442"\ - "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c"\ - "\u041e\u043a\u0442\u044f\u0431\u0440\u044c"\ - "\u041d\u043e\u044f\u0431\u0440\u044c"\ - "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"\ - ""] - ::msgcat::mcset ru BCE "\u0434\u043e \u043d.\u044d." - ::msgcat::mcset ru CE "\u043d.\u044d." - ::msgcat::mcset ru DATE_FORMAT "%d.%m.%Y" - ::msgcat::mcset ru TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset ru DATE_TIME_FORMAT "%d.%m.%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ru_ua.msg b/waypoint_manager/manager_GUI/tcl/msgs/ru_ua.msg deleted file mode 100644 index 6e1f8a8..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ru_ua.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ru_UA DATE_FORMAT "%d.%m.%Y" - ::msgcat::mcset ru_UA TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset ru_UA DATE_TIME_FORMAT "%d.%m.%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/sh.msg b/waypoint_manager/manager_GUI/tcl/msgs/sh.msg deleted file mode 100644 index 6ee0fc7..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/sh.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset sh DAYS_OF_WEEK_ABBREV [list \ - "Ned"\ - "Pon"\ - "Uto"\ - "Sre"\ - "\u010cet"\ - "Pet"\ - "Sub"] - ::msgcat::mcset sh DAYS_OF_WEEK_FULL [list \ - "Nedelja"\ - "Ponedeljak"\ - "Utorak"\ - "Sreda"\ - "\u010cetvrtak"\ - "Petak"\ - "Subota"] - ::msgcat::mcset sh MONTHS_ABBREV [list \ - "Jan"\ - "Feb"\ - "Mar"\ - "Apr"\ - "Maj"\ - "Jun"\ - "Jul"\ - "Avg"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Dec"\ - ""] - ::msgcat::mcset sh MONTHS_FULL [list \ - "Januar"\ - "Februar"\ - "Mart"\ - "April"\ - "Maj"\ - "Juni"\ - "Juli"\ - "Avgust"\ - "Septembar"\ - "Oktobar"\ - "Novembar"\ - "Decembar"\ - ""] - ::msgcat::mcset sh BCE "p. n. e." - ::msgcat::mcset sh CE "n. e." - ::msgcat::mcset sh DATE_FORMAT "%d.%m.%Y." - ::msgcat::mcset sh TIME_FORMAT "%k.%M.%S" - ::msgcat::mcset sh DATE_TIME_FORMAT "%d.%m.%Y. %k.%M.%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/sk.msg b/waypoint_manager/manager_GUI/tcl/msgs/sk.msg deleted file mode 100644 index 9b2f0aa..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/sk.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset sk DAYS_OF_WEEK_ABBREV [list \ - "Ne"\ - "Po"\ - "Ut"\ - "St"\ - "\u0160t"\ - "Pa"\ - "So"] - ::msgcat::mcset sk DAYS_OF_WEEK_FULL [list \ - "Nede\u013ee"\ - "Pondelok"\ - "Utorok"\ - "Streda"\ - "\u0160tvrtok"\ - "Piatok"\ - "Sobota"] - ::msgcat::mcset sk MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "m\u00e1j"\ - "j\u00fan"\ - "j\u00fal"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "dec"\ - ""] - ::msgcat::mcset sk MONTHS_FULL [list \ - "janu\u00e1r"\ - "febru\u00e1r"\ - "marec"\ - "apr\u00edl"\ - "m\u00e1j"\ - "j\u00fan"\ - "j\u00fal"\ - "august"\ - "september"\ - "okt\u00f3ber"\ - "november"\ - "december"\ - ""] - ::msgcat::mcset sk BCE "pred n.l." - ::msgcat::mcset sk CE "n.l." - ::msgcat::mcset sk DATE_FORMAT "%e.%m.%Y" - ::msgcat::mcset sk TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset sk DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/sl.msg b/waypoint_manager/manager_GUI/tcl/msgs/sl.msg deleted file mode 100644 index 42bc509..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/sl.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset sl DAYS_OF_WEEK_ABBREV [list \ - "Ned"\ - "Pon"\ - "Tor"\ - "Sre"\ - "\u010cet"\ - "Pet"\ - "Sob"] - ::msgcat::mcset sl DAYS_OF_WEEK_FULL [list \ - "Nedelja"\ - "Ponedeljek"\ - "Torek"\ - "Sreda"\ - "\u010cetrtek"\ - "Petek"\ - "Sobota"] - ::msgcat::mcset sl MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "maj"\ - "jun"\ - "jul"\ - "avg"\ - "sep"\ - "okt"\ - "nov"\ - "dec"\ - ""] - ::msgcat::mcset sl MONTHS_FULL [list \ - "januar"\ - "februar"\ - "marec"\ - "april"\ - "maj"\ - "junij"\ - "julij"\ - "avgust"\ - "september"\ - "oktober"\ - "november"\ - "december"\ - ""] - ::msgcat::mcset sl BCE "pr.n.\u0161." - ::msgcat::mcset sl CE "po Kr." - ::msgcat::mcset sl DATE_FORMAT "%Y.%m.%e" - ::msgcat::mcset sl TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset sl DATE_TIME_FORMAT "%Y.%m.%e %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/sq.msg b/waypoint_manager/manager_GUI/tcl/msgs/sq.msg deleted file mode 100644 index 8fb1fce..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/sq.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset sq DAYS_OF_WEEK_ABBREV [list \ - "Die"\ - "H\u00ebn"\ - "Mar"\ - "M\u00ebr"\ - "Enj"\ - "Pre"\ - "Sht"] - ::msgcat::mcset sq DAYS_OF_WEEK_FULL [list \ - "e diel"\ - "e h\u00ebn\u00eb"\ - "e mart\u00eb"\ - "e m\u00ebrkur\u00eb"\ - "e enjte"\ - "e premte"\ - "e shtun\u00eb"] - ::msgcat::mcset sq MONTHS_ABBREV [list \ - "Jan"\ - "Shk"\ - "Mar"\ - "Pri"\ - "Maj"\ - "Qer"\ - "Kor"\ - "Gsh"\ - "Sht"\ - "Tet"\ - "N\u00ebn"\ - "Dhj"\ - ""] - ::msgcat::mcset sq MONTHS_FULL [list \ - "janar"\ - "shkurt"\ - "mars"\ - "prill"\ - "maj"\ - "qershor"\ - "korrik"\ - "gusht"\ - "shtator"\ - "tetor"\ - "n\u00ebntor"\ - "dhjetor"\ - ""] - ::msgcat::mcset sq BCE "p.e.r." - ::msgcat::mcset sq CE "n.e.r." - ::msgcat::mcset sq AM "PD" - ::msgcat::mcset sq PM "MD" - ::msgcat::mcset sq DATE_FORMAT "%Y-%m-%d" - ::msgcat::mcset sq TIME_FORMAT_12 "%l:%M:%S.%P" - ::msgcat::mcset sq DATE_TIME_FORMAT "%Y-%m-%d %l:%M:%S.%P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/sr.msg b/waypoint_manager/manager_GUI/tcl/msgs/sr.msg deleted file mode 100644 index 7576668..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/sr.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset sr DAYS_OF_WEEK_ABBREV [list \ - "\u041d\u0435\u0434"\ - "\u041f\u043e\u043d"\ - "\u0423\u0442\u043e"\ - "\u0421\u0440\u0435"\ - "\u0427\u0435\u0442"\ - "\u041f\u0435\u0442"\ - "\u0421\u0443\u0431"] - ::msgcat::mcset sr DAYS_OF_WEEK_FULL [list \ - "\u041d\u0435\u0434\u0435\u0459\u0430"\ - "\u041f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a"\ - "\u0423\u0442\u043e\u0440\u0430\u043a"\ - "\u0421\u0440\u0435\u0434\u0430"\ - "\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043a"\ - "\u041f\u0435\u0442\u0430\u043a"\ - "\u0421\u0443\u0431\u043e\u0442\u0430"] - ::msgcat::mcset sr MONTHS_ABBREV [list \ - "\u0408\u0430\u043d"\ - "\u0424\u0435\u0431"\ - "\u041c\u0430\u0440"\ - "\u0410\u043f\u0440"\ - "\u041c\u0430\u0458"\ - "\u0408\u0443\u043d"\ - "\u0408\u0443\u043b"\ - "\u0410\u0432\u0433"\ - "\u0421\u0435\u043f"\ - "\u041e\u043a\u0442"\ - "\u041d\u043e\u0432"\ - "\u0414\u0435\u0446"\ - ""] - ::msgcat::mcset sr MONTHS_FULL [list \ - "\u0408\u0430\u043d\u0443\u0430\u0440"\ - "\u0424\u0435\u0431\u0440\u0443\u0430\u0440"\ - "\u041c\u0430\u0440\u0442"\ - "\u0410\u043f\u0440\u0438\u043b"\ - "\u041c\u0430\u0458"\ - "\u0408\u0443\u043d\u0438"\ - "\u0408\u0443\u043b\u0438"\ - "\u0410\u0432\u0433\u0443\u0441\u0442"\ - "\u0421\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440"\ - "\u041e\u043a\u0442\u043e\u0431\u0430\u0440"\ - "\u041d\u043e\u0432\u0435\u043c\u0431\u0430\u0440"\ - "\u0414\u0435\u0446\u0435\u043c\u0431\u0430\u0440"\ - ""] - ::msgcat::mcset sr BCE "\u043f. \u043d. \u0435." - ::msgcat::mcset sr CE "\u043d. \u0435" - ::msgcat::mcset sr DATE_FORMAT "%Y.%m.%e" - ::msgcat::mcset sr TIME_FORMAT "%k.%M.%S" - ::msgcat::mcset sr DATE_TIME_FORMAT "%Y.%m.%e %k.%M.%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/sv.msg b/waypoint_manager/manager_GUI/tcl/msgs/sv.msg deleted file mode 100644 index f7a67c6..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/sv.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset sv DAYS_OF_WEEK_ABBREV [list \ - "s\u00f6"\ - "m\u00e5"\ - "ti"\ - "on"\ - "to"\ - "fr"\ - "l\u00f6"] - ::msgcat::mcset sv DAYS_OF_WEEK_FULL [list \ - "s\u00f6ndag"\ - "m\u00e5ndag"\ - "tisdag"\ - "onsdag"\ - "torsdag"\ - "fredag"\ - "l\u00f6rdag"] - ::msgcat::mcset sv MONTHS_ABBREV [list \ - "jan"\ - "feb"\ - "mar"\ - "apr"\ - "maj"\ - "jun"\ - "jul"\ - "aug"\ - "sep"\ - "okt"\ - "nov"\ - "dec"\ - ""] - ::msgcat::mcset sv MONTHS_FULL [list \ - "januari"\ - "februari"\ - "mars"\ - "april"\ - "maj"\ - "juni"\ - "juli"\ - "augusti"\ - "september"\ - "oktober"\ - "november"\ - "december"\ - ""] - ::msgcat::mcset sv BCE "f.Kr." - ::msgcat::mcset sv CE "e.Kr." - ::msgcat::mcset sv DATE_FORMAT "%Y-%m-%d" - ::msgcat::mcset sv TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset sv DATE_TIME_FORMAT "%Y-%m-%d %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/sw.msg b/waypoint_manager/manager_GUI/tcl/msgs/sw.msg deleted file mode 100644 index b888b43..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/sw.msg +++ /dev/null @@ -1,49 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset sw DAYS_OF_WEEK_ABBREV [list \ - "Jpi"\ - "Jtt"\ - "Jnn"\ - "Jtn"\ - "Alh"\ - "Iju"\ - "Jmo"] - ::msgcat::mcset sw DAYS_OF_WEEK_FULL [list \ - "Jumapili"\ - "Jumatatu"\ - "Jumanne"\ - "Jumatano"\ - "Alhamisi"\ - "Ijumaa"\ - "Jumamosi"] - ::msgcat::mcset sw MONTHS_ABBREV [list \ - "Jan"\ - "Feb"\ - "Mar"\ - "Apr"\ - "Mei"\ - "Jun"\ - "Jul"\ - "Ago"\ - "Sep"\ - "Okt"\ - "Nov"\ - "Des"\ - ""] - ::msgcat::mcset sw MONTHS_FULL [list \ - "Januari"\ - "Februari"\ - "Machi"\ - "Aprili"\ - "Mei"\ - "Juni"\ - "Julai"\ - "Agosti"\ - "Septemba"\ - "Oktoba"\ - "Novemba"\ - "Desemba"\ - ""] - ::msgcat::mcset sw BCE "KK" - ::msgcat::mcset sw CE "BK" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ta.msg b/waypoint_manager/manager_GUI/tcl/msgs/ta.msg deleted file mode 100644 index 4abb90c..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ta.msg +++ /dev/null @@ -1,39 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ta DAYS_OF_WEEK_FULL [list \ - "\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1"\ - "\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd"\ - "\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd"\ - "\u0baa\u0bc1\u0ba4\u0ba9\u0bcd"\ - "\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd"\ - "\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf"\ - "\u0b9a\u0ba9\u0bbf"] - ::msgcat::mcset ta MONTHS_ABBREV [list \ - "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ - "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ - "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ - "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ - "\u0bae\u0bc7"\ - "\u0b9c\u0bc2\u0ba9\u0bcd"\ - "\u0b9c\u0bc2\u0bb2\u0bc8"\ - "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ - "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ - "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] - ::msgcat::mcset ta MONTHS_FULL [list \ - "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ - "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ - "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ - "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ - "\u0bae\u0bc7"\ - "\u0b9c\u0bc2\u0ba9\u0bcd"\ - "\u0b9c\u0bc2\u0bb2\u0bc8"\ - "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ - "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ - "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] - ::msgcat::mcset ta AM "\u0b95\u0bbf\u0bae\u0bc1" - ::msgcat::mcset ta PM "\u0b95\u0bbf\u0baa\u0bbf" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/ta_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/ta_in.msg deleted file mode 100644 index 24590ac..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/ta_in.msg +++ /dev/null @@ -1,6 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset ta_IN DATE_FORMAT "%d %M %Y" - ::msgcat::mcset ta_IN TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset ta_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/te.msg b/waypoint_manager/manager_GUI/tcl/msgs/te.msg deleted file mode 100644 index 6111473..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/te.msg +++ /dev/null @@ -1,47 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset te DAYS_OF_WEEK_ABBREV [list \ - "\u0c06\u0c26\u0c3f"\ - "\u0c38\u0c4b\u0c2e"\ - "\u0c2e\u0c02\u0c17\u0c33"\ - "\u0c2c\u0c41\u0c27"\ - "\u0c17\u0c41\u0c30\u0c41"\ - "\u0c36\u0c41\u0c15\u0c4d\u0c30"\ - "\u0c36\u0c28\u0c3f"] - ::msgcat::mcset te DAYS_OF_WEEK_FULL [list \ - "\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02"] - ::msgcat::mcset te MONTHS_ABBREV [list \ - "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ - "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ - "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ - "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ - "\u0c2e\u0c47"\ - "\u0c1c\u0c42\u0c28\u0c4d"\ - "\u0c1c\u0c42\u0c32\u0c48"\ - "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ - "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ - "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ - ""] - ::msgcat::mcset te MONTHS_FULL [list \ - "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ - "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ - "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ - "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ - "\u0c2e\u0c47"\ - "\u0c1c\u0c42\u0c28\u0c4d"\ - "\u0c1c\u0c42\u0c32\u0c48"\ - "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ - "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ - "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ - ""] -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/te_in.msg b/waypoint_manager/manager_GUI/tcl/msgs/te_in.msg deleted file mode 100644 index 61638b5..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/te_in.msg +++ /dev/null @@ -1,8 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset te_IN AM "\u0c2a\u0c42\u0c30\u0c4d\u0c35\u0c3e\u0c39\u0c4d\u0c28" - ::msgcat::mcset te_IN PM "\u0c05\u0c2a\u0c30\u0c3e\u0c39\u0c4d\u0c28" - ::msgcat::mcset te_IN DATE_FORMAT "%d/%m/%Y" - ::msgcat::mcset te_IN TIME_FORMAT_12 "%I:%M:%S %P" - ::msgcat::mcset te_IN DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/th.msg b/waypoint_manager/manager_GUI/tcl/msgs/th.msg deleted file mode 100644 index 7486c35..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/th.msg +++ /dev/null @@ -1,54 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset th DAYS_OF_WEEK_ABBREV [list \ - "\u0e2d\u0e32."\ - "\u0e08."\ - "\u0e2d."\ - "\u0e1e."\ - "\u0e1e\u0e24."\ - "\u0e28."\ - "\u0e2a."] - ::msgcat::mcset th DAYS_OF_WEEK_FULL [list \ - "\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c"\ - "\u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c"\ - "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23"\ - "\u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18"\ - "\u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35"\ - "\u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c"\ - "\u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c"] - ::msgcat::mcset th MONTHS_ABBREV [list \ - "\u0e21.\u0e04."\ - "\u0e01.\u0e1e."\ - "\u0e21\u0e35.\u0e04."\ - "\u0e40\u0e21.\u0e22."\ - "\u0e1e.\u0e04."\ - "\u0e21\u0e34.\u0e22."\ - "\u0e01.\u0e04."\ - "\u0e2a.\u0e04."\ - "\u0e01.\u0e22."\ - "\u0e15.\u0e04."\ - "\u0e1e.\u0e22."\ - "\u0e18.\u0e04."\ - ""] - ::msgcat::mcset th MONTHS_FULL [list \ - "\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21"\ - "\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c"\ - "\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21"\ - "\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19"\ - "\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21"\ - "\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19"\ - "\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21"\ - "\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21"\ - "\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19"\ - "\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21"\ - "\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19"\ - "\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21"\ - ""] - ::msgcat::mcset th BCE "\u0e25\u0e17\u0e35\u0e48" - ::msgcat::mcset th CE "\u0e04.\u0e28." - ::msgcat::mcset th AM "\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" - ::msgcat::mcset th PM "\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" - ::msgcat::mcset th DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset th TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset th DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/tr.msg b/waypoint_manager/manager_GUI/tcl/msgs/tr.msg deleted file mode 100644 index 7b2ecf9..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/tr.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset tr DAYS_OF_WEEK_ABBREV [list \ - "Paz"\ - "Pzt"\ - "Sal"\ - "\u00c7ar"\ - "Per"\ - "Cum"\ - "Cmt"] - ::msgcat::mcset tr DAYS_OF_WEEK_FULL [list \ - "Pazar"\ - "Pazartesi"\ - "Sal\u0131"\ - "\u00c7ar\u015famba"\ - "Per\u015fembe"\ - "Cuma"\ - "Cumartesi"] - ::msgcat::mcset tr MONTHS_ABBREV [list \ - "Oca"\ - "\u015eub"\ - "Mar"\ - "Nis"\ - "May"\ - "Haz"\ - "Tem"\ - "A\u011fu"\ - "Eyl"\ - "Eki"\ - "Kas"\ - "Ara"\ - ""] - ::msgcat::mcset tr MONTHS_FULL [list \ - "Ocak"\ - "\u015eubat"\ - "Mart"\ - "Nisan"\ - "May\u0131s"\ - "Haziran"\ - "Temmuz"\ - "A\u011fustos"\ - "Eyl\u00fcl"\ - "Ekim"\ - "Kas\u0131m"\ - "Aral\u0131k"\ - ""] - ::msgcat::mcset tr DATE_FORMAT "%d.%m.%Y" - ::msgcat::mcset tr TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset tr DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/uk.msg b/waypoint_manager/manager_GUI/tcl/msgs/uk.msg deleted file mode 100644 index 7d4c64a..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/uk.msg +++ /dev/null @@ -1,52 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset uk DAYS_OF_WEEK_ABBREV [list \ - "\u043d\u0434"\ - "\u043f\u043d"\ - "\u0432\u0442"\ - "\u0441\u0440"\ - "\u0447\u0442"\ - "\u043f\u0442"\ - "\u0441\u0431"] - ::msgcat::mcset uk DAYS_OF_WEEK_FULL [list \ - "\u043d\u0435\u0434\u0456\u043b\u044f"\ - "\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a"\ - "\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a"\ - "\u0441\u0435\u0440\u0435\u0434\u0430"\ - "\u0447\u0435\u0442\u0432\u0435\u0440"\ - "\u043f'\u044f\u0442\u043d\u0438\u0446\u044f"\ - "\u0441\u0443\u0431\u043e\u0442\u0430"] - ::msgcat::mcset uk MONTHS_ABBREV [list \ - "\u0441\u0456\u0447"\ - "\u043b\u044e\u0442"\ - "\u0431\u0435\u0440"\ - "\u043a\u0432\u0456\u0442"\ - "\u0442\u0440\u0430\u0432"\ - "\u0447\u0435\u0440\u0432"\ - "\u043b\u0438\u043f"\ - "\u0441\u0435\u0440\u043f"\ - "\u0432\u0435\u0440"\ - "\u0436\u043e\u0432\u0442"\ - "\u043b\u0438\u0441\u0442"\ - "\u0433\u0440\u0443\u0434"\ - ""] - ::msgcat::mcset uk MONTHS_FULL [list \ - "\u0441\u0456\u0447\u043d\u044f"\ - "\u043b\u044e\u0442\u043e\u0433\u043e"\ - "\u0431\u0435\u0440\u0435\u0437\u043d\u044f"\ - "\u043a\u0432\u0456\u0442\u043d\u044f"\ - "\u0442\u0440\u0430\u0432\u043d\u044f"\ - "\u0447\u0435\u0440\u0432\u043d\u044f"\ - "\u043b\u0438\u043f\u043d\u044f"\ - "\u0441\u0435\u0440\u043f\u043d\u044f"\ - "\u0432\u0435\u0440\u0435\u0441\u043d\u044f"\ - "\u0436\u043e\u0432\u0442\u043d\u044f"\ - "\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430"\ - "\u0433\u0440\u0443\u0434\u043d\u044f"\ - ""] - ::msgcat::mcset uk BCE "\u0434\u043e \u043d.\u0435." - ::msgcat::mcset uk CE "\u043f\u0456\u0441\u043b\u044f \u043d.\u0435." - ::msgcat::mcset uk DATE_FORMAT "%e/%m/%Y" - ::msgcat::mcset uk TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset uk DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/vi.msg b/waypoint_manager/manager_GUI/tcl/msgs/vi.msg deleted file mode 100644 index c98b2a6..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/vi.msg +++ /dev/null @@ -1,50 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset vi DAYS_OF_WEEK_ABBREV [list \ - "Th 2"\ - "Th 3"\ - "Th 4"\ - "Th 5"\ - "Th 6"\ - "Th 7"\ - "CN"] - ::msgcat::mcset vi DAYS_OF_WEEK_FULL [list \ - "Th\u01b0\u0301 hai"\ - "Th\u01b0\u0301 ba"\ - "Th\u01b0\u0301 t\u01b0"\ - "Th\u01b0\u0301 n\u0103m"\ - "Th\u01b0\u0301 s\u00e1u"\ - "Th\u01b0\u0301 ba\u0309y"\ - "Chu\u0309 nh\u00e2\u0323t"] - ::msgcat::mcset vi MONTHS_ABBREV [list \ - "Thg 1"\ - "Thg 2"\ - "Thg 3"\ - "Thg 4"\ - "Thg 5"\ - "Thg 6"\ - "Thg 7"\ - "Thg 8"\ - "Thg 9"\ - "Thg 10"\ - "Thg 11"\ - "Thg 12"\ - ""] - ::msgcat::mcset vi MONTHS_FULL [list \ - "Th\u00e1ng m\u00f4\u0323t"\ - "Th\u00e1ng hai"\ - "Th\u00e1ng ba"\ - "Th\u00e1ng t\u01b0"\ - "Th\u00e1ng n\u0103m"\ - "Th\u00e1ng s\u00e1u"\ - "Th\u00e1ng ba\u0309y"\ - "Th\u00e1ng t\u00e1m"\ - "Th\u00e1ng ch\u00edn"\ - "Th\u00e1ng m\u01b0\u01a1\u0300i"\ - "Th\u00e1ng m\u01b0\u01a1\u0300i m\u00f4\u0323t"\ - "Th\u00e1ng m\u01b0\u01a1\u0300i hai"\ - ""] - ::msgcat::mcset vi DATE_FORMAT "%d %b %Y" - ::msgcat::mcset vi TIME_FORMAT "%H:%M:%S" - ::msgcat::mcset vi DATE_TIME_FORMAT "%d %b %Y %H:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/zh.msg b/waypoint_manager/manager_GUI/tcl/msgs/zh.msg deleted file mode 100644 index b799a32..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/zh.msg +++ /dev/null @@ -1,55 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset zh DAYS_OF_WEEK_ABBREV [list \ - "\u661f\u671f\u65e5"\ - "\u661f\u671f\u4e00"\ - "\u661f\u671f\u4e8c"\ - "\u661f\u671f\u4e09"\ - "\u661f\u671f\u56db"\ - "\u661f\u671f\u4e94"\ - "\u661f\u671f\u516d"] - ::msgcat::mcset zh DAYS_OF_WEEK_FULL [list \ - "\u661f\u671f\u65e5"\ - "\u661f\u671f\u4e00"\ - "\u661f\u671f\u4e8c"\ - "\u661f\u671f\u4e09"\ - "\u661f\u671f\u56db"\ - "\u661f\u671f\u4e94"\ - "\u661f\u671f\u516d"] - ::msgcat::mcset zh MONTHS_ABBREV [list \ - "\u4e00\u6708"\ - "\u4e8c\u6708"\ - "\u4e09\u6708"\ - "\u56db\u6708"\ - "\u4e94\u6708"\ - "\u516d\u6708"\ - "\u4e03\u6708"\ - "\u516b\u6708"\ - "\u4e5d\u6708"\ - "\u5341\u6708"\ - "\u5341\u4e00\u6708"\ - "\u5341\u4e8c\u6708"\ - ""] - ::msgcat::mcset zh MONTHS_FULL [list \ - "\u4e00\u6708"\ - "\u4e8c\u6708"\ - "\u4e09\u6708"\ - "\u56db\u6708"\ - "\u4e94\u6708"\ - "\u516d\u6708"\ - "\u4e03\u6708"\ - "\u516b\u6708"\ - "\u4e5d\u6708"\ - "\u5341\u6708"\ - "\u5341\u4e00\u6708"\ - "\u5341\u4e8c\u6708"\ - ""] - ::msgcat::mcset zh BCE "\u516c\u5143\u524d" - ::msgcat::mcset zh CE "\u516c\u5143" - ::msgcat::mcset zh AM "\u4e0a\u5348" - ::msgcat::mcset zh PM "\u4e0b\u5348" - ::msgcat::mcset zh LOCALE_NUMERALS "\u3007 \u4e00 \u4e8c \u4e09 \u56db \u4e94 \u516d \u4e03 \u516b \u4e5d \u5341 \u5341\u4e00 \u5341\u4e8c \u5341\u4e09 \u5341\u56db \u5341\u4e94 \u5341\u516d \u5341\u4e03 \u5341\u516b \u5341\u4e5d \u4e8c\u5341 \u5eff\u4e00 \u5eff\u4e8c \u5eff\u4e09 \u5eff\u56db \u5eff\u4e94 \u5eff\u516d \u5eff\u4e03 \u5eff\u516b \u5eff\u4e5d \u4e09\u5341 \u5345\u4e00 \u5345\u4e8c \u5345\u4e09 \u5345\u56db \u5345\u4e94 \u5345\u516d \u5345\u4e03 \u5345\u516b \u5345\u4e5d \u56db\u5341 \u56db\u5341\u4e00 \u56db\u5341\u4e8c \u56db\u5341\u4e09 \u56db\u5341\u56db \u56db\u5341\u4e94 \u56db\u5341\u516d \u56db\u5341\u4e03 \u56db\u5341\u516b \u56db\u5341\u4e5d \u4e94\u5341 \u4e94\u5341\u4e00 \u4e94\u5341\u4e8c \u4e94\u5341\u4e09 \u4e94\u5341\u56db \u4e94\u5341\u4e94 \u4e94\u5341\u516d \u4e94\u5341\u4e03 \u4e94\u5341\u516b \u4e94\u5341\u4e5d \u516d\u5341 \u516d\u5341\u4e00 \u516d\u5341\u4e8c \u516d\u5341\u4e09 \u516d\u5341\u56db \u516d\u5341\u4e94 \u516d\u5341\u516d \u516d\u5341\u4e03 \u516d\u5341\u516b \u516d\u5341\u4e5d \u4e03\u5341 \u4e03\u5341\u4e00 \u4e03\u5341\u4e8c \u4e03\u5341\u4e09 \u4e03\u5341\u56db \u4e03\u5341\u4e94 \u4e03\u5341\u516d \u4e03\u5341\u4e03 \u4e03\u5341\u516b \u4e03\u5341\u4e5d \u516b\u5341 \u516b\u5341\u4e00 \u516b\u5341\u4e8c \u516b\u5341\u4e09 \u516b\u5341\u56db \u516b\u5341\u4e94 \u516b\u5341\u516d \u516b\u5341\u4e03 \u516b\u5341\u516b \u516b\u5341\u4e5d \u4e5d\u5341 \u4e5d\u5341\u4e00 \u4e5d\u5341\u4e8c \u4e5d\u5341\u4e09 \u4e5d\u5341\u56db \u4e5d\u5341\u4e94 \u4e5d\u5341\u516d \u4e5d\u5341\u4e03 \u4e5d\u5341\u516b \u4e5d\u5341\u4e5d" - ::msgcat::mcset zh LOCALE_DATE_FORMAT "\u516c\u5143%Y\u5e74%B%Od\u65e5" - ::msgcat::mcset zh LOCALE_TIME_FORMAT "%OH\u65f6%OM\u5206%OS\u79d2" - ::msgcat::mcset zh LOCALE_DATE_TIME_FORMAT "%A %Y\u5e74%B%Od\u65e5%OH\u65f6%OM\u5206%OS\u79d2 %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/zh_cn.msg b/waypoint_manager/manager_GUI/tcl/msgs/zh_cn.msg deleted file mode 100644 index d62ce77..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/zh_cn.msg +++ /dev/null @@ -1,7 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset zh_CN DATE_FORMAT "%Y-%m-%e" - ::msgcat::mcset zh_CN TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset zh_CN TIME_FORMAT_12 "%P%I\u65f6%M\u5206%S\u79d2" - ::msgcat::mcset zh_CN DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/zh_hk.msg b/waypoint_manager/manager_GUI/tcl/msgs/zh_hk.msg deleted file mode 100644 index badb1dd..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/zh_hk.msg +++ /dev/null @@ -1,28 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset zh_HK DAYS_OF_WEEK_ABBREV [list \ - "\u65e5"\ - "\u4e00"\ - "\u4e8c"\ - "\u4e09"\ - "\u56db"\ - "\u4e94"\ - "\u516d"] - ::msgcat::mcset zh_HK MONTHS_ABBREV [list \ - "1\u6708"\ - "2\u6708"\ - "3\u6708"\ - "4\u6708"\ - "5\u6708"\ - "6\u6708"\ - "7\u6708"\ - "8\u6708"\ - "9\u6708"\ - "10\u6708"\ - "11\u6708"\ - "12\u6708"\ - ""] - ::msgcat::mcset zh_HK DATE_FORMAT "%Y\u5e74%m\u6708%e\u65e5" - ::msgcat::mcset zh_HK TIME_FORMAT_12 "%P%I:%M:%S" - ::msgcat::mcset zh_HK DATE_TIME_FORMAT "%Y\u5e74%m\u6708%e\u65e5 %P%I:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/zh_sg.msg b/waypoint_manager/manager_GUI/tcl/msgs/zh_sg.msg deleted file mode 100644 index a2f3e39..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/zh_sg.msg +++ /dev/null @@ -1,8 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset zh_SG AM "\u4e0a\u5348" - ::msgcat::mcset zh_SG PM "\u4e2d\u5348" - ::msgcat::mcset zh_SG DATE_FORMAT "%d %B %Y" - ::msgcat::mcset zh_SG TIME_FORMAT_12 "%P %I:%M:%S" - ::msgcat::mcset zh_SG DATE_TIME_FORMAT "%d %B %Y %P %I:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/msgs/zh_tw.msg b/waypoint_manager/manager_GUI/tcl/msgs/zh_tw.msg deleted file mode 100644 index e0796b1..0000000 --- a/waypoint_manager/manager_GUI/tcl/msgs/zh_tw.msg +++ /dev/null @@ -1,8 +0,0 @@ -# created by tools/loadICU.tcl -- do not edit -namespace eval ::tcl::clock { - ::msgcat::mcset zh_TW BCE "\u6c11\u570b\u524d" - ::msgcat::mcset zh_TW CE "\u6c11\u570b" - ::msgcat::mcset zh_TW DATE_FORMAT "%Y/%m/%e" - ::msgcat::mcset zh_TW TIME_FORMAT_12 "%P %I:%M:%S" - ::msgcat::mcset zh_TW DATE_TIME_FORMAT "%Y/%m/%e %P %I:%M:%S %z" -} diff --git a/waypoint_manager/manager_GUI/tcl/opt0.4/optparse.tcl b/waypoint_manager/manager_GUI/tcl/opt0.4/optparse.tcl deleted file mode 100644 index 869a2b6..0000000 --- a/waypoint_manager/manager_GUI/tcl/opt0.4/optparse.tcl +++ /dev/null @@ -1,1072 +0,0 @@ -# optparse.tcl -- -# -# (private) Option parsing package -# Primarily used internally by the safe:: code. -# -# WARNING: This code will go away in a future release -# of Tcl. It is NOT supported and you should not rely -# on it. If your code does rely on this package you -# may directly incorporate this code into your application. - -package require Tcl 8.2 -# When this version number changes, update the pkgIndex.tcl file -# and the install directory in the Makefiles. -package provide opt 0.4.6 - -namespace eval ::tcl { - - # Exported APIs - namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \ - OptProc OptProcArgGiven OptParse \ - Lempty Lget \ - Lassign Lvarpop Lvarpop1 Lvarset Lvarincr \ - SetMax SetMin - - -################# Example of use / 'user documentation' ################### - - proc OptCreateTestProc {} { - - # Defines ::tcl::OptParseTest as a test proc with parsed arguments - # (can't be defined before the code below is loaded (before "OptProc")) - - # Every OptProc give usage information on "procname -help". - # Try "tcl::OptParseTest -help" and "tcl::OptParseTest -a" and - # then other arguments. - # - # example of 'valid' call: - # ::tcl::OptParseTest save -4 -pr 23 -libsok SybTcl\ - # -nostatics false ch1 - OptProc OptParseTest { - {subcommand -choice {save print} "sub command"} - {arg1 3 "some number"} - {-aflag} - {-intflag 7} - {-weirdflag "help string"} - {-noStatics "Not ok to load static packages"} - {-nestedloading1 true "OK to load into nested slaves"} - {-nestedloading2 -boolean true "OK to load into nested slaves"} - {-libsOK -choice {Tk SybTcl} - "List of packages that can be loaded"} - {-precision -int 12 "Number of digits of precision"} - {-intval 7 "An integer"} - {-scale -float 1.0 "Scale factor"} - {-zoom 1.0 "Zoom factor"} - {-arbitrary foobar "Arbitrary string"} - {-random -string 12 "Random string"} - {-listval -list {} "List value"} - {-blahflag -blah abc "Funny type"} - {arg2 -boolean "a boolean"} - {arg3 -choice "ch1 ch2"} - {?optarg? -list {} "optional argument"} - } { - foreach v [info locals] { - puts stderr [format "%14s : %s" $v [set $v]] - } - } - } - -################### No User serviceable part below ! ############### - - # Array storing the parsed descriptions - variable OptDesc - array set OptDesc {} - # Next potentially free key id (numeric) - variable OptDescN 0 - -# Inside algorithm/mechanism description: -# (not for the faint hearted ;-) -# -# The argument description is parsed into a "program tree" -# It is called a "program" because it is the program used by -# the state machine interpreter that use that program to -# actually parse the arguments at run time. -# -# The general structure of a "program" is -# notation (pseudo bnf like) -# name :== definition defines "name" as being "definition" -# { x y z } means list of x, y, and z -# x* means x repeated 0 or more time -# x+ means "x x*" -# x? means optionally x -# x | y means x or y -# "cccc" means the literal string -# -# program :== { programCounter programStep* } -# -# programStep :== program | singleStep -# -# programCounter :== {"P" integer+ } -# -# singleStep :== { instruction parameters* } -# -# instruction :== single element list -# -# (the difference between singleStep and program is that \ -# llength [lindex $program 0] >= 2 -# while -# llength [lindex $singleStep 0] == 1 -# ) -# -# And for this application: -# -# singleStep :== { instruction varname {hasBeenSet currentValue} type -# typeArgs help } -# instruction :== "flags" | "value" -# type :== knowType | anyword -# knowType :== "string" | "int" | "boolean" | "boolflag" | "float" -# | "choice" -# -# for type "choice" typeArgs is a list of possible choices, the first one -# is the default value. for all other types the typeArgs is the default value -# -# a "boolflag" is the type for a flag whose presence or absence, without -# additional arguments means respectively true or false (default flag type). -# -# programCounter is the index in the list of the currently processed -# programStep (thus starting at 1 (0 is {"P" prgCounterValue}). -# If it is a list it points toward each currently selected programStep. -# (like for "flags", as they are optional, form a set and programStep). - -# Performance/Implementation issues -# --------------------------------- -# We use tcl lists instead of arrays because with tcl8.0 -# they should start to be much faster. -# But this code use a lot of helper procs (like Lvarset) -# which are quite slow and would be helpfully optimized -# for instance by being written in C. Also our struture -# is complex and there is maybe some places where the -# string rep might be calculated at great exense. to be checked. - -# -# Parse a given description and saves it here under the given key -# generate a unused keyid if not given -# -proc ::tcl::OptKeyRegister {desc {key ""}} { - variable OptDesc - variable OptDescN - if {[string equal $key ""]} { - # in case a key given to us as a parameter was a number - while {[info exists OptDesc($OptDescN)]} {incr OptDescN} - set key $OptDescN - incr OptDescN - } - # program counter - set program [list [list "P" 1]] - - # are we processing flags (which makes a single program step) - set inflags 0 - - set state {} - - # flag used to detect that we just have a single (flags set) subprogram. - set empty 1 - - foreach item $desc { - if {$state == "args"} { - # more items after 'args'... - return -code error "'args' special argument must be the last one" - } - set res [OptNormalizeOne $item] - set state [lindex $res 0] - if {$inflags} { - if {$state == "flags"} { - # add to 'subprogram' - lappend flagsprg $res - } else { - # put in the flags - # structure for flag programs items is a list of - # {subprgcounter {prg flag 1} {prg flag 2} {...}} - lappend program $flagsprg - # put the other regular stuff - lappend program $res - set inflags 0 - set empty 0 - } - } else { - if {$state == "flags"} { - set inflags 1 - # sub program counter + first sub program - set flagsprg [list [list "P" 1] $res] - } else { - lappend program $res - set empty 0 - } - } - } - if {$inflags} { - if {$empty} { - # We just have the subprogram, optimize and remove - # unneeded level: - set program $flagsprg - } else { - lappend program $flagsprg - } - } - - set OptDesc($key) $program - - return $key -} - -# -# Free the storage for that given key -# -proc ::tcl::OptKeyDelete {key} { - variable OptDesc - unset OptDesc($key) -} - - # Get the parsed description stored under the given key. - proc OptKeyGetDesc {descKey} { - variable OptDesc - if {![info exists OptDesc($descKey)]} { - return -code error "Unknown option description key \"$descKey\"" - } - set OptDesc($descKey) - } - -# Parse entry point for ppl who don't want to register with a key, -# for instance because the description changes dynamically. -# (otherwise one should really use OptKeyRegister once + OptKeyParse -# as it is way faster or simply OptProc which does it all) -# Assign a temporary key, call OptKeyParse and then free the storage -proc ::tcl::OptParse {desc arglist} { - set tempkey [OptKeyRegister $desc] - set ret [catch {uplevel 1 [list ::tcl::OptKeyParse $tempkey $arglist]} res] - OptKeyDelete $tempkey - return -code $ret $res -} - -# Helper function, replacement for proc that both -# register the description under a key which is the name of the proc -# (and thus unique to that code) -# and add a first line to the code to call the OptKeyParse proc -# Stores the list of variables that have been actually given by the user -# (the other will be sets to their default value) -# into local variable named "Args". -proc ::tcl::OptProc {name desc body} { - set namespace [uplevel 1 [list ::namespace current]] - if {[string match "::*" $name] || [string equal $namespace "::"]} { - # absolute name or global namespace, name is the key - set key $name - } else { - # we are relative to some non top level namespace: - set key "${namespace}::${name}" - } - OptKeyRegister $desc $key - uplevel 1 [list ::proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"] - return $key -} -# Check that a argument has been given -# assumes that "OptProc" has been used as it will check in "Args" list -proc ::tcl::OptProcArgGiven {argname} { - upvar Args alist - expr {[lsearch $alist $argname] >=0} -} - - ####### - # Programs/Descriptions manipulation - - # Return the instruction word/list of a given step/(sub)program - proc OptInstr {lst} { - lindex $lst 0 - } - # Is a (sub) program or a plain instruction ? - proc OptIsPrg {lst} { - expr {[llength [OptInstr $lst]]>=2} - } - # Is this instruction a program counter or a real instr - proc OptIsCounter {item} { - expr {[lindex $item 0]=="P"} - } - # Current program counter (2nd word of first word) - proc OptGetPrgCounter {lst} { - Lget $lst {0 1} - } - # Current program counter (2nd word of first word) - proc OptSetPrgCounter {lstName newValue} { - upvar $lstName lst - set lst [lreplace $lst 0 0 [concat "P" $newValue]] - } - # returns a list of currently selected items. - proc OptSelection {lst} { - set res {} - foreach idx [lrange [lindex $lst 0] 1 end] { - lappend res [Lget $lst $idx] - } - return $res - } - - # Advance to next description - proc OptNextDesc {descName} { - uplevel 1 [list Lvarincr $descName {0 1}] - } - - # Get the current description, eventually descend - proc OptCurDesc {descriptions} { - lindex $descriptions [OptGetPrgCounter $descriptions] - } - # get the current description, eventually descend - # through sub programs as needed. - proc OptCurDescFinal {descriptions} { - set item [OptCurDesc $descriptions] - # Descend untill we get the actual item and not a sub program - while {[OptIsPrg $item]} { - set item [OptCurDesc $item] - } - return $item - } - # Current final instruction adress - proc OptCurAddr {descriptions {start {}}} { - set adress [OptGetPrgCounter $descriptions] - lappend start $adress - set item [lindex $descriptions $adress] - if {[OptIsPrg $item]} { - return [OptCurAddr $item $start] - } else { - return $start - } - } - # Set the value field of the current instruction - proc OptCurSetValue {descriptionsName value} { - upvar $descriptionsName descriptions - # get the current item full adress - set adress [OptCurAddr $descriptions] - # use the 3th field of the item (see OptValue / OptNewInst) - lappend adress 2 - Lvarset descriptions $adress [list 1 $value] - # ^hasBeenSet flag - } - - # empty state means done/paste the end of the program - proc OptState {item} { - lindex $item 0 - } - - # current state - proc OptCurState {descriptions} { - OptState [OptCurDesc $descriptions] - } - - ####### - # Arguments manipulation - - # Returns the argument that has to be processed now - proc OptCurrentArg {lst} { - lindex $lst 0 - } - # Advance to next argument - proc OptNextArg {argsName} { - uplevel 1 [list Lvarpop1 $argsName] - } - ####### - - - - - - # Loop over all descriptions, calling OptDoOne which will - # eventually eat all the arguments. - proc OptDoAll {descriptionsName argumentsName} { - upvar $descriptionsName descriptions - upvar $argumentsName arguments -# puts "entered DoAll" - # Nb: the places where "state" can be set are tricky to figure - # because DoOne sets the state to flagsValue and return -continue - # when needed... - set state [OptCurState $descriptions] - # We'll exit the loop in "OptDoOne" or when state is empty. - while 1 { - set curitem [OptCurDesc $descriptions] - # Do subprograms if needed, call ourselves on the sub branch - while {[OptIsPrg $curitem]} { - OptDoAll curitem arguments -# puts "done DoAll sub" - # Insert back the results in current tree - Lvarset1nc descriptions [OptGetPrgCounter $descriptions]\ - $curitem - OptNextDesc descriptions - set curitem [OptCurDesc $descriptions] - set state [OptCurState $descriptions] - } -# puts "state = \"$state\" - arguments=($arguments)" - if {[Lempty $state]} { - # Nothing left to do, we are done in this branch: - break - } - # The following statement can make us terminate/continue - # as it use return -code {break, continue, return and error} - # codes - OptDoOne descriptions state arguments - # If we are here, no special return code where issued, - # we'll step to next instruction : -# puts "new state = \"$state\"" - OptNextDesc descriptions - set state [OptCurState $descriptions] - } - } - - # Process one step for the state machine, - # eventually consuming the current argument. - proc OptDoOne {descriptionsName stateName argumentsName} { - upvar $argumentsName arguments - upvar $descriptionsName descriptions - upvar $stateName state - - # the special state/instruction "args" eats all - # the remaining args (if any) - if {($state == "args")} { - if {![Lempty $arguments]} { - # If there is no additional arguments, leave the default value - # in. - OptCurSetValue descriptions $arguments - set arguments {} - } -# puts "breaking out ('args' state: consuming every reminding args)" - return -code break - } - - if {[Lempty $arguments]} { - if {$state == "flags"} { - # no argument and no flags : we're done -# puts "returning to previous (sub)prg (no more args)" - return -code return - } elseif {$state == "optValue"} { - set state next; # not used, for debug only - # go to next state - return - } else { - return -code error [OptMissingValue $descriptions] - } - } else { - set arg [OptCurrentArg $arguments] - } - - switch $state { - flags { - # A non-dash argument terminates the options, as does -- - - # Still a flag ? - if {![OptIsFlag $arg]} { - # don't consume the argument, return to previous prg - return -code return - } - # consume the flag - OptNextArg arguments - if {[string equal "--" $arg]} { - # return from 'flags' state - return -code return - } - - set hits [OptHits descriptions $arg] - if {$hits > 1} { - return -code error [OptAmbigous $descriptions $arg] - } elseif {$hits == 0} { - return -code error [OptFlagUsage $descriptions $arg] - } - set item [OptCurDesc $descriptions] - if {[OptNeedValue $item]} { - # we need a value, next state is - set state flagValue - } else { - OptCurSetValue descriptions 1 - } - # continue - return -code continue - } - flagValue - - value { - set item [OptCurDesc $descriptions] - # Test the values against their required type - if {[catch {OptCheckType $arg\ - [OptType $item] [OptTypeArgs $item]} val]} { - return -code error [OptBadValue $item $arg $val] - } - # consume the value - OptNextArg arguments - # set the value - OptCurSetValue descriptions $val - # go to next state - if {$state == "flagValue"} { - set state flags - return -code continue - } else { - set state next; # not used, for debug only - return ; # will go on next step - } - } - optValue { - set item [OptCurDesc $descriptions] - # Test the values against their required type - if {![catch {OptCheckType $arg\ - [OptType $item] [OptTypeArgs $item]} val]} { - # right type, so : - # consume the value - OptNextArg arguments - # set the value - OptCurSetValue descriptions $val - } - # go to next state - set state next; # not used, for debug only - return ; # will go on next step - } - } - # If we reach this point: an unknown - # state as been entered ! - return -code error "Bug! unknown state in DoOne \"$state\"\ - (prg counter [OptGetPrgCounter $descriptions]:\ - [OptCurDesc $descriptions])" - } - -# Parse the options given the key to previously registered description -# and arguments list -proc ::tcl::OptKeyParse {descKey arglist} { - - set desc [OptKeyGetDesc $descKey] - - # make sure -help always give usage - if {[string equal -nocase "-help" $arglist]} { - return -code error [OptError "Usage information:" $desc 1] - } - - OptDoAll desc arglist - - if {![Lempty $arglist]} { - return -code error [OptTooManyArgs $desc $arglist] - } - - # Analyse the result - # Walk through the tree: - OptTreeVars $desc "#[expr {[info level]-1}]" -} - - # determine string length for nice tabulated output - proc OptTreeVars {desc level {vnamesLst {}}} { - foreach item $desc { - if {[OptIsCounter $item]} continue - if {[OptIsPrg $item]} { - set vnamesLst [OptTreeVars $item $level $vnamesLst] - } else { - set vname [OptVarName $item] - upvar $level $vname var - if {[OptHasBeenSet $item]} { -# puts "adding $vname" - # lets use the input name for the returned list - # it is more usefull, for instance you can check that - # no flags at all was given with expr - # {![string match "*-*" $Args]} - lappend vnamesLst [OptName $item] - set var [OptValue $item] - } else { - set var [OptDefaultValue $item] - } - } - } - return $vnamesLst - } - - -# Check the type of a value -# and emit an error if arg is not of the correct type -# otherwise returns the canonical value of that arg (ie 0/1 for booleans) -proc ::tcl::OptCheckType {arg type {typeArgs ""}} { -# puts "checking '$arg' against '$type' ($typeArgs)" - - # only types "any", "choice", and numbers can have leading "-" - - switch -exact -- $type { - int { - if {![string is integer -strict $arg]} { - error "not an integer" - } - return $arg - } - float { - return [expr {double($arg)}] - } - script - - list { - # if llength fail : malformed list - if {[llength $arg]==0 && [OptIsFlag $arg]} { - error "no values with leading -" - } - return $arg - } - boolean { - if {![string is boolean -strict $arg]} { - error "non canonic boolean" - } - # convert true/false because expr/if is broken with "!,... - return [expr {$arg ? 1 : 0}] - } - choice { - if {[lsearch -exact $typeArgs $arg] < 0} { - error "invalid choice" - } - return $arg - } - any { - return $arg - } - string - - default { - if {[OptIsFlag $arg]} { - error "no values with leading -" - } - return $arg - } - } - return neverReached -} - - # internal utilities - - # returns the number of flags matching the given arg - # sets the (local) prg counter to the list of matches - proc OptHits {descName arg} { - upvar $descName desc - set hits 0 - set hitems {} - set i 1 - - set larg [string tolower $arg] - set len [string length $larg] - set last [expr {$len-1}] - - foreach item [lrange $desc 1 end] { - set flag [OptName $item] - # lets try to match case insensitively - # (string length ought to be cheap) - set lflag [string tolower $flag] - if {$len == [string length $lflag]} { - if {[string equal $larg $lflag]} { - # Exact match case - OptSetPrgCounter desc $i - return 1 - } - } elseif {[string equal $larg [string range $lflag 0 $last]]} { - lappend hitems $i - incr hits - } - incr i - } - if {$hits} { - OptSetPrgCounter desc $hitems - } - return $hits - } - - # Extract fields from the list structure: - - proc OptName {item} { - lindex $item 1 - } - proc OptHasBeenSet {item} { - Lget $item {2 0} - } - proc OptValue {item} { - Lget $item {2 1} - } - - proc OptIsFlag {name} { - string match "-*" $name - } - proc OptIsOpt {name} { - string match {\?*} $name - } - proc OptVarName {item} { - set name [OptName $item] - if {[OptIsFlag $name]} { - return [string range $name 1 end] - } elseif {[OptIsOpt $name]} { - return [string trim $name "?"] - } else { - return $name - } - } - proc OptType {item} { - lindex $item 3 - } - proc OptTypeArgs {item} { - lindex $item 4 - } - proc OptHelp {item} { - lindex $item 5 - } - proc OptNeedValue {item} { - expr {![string equal [OptType $item] boolflag]} - } - proc OptDefaultValue {item} { - set val [OptTypeArgs $item] - switch -exact -- [OptType $item] { - choice {return [lindex $val 0]} - boolean - - boolflag { - # convert back false/true to 0/1 because expr !$bool - # is broken.. - if {$val} { - return 1 - } else { - return 0 - } - } - } - return $val - } - - # Description format error helper - proc OptOptUsage {item {what ""}} { - return -code error "invalid description format$what: $item\n\ - should be a list of {varname|-flagname ?-type? ?defaultvalue?\ - ?helpstring?}" - } - - - # Generate a canonical form single instruction - proc OptNewInst {state varname type typeArgs help} { - list $state $varname [list 0 {}] $type $typeArgs $help - # ^ ^ - # | | - # hasBeenSet=+ +=currentValue - } - - # Translate one item to canonical form - proc OptNormalizeOne {item} { - set lg [Lassign $item varname arg1 arg2 arg3] -# puts "called optnormalizeone '$item' v=($varname), lg=$lg" - set isflag [OptIsFlag $varname] - set isopt [OptIsOpt $varname] - if {$isflag} { - set state "flags" - } elseif {$isopt} { - set state "optValue" - } elseif {![string equal $varname "args"]} { - set state "value" - } else { - set state "args" - } - - # apply 'smart' 'fuzzy' logic to try to make - # description writer's life easy, and our's difficult : - # let's guess the missing arguments :-) - - switch $lg { - 1 { - if {$isflag} { - return [OptNewInst $state $varname boolflag false ""] - } else { - return [OptNewInst $state $varname any "" ""] - } - } - 2 { - # varname default - # varname help - set type [OptGuessType $arg1] - if {[string equal $type "string"]} { - if {$isflag} { - set type boolflag - set def false - } else { - set type any - set def "" - } - set help $arg1 - } else { - set help "" - set def $arg1 - } - return [OptNewInst $state $varname $type $def $help] - } - 3 { - # varname type value - # varname value comment - - if {[regexp {^-(.+)$} $arg1 x type]} { - # flags/optValue as they are optional, need a "value", - # on the contrary, for a variable (non optional), - # default value is pointless, 'cept for choices : - if {$isflag || $isopt || ($type == "choice")} { - return [OptNewInst $state $varname $type $arg2 ""] - } else { - return [OptNewInst $state $varname $type "" $arg2] - } - } else { - return [OptNewInst $state $varname\ - [OptGuessType $arg1] $arg1 $arg2] - } - } - 4 { - if {[regexp {^-(.+)$} $arg1 x type]} { - return [OptNewInst $state $varname $type $arg2 $arg3] - } else { - return -code error [OptOptUsage $item] - } - } - default { - return -code error [OptOptUsage $item] - } - } - } - - # Auto magic lazy type determination - proc OptGuessType {arg} { - if { $arg == "true" || $arg == "false" } { - return boolean - } - if {[string is integer -strict $arg]} { - return int - } - if {[string is double -strict $arg]} { - return float - } - return string - } - - # Error messages front ends - - proc OptAmbigous {desc arg} { - OptError "ambigous option \"$arg\", choose from:" [OptSelection $desc] - } - proc OptFlagUsage {desc arg} { - OptError "bad flag \"$arg\", must be one of" $desc - } - proc OptTooManyArgs {desc arguments} { - OptError "too many arguments (unexpected argument(s): $arguments),\ - usage:"\ - $desc 1 - } - proc OptParamType {item} { - if {[OptIsFlag $item]} { - return "flag" - } else { - return "parameter" - } - } - proc OptBadValue {item arg {err {}}} { -# puts "bad val err = \"$err\"" - OptError "bad value \"$arg\" for [OptParamType $item]"\ - [list $item] - } - proc OptMissingValue {descriptions} { -# set item [OptCurDescFinal $descriptions] - set item [OptCurDesc $descriptions] - OptError "no value given for [OptParamType $item] \"[OptName $item]\"\ - (use -help for full usage) :"\ - [list $item] - } - -proc ::tcl::OptKeyError {prefix descKey {header 0}} { - OptError $prefix [OptKeyGetDesc $descKey] $header -} - - # determine string length for nice tabulated output - proc OptLengths {desc nlName tlName dlName} { - upvar $nlName nl - upvar $tlName tl - upvar $dlName dl - foreach item $desc { - if {[OptIsCounter $item]} continue - if {[OptIsPrg $item]} { - OptLengths $item nl tl dl - } else { - SetMax nl [string length [OptName $item]] - SetMax tl [string length [OptType $item]] - set dv [OptTypeArgs $item] - if {[OptState $item] != "header"} { - set dv "($dv)" - } - set l [string length $dv] - # limit the space allocated to potentially big "choices" - if {([OptType $item] != "choice") || ($l<=12)} { - SetMax dl $l - } else { - if {![info exists dl]} { - set dl 0 - } - } - } - } - } - # output the tree - proc OptTree {desc nl tl dl} { - set res "" - foreach item $desc { - if {[OptIsCounter $item]} continue - if {[OptIsPrg $item]} { - append res [OptTree $item $nl $tl $dl] - } else { - set dv [OptTypeArgs $item] - if {[OptState $item] != "header"} { - set dv "($dv)" - } - append res [string trimright [format "\n %-*s %-*s %-*s %s" \ - $nl [OptName $item] $tl [OptType $item] \ - $dl $dv [OptHelp $item]]] - } - } - return $res - } - -# Give nice usage string -proc ::tcl::OptError {prefix desc {header 0}} { - # determine length - if {$header} { - # add faked instruction - set h [list [OptNewInst header Var/FlagName Type Value Help]] - lappend h [OptNewInst header ------------ ---- ----- ----] - lappend h [OptNewInst header {(-help} "" "" {gives this help)}] - set desc [concat $h $desc] - } - OptLengths $desc nl tl dl - # actually output - return "$prefix[OptTree $desc $nl $tl $dl]" -} - - -################ General Utility functions ####################### - -# -# List utility functions -# Naming convention: -# "Lvarxxx" take the list VARiable name as argument -# "Lxxxx" take the list value as argument -# (which is not costly with Tcl8 objects system -# as it's still a reference and not a copy of the values) -# - -# Is that list empty ? -proc ::tcl::Lempty {list} { - expr {[llength $list]==0} -} - -# Gets the value of one leaf of a lists tree -proc ::tcl::Lget {list indexLst} { - if {[llength $indexLst] <= 1} { - return [lindex $list $indexLst] - } - Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end] -} -# Sets the value of one leaf of a lists tree -# (we use the version that does not create the elements because -# it would be even slower... needs to be written in C !) -# (nb: there is a non trivial recursive problem with indexes 0, -# which appear because there is no difference between a list -# of 1 element and 1 element alone : [list "a"] == "a" while -# it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1 -# and [listp "a b"] maybe 0. listp does not exist either...) -proc ::tcl::Lvarset {listName indexLst newValue} { - upvar $listName list - if {[llength $indexLst] <= 1} { - Lvarset1nc list $indexLst $newValue - } else { - set idx [lindex $indexLst 0] - set targetList [lindex $list $idx] - # reduce refcount on targetList (not really usefull now, - # could be with optimizing compiler) -# Lvarset1 list $idx {} - # recursively replace in targetList - Lvarset targetList [lrange $indexLst 1 end] $newValue - # put updated sub list back in the tree - Lvarset1nc list $idx $targetList - } -} -# Set one cell to a value, eventually create all the needed elements -# (on level-1 of lists) -variable emptyList {} -proc ::tcl::Lvarset1 {listName index newValue} { - upvar $listName list - if {$index < 0} {return -code error "invalid negative index"} - set lg [llength $list] - if {$index >= $lg} { - variable emptyList - for {set i $lg} {$i<$index} {incr i} { - lappend list $emptyList - } - lappend list $newValue - } else { - set list [lreplace $list $index $index $newValue] - } -} -# same as Lvarset1 but no bound checking / creation -proc ::tcl::Lvarset1nc {listName index newValue} { - upvar $listName list - set list [lreplace $list $index $index $newValue] -} -# Increments the value of one leaf of a lists tree -# (which must exists) -proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} { - upvar $listName list - if {[llength $indexLst] <= 1} { - Lvarincr1 list $indexLst $howMuch - } else { - set idx [lindex $indexLst 0] - set targetList [lindex $list $idx] - # reduce refcount on targetList - Lvarset1nc list $idx {} - # recursively replace in targetList - Lvarincr targetList [lrange $indexLst 1 end] $howMuch - # put updated sub list back in the tree - Lvarset1nc list $idx $targetList - } -} -# Increments the value of one cell of a list -proc ::tcl::Lvarincr1 {listName index {howMuch 1}} { - upvar $listName list - set newValue [expr {[lindex $list $index]+$howMuch}] - set list [lreplace $list $index $index $newValue] - return $newValue -} -# Removes the first element of a list -# and returns the new list value -proc ::tcl::Lvarpop1 {listName} { - upvar $listName list - set list [lrange $list 1 end] -} -# Same but returns the removed element -# (Like the tclX version) -proc ::tcl::Lvarpop {listName} { - upvar $listName list - set el [lindex $list 0] - set list [lrange $list 1 end] - return $el -} -# Assign list elements to variables and return the length of the list -proc ::tcl::Lassign {list args} { - # faster than direct blown foreach (which does not byte compile) - set i 0 - set lg [llength $list] - foreach vname $args { - if {$i>=$lg} break - uplevel 1 [list ::set $vname [lindex $list $i]] - incr i - } - return $lg -} - -# Misc utilities - -# Set the varname to value if value is greater than varname's current value -# or if varname is undefined -proc ::tcl::SetMax {varname value} { - upvar 1 $varname var - if {![info exists var] || $value > $var} { - set var $value - } -} - -# Set the varname to value if value is smaller than varname's current value -# or if varname is undefined -proc ::tcl::SetMin {varname value} { - upvar 1 $varname var - if {![info exists var] || $value < $var} { - set var $value - } -} - - - # everything loaded fine, lets create the test proc: - # OptCreateTestProc - # Don't need the create temp proc anymore: - # rename OptCreateTestProc {} -} diff --git a/waypoint_manager/manager_GUI/tcl/opt0.4/pkgIndex.tcl b/waypoint_manager/manager_GUI/tcl/opt0.4/pkgIndex.tcl deleted file mode 100644 index 107d4c6..0000000 --- a/waypoint_manager/manager_GUI/tcl/opt0.4/pkgIndex.tcl +++ /dev/null @@ -1,12 +0,0 @@ -# Tcl package index file, version 1.1 -# This file is generated by the "pkg_mkIndex -direct" command -# and sourced either when an application starts up or -# by a "package unknown" script. It invokes the -# "package ifneeded" command to set up package-related -# information so that packages will be loaded automatically -# in response to "package require" commands. When this -# script is sourced, the variable $dir must contain the -# full path name of this file's directory. - -if {![package vsatisfies [package provide Tcl] 8.2]} {return} -package ifneeded opt 0.4.6 [list source [file join $dir optparse.tcl]] diff --git a/waypoint_manager/manager_GUI/tcl/package.tcl b/waypoint_manager/manager_GUI/tcl/package.tcl deleted file mode 100644 index 44e3b28..0000000 --- a/waypoint_manager/manager_GUI/tcl/package.tcl +++ /dev/null @@ -1,747 +0,0 @@ -# package.tcl -- -# -# utility procs formerly in init.tcl which can be loaded on demand -# for package management. -# -# Copyright (c) 1991-1993 The Regents of the University of California. -# Copyright (c) 1994-1998 Sun Microsystems, Inc. -# -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -# - -namespace eval tcl::Pkg {} - -# ::tcl::Pkg::CompareExtension -- -# -# Used internally by pkg_mkIndex to compare the extension of a file to a given -# extension. On Windows, it uses a case-insensitive comparison because the -# file system can be file insensitive. -# -# Arguments: -# fileName name of a file whose extension is compared -# ext (optional) The extension to compare against; you must -# provide the starting dot. -# Defaults to [info sharedlibextension] -# -# Results: -# Returns 1 if the extension matches, 0 otherwise - -proc tcl::Pkg::CompareExtension {fileName {ext {}}} { - global tcl_platform - if {$ext eq ""} {set ext [info sharedlibextension]} - if {$tcl_platform(platform) eq "windows"} { - return [string equal -nocase [file extension $fileName] $ext] - } else { - # Some unices add trailing numbers after the .so, so - # we could have something like '.so.1.2'. - set root $fileName - while {1} { - set currExt [file extension $root] - if {$currExt eq $ext} { - return 1 - } - - # The current extension does not match; if it is not a numeric - # value, quit, as we are only looking to ignore version number - # extensions. Otherwise we might return 1 in this case: - # tcl::Pkg::CompareExtension foo.so.bar .so - # which should not match. - - if {![string is integer -strict [string range $currExt 1 end]]} { - return 0 - } - set root [file rootname $root] - } - } -} - -# pkg_mkIndex -- -# This procedure creates a package index in a given directory. The package -# index consists of a "pkgIndex.tcl" file whose contents are a Tcl script that -# sets up package information with "package require" commands. The commands -# describe all of the packages defined by the files given as arguments. -# -# Arguments: -# -direct (optional) If this flag is present, the generated -# code in pkgMkIndex.tcl will cause the package to be -# loaded when "package require" is executed, rather -# than lazily when the first reference to an exported -# procedure in the package is made. -# -verbose (optional) Verbose output; the name of each file that -# was successfully rocessed is printed out. Additionally, -# if processing of a file failed a message is printed. -# -load pat (optional) Preload any packages whose names match -# the pattern. Used to handle DLLs that depend on -# other packages during their Init procedure. -# dir - Name of the directory in which to create the index. -# args - Any number of additional arguments, each giving -# a glob pattern that matches the names of one or -# more shared libraries or Tcl script files in -# dir. - -proc pkg_mkIndex {args} { - set usage {"pkg_mkIndex ?-direct? ?-lazy? ?-load pattern? ?-verbose? ?--? dir ?pattern ...?"} - - set argCount [llength $args] - if {$argCount < 1} { - return -code error "wrong # args: should be\n$usage" - } - - set more "" - set direct 1 - set doVerbose 0 - set loadPat "" - for {set idx 0} {$idx < $argCount} {incr idx} { - set flag [lindex $args $idx] - switch -glob -- $flag { - -- { - # done with the flags - incr idx - break - } - -verbose { - set doVerbose 1 - } - -lazy { - set direct 0 - append more " -lazy" - } - -direct { - append more " -direct" - } - -load { - incr idx - set loadPat [lindex $args $idx] - append more " -load $loadPat" - } - -* { - return -code error "unknown flag $flag: should be\n$usage" - } - default { - # done with the flags - break - } - } - } - - set dir [lindex $args $idx] - set patternList [lrange $args [expr {$idx + 1}] end] - if {![llength $patternList]} { - set patternList [list "*.tcl" "*[info sharedlibextension]"] - } - - try { - set fileList [glob -directory $dir -tails -types {r f} -- \ - {*}$patternList] - } on error {msg opt} { - return -options $opt $msg - } - foreach file $fileList { - # For each file, figure out what commands and packages it provides. - # To do this, create a child interpreter, load the file into the - # interpreter, and get a list of the new commands and packages that - # are defined. - - if {$file eq "pkgIndex.tcl"} { - continue - } - - set c [interp create] - - # Load into the child any packages currently loaded in the parent - # interpreter that match the -load pattern. - - if {$loadPat ne ""} { - if {$doVerbose} { - tclLog "currently loaded packages: '[info loaded]'" - tclLog "trying to load all packages matching $loadPat" - } - if {![llength [info loaded]]} { - tclLog "warning: no packages are currently loaded, nothing" - tclLog "can possibly match '$loadPat'" - } - } - foreach pkg [info loaded] { - if {![string match -nocase $loadPat [lindex $pkg 1]]} { - continue - } - if {$doVerbose} { - tclLog "package [lindex $pkg 1] matches '$loadPat'" - } - try { - load [lindex $pkg 0] [lindex $pkg 1] $c - } on error err { - if {$doVerbose} { - tclLog "warning: load [lindex $pkg 0]\ - [lindex $pkg 1]\nfailed with: $err" - } - } on ok {} { - if {$doVerbose} { - tclLog "loaded [lindex $pkg 0] [lindex $pkg 1]" - } - } - if {[lindex $pkg 1] eq "Tk"} { - # Withdraw . if Tk was loaded, to avoid showing a window. - $c eval [list wm withdraw .] - } - } - - $c eval { - # Stub out the package command so packages can require other - # packages. - - rename package __package_orig - proc package {what args} { - switch -- $what { - require { - return; # Ignore transitive requires - } - default { - __package_orig $what {*}$args - } - } - } - proc tclPkgUnknown args {} - package unknown tclPkgUnknown - - # Stub out the unknown command so package can call into each other - # during their initialilzation. - - proc unknown {args} {} - - # Stub out the auto_import mechanism - - proc auto_import {args} {} - - # reserve the ::tcl namespace for support procs and temporary - # variables. This might make it awkward to generate a - # pkgIndex.tcl file for the ::tcl namespace. - - namespace eval ::tcl { - variable dir ;# Current directory being processed - variable file ;# Current file being processed - variable direct ;# -direct flag value - variable x ;# Loop variable - variable debug ;# For debugging - variable type ;# "load" or "source", for -direct - variable namespaces ;# Existing namespaces (e.g., ::tcl) - variable packages ;# Existing packages (e.g., Tcl) - variable origCmds ;# Existing commands - variable newCmds ;# Newly created commands - variable newPkgs {} ;# Newly created packages - } - } - - $c eval [list set ::tcl::dir $dir] - $c eval [list set ::tcl::file $file] - $c eval [list set ::tcl::direct $direct] - - # Download needed procedures into the slave because we've just deleted - # the unknown procedure. This doesn't handle procedures with default - # arguments. - - foreach p {::tcl::Pkg::CompareExtension} { - $c eval [list namespace eval [namespace qualifiers $p] {}] - $c eval [list proc $p [info args $p] [info body $p]] - } - - try { - $c eval { - set ::tcl::debug "loading or sourcing" - - # we need to track command defined by each package even in the - # -direct case, because they are needed internally by the - # "partial pkgIndex.tcl" step above. - - proc ::tcl::GetAllNamespaces {{root ::}} { - set list $root - foreach ns [namespace children $root] { - lappend list {*}[::tcl::GetAllNamespaces $ns] - } - return $list - } - - # init the list of existing namespaces, packages, commands - - foreach ::tcl::x [::tcl::GetAllNamespaces] { - set ::tcl::namespaces($::tcl::x) 1 - } - foreach ::tcl::x [package names] { - if {[package provide $::tcl::x] ne ""} { - set ::tcl::packages($::tcl::x) 1 - } - } - set ::tcl::origCmds [info commands] - - # Try to load the file if it has the shared library extension, - # otherwise source it. It's important not to try to load - # files that aren't shared libraries, because on some systems - # (like SunOS) the loader will abort the whole application - # when it gets an error. - - if {[::tcl::Pkg::CompareExtension $::tcl::file [info sharedlibextension]]} { - # The "file join ." command below is necessary. Without - # it, if the file name has no \'s and we're on UNIX, the - # load command will invoke the LD_LIBRARY_PATH search - # mechanism, which could cause the wrong file to be used. - - set ::tcl::debug loading - load [file join $::tcl::dir $::tcl::file] - set ::tcl::type load - } else { - set ::tcl::debug sourcing - source [file join $::tcl::dir $::tcl::file] - set ::tcl::type source - } - - # As a performance optimization, if we are creating direct - # load packages, don't bother figuring out the set of commands - # created by the new packages. We only need that list for - # setting up the autoloading used in the non-direct case. - if {!$::tcl::direct} { - # See what new namespaces appeared, and import commands - # from them. Only exported commands go into the index. - - foreach ::tcl::x [::tcl::GetAllNamespaces] { - if {![info exists ::tcl::namespaces($::tcl::x)]} { - namespace import -force ${::tcl::x}::* - } - - # Figure out what commands appeared - - foreach ::tcl::x [info commands] { - set ::tcl::newCmds($::tcl::x) 1 - } - foreach ::tcl::x $::tcl::origCmds { - unset -nocomplain ::tcl::newCmds($::tcl::x) - } - foreach ::tcl::x [array names ::tcl::newCmds] { - # determine which namespace a command comes from - - set ::tcl::abs [namespace origin $::tcl::x] - - # special case so that global names have no - # leading ::, this is required by the unknown - # command - - set ::tcl::abs \ - [lindex [auto_qualify $::tcl::abs ::] 0] - - if {$::tcl::x ne $::tcl::abs} { - # Name changed during qualification - - set ::tcl::newCmds($::tcl::abs) 1 - unset ::tcl::newCmds($::tcl::x) - } - } - } - } - - # Look through the packages that appeared, and if there is a - # version provided, then record it - - foreach ::tcl::x [package names] { - if {[package provide $::tcl::x] ne "" - && ![info exists ::tcl::packages($::tcl::x)]} { - lappend ::tcl::newPkgs \ - [list $::tcl::x [package provide $::tcl::x]] - } - } - } - } on error msg { - set what [$c eval set ::tcl::debug] - if {$doVerbose} { - tclLog "warning: error while $what $file: $msg" - } - } on ok {} { - set what [$c eval set ::tcl::debug] - if {$doVerbose} { - tclLog "successful $what of $file" - } - set type [$c eval set ::tcl::type] - set cmds [lsort [$c eval array names ::tcl::newCmds]] - set pkgs [$c eval set ::tcl::newPkgs] - if {$doVerbose} { - if {!$direct} { - tclLog "commands provided were $cmds" - } - tclLog "packages provided were $pkgs" - } - if {[llength $pkgs] > 1} { - tclLog "warning: \"$file\" provides more than one package ($pkgs)" - } - foreach pkg $pkgs { - # cmds is empty/not used in the direct case - lappend files($pkg) [list $file $type $cmds] - } - - if {$doVerbose} { - tclLog "processed $file" - } - } - interp delete $c - } - - append index "# Tcl package index file, version 1.1\n" - append index "# This file is generated by the \"pkg_mkIndex$more\" command\n" - append index "# and sourced either when an application starts up or\n" - append index "# by a \"package unknown\" script. It invokes the\n" - append index "# \"package ifneeded\" command to set up package-related\n" - append index "# information so that packages will be loaded automatically\n" - append index "# in response to \"package require\" commands. When this\n" - append index "# script is sourced, the variable \$dir must contain the\n" - append index "# full path name of this file's directory.\n" - - foreach pkg [lsort [array names files]] { - set cmd {} - lassign $pkg name version - lappend cmd ::tcl::Pkg::Create -name $name -version $version - foreach spec [lsort -index 0 $files($pkg)] { - foreach {file type procs} $spec { - if {$direct} { - set procs {} - } - lappend cmd "-$type" [list $file $procs] - } - } - append index "\n[eval $cmd]" - } - - set f [open [file join $dir pkgIndex.tcl] w] - puts $f $index - close $f -} - -# tclPkgSetup -- -# This is a utility procedure use by pkgIndex.tcl files. It is invoked as -# part of a "package ifneeded" script. It calls "package provide" to indicate -# that a package is available, then sets entries in the auto_index array so -# that the package's files will be auto-loaded when the commands are used. -# -# Arguments: -# dir - Directory containing all the files for this package. -# pkg - Name of the package (no version number). -# version - Version number for the package, such as 2.1.3. -# files - List of files that constitute the package. Each -# element is a sub-list with three elements. The first -# is the name of a file relative to $dir, the second is -# "load" or "source", indicating whether the file is a -# loadable binary or a script to source, and the third -# is a list of commands defined by this file. - -proc tclPkgSetup {dir pkg version files} { - global auto_index - - package provide $pkg $version - foreach fileInfo $files { - set f [lindex $fileInfo 0] - set type [lindex $fileInfo 1] - foreach cmd [lindex $fileInfo 2] { - if {$type eq "load"} { - set auto_index($cmd) [list load [file join $dir $f] $pkg] - } else { - set auto_index($cmd) [list source [file join $dir $f]] - } - } - } -} - -# tclPkgUnknown -- -# This procedure provides the default for the "package unknown" function. It -# is invoked when a package that's needed can't be found. It scans the -# auto_path directories and their immediate children looking for pkgIndex.tcl -# files and sources any such files that are found to setup the package -# database. As it searches, it will recognize changes to the auto_path and -# scan any new directories. -# -# Arguments: -# name - Name of desired package. Not used. -# version - Version of desired package. Not used. -# exact - Either "-exact" or omitted. Not used. - -proc tclPkgUnknown {name args} { - global auto_path env - - if {![info exists auto_path]} { - return - } - # Cache the auto_path, because it may change while we run through the - # first set of pkgIndex.tcl files - set old_path [set use_path $auto_path] - while {[llength $use_path]} { - set dir [lindex $use_path end] - - # Make sure we only scan each directory one time. - if {[info exists tclSeenPath($dir)]} { - set use_path [lrange $use_path 0 end-1] - continue - } - set tclSeenPath($dir) 1 - - # we can't use glob in safe interps, so enclose the following in a - # catch statement, where we get the pkgIndex files out of the - # subdirectories - catch { - foreach file [glob -directory $dir -join -nocomplain \ - * pkgIndex.tcl] { - set dir [file dirname $file] - if {![info exists procdDirs($dir)]} { - try { - source $file - } trap {POSIX EACCES} {} { - # $file was not readable; silently ignore - continue - } on error msg { - tclLog "error reading package index file $file: $msg" - } on ok {} { - set procdDirs($dir) 1 - } - } - } - } - set dir [lindex $use_path end] - if {![info exists procdDirs($dir)]} { - set file [file join $dir pkgIndex.tcl] - # safe interps usually don't have "file exists", - if {([interp issafe] || [file exists $file])} { - try { - source $file - } trap {POSIX EACCES} {} { - # $file was not readable; silently ignore - continue - } on error msg { - tclLog "error reading package index file $file: $msg" - } on ok {} { - set procdDirs($dir) 1 - } - } - } - - set use_path [lrange $use_path 0 end-1] - - # Check whether any of the index scripts we [source]d above set a new - # value for $::auto_path. If so, then find any new directories on the - # $::auto_path, and lappend them to the $use_path we are working from. - # This gives index scripts the (arguably unwise) power to expand the - # index script search path while the search is in progress. - set index 0 - if {[llength $old_path] == [llength $auto_path]} { - foreach dir $auto_path old $old_path { - if {$dir ne $old} { - # This entry in $::auto_path has changed. - break - } - incr index - } - } - - # $index now points to the first element of $auto_path that has - # changed, or the beginning if $auto_path has changed length Scan the - # new elements of $auto_path for directories to add to $use_path. - # Don't add directories we've already seen, or ones already on the - # $use_path. - foreach dir [lrange $auto_path $index end] { - if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { - lappend use_path $dir - } - } - set old_path $auto_path - } -} - -# tcl::MacOSXPkgUnknown -- -# This procedure extends the "package unknown" function for MacOSX. It scans -# the Resources/Scripts directories of the immediate children of the auto_path -# directories for pkgIndex files. -# -# Arguments: -# original - original [package unknown] procedure -# name - Name of desired package. Not used. -# version - Version of desired package. Not used. -# exact - Either "-exact" or omitted. Not used. - -proc tcl::MacOSXPkgUnknown {original name args} { - # First do the cross-platform default search - uplevel 1 $original [linsert $args 0 $name] - - # Now do MacOSX specific searching - global auto_path - - if {![info exists auto_path]} { - return - } - # Cache the auto_path, because it may change while we run through the - # first set of pkgIndex.tcl files - set old_path [set use_path $auto_path] - while {[llength $use_path]} { - set dir [lindex $use_path end] - - # Make sure we only scan each directory one time. - if {[info exists tclSeenPath($dir)]} { - set use_path [lrange $use_path 0 end-1] - continue - } - set tclSeenPath($dir) 1 - - # get the pkgIndex files out of the subdirectories - foreach file [glob -directory $dir -join -nocomplain \ - * Resources Scripts pkgIndex.tcl] { - set dir [file dirname $file] - if {![info exists procdDirs($dir)]} { - try { - source $file - } trap {POSIX EACCES} {} { - # $file was not readable; silently ignore - continue - } on error msg { - tclLog "error reading package index file $file: $msg" - } on ok {} { - set procdDirs($dir) 1 - } - } - } - set use_path [lrange $use_path 0 end-1] - - # Check whether any of the index scripts we [source]d above set a new - # value for $::auto_path. If so, then find any new directories on the - # $::auto_path, and lappend them to the $use_path we are working from. - # This gives index scripts the (arguably unwise) power to expand the - # index script search path while the search is in progress. - set index 0 - if {[llength $old_path] == [llength $auto_path]} { - foreach dir $auto_path old $old_path { - if {$dir ne $old} { - # This entry in $::auto_path has changed. - break - } - incr index - } - } - - # $index now points to the first element of $auto_path that has - # changed, or the beginning if $auto_path has changed length Scan the - # new elements of $auto_path for directories to add to $use_path. - # Don't add directories we've already seen, or ones already on the - # $use_path. - foreach dir [lrange $auto_path $index end] { - if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { - lappend use_path $dir - } - } - set old_path $auto_path - } -} - -# ::tcl::Pkg::Create -- -# -# Given a package specification generate a "package ifneeded" statement -# for the package, suitable for inclusion in a pkgIndex.tcl file. -# -# Arguments: -# args arguments used by the Create function: -# -name packageName -# -version packageVersion -# -load {filename ?{procs}?} -# ... -# -source {filename ?{procs}?} -# ... -# -# Any number of -load and -source parameters may be -# specified, so long as there is at least one -load or -# -source parameter. If the procs component of a module -# specifier is left off, that module will be set up for -# direct loading; otherwise, it will be set up for lazy -# loading. If both -source and -load are specified, the -# -load'ed files will be loaded first, followed by the -# -source'd files. -# -# Results: -# An appropriate "package ifneeded" statement for the package. - -proc ::tcl::Pkg::Create {args} { - append err(usage) "[lindex [info level 0] 0] " - append err(usage) "-name packageName -version packageVersion" - append err(usage) "?-load {filename ?{procs}?}? ... " - append err(usage) "?-source {filename ?{procs}?}? ..." - - set err(wrongNumArgs) "wrong # args: should be \"$err(usage)\"" - set err(valueMissing) "value for \"%s\" missing: should be \"$err(usage)\"" - set err(unknownOpt) "unknown option \"%s\": should be \"$err(usage)\"" - set err(noLoadOrSource) "at least one of -load and -source must be given" - - # process arguments - set len [llength $args] - if {$len < 6} { - error $err(wrongNumArgs) - } - - # Initialize parameters - array set opts {-name {} -version {} -source {} -load {}} - - # process parameters - for {set i 0} {$i < $len} {incr i} { - set flag [lindex $args $i] - incr i - switch -glob -- $flag { - "-name" - - "-version" { - if {$i >= $len} { - error [format $err(valueMissing) $flag] - } - set opts($flag) [lindex $args $i] - } - "-source" - - "-load" { - if {$i >= $len} { - error [format $err(valueMissing) $flag] - } - lappend opts($flag) [lindex $args $i] - } - default { - error [format $err(unknownOpt) [lindex $args $i]] - } - } - } - - # Validate the parameters - if {![llength $opts(-name)]} { - error [format $err(valueMissing) "-name"] - } - if {![llength $opts(-version)]} { - error [format $err(valueMissing) "-version"] - } - - if {!([llength $opts(-source)] || [llength $opts(-load)])} { - error $err(noLoadOrSource) - } - - # OK, now everything is good. Generate the package ifneeded statment. - set cmdline "package ifneeded $opts(-name) $opts(-version) " - - set cmdList {} - set lazyFileList {} - - # Handle -load and -source specs - foreach key {load source} { - foreach filespec $opts(-$key) { - lassign $filespec filename proclist - - if { [llength $proclist] == 0 } { - set cmd "\[list $key \[file join \$dir [list $filename]\]\]" - lappend cmdList $cmd - } else { - lappend lazyFileList [list $filename $key $proclist] - } - } - } - - if {[llength $lazyFileList]} { - lappend cmdList "\[list tclPkgSetup \$dir $opts(-name)\ - $opts(-version) [list $lazyFileList]\]" - } - append cmdline [join $cmdList "\\n"] - return $cmdline -} - -interp alias {} ::pkg::create {} ::tcl::Pkg::Create diff --git a/waypoint_manager/manager_GUI/tcl/parray.tcl b/waypoint_manager/manager_GUI/tcl/parray.tcl deleted file mode 100644 index a9c2cb1..0000000 --- a/waypoint_manager/manager_GUI/tcl/parray.tcl +++ /dev/null @@ -1,28 +0,0 @@ -# parray: -# Print the contents of a global array on stdout. -# -# Copyright (c) 1991-1993 The Regents of the University of California. -# Copyright (c) 1994 Sun Microsystems, Inc. -# -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -# - -proc parray {a {pattern *}} { - upvar 1 $a array - if {![array exists array]} { - return -code error "\"$a\" isn't an array" - } - set maxl 0 - set names [lsort [array names array $pattern]] - foreach name $names { - if {[string length $name] > $maxl} { - set maxl [string length $name] - } - } - set maxl [expr {$maxl + [string length $a] + 2}] - foreach name $names { - set nameString [format %s(%s) $a $name] - puts stdout [format "%-*s = %s" $maxl $nameString $array($name)] - } -} diff --git a/waypoint_manager/manager_GUI/tcl/safe.tcl b/waypoint_manager/manager_GUI/tcl/safe.tcl deleted file mode 100644 index ea6391d..0000000 --- a/waypoint_manager/manager_GUI/tcl/safe.tcl +++ /dev/null @@ -1,1133 +0,0 @@ -# safe.tcl -- -# -# This file provide a safe loading/sourcing mechanism for safe interpreters. -# It implements a virtual path mecanism to hide the real pathnames from the -# slave. It runs in a master interpreter and sets up data structure and -# aliases that will be invoked when used from a slave interpreter. -# -# See the safe.n man page for details. -# -# Copyright (c) 1996-1997 Sun Microsystems, Inc. -# -# See the file "license.terms" for information on usage and redistribution of -# this file, and for a DISCLAIMER OF ALL WARRANTIES. - -# -# The implementation is based on namespaces. These naming conventions are -# followed: -# Private procs starts with uppercase. -# Public procs are exported and starts with lowercase -# - -# Needed utilities package -package require opt 0.4.1 - -# Create the safe namespace -namespace eval ::safe { - # Exported API: - namespace export interpCreate interpInit interpConfigure interpDelete \ - interpAddToAccessPath interpFindInAccessPath setLogCmd -} - -# Helper function to resolve the dual way of specifying staticsok (either -# by -noStatics or -statics 0) -proc ::safe::InterpStatics {} { - foreach v {Args statics noStatics} { - upvar $v $v - } - set flag [::tcl::OptProcArgGiven -noStatics] - if {$flag && (!$noStatics == !$statics) - && ([::tcl::OptProcArgGiven -statics])} { - return -code error\ - "conflicting values given for -statics and -noStatics" - } - if {$flag} { - return [expr {!$noStatics}] - } else { - return $statics - } -} - -# Helper function to resolve the dual way of specifying nested loading -# (either by -nestedLoadOk or -nested 1) -proc ::safe::InterpNested {} { - foreach v {Args nested nestedLoadOk} { - upvar $v $v - } - set flag [::tcl::OptProcArgGiven -nestedLoadOk] - # note that the test here is the opposite of the "InterpStatics" one - # (it is not -noNested... because of the wanted default value) - if {$flag && (!$nestedLoadOk != !$nested) - && ([::tcl::OptProcArgGiven -nested])} { - return -code error\ - "conflicting values given for -nested and -nestedLoadOk" - } - if {$flag} { - # another difference with "InterpStatics" - return $nestedLoadOk - } else { - return $nested - } -} - -#### -# -# API entry points that needs argument parsing : -# -#### - -# Interface/entry point function and front end for "Create" -proc ::safe::interpCreate {args} { - set Args [::tcl::OptKeyParse ::safe::interpCreate $args] - InterpCreate $slave $accessPath \ - [InterpStatics] [InterpNested] $deleteHook -} - -proc ::safe::interpInit {args} { - set Args [::tcl::OptKeyParse ::safe::interpIC $args] - if {![::interp exists $slave]} { - return -code error "\"$slave\" is not an interpreter" - } - InterpInit $slave $accessPath \ - [InterpStatics] [InterpNested] $deleteHook -} - -# Check that the given slave is "one of us" -proc ::safe::CheckInterp {slave} { - namespace upvar ::safe S$slave state - if {![info exists state] || ![::interp exists $slave]} { - return -code error \ - "\"$slave\" is not an interpreter managed by ::safe::" - } -} - -# Interface/entry point function and front end for "Configure". This code -# is awfully pedestrian because it would need more coupling and support -# between the way we store the configuration values in safe::interp's and -# the Opt package. Obviously we would like an OptConfigure to avoid -# duplicating all this code everywhere. -# -> TODO (the app should share or access easily the program/value stored -# by opt) - -# This is even more complicated by the boolean flags with no values that -# we had the bad idea to support for the sake of user simplicity in -# create/init but which makes life hard in configure... -# So this will be hopefully written and some integrated with opt1.0 -# (hopefully for tcl8.1 ?) -proc ::safe::interpConfigure {args} { - switch [llength $args] { - 1 { - # If we have exactly 1 argument the semantic is to return all - # the current configuration. We still call OptKeyParse though - # we know that "slave" is our given argument because it also - # checks for the "-help" option. - set Args [::tcl::OptKeyParse ::safe::interpIC $args] - CheckInterp $slave - namespace upvar ::safe S$slave state - - return [join [list \ - [list -accessPath $state(access_path)] \ - [list -statics $state(staticsok)] \ - [list -nested $state(nestedok)] \ - [list -deleteHook $state(cleanupHook)]]] - } - 2 { - # If we have exactly 2 arguments the semantic is a "configure - # get" - lassign $args slave arg - - # get the flag sub program (we 'know' about Opt's internal - # representation of data) - set desc [lindex [::tcl::OptKeyGetDesc ::safe::interpIC] 2] - set hits [::tcl::OptHits desc $arg] - if {$hits > 1} { - return -code error [::tcl::OptAmbigous $desc $arg] - } elseif {$hits == 0} { - return -code error [::tcl::OptFlagUsage $desc $arg] - } - CheckInterp $slave - namespace upvar ::safe S$slave state - - set item [::tcl::OptCurDesc $desc] - set name [::tcl::OptName $item] - switch -exact -- $name { - -accessPath { - return [list -accessPath $state(access_path)] - } - -statics { - return [list -statics $state(staticsok)] - } - -nested { - return [list -nested $state(nestedok)] - } - -deleteHook { - return [list -deleteHook $state(cleanupHook)] - } - -noStatics { - # it is most probably a set in fact but we would need - # then to jump to the set part and it is not *sure* - # that it is a set action that the user want, so force - # it to use the unambigous -statics ?value? instead: - return -code error\ - "ambigous query (get or set -noStatics ?)\ - use -statics instead" - } - -nestedLoadOk { - return -code error\ - "ambigous query (get or set -nestedLoadOk ?)\ - use -nested instead" - } - default { - return -code error "unknown flag $name (bug)" - } - } - } - default { - # Otherwise we want to parse the arguments like init and - # create did - set Args [::tcl::OptKeyParse ::safe::interpIC $args] - CheckInterp $slave - namespace upvar ::safe S$slave state - - # Get the current (and not the default) values of whatever has - # not been given: - if {![::tcl::OptProcArgGiven -accessPath]} { - set doreset 1 - set accessPath $state(access_path) - } else { - set doreset 0 - } - if { - ![::tcl::OptProcArgGiven -statics] - && ![::tcl::OptProcArgGiven -noStatics] - } then { - set statics $state(staticsok) - } else { - set statics [InterpStatics] - } - if { - [::tcl::OptProcArgGiven -nested] || - [::tcl::OptProcArgGiven -nestedLoadOk] - } then { - set nested [InterpNested] - } else { - set nested $state(nestedok) - } - if {![::tcl::OptProcArgGiven -deleteHook]} { - set deleteHook $state(cleanupHook) - } - # we can now reconfigure : - InterpSetConfig $slave $accessPath $statics $nested $deleteHook - # auto_reset the slave (to completly synch the new access_path) - if {$doreset} { - if {[catch {::interp eval $slave {auto_reset}} msg]} { - Log $slave "auto_reset failed: $msg" - } else { - Log $slave "successful auto_reset" NOTICE - } - } - } - } -} - -#### -# -# Functions that actually implements the exported APIs -# -#### - -# -# safe::InterpCreate : doing the real job -# -# This procedure creates a safe slave and initializes it with the safe -# base aliases. -# NB: slave name must be simple alphanumeric string, no spaces, no (), no -# {},... {because the state array is stored as part of the name} -# -# Returns the slave name. -# -# Optional Arguments : -# + slave name : if empty, generated name will be used -# + access_path: path list controlling where load/source can occur, -# if empty: the master auto_path will be used. -# + staticsok : flag, if 0 :no static package can be loaded (load {} Xxx) -# if 1 :static packages are ok. -# + nestedok: flag, if 0 :no loading to sub-sub interps (load xx xx sub) -# if 1 : multiple levels are ok. - -# use the full name and no indent so auto_mkIndex can find us -proc ::safe::InterpCreate { - slave - access_path - staticsok - nestedok - deletehook - } { - # Create the slave. - if {$slave ne ""} { - ::interp create -safe $slave - } else { - # empty argument: generate slave name - set slave [::interp create -safe] - } - Log $slave "Created" NOTICE - - # Initialize it. (returns slave name) - InterpInit $slave $access_path $staticsok $nestedok $deletehook -} - -# -# InterpSetConfig (was setAccessPath) : -# Sets up slave virtual auto_path and corresponding structure within -# the master. Also sets the tcl_library in the slave to be the first -# directory in the path. -# NB: If you change the path after the slave has been initialized you -# probably need to call "auto_reset" in the slave in order that it gets -# the right auto_index() array values. - -proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} { - global auto_path - - # determine and store the access path if empty - if {$access_path eq ""} { - set access_path $auto_path - - # Make sure that tcl_library is in auto_path and at the first - # position (needed by setAccessPath) - set where [lsearch -exact $access_path [info library]] - if {$where == -1} { - # not found, add it. - set access_path [linsert $access_path 0 [info library]] - Log $slave "tcl_library was not in auto_path,\ - added it to slave's access_path" NOTICE - } elseif {$where != 0} { - # not first, move it first - set access_path [linsert \ - [lreplace $access_path $where $where] \ - 0 [info library]] - Log $slave "tcl_libray was not in first in auto_path,\ - moved it to front of slave's access_path" NOTICE - } - - # Add 1st level sub dirs (will searched by auto loading from tcl - # code in the slave using glob and thus fail, so we add them here - # so by default it works the same). - set access_path [AddSubDirs $access_path] - } - - Log $slave "Setting accessPath=($access_path) staticsok=$staticsok\ - nestedok=$nestedok deletehook=($deletehook)" NOTICE - - namespace upvar ::safe S$slave state - - # clear old autopath if it existed - # build new one - # Extend the access list with the paths used to look for Tcl Modules. - # We save the virtual form separately as well, as syncing it with the - # slave has to be defered until the necessary commands are present for - # setup. - - set norm_access_path {} - set slave_access_path {} - set map_access_path {} - set remap_access_path {} - set slave_tm_path {} - - set i 0 - foreach dir $access_path { - set token [PathToken $i] - lappend slave_access_path $token - lappend map_access_path $token $dir - lappend remap_access_path $dir $token - lappend norm_access_path [file normalize $dir] - incr i - } - - set morepaths [::tcl::tm::list] - while {[llength $morepaths]} { - set addpaths $morepaths - set morepaths {} - - foreach dir $addpaths { - # Prevent the addition of dirs on the tm list to the - # result if they are already known. - if {[dict exists $remap_access_path $dir]} { - continue - } - - set token [PathToken $i] - lappend access_path $dir - lappend slave_access_path $token - lappend map_access_path $token $dir - lappend remap_access_path $dir $token - lappend norm_access_path [file normalize $dir] - lappend slave_tm_path $token - incr i - - # [Bug 2854929] - # Recursively find deeper paths which may contain - # modules. Required to handle modules with names like - # 'platform::shell', which translate into - # 'platform/shell-X.tm', i.e arbitrarily deep - # subdirectories. - lappend morepaths {*}[glob -nocomplain -directory $dir -type d *] - } - } - - set state(access_path) $access_path - set state(access_path,map) $map_access_path - set state(access_path,remap) $remap_access_path - set state(access_path,norm) $norm_access_path - set state(access_path,slave) $slave_access_path - set state(tm_path_slave) $slave_tm_path - set state(staticsok) $staticsok - set state(nestedok) $nestedok - set state(cleanupHook) $deletehook - - SyncAccessPath $slave -} - -# -# -# FindInAccessPath: -# Search for a real directory and returns its virtual Id (including the -# "$") -proc ::safe::interpFindInAccessPath {slave path} { - namespace upvar ::safe S$slave state - - if {![dict exists $state(access_path,remap) $path]} { - return -code error "$path not found in access path $access_path" - } - - return [dict get $state(access_path,remap) $path] -} - -# -# addToAccessPath: -# add (if needed) a real directory to access path and return its -# virtual token (including the "$"). -proc ::safe::interpAddToAccessPath {slave path} { - # first check if the directory is already in there - # (inlined interpFindInAccessPath). - namespace upvar ::safe S$slave state - - if {[dict exists $state(access_path,remap) $path]} { - return [dict get $state(access_path,remap) $path] - } - - # new one, add it: - set token [PathToken [llength $state(access_path)]] - - lappend state(access_path) $path - lappend state(access_path,slave) $token - lappend state(access_path,map) $token $path - lappend state(access_path,remap) $path $token - lappend state(access_path,norm) [file normalize $path] - - SyncAccessPath $slave - return $token -} - -# This procedure applies the initializations to an already existing -# interpreter. It is useful when you want to install the safe base aliases -# into a preexisting safe interpreter. -proc ::safe::InterpInit { - slave - access_path - staticsok - nestedok - deletehook - } { - # Configure will generate an access_path when access_path is empty. - InterpSetConfig $slave $access_path $staticsok $nestedok $deletehook - - # NB we need to add [namespace current], aliases are always absolute - # paths. - - # These aliases let the slave load files to define new commands - # This alias lets the slave use the encoding names, convertfrom, - # convertto, and system, but not "encoding system " to set the - # system encoding. - # Handling Tcl Modules, we need a restricted form of Glob. - # This alias interposes on the 'exit' command and cleanly terminates - # the slave. - - foreach {command alias} { - source AliasSource - load AliasLoad - encoding AliasEncoding - exit interpDelete - glob AliasGlob - } { - ::interp alias $slave $command {} [namespace current]::$alias $slave - } - - # This alias lets the slave have access to a subset of the 'file' - # command functionality. - - ::interp expose $slave file - foreach subcommand {dirname extension rootname tail} { - ::interp alias $slave ::tcl::file::$subcommand {} \ - ::safe::AliasFileSubcommand $slave $subcommand - } - foreach subcommand { - atime attributes copy delete executable exists isdirectory isfile - link lstat mtime mkdir nativename normalize owned readable readlink - rename size stat tempfile type volumes writable - } { - ::interp alias $slave ::tcl::file::$subcommand {} \ - ::safe::BadSubcommand $slave file $subcommand - } - - # Subcommands of info - foreach {subcommand alias} { - nameofexecutable AliasExeName - } { - ::interp alias $slave ::tcl::info::$subcommand \ - {} [namespace current]::$alias $slave - } - - # The allowed slave variables already have been set by Tcl_MakeSafe(3) - - # Source init.tcl and tm.tcl into the slave, to get auto_load and - # other procedures defined: - - if {[catch {::interp eval $slave { - source [file join $tcl_library init.tcl] - }} msg opt]} { - Log $slave "can't source init.tcl ($msg)" - return -options $opt "can't source init.tcl into slave $slave ($msg)" - } - - if {[catch {::interp eval $slave { - source [file join $tcl_library tm.tcl] - }} msg opt]} { - Log $slave "can't source tm.tcl ($msg)" - return -options $opt "can't source tm.tcl into slave $slave ($msg)" - } - - # Sync the paths used to search for Tcl modules. This can be done only - # now, after tm.tcl was loaded. - namespace upvar ::safe S$slave state - if {[llength $state(tm_path_slave)] > 0} { - ::interp eval $slave [list \ - ::tcl::tm::add {*}[lreverse $state(tm_path_slave)]] - } - return $slave -} - -# Add (only if needed, avoid duplicates) 1 level of sub directories to an -# existing path list. Also removes non directories from the returned -# list. -proc ::safe::AddSubDirs {pathList} { - set res {} - foreach dir $pathList { - if {[file isdirectory $dir]} { - # check that we don't have it yet as a children of a previous - # dir - if {$dir ni $res} { - lappend res $dir - } - foreach sub [glob -directory $dir -nocomplain *] { - if {[file isdirectory $sub] && ($sub ni $res)} { - # new sub dir, add it ! - lappend res $sub - } - } - } - } - return $res -} - -# This procedure deletes a safe slave managed by Safe Tcl and cleans up -# associated state: - -proc ::safe::interpDelete {slave} { - Log $slave "About to delete" NOTICE - - namespace upvar ::safe S$slave state - - # If the slave has a cleanup hook registered, call it. Check the - # existance because we might be called to delete an interp which has - # not been registered with us at all - - if {[info exists state(cleanupHook)]} { - set hook $state(cleanupHook) - if {[llength $hook]} { - # remove the hook now, otherwise if the hook calls us somehow, - # we'll loop - unset state(cleanupHook) - try { - {*}$hook $slave - } on error err { - Log $slave "Delete hook error ($err)" - } - } - } - - # Discard the global array of state associated with the slave, and - # delete the interpreter. - - if {[info exists state]} { - unset state - } - - # if we have been called twice, the interp might have been deleted - # already - if {[::interp exists $slave]} { - ::interp delete $slave - Log $slave "Deleted" NOTICE - } - - return -} - -# Set (or get) the logging mecanism - -proc ::safe::setLogCmd {args} { - variable Log - set la [llength $args] - if {$la == 0} { - return $Log - } elseif {$la == 1} { - set Log [lindex $args 0] - } else { - set Log $args - } - - if {$Log eq ""} { - # Disable logging completely. Calls to it will be compiled out - # of all users. - proc ::safe::Log {args} {} - } else { - # Activate logging, define proper command. - - proc ::safe::Log {slave msg {type ERROR}} { - variable Log - {*}$Log "$type for slave $slave : $msg" - return - } - } -} - -# ------------------- END OF PUBLIC METHODS ------------ - -# -# Sets the slave auto_path to the master recorded value. Also sets -# tcl_library to the first token of the virtual path. -# -proc ::safe::SyncAccessPath {slave} { - namespace upvar ::safe S$slave state - - set slave_access_path $state(access_path,slave) - ::interp eval $slave [list set auto_path $slave_access_path] - - Log $slave "auto_path in $slave has been set to $slave_access_path"\ - NOTICE - - # This code assumes that info library is the first element in the - # list of auto_path's. See -> InterpSetConfig for the code which - # ensures this condition. - - ::interp eval $slave [list \ - set tcl_library [lindex $slave_access_path 0]] -} - -# Returns the virtual token for directory number N. -proc ::safe::PathToken {n} { - # We need to have a ":" in the token string so [file join] on the - # mac won't turn it into a relative path. - return "\$p(:$n:)" ;# Form tested by case 7.2 -} - -# -# translate virtual path into real path -# -proc ::safe::TranslatePath {slave path} { - namespace upvar ::safe S$slave state - - # somehow strip the namespaces 'functionality' out (the danger is that - # we would strip valid macintosh "../" queries... : - if {[string match "*::*" $path] || [string match "*..*" $path]} { - return -code error "invalid characters in path $path" - } - - # Use a cached map instead of computed local vars and subst. - - return [string map $state(access_path,map) $path] -} - -# file name control (limit access to files/resources that should be a -# valid tcl source file) -proc ::safe::CheckFileName {slave file} { - # This used to limit what can be sourced to ".tcl" and forbid files - # with more than 1 dot and longer than 14 chars, but I changed that - # for 8.4 as a safe interp has enough internal protection already to - # allow sourcing anything. - hobbs - - if {![file exists $file]} { - # don't tell the file path - return -code error "no such file or directory" - } - - if {![file readable $file]} { - # don't tell the file path - return -code error "not readable" - } -} - -# AliasFileSubcommand handles selected subcommands of [file] in safe -# interpreters that are *almost* safe. In particular, it just acts to -# prevent discovery of what home directories exist. - -proc ::safe::AliasFileSubcommand {slave subcommand name} { - if {[string match ~* $name]} { - set name ./$name - } - tailcall ::interp invokehidden $slave tcl:file:$subcommand $name -} - -# AliasGlob is the target of the "glob" alias in safe interpreters. - -proc ::safe::AliasGlob {slave args} { - Log $slave "GLOB ! $args" NOTICE - set cmd {} - set at 0 - array set got { - -directory 0 - -nocomplain 0 - -join 0 - -tails 0 - -- 0 - } - - if {$::tcl_platform(platform) eq "windows"} { - set dirPartRE {^(.*)[\\/]([^\\/]*)$} - } else { - set dirPartRE {^(.*)/([^/]*)$} - } - - set dir {} - set virtualdir {} - - while {$at < [llength $args]} { - switch -glob -- [set opt [lindex $args $at]] { - -nocomplain - -- - -join - -tails { - lappend cmd $opt - set got($opt) 1 - incr at - } - -types - -type { - lappend cmd -types [lindex $args [incr at]] - incr at - } - -directory { - if {$got($opt)} { - return -code error \ - {"-directory" cannot be used with "-path"} - } - set got($opt) 1 - set virtualdir [lindex $args [incr at]] - incr at - } - pkgIndex.tcl { - # Oops, this is globbing a subdirectory in regular package - # search. That is not wanted. Abort, handler does catch - # already (because glob was not defined before). See - # package.tcl, lines 484ff in tclPkgUnknown. - return -code error "unknown command glob" - } - -* { - Log $slave "Safe base rejecting glob option '$opt'" - return -code error "Safe base rejecting glob option '$opt'" - } - default { - break - } - } - if {$got(--)} break - } - - # Get the real path from the virtual one and check that the path is in the - # access path of that slave. Done after basic argument processing so that - # we know if -nocomplain is set. - if {$got(-directory)} { - try { - set dir [TranslatePath $slave $virtualdir] - DirInAccessPath $slave $dir - } on error msg { - Log $slave $msg - if {$got(-nocomplain)} return - return -code error "permission denied" - } - lappend cmd -directory $dir - } - - # Apply the -join semantics ourselves - if {$got(-join)} { - set args [lreplace $args $at end [join [lrange $args $at end] "/"]] - } - - # Process remaining pattern arguments - set firstPattern [llength $cmd] - foreach opt [lrange $args $at end] { - if {![regexp $dirPartRE $opt -> thedir thefile]} { - set thedir . - } elseif {[string match ~* $thedir]} { - set thedir ./$thedir - } - if {$thedir eq "*" && - ($thefile eq "pkgIndex.tcl" || $thefile eq "*.tm")} { - set mapped 0 - foreach d [glob -directory [TranslatePath $slave $virtualdir] \ - -types d -tails *] { - catch { - DirInAccessPath $slave \ - [TranslatePath $slave [file join $virtualdir $d]] - lappend cmd [file join $d $thefile] - set mapped 1 - } - } - if {$mapped} continue - } - try { - DirInAccessPath $slave [TranslatePath $slave \ - [file join $virtualdir $thedir]] - } on error msg { - Log $slave $msg - if {$got(-nocomplain)} continue - return -code error "permission denied" - } - lappend cmd $opt - } - - Log $slave "GLOB = $cmd" NOTICE - - if {$got(-nocomplain) && [llength $cmd] eq $firstPattern} { - return - } - try { - set entries [::interp invokehidden $slave glob {*}$cmd] - } on error msg { - Log $slave $msg - return -code error "script error" - } - - Log $slave "GLOB < $entries" NOTICE - - # Translate path back to what the slave should see. - set res {} - set l [string length $dir] - foreach p $entries { - if {[string equal -length $l $dir $p]} { - set p [string replace $p 0 [expr {$l-1}] $virtualdir] - } - lappend res $p - } - - Log $slave "GLOB > $res" NOTICE - return $res -} - -# AliasSource is the target of the "source" alias in safe interpreters. - -proc ::safe::AliasSource {slave args} { - set argc [llength $args] - # Extended for handling of Tcl Modules to allow not only "source - # filename", but "source -encoding E filename" as well. - if {[lindex $args 0] eq "-encoding"} { - incr argc -2 - set encoding [lindex $args 1] - set at 2 - if {$encoding eq "identity"} { - Log $slave "attempt to use the identity encoding" - return -code error "permission denied" - } - } else { - set at 0 - set encoding {} - } - if {$argc != 1} { - set msg "wrong # args: should be \"source ?-encoding E? fileName\"" - Log $slave "$msg ($args)" - return -code error $msg - } - set file [lindex $args $at] - - # get the real path from the virtual one. - if {[catch { - set realfile [TranslatePath $slave $file] - } msg]} { - Log $slave $msg - return -code error "permission denied" - } - - # check that the path is in the access path of that slave - if {[catch { - FileInAccessPath $slave $realfile - } msg]} { - Log $slave $msg - return -code error "permission denied" - } - - # do the checks on the filename : - if {[catch { - CheckFileName $slave $realfile - } msg]} { - Log $slave "$realfile:$msg" - return -code error $msg - } - - # Passed all the tests, lets source it. Note that we do this all manually - # because we want to control [info script] in the slave so information - # doesn't leak so much. [Bug 2913625] - set old [::interp eval $slave {info script}] - set replacementMsg "script error" - set code [catch { - set f [open $realfile] - fconfigure $f -eofchar \032 - if {$encoding ne ""} { - fconfigure $f -encoding $encoding - } - set contents [read $f] - close $f - ::interp eval $slave [list info script $file] - } msg opt] - if {$code == 0} { - set code [catch {::interp eval $slave $contents} msg opt] - set replacementMsg $msg - } - catch {interp eval $slave [list info script $old]} - # Note that all non-errors are fine result codes from [source], so we must - # take a little care to do it properly. [Bug 2923613] - if {$code == 1} { - Log $slave $msg - return -code error $replacementMsg - } - return -code $code -options $opt $msg -} - -# AliasLoad is the target of the "load" alias in safe interpreters. - -proc ::safe::AliasLoad {slave file args} { - set argc [llength $args] - if {$argc > 2} { - set msg "load error: too many arguments" - Log $slave "$msg ($argc) {$file $args}" - return -code error $msg - } - - # package name (can be empty if file is not). - set package [lindex $args 0] - - namespace upvar ::safe S$slave state - - # Determine where to load. load use a relative interp path and {} - # means self, so we can directly and safely use passed arg. - set target [lindex $args 1] - if {$target ne ""} { - # we will try to load into a sub sub interp; check that we want to - # authorize that. - if {!$state(nestedok)} { - Log $slave "loading to a sub interp (nestedok)\ - disabled (trying to load $package to $target)" - return -code error "permission denied (nested load)" - } - } - - # Determine what kind of load is requested - if {$file eq ""} { - # static package loading - if {$package eq ""} { - set msg "load error: empty filename and no package name" - Log $slave $msg - return -code error $msg - } - if {!$state(staticsok)} { - Log $slave "static packages loading disabled\ - (trying to load $package to $target)" - return -code error "permission denied (static package)" - } - } else { - # file loading - - # get the real path from the virtual one. - try { - set file [TranslatePath $slave $file] - } on error msg { - Log $slave $msg - return -code error "permission denied" - } - - # check the translated path - try { - FileInAccessPath $slave $file - } on error msg { - Log $slave $msg - return -code error "permission denied (path)" - } - } - - try { - return [::interp invokehidden $slave load $file $package $target] - } on error msg { - Log $slave $msg - return -code error $msg - } -} - -# FileInAccessPath raises an error if the file is not found in the list of -# directories contained in the (master side recorded) slave's access path. - -# the security here relies on "file dirname" answering the proper -# result... needs checking ? -proc ::safe::FileInAccessPath {slave file} { - namespace upvar ::safe S$slave state - set access_path $state(access_path) - - if {[file isdirectory $file]} { - return -code error "\"$file\": is a directory" - } - set parent [file dirname $file] - - # Normalize paths for comparison since lsearch knows nothing of - # potential pathname anomalies. - set norm_parent [file normalize $parent] - - namespace upvar ::safe S$slave state - if {$norm_parent ni $state(access_path,norm)} { - return -code error "\"$file\": not in access_path" - } -} - -proc ::safe::DirInAccessPath {slave dir} { - namespace upvar ::safe S$slave state - set access_path $state(access_path) - - if {[file isfile $dir]} { - return -code error "\"$dir\": is a file" - } - - # Normalize paths for comparison since lsearch knows nothing of - # potential pathname anomalies. - set norm_dir [file normalize $dir] - - namespace upvar ::safe S$slave state - if {$norm_dir ni $state(access_path,norm)} { - return -code error "\"$dir\": not in access_path" - } -} - -# This procedure is used to report an attempt to use an unsafe member of an -# ensemble command. - -proc ::safe::BadSubcommand {slave command subcommand args} { - set msg "not allowed to invoke subcommand $subcommand of $command" - Log $slave $msg - return -code error -errorcode {TCL SAFE SUBCOMMAND} $msg -} - -# AliasEncoding is the target of the "encoding" alias in safe interpreters. - -proc ::safe::AliasEncoding {slave option args} { - # Note that [encoding dirs] is not supported in safe slaves at all - set subcommands {convertfrom convertto names system} - try { - set option [tcl::prefix match -error [list -level 1 -errorcode \ - [list TCL LOOKUP INDEX option $option]] $subcommands $option] - # Special case: [encoding system] ok, but [encoding system foo] not - if {$option eq "system" && [llength $args]} { - return -code error -errorcode {TCL WRONGARGS} \ - "wrong # args: should be \"encoding system\"" - } - } on error {msg options} { - Log $slave $msg - return -options $options $msg - } - tailcall ::interp invokehidden $slave encoding $option {*}$args -} - -# Various minor hiding of platform features. [Bug 2913625] - -proc ::safe::AliasExeName {slave} { - return "" -} - -proc ::safe::Setup {} { - #### - # - # Setup the arguments parsing - # - #### - - # Share the descriptions - set temp [::tcl::OptKeyRegister { - {-accessPath -list {} "access path for the slave"} - {-noStatics "prevent loading of statically linked pkgs"} - {-statics true "loading of statically linked pkgs"} - {-nestedLoadOk "allow nested loading"} - {-nested false "nested loading"} - {-deleteHook -script {} "delete hook"} - }] - - # create case (slave is optional) - ::tcl::OptKeyRegister { - {?slave? -name {} "name of the slave (optional)"} - } ::safe::interpCreate - - # adding the flags sub programs to the command program (relying on Opt's - # internal implementation details) - lappend ::tcl::OptDesc(::safe::interpCreate) $::tcl::OptDesc($temp) - - # init and configure (slave is needed) - ::tcl::OptKeyRegister { - {slave -name {} "name of the slave"} - } ::safe::interpIC - - # adding the flags sub programs to the command program (relying on Opt's - # internal implementation details) - lappend ::tcl::OptDesc(::safe::interpIC) $::tcl::OptDesc($temp) - - # temp not needed anymore - ::tcl::OptKeyDelete $temp - - #### - # - # Default: No logging. - # - #### - - setLogCmd {} - - # Log eventually. - # To enable error logging, set Log to {puts stderr} for instance, - # via setLogCmd. - return -} - -namespace eval ::safe { - # internal variables - - # Log command, set via 'setLogCmd'. Logging is disabled when empty. - variable Log {} - - # The package maintains a state array per slave interp under its - # control. The name of this array is S. This array is - # brought into scope where needed, using 'namespace upvar'. The S - # prefix is used to avoid that a slave interp called "Log" smashes - # the "Log" variable. - # - # The array's elements are: - # - # access_path : List of paths accessible to the slave. - # access_path,norm : Ditto, in normalized form. - # access_path,slave : Ditto, as the path tokens as seen by the slave. - # access_path,map : dict ( token -> path ) - # access_path,remap : dict ( path -> token ) - # tm_path_slave : List of TM root directories, as tokens seen by the slave. - # staticsok : Value of option -statics - # nestedok : Value of option -nested - # cleanupHook : Value of option -deleteHook -} - -::safe::Setup diff --git a/waypoint_manager/manager_GUI/tcl/tcl8/http-2.9.1.tm b/waypoint_manager/manager_GUI/tcl/tcl8/http-2.9.1.tm deleted file mode 100644 index 0aa283f..0000000 --- a/waypoint_manager/manager_GUI/tcl/tcl8/http-2.9.1.tm +++ /dev/null @@ -1,3427 +0,0 @@ -# http.tcl -- -# -# Client-side HTTP for GET, POST, and HEAD commands. These routines can -# be used in untrusted code that uses the Safesock security policy. -# These procedures use a callback interface to avoid using vwait, which -# is not defined in the safe base. -# -# See the file "license.terms" for information on usage and redistribution of -# this file, and for a DISCLAIMER OF ALL WARRANTIES. - -package require Tcl 8.6- -# Keep this in sync with pkgIndex.tcl and with the install directories in -# Makefiles -package provide http 2.9.1 - -namespace eval http { - # Allow resourcing to not clobber existing data - - variable http - if {![info exists http]} { - array set http { - -accept */* - -pipeline 1 - -postfresh 0 - -proxyhost {} - -proxyport {} - -proxyfilter http::ProxyRequired - -repost 0 - -urlencoding utf-8 - -zip 1 - } - # We need a useragent string of this style or various servers will - # refuse to send us compressed content even when we ask for it. This - # follows the de-facto layout of user-agent strings in current browsers. - # Safe interpreters do not have ::tcl_platform(os) or - # ::tcl_platform(osVersion). - if {[interp issafe]} { - set http(-useragent) "Mozilla/5.0\ - (Windows; U;\ - Windows NT 10.0)\ - http/[package provide http] Tcl/[package provide Tcl]" - } else { - set http(-useragent) "Mozilla/5.0\ - ([string totitle $::tcl_platform(platform)]; U;\ - $::tcl_platform(os) $::tcl_platform(osVersion))\ - http/[package provide http] Tcl/[package provide Tcl]" - } - } - - proc init {} { - # Set up the map for quoting chars. RFC3986 Section 2.3 say percent - # encode all except: "... percent-encoded octets in the ranges of - # ALPHA (%41-%5A and %61-%7A), DIGIT (%30-%39), hyphen (%2D), period - # (%2E), underscore (%5F), or tilde (%7E) should not be created by URI - # producers ..." - for {set i 0} {$i <= 256} {incr i} { - set c [format %c $i] - if {![string match {[-._~a-zA-Z0-9]} $c]} { - set map($c) %[format %.2X $i] - } - } - # These are handled specially - set map(\n) %0D%0A - variable formMap [array get map] - - # Create a map for HTTP/1.1 open sockets - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - if {[info exists socketMapping]} { - # Close open sockets on re-init. Do not permit retries. - foreach {url sock} [array get socketMapping] { - unset -nocomplain socketClosing($url) - unset -nocomplain socketPlayCmd($url) - CloseSocket $sock - } - } - - # CloseSocket should have unset the socket* arrays, one element at - # a time. Now unset anything that was overlooked. - # Traces on "unset socketRdState(*)" will call CancelReadPipeline and - # cancel any queued responses. - # Traces on "unset socketWrState(*)" will call CancelWritePipeline and - # cancel any queued requests. - array unset socketMapping - array unset socketRdState - array unset socketWrState - array unset socketRdQueue - array unset socketWrQueue - array unset socketClosing - array unset socketPlayCmd - array set socketMapping {} - array set socketRdState {} - array set socketWrState {} - array set socketRdQueue {} - array set socketWrQueue {} - array set socketClosing {} - array set socketPlayCmd {} - } - init - - variable urlTypes - if {![info exists urlTypes]} { - set urlTypes(http) [list 80 ::socket] - } - - variable encodings [string tolower [encoding names]] - # This can be changed, but iso8859-1 is the RFC standard. - variable defaultCharset - if {![info exists defaultCharset]} { - set defaultCharset "iso8859-1" - } - - # Force RFC 3986 strictness in geturl url verification? - variable strict - if {![info exists strict]} { - set strict 1 - } - - # Let user control default keepalive for compatibility - variable defaultKeepalive - if {![info exists defaultKeepalive]} { - set defaultKeepalive 0 - } - - namespace export geturl config reset wait formatQuery quoteString - namespace export register unregister registerError - # - Useful, but not exported: data, size, status, code, cleanup, error, - # meta, ncode, mapReply, init. Comments suggest that "init" can be used - # for re-initialisation, although the command is undocumented. - # - Not exported, probably should be upper-case initial letter as part - # of the internals: getTextLine, make-transformation-chunked. -} - -# http::Log -- -# -# Debugging output -- define this to observe HTTP/1.1 socket usage. -# Should echo any args received. -# -# Arguments: -# msg Message to output -# -if {[info command http::Log] eq {}} {proc http::Log {args} {}} - -# http::register -- -# -# See documentation for details. -# -# Arguments: -# proto URL protocol prefix, e.g. https -# port Default port for protocol -# command Command to use to create socket -# Results: -# list of port and command that was registered. - -proc http::register {proto port command} { - variable urlTypes - set urlTypes([string tolower $proto]) [list $port $command] -} - -# http::unregister -- -# -# Unregisters URL protocol handler -# -# Arguments: -# proto URL protocol prefix, e.g. https -# Results: -# list of port and command that was unregistered. - -proc http::unregister {proto} { - variable urlTypes - set lower [string tolower $proto] - if {![info exists urlTypes($lower)]} { - return -code error "unsupported url type \"$proto\"" - } - set old $urlTypes($lower) - unset urlTypes($lower) - return $old -} - -# http::config -- -# -# See documentation for details. -# -# Arguments: -# args Options parsed by the procedure. -# Results: -# TODO - -proc http::config {args} { - variable http - set options [lsort [array names http -*]] - set usage [join $options ", "] - if {[llength $args] == 0} { - set result {} - foreach name $options { - lappend result $name $http($name) - } - return $result - } - set options [string map {- ""} $options] - set pat ^-(?:[join $options |])$ - if {[llength $args] == 1} { - set flag [lindex $args 0] - if {![regexp -- $pat $flag]} { - return -code error "Unknown option $flag, must be: $usage" - } - return $http($flag) - } else { - foreach {flag value} $args { - if {![regexp -- $pat $flag]} { - return -code error "Unknown option $flag, must be: $usage" - } - set http($flag) $value - } - } -} - -# http::Finish -- -# -# Clean up the socket and eval close time callbacks -# -# Arguments: -# token Connection token. -# errormsg (optional) If set, forces status to error. -# skipCB (optional) If set, don't call the -command callback. This -# is useful when geturl wants to throw an exception instead -# of calling the callback. That way, the same error isn't -# reported to two places. -# -# Side Effects: -# May close the socket. - -proc http::Finish {token {errormsg ""} {skipCB 0}} { - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - variable $token - upvar 0 $token state - global errorInfo errorCode - set closeQueue 0 - if {$errormsg ne ""} { - set state(error) [list $errormsg $errorInfo $errorCode] - set state(status) "error" - } - if {[info commands ${token}EventCoroutine] ne {}} { - rename ${token}EventCoroutine {} - } - if { ($state(status) eq "timeout") - || ($state(status) eq "error") - || ($state(status) eq "eof") - || ([info exists state(-keepalive)] && !$state(-keepalive)) - || ([info exists state(connection)] && ($state(connection) eq "close")) - } { - set closeQueue 1 - set connId $state(socketinfo) - set sock $state(sock) - CloseSocket $state(sock) $token - } elseif { - ([info exists state(-keepalive)] && $state(-keepalive)) - && ([info exists state(connection)] && ($state(connection) ne "close")) - } { - KeepSocket $token - } - if {[info exists state(after)]} { - after cancel $state(after) - unset state(after) - } - if {[info exists state(-command)] && (!$skipCB) - && (![info exists state(done-command-cb)])} { - set state(done-command-cb) yes - if {[catch {eval $state(-command) {$token}} err] && $errormsg eq ""} { - set state(error) [list $err $errorInfo $errorCode] - set state(status) error - } - } - - if { $closeQueue - && [info exists socketMapping($connId)] - && ($socketMapping($connId) eq $sock) - } { - http::CloseQueuedQueries $connId $token - } -} - -# http::KeepSocket - -# -# Keep a socket in the persistent sockets table and connect it to its next -# queued task if possible. Otherwise leave it idle and ready for its next -# use. -# -# If $socketClosing(*), then ($state(connection) eq "close") and therefore -# this command will not be called by Finish. -# -# Arguments: -# token Connection token. - -proc http::KeepSocket {token} { - variable http - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - variable $token - upvar 0 $token state - set tk [namespace tail $token] - - # Keep this socket open for another request ("Keep-Alive"). - # React if the server half-closes the socket. - # Discussion is in http::geturl. - catch {fileevent $state(sock) readable [list http::CheckEof $state(sock)]} - - # The line below should not be changed in production code. - # It is edited by the test suite. - set TEST_EOF 0 - if {$TEST_EOF} { - # ONLY for testing reaction to server eof. - # No server timeouts will be caught. - catch {fileevent $state(sock) readable {}} - } - - if { [info exists state(socketinfo)] - && [info exists socketMapping($state(socketinfo))] - } { - set connId $state(socketinfo) - # The value "Rready" is set only here. - set socketRdState($connId) Rready - - if { $state(-pipeline) - && [info exists socketRdQueue($connId)] - && [llength $socketRdQueue($connId)] - } { - # The usual case for pipelined responses - if another response is - # queued, arrange to read it. - set token3 [lindex $socketRdQueue($connId) 0] - set socketRdQueue($connId) [lrange $socketRdQueue($connId) 1 end] - variable $token3 - upvar 0 $token3 state3 - set tk2 [namespace tail $token3] - - #Log pipelined, GRANT read access to $token3 in KeepSocket - set socketRdState($connId) $token3 - ReceiveResponse $token3 - - # Other pipelined cases. - # - The test above ensures that, for the pipelined cases in the two - # tests below, the read queue is empty. - # - In those two tests, check whether the next write will be - # nonpipeline. - } elseif { - $state(-pipeline) - && [info exists socketWrState($connId)] - && ($socketWrState($connId) eq "peNding") - - && [info exists socketWrQueue($connId)] - && [llength $socketWrQueue($connId)] - && (![set token3 [lindex $socketWrQueue($connId) 0] - set ${token3}(-pipeline) - ] - ) - } { - # This case: - # - Now it the time to run the "pending" request. - # - The next token in the write queue is nonpipeline, and - # socketWrState has been marked "pending" (in - # http::NextPipelinedWrite or http::geturl) so a new pipelined - # request cannot jump the queue. - # - # Tests: - # - In this case the read queue (tested above) is empty and this - # "pending" write token is in front of the rest of the write - # queue. - # - The write state is not Wready and therefore appears to be busy, - # but because it is "pending" we know that it is reserved for the - # first item in the write queue, a non-pipelined request that is - # waiting for the read queue to empty. That has now happened: so - # give that request read and write access. - variable $token3 - set conn [set ${token3}(tmpConnArgs)] - #Log nonpipeline, GRANT r/w access to $token3 in KeepSocket - set socketRdState($connId) $token3 - set socketWrState($connId) $token3 - set socketWrQueue($connId) [lrange $socketWrQueue($connId) 1 end] - # Connect does its own fconfigure. - fileevent $state(sock) writable [list http::Connect $token3 {*}$conn] - #Log ---- $state(sock) << conn to $token3 for HTTP request (c) - - } elseif { - $state(-pipeline) - && [info exists socketWrState($connId)] - && ($socketWrState($connId) eq "peNding") - - } { - # Should not come here. The second block in the previous "elseif" - # test should be tautologous (but was needed in an earlier - # implementation) and will be removed after testing. - # If we get here, the value "pending" was assigned in error. - # This error would block the queue for ever. - Log ^X$tk <<<<< Error in queueing of requests >>>>> - token $token - - } elseif { - $state(-pipeline) - && [info exists socketWrState($connId)] - && ($socketWrState($connId) eq "Wready") - - && [info exists socketWrQueue($connId)] - && [llength $socketWrQueue($connId)] - && (![set token3 [lindex $socketWrQueue($connId) 0] - set ${token3}(-pipeline) - ] - ) - } { - # This case: - # - The next token in the write queue is nonpipeline, and - # socketWrState is Wready. Get the next event from socketWrQueue. - # Tests: - # - In this case the read state (tested above) is Rready and the - # write state (tested here) is Wready - there is no "pending" - # request. - # Code: - # - The code is the same as the code below for the nonpipelined - # case with a queued request. - variable $token3 - set conn [set ${token3}(tmpConnArgs)] - #Log nonpipeline, GRANT r/w access to $token3 in KeepSocket - set socketRdState($connId) $token3 - set socketWrState($connId) $token3 - set socketWrQueue($connId) [lrange $socketWrQueue($connId) 1 end] - # Connect does its own fconfigure. - fileevent $state(sock) writable [list http::Connect $token3 {*}$conn] - #Log ---- $state(sock) << conn to $token3 for HTTP request (c) - - } elseif { - (!$state(-pipeline)) - && [info exists socketWrQueue($connId)] - && [llength $socketWrQueue($connId)] - && ($state(connection) ne "close") - } { - # If not pipelined, (socketRdState eq Rready) tells us that we are - # ready for the next write - there is no need to check - # socketWrState. Write the next request, if one is waiting. - # If the next request is pipelined, it receives premature read - # access to the socket. This is not a problem. - set token3 [lindex $socketWrQueue($connId) 0] - variable $token3 - set conn [set ${token3}(tmpConnArgs)] - #Log nonpipeline, GRANT r/w access to $token3 in KeepSocket - set socketRdState($connId) $token3 - set socketWrState($connId) $token3 - set socketWrQueue($connId) [lrange $socketWrQueue($connId) 1 end] - # Connect does its own fconfigure. - fileevent $state(sock) writable [list http::Connect $token3 {*}$conn] - #Log ---- $state(sock) << conn to $token3 for HTTP request (d) - - } elseif {(!$state(-pipeline))} { - set socketWrState($connId) Wready - # Rready and Wready and idle: nothing to do. - } - - } else { - CloseSocket $state(sock) $token - # There is no socketMapping($state(socketinfo)), so it does not matter - # that CloseQueuedQueries is not called. - } -} - -# http::CheckEof - -# -# Read from a socket and close it if eof. -# The command is bound to "fileevent readable" on an idle socket, and -# "eof" is the only event that should trigger the binding, occurring when -# the server times out and half-closes the socket. -# -# A read is necessary so that [eof] gives a meaningful result. -# Any bytes sent are junk (or a bug). - -proc http::CheckEof {sock} { - set junk [read $sock] - set n [string length $junk] - if {$n} { - Log "WARNING: $n bytes received but no HTTP request sent" - } - - if {[catch {eof $sock} res] || $res} { - # The server has half-closed the socket. - # If a new write has started, its transaction will fail and - # will then be error-handled. - CloseSocket $sock - } -} - -# http::CloseSocket - -# -# Close a socket and remove it from the persistent sockets table. If -# possible an http token is included here but when we are called from a -# fileevent on remote closure we need to find the correct entry - hence -# the "else" block of the first "if" command. - -proc http::CloseSocket {s {token {}}} { - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - set tk [namespace tail $token] - - catch {fileevent $s readable {}} - set connId {} - if {$token ne ""} { - variable $token - upvar 0 $token state - if {[info exists state(socketinfo)]} { - set connId $state(socketinfo) - } - } else { - set map [array get socketMapping] - set ndx [lsearch -exact $map $s] - if {$ndx != -1} { - incr ndx -1 - set connId [lindex $map $ndx] - } - } - if { ($connId ne {}) - && [info exists socketMapping($connId)] - && ($socketMapping($connId) eq $s) - } { - Log "Closing connection $connId (sock $socketMapping($connId))" - if {[catch {close $socketMapping($connId)} err]} { - Log "Error closing connection: $err" - } - if {$token eq {}} { - # Cases with a non-empty token are handled by Finish, so the tokens - # are finished in connection order. - http::CloseQueuedQueries $connId - } - } else { - Log "Closing socket $s (no connection info)" - if {[catch {close $s} err]} { - Log "Error closing socket: $err" - } - } -} - -# http::CloseQueuedQueries -# -# connId - identifier "domain:port" for the connection -# token - (optional) used only for logging -# -# Called from http::CloseSocket and http::Finish, after a connection is closed, -# to clear the read and write queues if this has not already been done. - -proc http::CloseQueuedQueries {connId {token {}}} { - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - if {![info exists socketMapping($connId)]} { - # Command has already been called. - # Don't come here again - especially recursively. - return - } - - # Used only for logging. - if {$token eq {}} { - set tk {} - } else { - set tk [namespace tail $token] - } - - if { [info exists socketPlayCmd($connId)] - && ($socketPlayCmd($connId) ne {ReplayIfClose Wready {} {}}) - } { - # Before unsetting, there is some unfinished business. - # - If the server sent "Connection: close", we have stored the command - # for retrying any queued requests in socketPlayCmd, so copy that - # value for execution below. socketClosing(*) was also set. - # - Also clear the queues to prevent calls to Finish that would set the - # state for the requests that will be retried to "finished with error - # status". - set unfinished $socketPlayCmd($connId) - set socketRdQueue($connId) {} - set socketWrQueue($connId) {} - } else { - set unfinished {} - } - - Unset $connId - - if {$unfinished ne {}} { - Log ^R$tk Any unfinished transactions (excluding $token) failed \ - - token $token - {*}$unfinished - } -} - -# http::Unset -# -# The trace on "unset socketRdState(*)" will call CancelReadPipeline -# and cancel any queued responses. -# The trace on "unset socketWrState(*)" will call CancelWritePipeline -# and cancel any queued requests. - -proc http::Unset {connId} { - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - unset socketMapping($connId) - unset socketRdState($connId) - unset socketWrState($connId) - unset -nocomplain socketRdQueue($connId) - unset -nocomplain socketWrQueue($connId) - unset -nocomplain socketClosing($connId) - unset -nocomplain socketPlayCmd($connId) -} - -# http::reset -- -# -# See documentation for details. -# -# Arguments: -# token Connection token. -# why Status info. -# -# Side Effects: -# See Finish - -proc http::reset {token {why reset}} { - variable $token - upvar 0 $token state - set state(status) $why - catch {fileevent $state(sock) readable {}} - catch {fileevent $state(sock) writable {}} - Finish $token - if {[info exists state(error)]} { - set errorlist $state(error) - unset state - eval ::error $errorlist - } -} - -# http::geturl -- -# -# Establishes a connection to a remote url via http. -# -# Arguments: -# url The http URL to goget. -# args Option value pairs. Valid options include: -# -blocksize, -validate, -headers, -timeout -# Results: -# Returns a token for this connection. This token is the name of an -# array that the caller should unset to garbage collect the state. - -proc http::geturl {url args} { - variable http - variable urlTypes - variable defaultCharset - variable defaultKeepalive - variable strict - - # Initialize the state variable, an array. We'll return the name of this - # array as the token for the transaction. - - if {![info exists http(uid)]} { - set http(uid) 0 - } - set token [namespace current]::[incr http(uid)] - ##Log Starting http::geturl - token $token - variable $token - upvar 0 $token state - set tk [namespace tail $token] - reset $token - Log ^A$tk URL $url - token $token - - # Process command options. - - array set state { - -binary false - -blocksize 8192 - -queryblocksize 8192 - -validate 0 - -headers {} - -timeout 0 - -type application/x-www-form-urlencoded - -queryprogress {} - -protocol 1.1 - binary 0 - state created - meta {} - method {} - coding {} - currentsize 0 - totalsize 0 - querylength 0 - queryoffset 0 - type text/html - body {} - status "" - http "" - connection close - } - set state(-keepalive) $defaultKeepalive - set state(-strict) $strict - # These flags have their types verified [Bug 811170] - array set type { - -binary boolean - -blocksize integer - -queryblocksize integer - -strict boolean - -timeout integer - -validate boolean - } - set state(charset) $defaultCharset - set options { - -binary -blocksize -channel -command -handler -headers -keepalive - -method -myaddr -progress -protocol -query -queryblocksize - -querychannel -queryprogress -strict -timeout -type -validate - } - set usage [join [lsort $options] ", "] - set options [string map {- ""} $options] - set pat ^-(?:[join $options |])$ - foreach {flag value} $args { - if {[regexp -- $pat $flag]} { - # Validate numbers - if { - [info exists type($flag)] && - ![string is $type($flag) -strict $value] - } { - unset $token - return -code error \ - "Bad value for $flag ($value), must be $type($flag)" - } - set state($flag) $value - } else { - unset $token - return -code error "Unknown option $flag, can be: $usage" - } - } - - # Make sure -query and -querychannel aren't both specified - - set isQueryChannel [info exists state(-querychannel)] - set isQuery [info exists state(-query)] - if {$isQuery && $isQueryChannel} { - unset $token - return -code error "Can't combine -query and -querychannel options!" - } - - # Validate URL, determine the server host and port, and check proxy case - # Recognize user:pass@host URLs also, although we do not do anything with - # that info yet. - - # URLs have basically four parts. - # First, before the colon, is the protocol scheme (e.g. http) - # Second, for HTTP-like protocols, is the authority - # The authority is preceded by // and lasts up to (but not including) - # the following / or ? and it identifies up to four parts, of which - # only one, the host, is required (if an authority is present at all). - # All other parts of the authority (user name, password, port number) - # are optional. - # Third is the resource name, which is split into two parts at a ? - # The first part (from the single "/" up to "?") is the path, and the - # second part (from that "?" up to "#") is the query. *HOWEVER*, we do - # not need to separate them; we send the whole lot to the server. - # Both, path and query are allowed to be missing, including their - # delimiting character. - # Fourth is the fragment identifier, which is everything after the first - # "#" in the URL. The fragment identifier MUST NOT be sent to the server - # and indeed, we don't bother to validate it (it could be an error to - # pass it in here, but it's cheap to strip). - # - # An example of a URL that has all the parts: - # - # http://jschmoe:xyzzy@www.bogus.net:8000/foo/bar.tml?q=foo#changes - # - # The "http" is the protocol, the user is "jschmoe", the password is - # "xyzzy", the host is "www.bogus.net", the port is "8000", the path is - # "/foo/bar.tml", the query is "q=foo", and the fragment is "changes". - # - # Note that the RE actually combines the user and password parts, as - # recommended in RFC 3986. Indeed, that RFC states that putting passwords - # in URLs is a Really Bad Idea, something with which I would agree utterly. - # - # From a validation perspective, we need to ensure that the parts of the - # URL that are going to the server are correctly encoded. This is only - # done if $state(-strict) is true (inherited from $::http::strict). - - set URLmatcher {(?x) # this is _expanded_ syntax - ^ - (?: (\w+) : ) ? # - (?: // - (?: - ( - [^@/\#?]+ # - ) @ - )? - ( # - [^/:\#?]+ | # host name or IPv4 address - \[ [^/\#?]+ \] # IPv6 address in square brackets - ) - (?: : (\d+) )? # - )? - ( [/\?] [^\#]*)? # (including query) - (?: \# (.*) )? # - $ - } - - # Phase one: parse - if {![regexp -- $URLmatcher $url -> proto user host port srvurl]} { - unset $token - return -code error "Unsupported URL: $url" - } - # Phase two: validate - set host [string trim $host {[]}]; # strip square brackets from IPv6 address - if {$host eq ""} { - # Caller has to provide a host name; we do not have a "default host" - # that would enable us to handle relative URLs. - unset $token - return -code error "Missing host part: $url" - # Note that we don't check the hostname for validity here; if it's - # invalid, we'll simply fail to resolve it later on. - } - if {$port ne "" && $port > 65535} { - unset $token - return -code error "Invalid port number: $port" - } - # The user identification and resource identification parts of the URL can - # have encoded characters in them; take care! - if {$user ne ""} { - # Check for validity according to RFC 3986, Appendix A - set validityRE {(?xi) - ^ - (?: [-\w.~!$&'()*+,;=:] | %[0-9a-f][0-9a-f] )+ - $ - } - if {$state(-strict) && ![regexp -- $validityRE $user]} { - unset $token - # Provide a better error message in this error case - if {[regexp {(?i)%(?![0-9a-f][0-9a-f]).?.?} $user bad]} { - return -code error \ - "Illegal encoding character usage \"$bad\" in URL user" - } - return -code error "Illegal characters in URL user" - } - } - if {$srvurl ne ""} { - # RFC 3986 allows empty paths (not even a /), but servers - # return 400 if the path in the HTTP request doesn't start - # with / , so add it here if needed. - if {[string index $srvurl 0] ne "/"} { - set srvurl /$srvurl - } - # Check for validity according to RFC 3986, Appendix A - set validityRE {(?xi) - ^ - # Path part (already must start with / character) - (?: [-\w.~!$&'()*+,;=:@/] | %[0-9a-f][0-9a-f] )* - # Query part (optional, permits ? characters) - (?: \? (?: [-\w.~!$&'()*+,;=:@/?] | %[0-9a-f][0-9a-f] )* )? - $ - } - if {$state(-strict) && ![regexp -- $validityRE $srvurl]} { - unset $token - # Provide a better error message in this error case - if {[regexp {(?i)%(?![0-9a-f][0-9a-f])..} $srvurl bad]} { - return -code error \ - "Illegal encoding character usage \"$bad\" in URL path" - } - return -code error "Illegal characters in URL path" - } - } else { - set srvurl / - } - if {$proto eq ""} { - set proto http - } - set lower [string tolower $proto] - if {![info exists urlTypes($lower)]} { - unset $token - return -code error "Unsupported URL type \"$proto\"" - } - set defport [lindex $urlTypes($lower) 0] - set defcmd [lindex $urlTypes($lower) 1] - - if {$port eq ""} { - set port $defport - } - if {![catch {$http(-proxyfilter) $host} proxy]} { - set phost [lindex $proxy 0] - set pport [lindex $proxy 1] - } - - # OK, now reassemble into a full URL - set url ${proto}:// - if {$user ne ""} { - append url $user - append url @ - } - append url $host - if {$port != $defport} { - append url : $port - } - append url $srvurl - # Don't append the fragment! - set state(url) $url - - set sockopts [list -async] - - # If we are using the proxy, we must pass in the full URL that includes - # the server name. - - if {[info exists phost] && ($phost ne "")} { - set srvurl $url - set targetAddr [list $phost $pport] - } else { - set targetAddr [list $host $port] - } - # Proxy connections aren't shared among different hosts. - set state(socketinfo) $host:$port - - # Save the accept types at this point to prevent a race condition. [Bug - # c11a51c482] - set state(accept-types) $http(-accept) - - if {$isQuery || $isQueryChannel} { - # It's a POST. - # A client wishing to send a non-idempotent request SHOULD wait to send - # that request until it has received the response status for the - # previous request. - if {$http(-postfresh)} { - # Override -keepalive for a POST. Use a new connection, and thus - # avoid the small risk of a race against server timeout. - set state(-keepalive) 0 - } else { - # Allow -keepalive but do not -pipeline - wait for the previous - # transaction to finish. - # There is a small risk of a race against server timeout. - set state(-pipeline) 0 - } - } else { - # It's a GET or HEAD. - set state(-pipeline) $http(-pipeline) - } - - # See if we are supposed to use a previously opened channel. - # - In principle, ANY call to http::geturl could use a previously opened - # channel if it is available - the "Connection: keep-alive" header is a - # request to leave the channel open AFTER completion of this call. - # - In fact, we try to use an existing channel only if -keepalive 1 -- this - # means that at most one channel is left open for each value of - # $state(socketinfo). This property simplifies the mapping of open - # channels. - set reusing 0 - set alreadyQueued 0 - if {$state(-keepalive)} { - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - if {[info exists socketMapping($state(socketinfo))]} { - # - If the connection is idle, it has a "fileevent readable" binding - # to http::CheckEof, in case the server times out and half-closes - # the socket (http::CheckEof closes the other half). - # - We leave this binding in place until just before the last - # puts+flush in http::Connected (GET/HEAD) or http::Write (POST), - # after which the HTTP response might be generated. - - if { [info exists socketClosing($state(socketinfo))] - && $socketClosing($state(socketinfo)) - } { - # socketClosing(*) is set because the server has sent a - # "Connection: close" header. - # Do not use the persistent socket again. - # Since we have only one persistent socket per server, and the - # old socket is not yet dead, add the request to the write queue - # of the dying socket, which will be replayed by ReplayIfClose. - # Also add it to socketWrQueue(*) which is used only if an error - # causes a call to Finish. - set reusing 1 - set sock $socketMapping($state(socketinfo)) - Log "reusing socket $sock for $state(socketinfo) - token $token" - - set alreadyQueued 1 - lassign $socketPlayCmd($state(socketinfo)) com0 com1 com2 com3 - lappend com3 $token - set socketPlayCmd($state(socketinfo)) [list $com0 $com1 $com2 $com3] - lappend socketWrQueue($state(socketinfo)) $token - } elseif {[catch {fconfigure $socketMapping($state(socketinfo))}]} { - # FIXME Is it still possible for this code to be executed? If - # so, this could be another place to call TestForReplay, - # rather than discarding the queued transactions. - Log "WARNING: socket for $state(socketinfo) was closed\ - - token $token" - Log "WARNING - if testing, pay special attention to this\ - case (GH) which is seldom executed - token $token" - - # This will call CancelReadPipeline, CancelWritePipeline, and - # cancel any queued requests, responses. - Unset $state(socketinfo) - } else { - # Use the persistent socket. - # The socket may not be ready to write: an earlier request might - # still be still writing (in the pipelined case) or - # writing/reading (in the nonpipeline case). This possibility - # is handled by socketWrQueue later in this command. - set reusing 1 - set sock $socketMapping($state(socketinfo)) - Log "reusing socket $sock for $state(socketinfo) - token $token" - - } - # Do not automatically close the connection socket. - set state(connection) {} - } - } - - if {$reusing} { - # Define state(tmpState) and state(tmpOpenCmd) for use - # by http::ReplayIfDead if the persistent connection has died. - set state(tmpState) [array get state] - - # Pass -myaddr directly to the socket command - if {[info exists state(-myaddr)]} { - lappend sockopts -myaddr $state(-myaddr) - } - - set state(tmpOpenCmd) [list {*}$defcmd {*}$sockopts {*}$targetAddr] - } - - set state(reusing) $reusing - # Excluding ReplayIfDead and the decision whether to call it, there are four - # places outside http::geturl where state(reusing) is used: - # - Connected - if reusing and not pipelined, start the state(-timeout) - # timeout (when writing). - # - DoneRequest - if reusing and pipelined, send the next pipelined write - # - Event - if reusing and pipelined, start the state(-timeout) - # timeout (when reading). - # - Event - if (not reusing) and pipelined, send the next pipelined - # write - - # See comments above re the start of this timeout in other cases. - if {(!$state(reusing)) && ($state(-timeout) > 0)} { - set state(after) [after $state(-timeout) \ - [list http::reset $token timeout]] - } - - if {![info exists sock]} { - # Pass -myaddr directly to the socket command - if {[info exists state(-myaddr)]} { - lappend sockopts -myaddr $state(-myaddr) - } - set pre [clock milliseconds] - ##Log pre socket opened, - token $token - ##Log [concat $defcmd $sockopts $targetAddr] - token $token - if {[catch {eval $defcmd $sockopts $targetAddr} sock errdict]} { - # Something went wrong while trying to establish the connection. - # Clean up after events and such, but DON'T call the command - # callback (if available) because we're going to throw an - # exception from here instead. - - set state(sock) NONE - Finish $token $sock 1 - cleanup $token - dict unset errdict -level - return -options $errdict $sock - } else { - # Initialisation of a new socket. - ##Log post socket opened, - token $token - ##Log socket opened, now fconfigure - token $token - set delay [expr {[clock milliseconds] - $pre}] - if {$delay > 3000} { - Log socket delay $delay - token $token - } - fconfigure $sock -translation {auto crlf} \ - -buffersize $state(-blocksize) - ##Log socket opened, DONE fconfigure - token $token - } - } - # Command [socket] is called with -async, but takes 5s to 5.1s to return, - # with probability of order 1 in 10,000. This may be a bizarre scheduling - # issue with my (KJN's) system (Fedora Linux). - # This does not cause a problem (unless the request times out when this - # command returns). - - set state(sock) $sock - Log "Using $sock for $state(socketinfo) - token $token" \ - [expr {$state(-keepalive)?"keepalive":""}] - - if { $state(-keepalive) - && (![info exists socketMapping($state(socketinfo))]) - } { - # Freshly-opened socket that we would like to become persistent. - set socketMapping($state(socketinfo)) $sock - - if {![info exists socketRdState($state(socketinfo))]} { - set socketRdState($state(socketinfo)) {} - set varName ::http::socketRdState($state(socketinfo)) - trace add variable $varName unset ::http::CancelReadPipeline - } - if {![info exists socketWrState($state(socketinfo))]} { - set socketWrState($state(socketinfo)) {} - set varName ::http::socketWrState($state(socketinfo)) - trace add variable $varName unset ::http::CancelWritePipeline - } - - if {$state(-pipeline)} { - #Log new, init for pipelined, GRANT write access to $token in geturl - # Also grant premature read access to the socket. This is OK. - set socketRdState($state(socketinfo)) $token - set socketWrState($state(socketinfo)) $token - } else { - # socketWrState is not used by this non-pipelined transaction. - # We cannot leave it as "Wready" because the next call to - # http::geturl with a pipelined transaction would conclude that the - # socket is available for writing. - #Log new, init for nonpipeline, GRANT r/w access to $token in geturl - set socketRdState($state(socketinfo)) $token - set socketWrState($state(socketinfo)) $token - } - - set socketRdQueue($state(socketinfo)) {} - set socketWrQueue($state(socketinfo)) {} - set socketClosing($state(socketinfo)) 0 - set socketPlayCmd($state(socketinfo)) {ReplayIfClose Wready {} {}} - } - - if {![info exists phost]} { - set phost "" - } - if {$reusing} { - # For use by http::ReplayIfDead if the persistent connection has died. - # Also used by NextPipelinedWrite. - set state(tmpConnArgs) [list $proto $phost $srvurl] - } - - # The element socketWrState($connId) has a value which is either the name of - # the token that is permitted to write to the socket, or "Wready" if no - # token is permitted to write. - # - # The code that sets the value to Wready immediately calls - # http::NextPipelinedWrite, which examines socketWrQueue($connId) and - # processes the next request in the queue, if there is one. The value - # Wready is not found when the interpreter is in the event loop unless the - # socket is idle. - # - # The element socketRdState($connId) has a value which is either the name of - # the token that is permitted to read from the socket, or "Rready" if no - # token is permitted to read. - # - # The code that sets the value to Rready then examines - # socketRdQueue($connId) and processes the next request in the queue, if - # there is one. The value Rready is not found when the interpreter is in - # the event loop unless the socket is idle. - - if {$alreadyQueued} { - # A write may or may not be in progress. There is no need to set - # socketWrState to prevent another call stealing write access - all - # subsequent calls on this socket will come here because the socket - # will close after the current read, and its - # socketClosing($connId) is 1. - ##Log "HTTP request for token $token is queued" - - } elseif { $reusing - && $state(-pipeline) - && ($socketWrState($state(socketinfo)) ne "Wready") - } { - ##Log "HTTP request for token $token is queued for pipelined use" - lappend socketWrQueue($state(socketinfo)) $token - - } elseif { $reusing - && (!$state(-pipeline)) - && ($socketWrState($state(socketinfo)) ne "Wready") - } { - # A write is queued or in progress. Lappend to the write queue. - ##Log "HTTP request for token $token is queued for nonpipeline use" - lappend socketWrQueue($state(socketinfo)) $token - - } elseif { $reusing - && (!$state(-pipeline)) - && ($socketWrState($state(socketinfo)) eq "Wready") - && ($socketRdState($state(socketinfo)) ne "Rready") - } { - # A read is queued or in progress, but not a write. Cannot start the - # nonpipeline transaction, but must set socketWrState to prevent a - # pipelined request jumping the queue. - ##Log "HTTP request for token $token is queued for nonpipeline use" - #Log re-use nonpipeline, GRANT delayed write access to $token in geturl - - set socketWrState($state(socketinfo)) peNding - lappend socketWrQueue($state(socketinfo)) $token - - } else { - if {$reusing && $state(-pipeline)} { - #Log re-use pipelined, GRANT write access to $token in geturl - set socketWrState($state(socketinfo)) $token - - } elseif {$reusing} { - # Cf tests above - both are ready. - #Log re-use nonpipeline, GRANT r/w access to $token in geturl - set socketRdState($state(socketinfo)) $token - set socketWrState($state(socketinfo)) $token - } - - # All (!$reusing) cases come here, and also some $reusing cases if the - # connection is ready. - #Log ---- $state(socketinfo) << conn to $token for HTTP request (a) - # Connect does its own fconfigure. - fileevent $sock writable \ - [list http::Connect $token $proto $phost $srvurl] - } - - # Wait for the connection to complete. - if {![info exists state(-command)]} { - # geturl does EVERYTHING asynchronously, so if the user - # calls it synchronously, we just do a wait here. - http::wait $token - - if {![info exists state]} { - # If we timed out then Finish has been called and the users - # command callback may have cleaned up the token. If so we end up - # here with nothing left to do. - return $token - } elseif {$state(status) eq "error"} { - # Something went wrong while trying to establish the connection. - # Clean up after events and such, but DON'T call the command - # callback (if available) because we're going to throw an - # exception from here instead. - set err [lindex $state(error) 0] - cleanup $token - return -code error $err - } - } - ##Log Leaving http::geturl - token $token - return $token -} - -# http::Connected -- -# -# Callback used when the connection to the HTTP server is actually -# established. -# -# Arguments: -# token State token. -# proto What protocol (http, https, etc.) was used to connect. -# phost Are we using keep-alive? Non-empty if yes. -# srvurl Service-local URL that we're requesting -# Results: -# None. - -proc http::Connected {token proto phost srvurl} { - variable http - variable urlTypes - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - variable $token - upvar 0 $token state - set tk [namespace tail $token] - - if {$state(reusing) && (!$state(-pipeline)) && ($state(-timeout) > 0)} { - set state(after) [after $state(-timeout) \ - [list http::reset $token timeout]] - } - - # Set back the variables needed here. - set sock $state(sock) - set isQueryChannel [info exists state(-querychannel)] - set isQuery [info exists state(-query)] - set host [lindex [split $state(socketinfo) :] 0] - set port [lindex [split $state(socketinfo) :] 1] - - set lower [string tolower $proto] - set defport [lindex $urlTypes($lower) 0] - - # Send data in cr-lf format, but accept any line terminators. - # Initialisation to {auto *} now done in geturl, KeepSocket and DoneRequest. - # We are concerned here with the request (write) not the response (read). - lassign [fconfigure $sock -translation] trRead trWrite - fconfigure $sock -translation [list $trRead crlf] \ - -buffersize $state(-blocksize) - - # The following is disallowed in safe interpreters, but the socket is - # already in non-blocking mode in that case. - - catch {fconfigure $sock -blocking off} - set how GET - if {$isQuery} { - set state(querylength) [string length $state(-query)] - if {$state(querylength) > 0} { - set how POST - set contDone 0 - } else { - # There's no query data. - unset state(-query) - set isQuery 0 - } - } elseif {$state(-validate)} { - set how HEAD - } elseif {$isQueryChannel} { - set how POST - # The query channel must be blocking for the async Write to - # work properly. - lassign [fconfigure $sock -translation] trRead trWrite - fconfigure $state(-querychannel) -blocking 1 \ - -translation [list $trRead binary] - set contDone 0 - } - if {[info exists state(-method)] && ($state(-method) ne "")} { - set how $state(-method) - } - # We cannot handle chunked encodings with -handler, so force HTTP/1.0 - # until we can manage this. - if {[info exists state(-handler)]} { - set state(-protocol) 1.0 - } - set accept_types_seen 0 - - Log ^B$tk begin sending request - token $token - - if {[catch { - set state(method) $how - puts $sock "$how $srvurl HTTP/$state(-protocol)" - if {[dict exists $state(-headers) Host]} { - # Allow Host spoofing. [Bug 928154] - puts $sock "Host: [dict get $state(-headers) Host]" - } elseif {$port == $defport} { - # Don't add port in this case, to handle broken servers. [Bug - # #504508] - puts $sock "Host: $host" - } else { - puts $sock "Host: $host:$port" - } - puts $sock "User-Agent: $http(-useragent)" - if {($state(-protocol) >= 1.0) && $state(-keepalive)} { - # Send this header, because a 1.1 server is not compelled to treat - # this as the default. - puts $sock "Connection: keep-alive" - } - if {($state(-protocol) > 1.0) && !$state(-keepalive)} { - puts $sock "Connection: close" ;# RFC2616 sec 8.1.2.1 - } - if {[info exists phost] && ($phost ne "") && $state(-keepalive)} { - puts $sock "Proxy-Connection: Keep-Alive" - } - set accept_encoding_seen 0 - set content_type_seen 0 - dict for {key value} $state(-headers) { - set value [string map [list \n "" \r ""] $value] - set key [string map {" " -} [string trim $key]] - if {[string equal -nocase $key "host"]} { - continue - } - if {[string equal -nocase $key "accept-encoding"]} { - set accept_encoding_seen 1 - } - if {[string equal -nocase $key "accept"]} { - set accept_types_seen 1 - } - if {[string equal -nocase $key "content-type"]} { - set content_type_seen 1 - } - if {[string equal -nocase $key "content-length"]} { - set contDone 1 - set state(querylength) $value - } - if {[string length $key]} { - puts $sock "$key: $value" - } - } - # Allow overriding the Accept header on a per-connection basis. Useful - # for working with REST services. [Bug c11a51c482] - if {!$accept_types_seen} { - puts $sock "Accept: $state(accept-types)" - } - if { (!$accept_encoding_seen) - && (![info exists state(-handler)]) - && $http(-zip) - } { - puts $sock "Accept-Encoding: gzip,deflate,compress" - } - if {$isQueryChannel && ($state(querylength) == 0)} { - # Try to determine size of data in channel. If we cannot seek, the - # surrounding catch will trap us - - set start [tell $state(-querychannel)] - seek $state(-querychannel) 0 end - set state(querylength) \ - [expr {[tell $state(-querychannel)] - $start}] - seek $state(-querychannel) $start - } - - # Flush the request header and set up the fileevent that will either - # push the POST data or read the response. - # - # fileevent note: - # - # It is possible to have both the read and write fileevents active at - # this point. The only scenario it seems to affect is a server that - # closes the connection without reading the POST data. (e.g., early - # versions TclHttpd in various error cases). Depending on the - # platform, the client may or may not be able to get the response from - # the server because of the error it will get trying to write the post - # data. Having both fileevents active changes the timing and the - # behavior, but no two platforms (among Solaris, Linux, and NT) behave - # the same, and none behave all that well in any case. Servers should - # always read their POST data if they expect the client to read their - # response. - - if {$isQuery || $isQueryChannel} { - # POST method. - if {!$content_type_seen} { - puts $sock "Content-Type: $state(-type)" - } - if {!$contDone} { - puts $sock "Content-Length: $state(querylength)" - } - puts $sock "" - flush $sock - # Flush flushes the error in the https case with a bad handshake: - # else the socket never becomes writable again, and hangs until - # timeout (if any). - - lassign [fconfigure $sock -translation] trRead trWrite - fconfigure $sock -translation [list $trRead binary] - fileevent $sock writable [list http::Write $token] - # The http::Write command decides when to make the socket readable, - # using the same test as the GET/HEAD case below. - } else { - # GET or HEAD method. - if { (![catch {fileevent $sock readable} binding]) - && ($binding eq [list http::CheckEof $sock]) - } { - # Remove the "fileevent readable" binding of an idle persistent - # socket to http::CheckEof. We can no longer treat bytes - # received as junk. The server might still time out and - # half-close the socket if it has not yet received the first - # "puts". - fileevent $sock readable {} - } - puts $sock "" - flush $sock - Log ^C$tk end sending request - token $token - # End of writing (GET/HEAD methods). The request has been sent. - - DoneRequest $token - } - - } err]} { - # The socket probably was never connected, OR the connection dropped - # later, OR https handshake error, which may be discovered as late as - # the "flush" command above... - Log "WARNING - if testing, pay special attention to this\ - case (GI) which is seldom executed - token $token" - if {[info exists state(reusing)] && $state(reusing)} { - # The socket was closed at the server end, and closed at - # this end by http::CheckEof. - if {[TestForReplay $token write $err a]} { - return - } else { - Finish $token {failed to re-use socket} - } - - # else: - # This is NOT a persistent socket that has been closed since its - # last use. - # If any other requests are in flight or pipelined/queued, they will - # be discarded. - } elseif {$state(status) eq ""} { - # ...https handshake errors come here. - set msg [registerError $sock] - registerError $sock {} - if {$msg eq {}} { - set msg {failed to use socket} - } - Finish $token $msg - } elseif {$state(status) ne "error"} { - Finish $token $err - } - } -} - -# http::registerError -# -# Called (for example when processing TclTLS activity) to register -# an error for a connection on a specific socket. This helps -# http::Connected to deliver meaningful error messages, e.g. when a TLS -# certificate fails verification. -# -# Usage: http::registerError socket ?newValue? -# -# "set" semantics, except that a "get" (a call without a new value) for a -# non-existent socket returns {}, not an error. - -proc http::registerError {sock args} { - variable registeredErrors - - if { ([llength $args] == 0) - && (![info exists registeredErrors($sock)]) - } { - return - } elseif { ([llength $args] == 1) - && ([lindex $args 0] eq {}) - } { - unset -nocomplain registeredErrors($sock) - return - } - set registeredErrors($sock) {*}$args -} - -# http::DoneRequest -- -# -# Command called when a request has been sent. It will arrange the -# next request and/or response as appropriate. -# -# If this command is called when $socketClosing(*), the request $token -# that calls it must be pipelined and destined to fail. - -proc http::DoneRequest {token} { - variable http - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - variable $token - upvar 0 $token state - set tk [namespace tail $token] - set sock $state(sock) - - # If pipelined, connect the next HTTP request to the socket. - if {$state(reusing) && $state(-pipeline)} { - # Enable next token (if any) to write. - # The value "Wready" is set only here, and - # in http::Event after reading the response-headers of a - # non-reusing transaction. - # Previous value is $token. It cannot be pending. - set socketWrState($state(socketinfo)) Wready - - # Now ready to write the next pipelined request (if any). - http::NextPipelinedWrite $token - } else { - # If pipelined, this is the first transaction on this socket. We wait - # for the response headers to discover whether the connection is - # persistent. (If this is not done and the connection is not - # persistent, we SHOULD retry and then MUST NOT pipeline before knowing - # that we have a persistent connection - # (rfc2616 8.1.2.2)). - } - - # Connect to receive the response, unless the socket is pipelined - # and another response is being sent. - # This code block is separate from the code below because there are - # cases where socketRdState already has the value $token. - if { $state(-keepalive) - && $state(-pipeline) - && [info exists socketRdState($state(socketinfo))] - && ($socketRdState($state(socketinfo)) eq "Rready") - } { - #Log pipelined, GRANT read access to $token in Connected - set socketRdState($state(socketinfo)) $token - } - - if { $state(-keepalive) - && $state(-pipeline) - && [info exists socketRdState($state(socketinfo))] - && ($socketRdState($state(socketinfo)) ne $token) - } { - # Do not read from the socket until it is ready. - ##Log "HTTP response for token $token is queued for pipelined use" - # If $socketClosing(*), then the caller will be a pipelined write and - # execution will come here. - # This token has already been recorded as "in flight" for writing. - # When the socket is closed, the read queue will be cleared in - # CloseQueuedQueries and so the "lappend" here has no effect. - lappend socketRdQueue($state(socketinfo)) $token - } else { - # In the pipelined case, connection for reading depends on the - # value of socketRdState. - # In the nonpipeline case, connection for reading always occurs. - ReceiveResponse $token - } -} - -# http::ReceiveResponse -# -# Connects token to its socket for reading. - -proc http::ReceiveResponse {token} { - variable $token - upvar 0 $token state - set tk [namespace tail $token] - set sock $state(sock) - - #Log ---- $state(socketinfo) >> conn to $token for HTTP response - lassign [fconfigure $sock -translation] trRead trWrite - fconfigure $sock -translation [list auto $trWrite] \ - -buffersize $state(-blocksize) - Log ^D$tk begin receiving response - token $token - - coroutine ${token}EventCoroutine http::Event $sock $token - fileevent $sock readable ${token}EventCoroutine -} - -# http::NextPipelinedWrite -# -# - Connecting a socket to a token for writing is done by this command and by -# command KeepSocket. -# - If another request has a pipelined write scheduled for $token's socket, -# and if the socket is ready to accept it, connect the write and update -# the queue accordingly. -# - This command is called from http::DoneRequest and http::Event, -# IF $state(-pipeline) AND (the current transfer has reached the point at -# which the socket is ready for the next request to be written). -# - This command is called when a token has write access and is pipelined and -# keep-alive, and sets socketWrState to Wready. -# - The command need not consider the case where socketWrState is set to a token -# that does not yet have write access. Such a token is waiting for Rready, -# and the assignment of the connection to the token will be done elsewhere (in -# http::KeepSocket). -# - This command cannot be called after socketWrState has been set to a -# "pending" token value (that is then overwritten by the caller), because that -# value is set by this command when it is called by an earlier token when it -# relinquishes its write access, and the pending token is always the next in -# line to write. - -proc http::NextPipelinedWrite {token} { - variable http - variable socketRdState - variable socketWrState - variable socketWrQueue - variable socketClosing - variable $token - upvar 0 $token state - set connId $state(socketinfo) - - if { [info exists socketClosing($connId)] - && $socketClosing($connId) - } { - # socketClosing(*) is set because the server has sent a - # "Connection: close" header. - # Behave as if the queues are empty - so do nothing. - } elseif { $state(-pipeline) - && [info exists socketWrState($connId)] - && ($socketWrState($connId) eq "Wready") - - && [info exists socketWrQueue($connId)] - && [llength $socketWrQueue($connId)] - && ([set token2 [lindex $socketWrQueue($connId) 0] - set ${token2}(-pipeline) - ] - ) - } { - # - The usual case for a pipelined connection, ready for a new request. - #Log pipelined, GRANT write access to $token2 in NextPipelinedWrite - set conn [set ${token2}(tmpConnArgs)] - set socketWrState($connId) $token2 - set socketWrQueue($connId) [lrange $socketWrQueue($connId) 1 end] - # Connect does its own fconfigure. - fileevent $state(sock) writable [list http::Connect $token2 {*}$conn] - #Log ---- $connId << conn to $token2 for HTTP request (b) - - # In the tests below, the next request will be nonpipeline. - } elseif { $state(-pipeline) - && [info exists socketWrState($connId)] - && ($socketWrState($connId) eq "Wready") - - && [info exists socketWrQueue($connId)] - && [llength $socketWrQueue($connId)] - && (![ set token3 [lindex $socketWrQueue($connId) 0] - set ${token3}(-pipeline) - ] - ) - - && [info exists socketRdState($connId)] - && ($socketRdState($connId) eq "Rready") - } { - # The case in which the next request will be non-pipelined, and the read - # and write queues is ready: which is the condition for a non-pipelined - # write. - variable $token3 - upvar 0 $token3 state3 - set conn [set ${token3}(tmpConnArgs)] - #Log nonpipeline, GRANT r/w access to $token3 in NextPipelinedWrite - set socketRdState($connId) $token3 - set socketWrState($connId) $token3 - set socketWrQueue($connId) [lrange $socketWrQueue($connId) 1 end] - # Connect does its own fconfigure. - fileevent $state(sock) writable [list http::Connect $token3 {*}$conn] - #Log ---- $state(sock) << conn to $token3 for HTTP request (c) - - } elseif { $state(-pipeline) - && [info exists socketWrState($connId)] - && ($socketWrState($connId) eq "Wready") - - && [info exists socketWrQueue($connId)] - && [llength $socketWrQueue($connId)] - && (![set token2 [lindex $socketWrQueue($connId) 0] - set ${token2}(-pipeline) - ] - ) - } { - # - The case in which the next request will be non-pipelined, but the - # read queue is NOT ready. - # - A read is queued or in progress, but not a write. Cannot start the - # nonpipeline transaction, but must set socketWrState to prevent a new - # pipelined request (in http::geturl) jumping the queue. - # - Because socketWrState($connId) is not set to Wready, the assignment - # of the connection to $token2 will be done elsewhere - by command - # http::KeepSocket when $socketRdState($connId) is set to "Rready". - - #Log re-use nonpipeline, GRANT delayed write access to $token in NextP.. - set socketWrState($connId) peNding - } -} - -# http::CancelReadPipeline -# -# Cancel pipelined responses on a closing "Keep-Alive" socket. -# -# - Called by a variable trace on "unset socketRdState($connId)". -# - The variable relates to a Keep-Alive socket, which has been closed. -# - Cancels all pipelined responses. The requests have been sent, -# the responses have not yet been received. -# - This is a hard cancel that ends each transaction with error status, -# and closes the connection. Do not use it if you want to replay failed -# transactions. -# - N.B. Always delete ::http::socketRdState($connId) before deleting -# ::http::socketRdQueue($connId), or this command will do nothing. -# -# Arguments -# As for a trace command on a variable. - -proc http::CancelReadPipeline {name1 connId op} { - variable socketRdQueue - ##Log CancelReadPipeline $name1 $connId $op - if {[info exists socketRdQueue($connId)]} { - set msg {the connection was closed by CancelReadPipeline} - foreach token $socketRdQueue($connId) { - set tk [namespace tail $token] - Log ^X$tk end of response "($msg)" - token $token - set ${token}(status) eof - Finish $token ;#$msg - } - set socketRdQueue($connId) {} - } -} - -# http::CancelWritePipeline -# -# Cancel queued events on a closing "Keep-Alive" socket. -# -# - Called by a variable trace on "unset socketWrState($connId)". -# - The variable relates to a Keep-Alive socket, which has been closed. -# - In pipelined or nonpipeline case: cancels all queued requests. The -# requests have not yet been sent, the responses are not due. -# - This is a hard cancel that ends each transaction with error status, -# and closes the connection. Do not use it if you want to replay failed -# transactions. -# - N.B. Always delete ::http::socketWrState($connId) before deleting -# ::http::socketWrQueue($connId), or this command will do nothing. -# -# Arguments -# As for a trace command on a variable. - -proc http::CancelWritePipeline {name1 connId op} { - variable socketWrQueue - - ##Log CancelWritePipeline $name1 $connId $op - if {[info exists socketWrQueue($connId)]} { - set msg {the connection was closed by CancelWritePipeline} - foreach token $socketWrQueue($connId) { - set tk [namespace tail $token] - Log ^X$tk end of response "($msg)" - token $token - set ${token}(status) eof - Finish $token ;#$msg - } - set socketWrQueue($connId) {} - } -} - -# http::ReplayIfDead -- -# -# - A query on a re-used persistent socket failed at the earliest opportunity, -# because the socket had been closed by the server. Keep the token, tidy up, -# and try to connect on a fresh socket. -# - The connection is monitored for eof by the command http::CheckEof. Thus -# http::ReplayIfDead is needed only when a server event (half-closing an -# apparently idle connection), and a client event (sending a request) occur at -# almost the same time, and neither client nor server detects the other's -# action before performing its own (an "asynchronous close event"). -# - To simplify testing of http::ReplayIfDead, set TEST_EOF 1 in -# http::KeepSocket, and then http::ReplayIfDead will be called if http::geturl -# is called at any time after the server timeout. -# -# Arguments: -# token Connection token. -# -# Side Effects: -# Use the same token, but try to open a new socket. - -proc http::ReplayIfDead {tokenArg doing} { - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - variable $tokenArg - upvar 0 $tokenArg stateArg - - Log running http::ReplayIfDead for $tokenArg $doing - - # 1. Merge the tokens for transactions in flight, the read (response) queue, - # and the write (request) queue. - - set InFlightR {} - set InFlightW {} - - # Obtain the tokens for transactions in flight. - if {$stateArg(-pipeline)} { - # Two transactions may be in flight. The "read" transaction was first. - # It is unlikely that the server would close the socket if a response - # was pending; however, an earlier request (as well as the present - # request) may have been sent and ignored if the socket was half-closed - # by the server. - - if { [info exists socketRdState($stateArg(socketinfo))] - && ($socketRdState($stateArg(socketinfo)) ne "Rready") - } { - lappend InFlightR $socketRdState($stateArg(socketinfo)) - } elseif {($doing eq "read")} { - lappend InFlightR $tokenArg - } - - if { [info exists socketWrState($stateArg(socketinfo))] - && $socketWrState($stateArg(socketinfo)) ni {Wready peNding} - } { - lappend InFlightW $socketWrState($stateArg(socketinfo)) - } elseif {($doing eq "write")} { - lappend InFlightW $tokenArg - } - - # Report any inconsistency of $tokenArg with socket*state. - if { ($doing eq "read") - && [info exists socketRdState($stateArg(socketinfo))] - && ($tokenArg ne $socketRdState($stateArg(socketinfo))) - } { - Log WARNING - ReplayIfDead pipelined tokenArg $tokenArg $doing \ - ne socketRdState($stateArg(socketinfo)) \ - $socketRdState($stateArg(socketinfo)) - - } elseif { - ($doing eq "write") - && [info exists socketWrState($stateArg(socketinfo))] - && ($tokenArg ne $socketWrState($stateArg(socketinfo))) - } { - Log WARNING - ReplayIfDead pipelined tokenArg $tokenArg $doing \ - ne socketWrState($stateArg(socketinfo)) \ - $socketWrState($stateArg(socketinfo)) - } - } else { - # One transaction should be in flight. - # socketRdState, socketWrQueue are used. - # socketRdQueue should be empty. - - # Report any inconsistency of $tokenArg with socket*state. - if {$tokenArg ne $socketRdState($stateArg(socketinfo))} { - Log WARNING - ReplayIfDead nonpipeline tokenArg $tokenArg $doing \ - ne socketRdState($stateArg(socketinfo)) \ - $socketRdState($stateArg(socketinfo)) - } - - # Report the inconsistency that socketRdQueue is non-empty. - if { [info exists socketRdQueue($stateArg(socketinfo))] - && ($socketRdQueue($stateArg(socketinfo)) ne {}) - } { - Log WARNING - ReplayIfDead nonpipeline tokenArg $tokenArg $doing \ - has read queue socketRdQueue($stateArg(socketinfo)) \ - $socketRdQueue($stateArg(socketinfo)) ne {} - } - - lappend InFlightW $socketRdState($stateArg(socketinfo)) - set socketRdQueue($stateArg(socketinfo)) {} - } - - set newQueue {} - lappend newQueue {*}$InFlightR - lappend newQueue {*}$socketRdQueue($stateArg(socketinfo)) - lappend newQueue {*}$InFlightW - lappend newQueue {*}$socketWrQueue($stateArg(socketinfo)) - - - # 2. Tidy up tokenArg. This is a cut-down form of Finish/CloseSocket. - # Do not change state(status). - # No need to after cancel stateArg(after) - either this is done in - # ReplayCore/ReInit, or Finish is called. - - catch {close $stateArg(sock)} - - # 2a. Tidy the tokens in the queues - this is done in ReplayCore/ReInit. - # - Transactions, if any, that are awaiting responses cannot be completed. - # They are listed for re-sending in newQueue. - # - All tokens are preserved for re-use by ReplayCore, and their variables - # will be re-initialised by calls to ReInit. - # - The relevant element of socketMapping, socketRdState, socketWrState, - # socketRdQueue, socketWrQueue, socketClosing, socketPlayCmd will be set - # to new values in ReplayCore. - - ReplayCore $newQueue -} - -# http::ReplayIfClose -- -# -# A request on a socket that was previously "Connection: keep-alive" has -# received a "Connection: close" response header. The server supplies -# that response correctly, but any later requests already queued on this -# connection will be lost when the socket closes. -# -# This command takes arguments that represent the socketWrState, -# socketRdQueue and socketWrQueue for this connection. The socketRdState -# is not needed because the server responds in full to the request that -# received the "Connection: close" response header. -# -# Existing request tokens $token (::http::$n) are preserved. The caller -# will be unaware that the request was processed this way. - -proc http::ReplayIfClose {Wstate Rqueue Wqueue} { - Log running http::ReplayIfClose for $Wstate $Rqueue $Wqueue - - if {$Wstate in $Rqueue || $Wstate in $Wqueue} { - Log WARNING duplicate token in http::ReplayIfClose - token $Wstate - set Wstate Wready - } - - # 1. Create newQueue - set InFlightW {} - if {$Wstate ni {Wready peNding}} { - lappend InFlightW $Wstate - } - - set newQueue {} - lappend newQueue {*}$Rqueue - lappend newQueue {*}$InFlightW - lappend newQueue {*}$Wqueue - - # 2. Cleanup - none needed, done by the caller. - - ReplayCore $newQueue -} - -# http::ReInit -- -# -# Command to restore a token's state to a condition that -# makes it ready to replay a request. -# -# Command http::geturl stores extra state in state(tmp*) so -# we don't need to do the argument processing again. -# -# The caller must: -# - Set state(reusing) and state(sock) to their new values after calling -# this command. -# - Unset state(tmpState), state(tmpOpenCmd) if future calls to ReplayCore -# or ReInit are inappropriate for this token. Typically only one retry -# is allowed. -# The caller may also unset state(tmpConnArgs) if this value (and the -# token) will be used immediately. The value is needed by tokens that -# will be stored in a queue. -# -# Arguments: -# token Connection token. -# -# Return Value: (boolean) true iff the re-initialisation was successful. - -proc http::ReInit {token} { - variable $token - upvar 0 $token state - - if {!( - [info exists state(tmpState)] - && [info exists state(tmpOpenCmd)] - && [info exists state(tmpConnArgs)] - ) - } { - Log FAILED in http::ReInit via ReplayCore - NO tmp vars for $token - return 0 - } - - if {[info exists state(after)]} { - after cancel $state(after) - unset state(after) - } - - # Don't alter state(status) - this would trigger http::wait if it is in use. - set tmpState $state(tmpState) - set tmpOpenCmd $state(tmpOpenCmd) - set tmpConnArgs $state(tmpConnArgs) - foreach name [array names state] { - if {$name ne "status"} { - unset state($name) - } - } - - # Don't alter state(status). - # Restore state(tmp*) - the caller may decide to unset them. - # Restore state(tmpConnArgs) which is needed for connection. - # state(tmpState), state(tmpOpenCmd) are needed only for retries. - - dict unset tmpState status - array set state $tmpState - set state(tmpState) $tmpState - set state(tmpOpenCmd) $tmpOpenCmd - set state(tmpConnArgs) $tmpConnArgs - - return 1 -} - -# http::ReplayCore -- -# -# Command to replay a list of requests, using existing connection tokens. -# -# Abstracted from http::geturl which stores extra state in state(tmp*) so -# we don't need to do the argument processing again. -# -# Arguments: -# newQueue List of connection tokens. -# -# Side Effects: -# Use existing tokens, but try to open a new socket. - -proc http::ReplayCore {newQueue} { - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - if {[llength $newQueue] == 0} { - # Nothing to do. - return - } - - ##Log running ReplayCore for {*}$newQueue - set newToken [lindex $newQueue 0] - set newQueue [lrange $newQueue 1 end] - - # 3. Use newToken, and restore its values of state(*). Do not restore - # elements tmp* - we try again only once. - - set token $newToken - variable $token - upvar 0 $token state - - if {![ReInit $token]} { - Log FAILED in http::ReplayCore - NO tmp vars - Finish $token {cannot send this request again} - return - } - - set tmpState $state(tmpState) - set tmpOpenCmd $state(tmpOpenCmd) - set tmpConnArgs $state(tmpConnArgs) - unset state(tmpState) - unset state(tmpOpenCmd) - unset state(tmpConnArgs) - - set state(reusing) 0 - - if {$state(-timeout) > 0} { - set resetCmd [list http::reset $token timeout] - set state(after) [after $state(-timeout) $resetCmd] - } - - set pre [clock milliseconds] - ##Log pre socket opened, - token $token - ##Log $tmpOpenCmd - token $token - # 4. Open a socket. - if {[catch {eval $tmpOpenCmd} sock]} { - # Something went wrong while trying to establish the connection. - Log FAILED - $sock - set state(sock) NONE - Finish $token $sock - return - } - ##Log post socket opened, - token $token - set delay [expr {[clock milliseconds] - $pre}] - if {$delay > 3000} { - Log socket delay $delay - token $token - } - # Command [socket] is called with -async, but takes 5s to 5.1s to return, - # with probability of order 1 in 10,000. This may be a bizarre scheduling - # issue with my (KJN's) system (Fedora Linux). - # This does not cause a problem (unless the request times out when this - # command returns). - - # 5. Configure the persistent socket data. - if {$state(-keepalive)} { - set socketMapping($state(socketinfo)) $sock - - if {![info exists socketRdState($state(socketinfo))]} { - set socketRdState($state(socketinfo)) {} - set varName ::http::socketRdState($state(socketinfo)) - trace add variable $varName unset ::http::CancelReadPipeline - } - - if {![info exists socketWrState($state(socketinfo))]} { - set socketWrState($state(socketinfo)) {} - set varName ::http::socketWrState($state(socketinfo)) - trace add variable $varName unset ::http::CancelWritePipeline - } - - if {$state(-pipeline)} { - #Log new, init for pipelined, GRANT write acc to $token ReplayCore - set socketRdState($state(socketinfo)) $token - set socketWrState($state(socketinfo)) $token - } else { - #Log new, init for nonpipeline, GRANT r/w acc to $token ReplayCore - set socketRdState($state(socketinfo)) $token - set socketWrState($state(socketinfo)) $token - } - - set socketRdQueue($state(socketinfo)) {} - set socketWrQueue($state(socketinfo)) $newQueue - set socketClosing($state(socketinfo)) 0 - set socketPlayCmd($state(socketinfo)) {ReplayIfClose Wready {} {}} - } - - ##Log pre newQueue ReInit, - token $token - # 6. Configure sockets in the queue. - foreach tok $newQueue { - if {[ReInit $tok]} { - set ${tok}(reusing) 1 - set ${tok}(sock) $sock - } else { - set ${tok}(reusing) 1 - set ${tok}(sock) NONE - Finish $token {cannot send this request again} - } - } - - # 7. Configure the socket for newToken to send a request. - set state(sock) $sock - Log "Using $sock for $state(socketinfo) - token $token" \ - [expr {$state(-keepalive)?"keepalive":""}] - - # Initialisation of a new socket. - ##Log socket opened, now fconfigure - token $token - fconfigure $sock -translation {auto crlf} -buffersize $state(-blocksize) - ##Log socket opened, DONE fconfigure - token $token - - # Connect does its own fconfigure. - fileevent $sock writable [list http::Connect $token {*}$tmpConnArgs] - #Log ---- $sock << conn to $token for HTTP request (e) -} - -# Data access functions: -# Data - the URL data -# Status - the transaction status: ok, reset, eof, timeout, error -# Code - the HTTP transaction code, e.g., 200 -# Size - the size of the URL data - -proc http::data {token} { - variable $token - upvar 0 $token state - return $state(body) -} -proc http::status {token} { - if {![info exists $token]} { - return "error" - } - variable $token - upvar 0 $token state - return $state(status) -} -proc http::code {token} { - variable $token - upvar 0 $token state - return $state(http) -} -proc http::ncode {token} { - variable $token - upvar 0 $token state - if {[regexp {[0-9]{3}} $state(http) numeric_code]} { - return $numeric_code - } else { - return $state(http) - } -} -proc http::size {token} { - variable $token - upvar 0 $token state - return $state(currentsize) -} -proc http::meta {token} { - variable $token - upvar 0 $token state - return $state(meta) -} -proc http::error {token} { - variable $token - upvar 0 $token state - if {[info exists state(error)]} { - return $state(error) - } - return "" -} - -# http::cleanup -# -# Garbage collect the state associated with a transaction -# -# Arguments -# token The token returned from http::geturl -# -# Side Effects -# unsets the state array - -proc http::cleanup {token} { - variable $token - upvar 0 $token state - if {[info commands ${token}EventCoroutine] ne {}} { - rename ${token}EventCoroutine {} - } - if {[info exists state(after)]} { - after cancel $state(after) - unset state(after) - } - if {[info exists state]} { - unset state - } -} - -# http::Connect -# -# This callback is made when an asyncronous connection completes. -# -# Arguments -# token The token returned from http::geturl -# -# Side Effects -# Sets the status of the connection, which unblocks -# the waiting geturl call - -proc http::Connect {token proto phost srvurl} { - variable $token - upvar 0 $token state - set tk [namespace tail $token] - set err "due to unexpected EOF" - if { - [eof $state(sock)] || - [set err [fconfigure $state(sock) -error]] ne "" - } { - Log "WARNING - if testing, pay special attention to this\ - case (GJ) which is seldom executed - token $token" - if {[info exists state(reusing)] && $state(reusing)} { - # The socket was closed at the server end, and closed at - # this end by http::CheckEof. - if {[TestForReplay $token write $err b]} { - return - } - - # else: - # This is NOT a persistent socket that has been closed since its - # last use. - # If any other requests are in flight or pipelined/queued, they will - # be discarded. - } - Finish $token "connect failed $err" - } else { - set state(state) connecting - fileevent $state(sock) writable {} - ::http::Connected $token $proto $phost $srvurl - } -} - -# http::Write -# -# Write POST query data to the socket -# -# Arguments -# token The token for the connection -# -# Side Effects -# Write the socket and handle callbacks. - -proc http::Write {token} { - variable http - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - variable $token - upvar 0 $token state - set tk [namespace tail $token] - set sock $state(sock) - - # Output a block. Tcl will buffer this if the socket blocks - set done 0 - if {[catch { - # Catch I/O errors on dead sockets - - if {[info exists state(-query)]} { - # Chop up large query strings so queryprogress callback can give - # smooth feedback. - if { $state(queryoffset) + $state(-queryblocksize) - >= $state(querylength) - } { - # This will be the last puts for the request-body. - if { (![catch {fileevent $sock readable} binding]) - && ($binding eq [list http::CheckEof $sock]) - } { - # Remove the "fileevent readable" binding of an idle - # persistent socket to http::CheckEof. We can no longer - # treat bytes received as junk. The server might still time - # out and half-close the socket if it has not yet received - # the first "puts". - fileevent $sock readable {} - } - } - puts -nonewline $sock \ - [string range $state(-query) $state(queryoffset) \ - [expr {$state(queryoffset) + $state(-queryblocksize) - 1}]] - incr state(queryoffset) $state(-queryblocksize) - if {$state(queryoffset) >= $state(querylength)} { - set state(queryoffset) $state(querylength) - set done 1 - } - } else { - # Copy blocks from the query channel - - set outStr [read $state(-querychannel) $state(-queryblocksize)] - if {[eof $state(-querychannel)]} { - # This will be the last puts for the request-body. - if { (![catch {fileevent $sock readable} binding]) - && ($binding eq [list http::CheckEof $sock]) - } { - # Remove the "fileevent readable" binding of an idle - # persistent socket to http::CheckEof. We can no longer - # treat bytes received as junk. The server might still time - # out and half-close the socket if it has not yet received - # the first "puts". - fileevent $sock readable {} - } - } - puts -nonewline $sock $outStr - incr state(queryoffset) [string length $outStr] - if {[eof $state(-querychannel)]} { - set done 1 - } - } - } err]} { - # Do not call Finish here, but instead let the read half of the socket - # process whatever server reply there is to get. - - set state(posterror) $err - set done 1 - } - - if {$done} { - catch {flush $sock} - fileevent $sock writable {} - Log ^C$tk end sending request - token $token - # End of writing (POST method). The request has been sent. - - DoneRequest $token - } - - # Callback to the client after we've completely handled everything. - - if {[string length $state(-queryprogress)]} { - eval $state(-queryprogress) \ - [list $token $state(querylength) $state(queryoffset)] - } -} - -# http::Event -# -# Handle input on the socket. This command is the core of -# the coroutine commands ${token}EventCoroutine that are -# bound to "fileevent $sock readable" and process input. -# -# Arguments -# sock The socket receiving input. -# token The token returned from http::geturl -# -# Side Effects -# Read the socket and handle callbacks. - -proc http::Event {sock token} { - variable http - variable socketMapping - variable socketRdState - variable socketWrState - variable socketRdQueue - variable socketWrQueue - variable socketClosing - variable socketPlayCmd - - variable $token - upvar 0 $token state - set tk [namespace tail $token] - while 1 { - yield - ##Log Event call - token $token - - if {![info exists state]} { - Log "Event $sock with invalid token '$token' - remote close?" - if {![eof $sock]} { - if {[set d [read $sock]] ne ""} { - Log "WARNING: additional data left on closed socket\ - - token $token" - } - } - Log ^X$tk end of response (token error) - token $token - CloseSocket $sock - return - } - if {$state(state) eq "connecting"} { - ##Log - connecting - token $token - if { $state(reusing) - && $state(-pipeline) - && ($state(-timeout) > 0) - && (![info exists state(after)]) - } { - set state(after) [after $state(-timeout) \ - [list http::reset $token timeout]] - } - - if {[catch {gets $sock state(http)} nsl]} { - Log "WARNING - if testing, pay special attention to this\ - case (GK) which is seldom executed - token $token" - if {[info exists state(reusing)] && $state(reusing)} { - # The socket was closed at the server end, and closed at - # this end by http::CheckEof. - - if {[TestForReplay $token read $nsl c]} { - return - } - - # else: - # This is NOT a persistent socket that has been closed since - # its last use. - # If any other requests are in flight or pipelined/queued, - # they will be discarded. - } else { - Log ^X$tk end of response (error) - token $token - Finish $token $nsl - return - } - } elseif {$nsl >= 0} { - ##Log - connecting 1 - token $token - set state(state) "header" - } elseif { [eof $sock] - && [info exists state(reusing)] - && $state(reusing) - } { - # The socket was closed at the server end, and we didn't notice. - # This is the first read - where the closure is usually first - # detected. - - if {[TestForReplay $token read {} d]} { - return - } - - # else: - # This is NOT a persistent socket that has been closed since its - # last use. - # If any other requests are in flight or pipelined/queued, they - # will be discarded. - } - } elseif {$state(state) eq "header"} { - if {[catch {gets $sock line} nhl]} { - ##Log header failed - token $token - Log ^X$tk end of response (error) - token $token - Finish $token $nhl - return - } elseif {$nhl == 0} { - ##Log header done - token $token - Log ^E$tk end of response headers - token $token - # We have now read all headers - # We ignore HTTP/1.1 100 Continue returns. RFC2616 sec 8.2.3 - if { ($state(http) == "") - || ([regexp {^\S+\s(\d+)} $state(http) {} x] && $x == 100) - } { - set state(state) "connecting" - continue - # This was a "return" in the pre-coroutine code. - } - - if { ([info exists state(connection)]) - && ([info exists socketMapping($state(socketinfo))]) - && ($state(connection) eq "keep-alive") - && ($state(-keepalive)) - && (!$state(reusing)) - && ($state(-pipeline)) - } { - # Response headers received for first request on a - # persistent socket. Now ready for pipelined writes (if - # any). - # Previous value is $token. It cannot be "pending". - set socketWrState($state(socketinfo)) Wready - http::NextPipelinedWrite $token - } - - # Once a "close" has been signaled, the client MUST NOT send any - # more requests on that connection. - # - # If either the client or the server sends the "close" token in - # the Connection header, that request becomes the last one for - # the connection. - - if { ([info exists state(connection)]) - && ([info exists socketMapping($state(socketinfo))]) - && ($state(connection) eq "close") - && ($state(-keepalive)) - } { - # The server warns that it will close the socket after this - # response. - ##Log WARNING - socket will close after response for $token - # Prepare data for a call to ReplayIfClose. - if { ($socketRdQueue($state(socketinfo)) ne {}) - || ($socketWrQueue($state(socketinfo)) ne {}) - || ($socketWrState($state(socketinfo)) ni - [list Wready peNding $token]) - } { - set InFlightW $socketWrState($state(socketinfo)) - if {$InFlightW in [list Wready peNding $token]} { - set InFlightW Wready - } else { - set msg "token ${InFlightW} is InFlightW" - ##Log $msg - token $token - } - - set socketPlayCmd($state(socketinfo)) \ - [list ReplayIfClose $InFlightW \ - $socketRdQueue($state(socketinfo)) \ - $socketWrQueue($state(socketinfo))] - - # - All tokens are preserved for re-use by ReplayCore. - # - Queues are preserved in case of Finish with error, - # but are not used for anything else because - # socketClosing(*) is set below. - # - Cancel the state(after) timeout events. - foreach tokenVal $socketRdQueue($state(socketinfo)) { - if {[info exists ${tokenVal}(after)]} { - after cancel [set ${tokenVal}(after)] - unset ${tokenVal}(after) - } - } - - } else { - set socketPlayCmd($state(socketinfo)) \ - {ReplayIfClose Wready {} {}} - } - - # Do not allow further connections on this socket. - set socketClosing($state(socketinfo)) 1 - } - - set state(state) body - - # If doing a HEAD, then we won't get any body - if {$state(-validate)} { - Log ^F$tk end of response for HEAD request - token $token - set state(state) complete - Eot $token - return - } - - # - For non-chunked transfer we may have no body - in this case - # we may get no further file event if the connection doesn't - # close and no more data is sent. We can tell and must finish - # up now - not later - the alternative would be to wait until - # the server times out. - # - In this case, the server has NOT told the client it will - # close the connection, AND it has NOT indicated the resource - # length EITHER by setting the Content-Length (totalsize) OR - # by using chunked Transfer-Encoding. - # - Do not worry here about the case (Connection: close) because - # the server should close the connection. - # - IF (NOT Connection: close) AND (NOT chunked encoding) AND - # (totalsize == 0). - - if { (!( [info exists state(connection)] - && ($state(connection) eq "close") - ) - ) - && (![info exists state(transfer)]) - && ($state(totalsize) == 0) - } { - set msg {body size is 0 and no events likely - complete} - Log "$msg - token $token" - set msg {(length unknown, set to 0)} - Log ^F$tk end of response body {*}$msg - token $token - set state(state) complete - Eot $token - return - } - - # We have to use binary translation to count bytes properly. - lassign [fconfigure $sock -translation] trRead trWrite - fconfigure $sock -translation [list binary $trWrite] - - if { - $state(-binary) || [IsBinaryContentType $state(type)] - } { - # Turn off conversions for non-text data. - set state(binary) 1 - } - if {[info exists state(-channel)]} { - if {$state(binary) || [llength [ContentEncoding $token]]} { - fconfigure $state(-channel) -translation binary - } - if {![info exists state(-handler)]} { - # Initiate a sequence of background fcopies. - fileevent $sock readable {} - rename ${token}EventCoroutine {} - CopyStart $sock $token - return - } - } - } elseif {$nhl > 0} { - # Process header lines. - ##Log header - token $token - $line - if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} { - switch -- [string tolower $key] { - content-type { - set state(type) [string trim [string tolower $value]] - # Grab the optional charset information. - if {[regexp -nocase \ - {charset\s*=\s*\"((?:[^""]|\\\")*)\"} \ - $state(type) -> cs]} { - set state(charset) [string map {{\"} \"} $cs] - } else { - regexp -nocase {charset\s*=\s*(\S+?);?} \ - $state(type) -> state(charset) - } - } - content-length { - set state(totalsize) [string trim $value] - } - content-encoding { - set state(coding) [string trim $value] - } - transfer-encoding { - set state(transfer) \ - [string trim [string tolower $value]] - } - proxy-connection - - connection { - set state(connection) \ - [string trim [string tolower $value]] - } - } - lappend state(meta) $key [string trim $value] - } - } - } else { - # Now reading body - ##Log body - token $token - if {[catch { - if {[info exists state(-handler)]} { - set n [eval $state(-handler) [list $sock $token]] - ##Log handler $n - token $token - # N.B. the protocol has been set to 1.0 because the -handler - # logic is not expected to handle chunked encoding. - # FIXME Allow -handler with 1.1 on dechunked stacked chan. - if {$state(totalsize) == 0} { - # We know the transfer is complete only when the server - # closes the connection - i.e. eof is not an error. - set state(state) complete - } - if {![string is integer -strict $n]} { - if 1 { - # Do not tolerate bad -handler - fail with error - # status. - set msg {the -handler command for http::geturl must\ - return an integer (the number of bytes\ - read)} - Log ^X$tk end of response (handler error) -\ - token $token - Eot $token $msg - } else { - # Tolerate the bad -handler, and continue. The - # penalty: - # (a) Because the handler returns nonsense, we know - # the transfer is complete only when the server - # closes the connection - i.e. eof is not an - # error. - # (b) http::size will not be accurate. - # (c) The transaction is already downgraded to 1.0 - # to avoid chunked transfer encoding. It MUST - # also be forced to "Connection: close" or the - # HTTP/1.0 equivalent; or it MUST fail (as - # above) if the server sends - # "Connection: keep-alive" or the HTTP/1.0 - # equivalent. - set n 0 - set state(state) complete - } - } - } elseif {[info exists state(transfer_final)]} { - # This code forgives EOF in place of the final CRLF. - set line [getTextLine $sock] - set n [string length $line] - set state(state) complete - if {$n > 0} { - # - HTTP trailers (late response headers) are permitted - # by Chunked Transfer-Encoding, and can be safely - # ignored. - # - Do not count these bytes in the total received for - # the response body. - Log "trailer of $n bytes after final chunk -\ - token $token" - append state(transfer_final) $line - set n 0 - } else { - Log ^F$tk end of response body (chunked) - token $token - Log "final chunk part - token $token" - Eot $token - } - } elseif { [info exists state(transfer)] - && ($state(transfer) eq "chunked") - } { - ##Log chunked - token $token - set size 0 - set hexLenChunk [getTextLine $sock] - #set ntl [string length $hexLenChunk] - if {[string trim $hexLenChunk] ne ""} { - scan $hexLenChunk %x size - if {$size != 0} { - ##Log chunk-measure $size - token $token - set chunk [BlockingRead $sock $size] - set n [string length $chunk] - if {$n >= 0} { - append state(body) $chunk - incr state(log_size) [string length $chunk] - ##Log chunk $n cumul $state(log_size) -\ - token $token - } - if {$size != [string length $chunk]} { - Log "WARNING: mis-sized chunk:\ - was [string length $chunk], should be\ - $size - token $token" - set n 0 - set state(connection) close - Log ^X$tk end of response (chunk error) \ - - token $token - set msg {error in chunked encoding - fetch\ - terminated} - Eot $token $msg - } - # CRLF that follows chunk. - # If eof, this is handled at the end of this proc. - getTextLine $sock - } else { - set n 0 - set state(transfer_final) {} - } - } else { - # Line expected to hold chunk length is empty, or eof. - ##Log bad-chunk-measure - token $token - set n 0 - set state(connection) close - Log ^X$tk end of response (chunk error) - token $token - Eot $token {error in chunked encoding -\ - fetch terminated} - } - } else { - ##Log unchunked - token $token - if {$state(totalsize) == 0} { - # We know the transfer is complete only when the server - # closes the connection. - set state(state) complete - set reqSize $state(-blocksize) - } else { - # Ask for the whole of the unserved response-body. - # This works around a problem with a tls::socket - for - # https in keep-alive mode, and a request for - # $state(-blocksize) bytes, the last part of the - # resource does not get read until the server times out. - set reqSize [expr { $state(totalsize) - - $state(currentsize)}] - - # The workaround fails if reqSize is - # capped at $state(-blocksize). - # set reqSize [expr {min($reqSize, $state(-blocksize))}] - } - set c $state(currentsize) - set t $state(totalsize) - ##Log non-chunk currentsize $c of totalsize $t -\ - token $token - set block [read $sock $reqSize] - set n [string length $block] - if {$n >= 0} { - append state(body) $block - ##Log non-chunk [string length $state(body)] -\ - token $token - } - } - # This calculation uses n from the -handler, chunked, or - # unchunked case as appropriate. - if {[info exists state]} { - if {$n >= 0} { - incr state(currentsize) $n - set c $state(currentsize) - set t $state(totalsize) - ##Log another $n currentsize $c totalsize $t -\ - token $token - } - # If Content-Length - check for end of data. - if { - ($state(totalsize) > 0) - && ($state(currentsize) >= $state(totalsize)) - } { - Log ^F$tk end of response body (unchunked) -\ - token $token - set state(state) complete - Eot $token - } - } - } err]} { - Log ^X$tk end of response (error ${err}) - token $token - Finish $token $err - return - } else { - if {[info exists state(-progress)]} { - eval $state(-progress) \ - [list $token $state(totalsize) $state(currentsize)] - } - } - } - - # catch as an Eot above may have closed the socket already - # $state(state) may be connecting, header, body, or complete - if {![set cc [catch {eof $sock} eof]] && $eof} { - ##Log eof - token $token - if {[info exists $token]} { - set state(connection) close - if {$state(state) eq "complete"} { - # This includes all cases in which the transaction - # can be completed by eof. - # The value "complete" is set only in http::Event, and it is - # used only in the test above. - Log ^F$tk end of response body (unchunked, eof) -\ - token $token - Eot $token - } else { - # Premature eof. - Log ^X$tk end of response (unexpected eof) - token $token - Eot $token eof - } - } else { - # open connection closed on a token that has been cleaned up. - Log ^X$tk end of response (token error) - token $token - CloseSocket $sock - } - } elseif {$cc} { - return - } - } -} - -# http::TestForReplay -# -# Command called if eof is discovered when a socket is first used for a -# new transaction. Typically this occurs if a persistent socket is used -# after a period of idleness and the server has half-closed the socket. -# -# token - the connection token returned by http::geturl -# doing - "read" or "write" -# err - error message, if any -# caller - code to identify the caller - used only in logging -# -# Return Value: boolean, true iff the command calls http::ReplayIfDead. - -proc http::TestForReplay {token doing err caller} { - variable http - variable $token - upvar 0 $token state - set tk [namespace tail $token] - if {$doing eq "read"} { - set code Q - set action response - set ing reading - } else { - set code P - set action request - set ing writing - } - - if {$err eq {}} { - set err "detect eof when $ing (server timed out?)" - } - - if {$state(method) eq "POST" && !$http(-repost)} { - # No Replay. - # The present transaction will end when Finish is called. - # That call to Finish will abort any other transactions - # currently in the write queue. - # For calls from http::Event this occurs when execution - # reaches the code block at the end of that proc. - set msg {no retry for POST with http::config -repost 0} - Log reusing socket failed "($caller)" - $msg - token $token - Log error - $err - token $token - Log ^X$tk end of $action (error) - token $token - return 0 - } else { - # Replay. - set msg {try a new socket} - Log reusing socket failed "($caller)" - $msg - token $token - Log error - $err - token $token - Log ^$code$tk Any unfinished (incl this one) failed - token $token - ReplayIfDead $token $doing - return 1 - } -} - -# http::IsBinaryContentType -- -# -# Determine if the content-type means that we should definitely transfer -# the data as binary. [Bug 838e99a76d] -# -# Arguments -# type The content-type of the data. -# -# Results: -# Boolean, true if we definitely should be binary. - -proc http::IsBinaryContentType {type} { - lassign [split [string tolower $type] "/;"] major minor - if {$major eq "text"} { - return false - } - # There's a bunch of XML-as-application-format things about. See RFC 3023 - # and so on. - if {$major eq "application"} { - set minor [string trimright $minor] - if {$minor in {"json" "xml" "xml-external-parsed-entity" "xml-dtd"}} { - return false - } - } - # Not just application/foobar+xml but also image/svg+xml, so let us not - # restrict things for now... - if {[string match "*+xml" $minor]} { - return false - } - return true -} - -# http::getTextLine -- -# -# Get one line with the stream in crlf mode. -# Used if Transfer-Encoding is chunked. -# Empty line is not distinguished from eof. The caller must -# be able to handle this. -# -# Arguments -# sock The socket receiving input. -# -# Results: -# The line of text, without trailing newline - -proc http::getTextLine {sock} { - set tr [fconfigure $sock -translation] - lassign $tr trRead trWrite - fconfigure $sock -translation [list crlf $trWrite] - set r [BlockingGets $sock] - fconfigure $sock -translation $tr - return $r -} - -# http::BlockingRead -# -# Replacement for a blocking read. -# The caller must be a coroutine. - -proc http::BlockingRead {sock size} { - if {$size < 1} { - return - } - set result {} - while 1 { - set need [expr {$size - [string length $result]}] - set block [read $sock $need] - set eof [eof $sock] - append result $block - if {[string length $result] >= $size || $eof} { - return $result - } else { - yield - } - } -} - -# http::BlockingGets -# -# Replacement for a blocking gets. -# The caller must be a coroutine. -# Empty line is not distinguished from eof. The caller must -# be able to handle this. - -proc http::BlockingGets {sock} { - while 1 { - set count [gets $sock line] - set eof [eof $sock] - if {$count > -1 || $eof} { - return $line - } else { - yield - } - } -} - -# http::CopyStart -# -# Error handling wrapper around fcopy -# -# Arguments -# sock The socket to copy from -# token The token returned from http::geturl -# -# Side Effects -# This closes the connection upon error - -proc http::CopyStart {sock token {initial 1}} { - upvar #0 $token state - if {[info exists state(transfer)] && $state(transfer) eq "chunked"} { - foreach coding [ContentEncoding $token] { - lappend state(zlib) [zlib stream $coding] - } - make-transformation-chunked $sock [namespace code [list CopyChunk $token]] - } else { - if {$initial} { - foreach coding [ContentEncoding $token] { - zlib push $coding $sock - } - } - if {[catch { - # FIXME Keep-Alive on https tls::socket with unchunked transfer - # hangs until the server times out. A workaround is possible, as for - # the case without -channel, but it does not use the neat "fcopy" - # solution. - fcopy $sock $state(-channel) -size $state(-blocksize) -command \ - [list http::CopyDone $token] - } err]} { - Finish $token $err - } - } -} - -proc http::CopyChunk {token chunk} { - upvar 0 $token state - if {[set count [string length $chunk]]} { - incr state(currentsize) $count - if {[info exists state(zlib)]} { - foreach stream $state(zlib) { - set chunk [$stream add $chunk] - } - } - puts -nonewline $state(-channel) $chunk - if {[info exists state(-progress)]} { - eval [linsert $state(-progress) end \ - $token $state(totalsize) $state(currentsize)] - } - } else { - Log "CopyChunk Finish - token $token" - if {[info exists state(zlib)]} { - set excess "" - foreach stream $state(zlib) { - catch {set excess [$stream add -finalize $excess]} - } - puts -nonewline $state(-channel) $excess - foreach stream $state(zlib) { $stream close } - unset state(zlib) - } - Eot $token ;# FIX ME: pipelining. - } -} - -# http::CopyDone -# -# fcopy completion callback -# -# Arguments -# token The token returned from http::geturl -# count The amount transfered -# -# Side Effects -# Invokes callbacks - -proc http::CopyDone {token count {error {}}} { - variable $token - upvar 0 $token state - set sock $state(sock) - incr state(currentsize) $count - if {[info exists state(-progress)]} { - eval $state(-progress) \ - [list $token $state(totalsize) $state(currentsize)] - } - # At this point the token may have been reset. - if {[string length $error]} { - Finish $token $error - } elseif {[catch {eof $sock} iseof] || $iseof} { - Eot $token - } else { - CopyStart $sock $token 0 - } -} - -# http::Eot -# -# Called when either: -# a. An eof condition is detected on the socket. -# b. The client decides that the response is complete. -# c. The client detects an inconsistency and aborts the transaction. -# -# Does: -# 1. Set state(status) -# 2. Reverse any Content-Encoding -# 3. Convert charset encoding and line ends if necessary -# 4. Call http::Finish -# -# Arguments -# token The token returned from http::geturl -# force (previously) optional, has no effect -# reason - "eof" means premature EOF (not EOF as the natural end of -# the response) -# - "" means completion of response, with or without EOF -# - anything else describes an error confition other than -# premature EOF. -# -# Side Effects -# Clean up the socket - -proc http::Eot {token {reason {}}} { - variable $token - upvar 0 $token state - if {$reason eq "eof"} { - # Premature eof. - set state(status) eof - set reason {} - } elseif {$reason ne ""} { - # Abort the transaction. - set state(status) $reason - } else { - # The response is complete. - set state(status) ok - } - - if {[string length $state(body)] > 0} { - if {[catch { - foreach coding [ContentEncoding $token] { - set state(body) [zlib $coding $state(body)] - } - } err]} { - Log "error doing decompression for token $token: $err" - Finish $token $err - return - } - - if {!$state(binary)} { - # If we are getting text, set the incoming channel's encoding - # correctly. iso8859-1 is the RFC default, but this could be any - # IANA charset. However, we only know how to convert what we have - # encodings for. - - set enc [CharsetToEncoding $state(charset)] - if {$enc ne "binary"} { - set state(body) [encoding convertfrom $enc $state(body)] - } - - # Translate text line endings. - set state(body) [string map {\r\n \n \r \n} $state(body)] - } - } - Finish $token $reason -} - -# http::wait -- -# -# See documentation for details. -# -# Arguments: -# token Connection token. -# -# Results: -# The status after the wait. - -proc http::wait {token} { - variable $token - upvar 0 $token state - - if {![info exists state(status)] || $state(status) eq ""} { - # We must wait on the original variable name, not the upvar alias - vwait ${token}(status) - } - - return [status $token] -} - -# http::formatQuery -- -# -# See documentation for details. Call http::formatQuery with an even -# number of arguments, where the first is a name, the second is a value, -# the third is another name, and so on. -# -# Arguments: -# args A list of name-value pairs. -# -# Results: -# TODO - -proc http::formatQuery {args} { - if {[llength $args] % 2} { - return \ - -code error \ - -errorcode [list HTTP BADARGCNT $args] \ - {Incorrect number of arguments, must be an even number.} - } - set result "" - set sep "" - foreach i $args { - append result $sep [mapReply $i] - if {$sep eq "="} { - set sep & - } else { - set sep = - } - } - return $result -} - -# http::mapReply -- -# -# Do x-www-urlencoded character mapping -# -# Arguments: -# string The string the needs to be encoded -# -# Results: -# The encoded string - -proc http::mapReply {string} { - variable http - variable formMap - - # The spec says: "non-alphanumeric characters are replaced by '%HH'". Use - # a pre-computed map and [string map] to do the conversion (much faster - # than [regsub]/[subst]). [Bug 1020491] - - if {$http(-urlencoding) ne ""} { - set string [encoding convertto $http(-urlencoding) $string] - return [string map $formMap $string] - } - set converted [string map $formMap $string] - if {[string match "*\[\u0100-\uffff\]*" $converted]} { - regexp "\[\u0100-\uffff\]" $converted badChar - # Return this error message for maximum compatibility... :^/ - return -code error \ - "can't read \"formMap($badChar)\": no such element in array" - } - return $converted -} -interp alias {} http::quoteString {} http::mapReply - -# http::ProxyRequired -- -# Default proxy filter. -# -# Arguments: -# host The destination host -# -# Results: -# The current proxy settings - -proc http::ProxyRequired {host} { - variable http - if {[info exists http(-proxyhost)] && [string length $http(-proxyhost)]} { - if { - ![info exists http(-proxyport)] || - ![string length $http(-proxyport)] - } { - set http(-proxyport) 8080 - } - return [list $http(-proxyhost) $http(-proxyport)] - } -} - -# http::CharsetToEncoding -- -# -# Tries to map a given IANA charset to a tcl encoding. If no encoding -# can be found, returns binary. -# - -proc http::CharsetToEncoding {charset} { - variable encodings - - set charset [string tolower $charset] - if {[regexp {iso-?8859-([0-9]+)} $charset -> num]} { - set encoding "iso8859-$num" - } elseif {[regexp {iso-?2022-(jp|kr)} $charset -> ext]} { - set encoding "iso2022-$ext" - } elseif {[regexp {shift[-_]?js} $charset]} { - set encoding "shiftjis" - } elseif {[regexp {(?:windows|cp)-?([0-9]+)} $charset -> num]} { - set encoding "cp$num" - } elseif {$charset eq "us-ascii"} { - set encoding "ascii" - } elseif {[regexp {(?:iso-?)?lat(?:in)?-?([0-9]+)} $charset -> num]} { - switch -- $num { - 5 {set encoding "iso8859-9"} - 1 - 2 - 3 { - set encoding "iso8859-$num" - } - } - } else { - # other charset, like euc-xx, utf-8,... may directly map to encoding - set encoding $charset - } - set idx [lsearch -exact $encodings $encoding] - if {$idx >= 0} { - return $encoding - } else { - return "binary" - } -} - -# Return the list of content-encoding transformations we need to do in order. -proc http::ContentEncoding {token} { - upvar 0 $token state - set r {} - if {[info exists state(coding)]} { - foreach coding [split $state(coding) ,] { - switch -exact -- $coding { - deflate { lappend r inflate } - gzip - x-gzip { lappend r gunzip } - compress - x-compress { lappend r decompress } - identity {} - default { - return -code error "unsupported content-encoding \"$coding\"" - } - } - } - } - return $r -} - -proc http::ReceiveChunked {chan command} { - set data "" - set size -1 - yield - while {1} { - chan configure $chan -translation {crlf binary} - while {[gets $chan line] < 1} { yield } - chan configure $chan -translation {binary binary} - if {[scan $line %x size] != 1} { - return -code error "invalid size: \"$line\"" - } - set chunk "" - while {$size && ![chan eof $chan]} { - set part [chan read $chan $size] - incr size -[string length $part] - append chunk $part - } - if {[catch { - uplevel #0 [linsert $command end $chunk] - }]} { - http::Log "Error in callback: $::errorInfo" - } - if {[string length $chunk] == 0} { - # channel might have been closed in the callback - catch {chan event $chan readable {}} - return - } - } -} - -proc http::make-transformation-chunked {chan command} { - coroutine [namespace current]::dechunk$chan ::http::ReceiveChunked $chan $command - chan event $chan readable [namespace current]::dechunk$chan -} - -# Local variables: -# indent-tabs-mode: t -# End: diff --git a/waypoint_manager/manager_GUI/tcl/tcl8/msgcat-1.6.1.tm b/waypoint_manager/manager_GUI/tcl/tcl8/msgcat-1.6.1.tm deleted file mode 100644 index 646bc17..0000000 --- a/waypoint_manager/manager_GUI/tcl/tcl8/msgcat-1.6.1.tm +++ /dev/null @@ -1,1210 +0,0 @@ -# msgcat.tcl -- -# -# This file defines various procedures which implement a -# message catalog facility for Tcl programs. It should be -# loaded with the command "package require msgcat". -# -# Copyright (c) 2010-2015 by Harald Oehlmann. -# Copyright (c) 1998-2000 by Ajuba Solutions. -# Copyright (c) 1998 by Mark Harrison. -# -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. - -package require Tcl 8.5- -# When the version number changes, be sure to update the pkgIndex.tcl file, -# and the installation directory in the Makefiles. -package provide msgcat 1.6.1 - -namespace eval msgcat { - namespace export mc mcexists mcload mclocale mcmax mcmset mcpreferences mcset\ - mcunknown mcflset mcflmset mcloadedlocales mcforgetpackage\ - mcpackageconfig mcpackagelocale - - # Records the list of locales to search - variable Loclist {} - - # List of currently loaded locales - variable LoadedLocales {} - - # Records the locale of the currently sourced message catalogue file - variable FileLocale - - # Configuration values per Package (e.g. client namespace). - # The dict key is of the form "