^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Procedures for drawing on the screen early on in the boot process.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Benjamin Herrenschmidt <benh@kernel.crashing.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/memblock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/pgtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/sections.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/prom.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/btext.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <asm/mmu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/udbg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #ifndef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) static void scrollscreen(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define __force_data __section(".data")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static int g_loc_X __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) static int g_loc_Y __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static int g_max_loc_X __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) static int g_max_loc_Y __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) static int dispDeviceRowBytes __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static int dispDeviceDepth __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static int dispDeviceRect[4] __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static unsigned char *dispDeviceBase __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static unsigned char *logicalDisplayBase __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) unsigned long disp_BAT[2] __initdata = {0, 0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define cmapsz (16*256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static unsigned char vga_font[cmapsz];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) int boot_text_mapped __force_data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int force_printk_to_btext = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) extern void rmci_on(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) extern void rmci_off(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static inline void rmci_maybe_on(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (!(mfmsr() & MSR_DR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) rmci_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) static inline void rmci_maybe_off(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) if (!(mfmsr() & MSR_DR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) rmci_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #ifdef CONFIG_PPC32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Calc BAT values for mapping the display and store them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * in disp_BAT. Those values are then used from head.S to map
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * the display during identify_machine() and MMU_Init()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * The display is mapped to virtual address 0xD0000000, rather
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * than 1:1, because some some CHRP machines put the frame buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * in the region starting at 0xC0000000 (PAGE_OFFSET).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * This mapping is temporary and will disappear as soon as the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * setup done by MMU_Init() is applied.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * For now, we align the BAT and then map 8Mb on 601 and 16Mb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * on other PPCs. This may cause trouble if the framebuffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * is really badly aligned, but I didn't encounter this case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) void __init btext_prepare_BAT(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) unsigned long vaddr = PAGE_OFFSET + 0x10000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) unsigned long addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) unsigned long lowbits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) addr = (unsigned long)dispDeviceBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (!addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) lowbits = addr & ~0xFF000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) addr &= 0xFF000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) disp_BAT[0] = vaddr | (BL_16M<<2) | 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) disp_BAT[1] = addr | (_PAGE_NO_CACHE | _PAGE_GUARDED | BPP_RW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) logicalDisplayBase = (void *) (vaddr + lowbits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* This function can be used to enable the early boot text when doing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * OF booting or within bootx init. It must be followed by a btext_unmap()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * call before the logical address becomes unusable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) void __init btext_setup_display(int width, int height, int depth, int pitch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) unsigned long address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) g_max_loc_X = width / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) g_max_loc_Y = height / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) logicalDisplayBase = (unsigned char *)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) dispDeviceBase = (unsigned char *)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) dispDeviceRowBytes = pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) dispDeviceDepth = depth == 15 ? 16 : depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) dispDeviceRect[0] = dispDeviceRect[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) dispDeviceRect[2] = width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) dispDeviceRect[3] = height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) boot_text_mapped = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) void __init btext_unmap(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* Here's a small text engine to use during early boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * or for debugging purposes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * todo:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * - build some kind of vgacon with it to enable early printk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * - move to a separate file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * - add a few video driver hooks to keep in sync with display
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) * changes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) void btext_map(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) unsigned long base, offset, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) unsigned char *vbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /* By default, we are no longer mapped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) if (!dispDeviceBase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) base = ((unsigned long) dispDeviceBase) & 0xFFFFF000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) offset = ((unsigned long) dispDeviceBase) - base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) size = dispDeviceRowBytes * dispDeviceRect[3] + offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) + dispDeviceRect[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) vbase = ioremap_wc(base, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (!vbase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) logicalDisplayBase = vbase + offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) boot_text_mapped = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static int btext_initialize(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) unsigned int width, height, depth, pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) unsigned long address = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) const u32 *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) prop = of_get_property(np, "linux,bootx-width", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) prop = of_get_property(np, "width", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) width = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) prop = of_get_property(np, "linux,bootx-height", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) prop = of_get_property(np, "height", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) height = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) prop = of_get_property(np, "linux,bootx-depth", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) prop = of_get_property(np, "depth", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) depth = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) pitch = width * ((depth + 7) / 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) prop = of_get_property(np, "linux,bootx-linebytes", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) prop = of_get_property(np, "linebytes", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) if (prop && *prop != 0xffffffffu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) pitch = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (pitch == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) pitch = 0x1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) prop = of_get_property(np, "linux,bootx-addr", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) prop = of_get_property(np, "address", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (prop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) address = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) /* FIXME: Add support for PCI reg properties. Right now, only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) * reliable on macs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (address == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) g_max_loc_X = width / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) g_max_loc_Y = height / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) dispDeviceBase = (unsigned char *)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) dispDeviceRowBytes = pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) dispDeviceDepth = depth == 15 ? 16 : depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) dispDeviceRect[0] = dispDeviceRect[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) dispDeviceRect[2] = width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) dispDeviceRect[3] = height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) btext_map();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) int __init btext_find_display(int allow_nonstdout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct device_node *np = of_stdout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) int rc = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) if (!of_node_is_type(np, "display")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) printk("boot stdout isn't a display !\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) np = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) if (np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) rc = btext_initialize(np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (rc == 0 || !allow_nonstdout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) for_each_node_by_type(np, "display") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (of_get_property(np, "linux,opened", NULL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) printk("trying %pOF ...\n", np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) rc = btext_initialize(np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) printk("result: %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) of_node_put(np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* Calc the base address of a given point (x,y) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) static unsigned char * calc_base(int x, int y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) unsigned char *base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) base = logicalDisplayBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) if (!base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) base = dispDeviceBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) return base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /* Adjust the display to a new resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) void btext_update_display(unsigned long phys, int width, int height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int depth, int pitch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (!dispDeviceBase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) /* check it's the same frame buffer (within 256MB) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) dispDeviceBase = (__u8 *) phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) dispDeviceRect[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) dispDeviceRect[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) dispDeviceRect[2] = width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) dispDeviceRect[3] = height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) dispDeviceDepth = depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) dispDeviceRowBytes = pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (boot_text_mapped) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) iounmap(logicalDisplayBase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) btext_map();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) g_max_loc_X = width / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) g_max_loc_Y = height / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) EXPORT_SYMBOL(btext_update_display);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) void btext_clearscreen(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) unsigned int *base = (unsigned int *)calc_base(0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) (dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) rmci_maybe_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) unsigned int *ptr = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) for(j=width; j; --j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) *(ptr++) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) base += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) rmci_maybe_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) void btext_flushscreen(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) unsigned int *base = (unsigned int *)calc_base(0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) (dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) for (i=0; i < (dispDeviceRect[3] - dispDeviceRect[1]); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) unsigned int *ptr = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) for(j = width; j > 0; j -= 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) base += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) __asm__ __volatile__ ("sync" ::: "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) void btext_flushline(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) unsigned int *base = (unsigned int *)calc_base(0, g_loc_Y << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) (dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) for (i=0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) unsigned int *ptr = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) for(j = width; j > 0; j -= 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) base += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) __asm__ __volatile__ ("sync" ::: "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #ifndef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) static void scrollscreen(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) unsigned int *src = (unsigned int *)calc_base(0,16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) unsigned int *dst = (unsigned int *)calc_base(0,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) (dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) rmci_maybe_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) unsigned int *src_ptr = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) unsigned int *dst_ptr = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) for(j=width; j; --j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) *(dst_ptr++) = *(src_ptr++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) src += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) dst += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) for (i=0; i<16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) unsigned int *dst_ptr = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) for(j=width; j; --j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) *(dst_ptr++) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) dst += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) rmci_maybe_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) #endif /* ndef NO_SCROLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static unsigned int expand_bits_8[16] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 0x00000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 0x000000ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 0x0000ff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 0x0000ffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 0x00ff0000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 0x00ff00ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 0x00ffff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 0x00ffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 0xff000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 0xff0000ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 0xff00ff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 0xff00ffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 0xffff0000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 0xffff00ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 0xffffff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 0xffffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static unsigned int expand_bits_16[4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 0x00000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 0x0000ffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 0xffff0000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 0xffffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) int l, bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) int fg = 0xFFFFFFFFUL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) int bg = 0x00000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) for (l = 0; l < 16; ++l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) bits = *font++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) base[0] = (-(bits >> 7) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) base[7] = (-(bits & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) base = (unsigned int *) ((char *)base + rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) static inline void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) int l, bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) int fg = 0xFFFFFFFFUL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) int bg = 0x00000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) unsigned int *eb = (int *)expand_bits_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) for (l = 0; l < 16; ++l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) bits = *font++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) base[0] = (eb[bits >> 6] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) base[3] = (eb[bits & 3] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) base = (unsigned int *) ((char *)base + rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) static inline void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) int l, bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) int fg = 0x0F0F0F0FUL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) int bg = 0x00000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) unsigned int *eb = (int *)expand_bits_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) for (l = 0; l < 16; ++l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) bits = *font++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) base[0] = (eb[bits >> 4] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) base[1] = (eb[bits & 0xf] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) base = (unsigned int *) ((char *)base + rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) static noinline void draw_byte(unsigned char c, long locX, long locY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) unsigned char *base = calc_base(locX << 3, locY << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) unsigned char *font = &vga_font[((unsigned int)c) * 16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int rb = dispDeviceRowBytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) rmci_maybe_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) switch(dispDeviceDepth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) case 24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) case 32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) draw_byte_32(font, (unsigned int *)base, rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) case 15:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) draw_byte_16(font, (unsigned int *)base, rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) draw_byte_8(font, (unsigned int *)base, rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) rmci_maybe_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) void btext_drawchar(char c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) int cline = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) #ifdef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) int x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) switch (c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) case '\b':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) if (g_loc_X > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) --g_loc_X;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) case '\t':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) g_loc_X = (g_loc_X & -8) + 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) case '\r':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) case '\n':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) g_loc_Y++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) cline = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) draw_byte(c, g_loc_X++, g_loc_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) if (g_loc_X >= g_max_loc_X) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) g_loc_Y++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) cline = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) #ifndef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) while (g_loc_Y >= g_max_loc_Y) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) scrollscreen();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) g_loc_Y--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) /* wrap around from bottom to top of screen so we don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) waste time scrolling each line. -- paulus. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) if (g_loc_Y >= g_max_loc_Y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) if (cline) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) for (x = 0; x < g_max_loc_X; ++x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) draw_byte(' ', x, g_loc_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) void btext_drawstring(const char *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) while (*c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) btext_drawchar(*c++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) void btext_drawtext(const char *c, unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) while (len--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) btext_drawchar(*c++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) void btext_drawhex(unsigned long v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) btext_drawchar(hex_asc_hi(v >> 56));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) btext_drawchar(hex_asc_lo(v >> 56));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) btext_drawchar(hex_asc_hi(v >> 48));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) btext_drawchar(hex_asc_lo(v >> 48));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) btext_drawchar(hex_asc_hi(v >> 40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) btext_drawchar(hex_asc_lo(v >> 40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) btext_drawchar(hex_asc_hi(v >> 32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) btext_drawchar(hex_asc_lo(v >> 32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) btext_drawchar(hex_asc_hi(v >> 24));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) btext_drawchar(hex_asc_lo(v >> 24));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) btext_drawchar(hex_asc_hi(v >> 16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) btext_drawchar(hex_asc_lo(v >> 16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) btext_drawchar(hex_asc_hi(v >> 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) btext_drawchar(hex_asc_lo(v >> 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) btext_drawchar(hex_asc_hi(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) btext_drawchar(hex_asc_lo(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) btext_drawchar(' ');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) void __init udbg_init_btext(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) /* If btext is enabled, we might have a BAT setup for early display,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * thus we do enable some very basic udbg output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) udbg_putc = btext_drawchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) static unsigned char vga_font[cmapsz] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) 0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)