Commit fc4cbd755b75c7687b923da5b75ba4a64652582e

Authored by Martin K. Petersen
Committed by Greg Kroah-Hartman
1 parent dd4dd19e8d

USB: io_ti: Digi EdgePort update for new devices

This patch adds support for the most recent Digi EdgePort USB serial
devices.

Signed-off-by: Martin K. Petersen <mkp@mkp.net>
Signed-off-by: Mike Swift <mikes@digi.com>
Signed-off-by: Jeremy McBane <jmcbane@digi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Showing 3 changed files with 807 additions and 732 deletions Inline Diff

drivers/usb/serial/io_fw_down3.h
1 //************************************************************** 1 //**************************************************************
2 //* Edgeport Binary Image (for TI based products) 2 //* Edgeport Binary Image (for TI based products)
3 //* Generated by TIBin2C v2.00 (watchport) 3 //* Generated by TIBin2C v2.00 (watchport)
4 //* Copyright (C) 2001 Inside Out Networks, All rights reserved. 4 //* Copyright (C) 2001 Inside Out Networks, All rights reserved.
5 //************************************************************** 5 //**************************************************************
6 6
7 7
8 static int IMAGE_SIZE = 12749; 8 static int IMAGE_SIZE = 12938;
9 9
10 struct EDGE_FIRMWARE_VERSION_INFO 10 struct EDGE_FIRMWARE_VERSION_INFO
11 { 11 {
12 unsigned char MajorVersion; 12 unsigned char MajorVersion;
13 unsigned char MinorVersion; 13 unsigned char MinorVersion;
14 unsigned short BuildNumber; 14 unsigned short BuildNumber;
15 }; 15 };
16 16
17 static struct EDGE_FIRMWARE_VERSION_INFO IMAGE_VERSION_NAME = 17 static struct EDGE_FIRMWARE_VERSION_INFO IMAGE_VERSION_NAME =
18 { 18 {
19 4, 10, 0 // Major, Minor, Build 19 4, 80, 0 // Major, Minor, Build
20 20
21 }; 21 };
22 22
23 static unsigned char IMAGE_ARRAY_NAME[] = 23 static unsigned char IMAGE_ARRAY_NAME[] =
24 { 24 {
25 // struct ImageHdr 25 // struct ImageHdr
26 // { 26 // {
27 // WORD Length; 27 // WORD Length;
28 // BYTE CheckSum; 28 // BYTE CheckSum;
29 // }; 29 // };
30 0xca, 0x31, 30 0x87, 0x32,
31 0xa8, 31 0x9a,
32 32
33 0x02, 0x26, 0xfe, 0x02, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x00, 33 0x02, 0x27, 0xbf, 0x02, 0x21, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x00,
34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1a, 0x85, 0x3f, 34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1a, 0x85, 0x3f,
35 0x8c, 0x85, 0x40, 0x8a, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 35 0x8c, 0x85, 0x40, 0x8a, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00,
36 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x3e, 36 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x3e,
37 0x24, 0x08, 0xf8, 0xe6, 0x60, 0x2b, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0xa6, 0x81, 0xe5, 0x3e, 0x75, 37 0x24, 0x08, 0xf8, 0xe6, 0x60, 0x2b, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0xa6, 0x81, 0xe5, 0x3e, 0x75,
38 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0x78, 0x8c, 0xe5, 0x81, 38 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0x78, 0x8c, 0xe5, 0x81,
39 0x04, 0xc3, 0x98, 0xf9, 0x94, 0x22, 0x40, 0x03, 0x02, 0x11, 0x94, 0xe6, 0xf0, 0x08, 0xa3, 0xd9, 39 0x04, 0xc3, 0x98, 0xf9, 0x94, 0x22, 0x40, 0x03, 0x02, 0x11, 0xdc, 0xe6, 0xf0, 0x08, 0xa3, 0xd9,
40 0xfa, 0x74, 0x08, 0x25, 0x3e, 0xf8, 0x05, 0x3e, 0x08, 0xe6, 0x54, 0x80, 0x70, 0x0c, 0xe5, 0x3e, 40 0xfa, 0x74, 0x08, 0x25, 0x3e, 0xf8, 0x05, 0x3e, 0x08, 0xe6, 0x54, 0x80, 0x70, 0x0c, 0xe5, 0x3e,
41 0xb4, 0x07, 0xf3, 0x78, 0x08, 0x75, 0x3e, 0x00, 0x80, 0xef, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0x86, 41 0xb4, 0x07, 0xf3, 0x78, 0x08, 0x75, 0x3e, 0x00, 0x80, 0xef, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0x86,
42 0x81, 0xe5, 0x3e, 0x75, 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 42 0x81, 0xe5, 0x3e, 0x75, 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83,
43 0x78, 0x8c, 0xe5, 0x81, 0x04, 0xc3, 0x98, 0xf9, 0xe0, 0xf6, 0x08, 0xa3, 0xd9, 0xfa, 0xd0, 0x07, 43 0x78, 0x8c, 0xe5, 0x81, 0x04, 0xc3, 0x98, 0xf9, 0xe0, 0xf6, 0x08, 0xa3, 0xd9, 0xfa, 0xd0, 0x07,
44 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83, 44 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83,
45 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 0x30, 0x01, 0x4d, 0x30, 0xb4, 0x48, 0x10, 45 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 0x30, 0x01, 0x4d, 0x30, 0xb4, 0x48, 0x10,
46 0x00, 0x45, 0x90, 0xff, 0x08, 0xe0, 0x54, 0x20, 0xf8, 0x90, 0xff, 0x48, 0xe0, 0x54, 0x20, 0xf9, 46 0x00, 0x45, 0x90, 0xff, 0x08, 0xe0, 0x54, 0x20, 0xf8, 0x90, 0xff, 0x48, 0xe0, 0x54, 0x20, 0xf9,
47 0x90, 0xff, 0x10, 0xe0, 0x54, 0x20, 0xfa, 0x90, 0xff, 0x50, 0xe0, 0x54, 0x20, 0xfb, 0x74, 0x00, 47 0x90, 0xff, 0x10, 0xe0, 0x54, 0x20, 0xfa, 0x90, 0xff, 0x50, 0xe0, 0x54, 0x20, 0xfb, 0x74, 0x00,
48 0xf5, 0x82, 0x74, 0xf8, 0xf5, 0x83, 0xe0, 0xc8, 0xf0, 0x68, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, 48 0xf5, 0x82, 0x74, 0xf8, 0xf5, 0x83, 0xe0, 0xc8, 0xf0, 0x68, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0,
49 0xc9, 0xf0, 0x69, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, 0xca, 0xf0, 0x6a, 0x60, 0x02, 0x7e, 0x04, 49 0xc9, 0xf0, 0x69, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, 0xca, 0xf0, 0x6a, 0x60, 0x02, 0x7e, 0x04,
50 0xa3, 0xe0, 0xcb, 0xf0, 0x6b, 0x60, 0x02, 0x7e, 0x04, 0x22, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, 50 0xa3, 0xe0, 0xcb, 0xf0, 0x6b, 0x60, 0x02, 0x7e, 0x04, 0x22, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0,
51 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 51 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05,
52 0xc0, 0x06, 0xc0, 0x07, 0x90, 0xff, 0x93, 0x74, 0x01, 0xf0, 0xe5, 0x81, 0x94, 0xfd, 0x40, 0x03, 52 0xc0, 0x06, 0xc0, 0x07, 0x74, 0x15, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x60, 0x23, 0x74,
53 0x02, 0x11, 0x94, 0x85, 0x41, 0x8d, 0x85, 0x42, 0x8b, 0x74, 0xaf, 0xf5, 0x82, 0x74, 0xfa, 0xf5, 53 0x66, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x14, 0xf0, 0x70, 0x16, 0x74, 0xff, 0xf0, 0x74,
54 0x83, 0xe0, 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x4a, 0xe0, 0x30, 0xe7, 0x2c, 54 0x1c, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x60, 0x04, 0x14, 0xf0, 0x70, 0x04, 0xc2, 0x90,
55 0x90, 0xff, 0x4e, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x20, 55 0x80, 0xfc, 0x90, 0xff, 0x93, 0x74, 0x81, 0xf0, 0xe5, 0x81, 0x94, 0xfd, 0x40, 0x03, 0x02, 0x11,
56 0xb4, 0x02, 0x1d, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x27, 56 0xdc, 0x85, 0x41, 0x8d, 0x85, 0x42, 0x8b, 0x74, 0xb2, 0xf5, 0x82, 0x74, 0xfa, 0xf5, 0x83, 0xe0,
57 0x8d, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x04, 0xd0, 0x83, 0xd0, 0x82, 57 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x4a, 0xe0, 0x30, 0xe7, 0x2c, 0x90, 0xff,
58 0xa3, 0xe0, 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x52, 0xe0, 0x30, 0xe7, 0x2c, 58 0x4e, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x20, 0xb4, 0x02,
59 0x90, 0xff, 0x56, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x25, 59 0x1d, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x28, 0x4e, 0x80,
60 0xb4, 0x02, 0x22, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x27, 60 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x04, 0xd0, 0x83, 0xd0, 0x82, 0xa3, 0xe0,
61 0x8d, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 61 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x52, 0xe0, 0x30, 0xe7, 0x2c, 0x90, 0xff,
62 0x80, 0x03, 0x02, 0x02, 0x62, 0x74, 0x15, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x20, 0x04, 62 0x56, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x25, 0xb4, 0x02,
63 0xf1, 0x20, 0x02, 0x03, 0x30, 0x01, 0xeb, 0x74, 0x18, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 63 0x22, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x28, 0x4e, 0x80,
64 0x14, 0xfc, 0xf0, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0x64, 0x04, 0x70, 0x0f, 0xec, 0x70, 0x62, 64 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x80, 0x03,
65 0x7e, 0x01, 0x12, 0x00, 0xc9, 0x7c, 0x0a, 0x7d, 0xfa, 0x02, 0x02, 0x33, 0x12, 0x00, 0xc9, 0xee, 65 0x02, 0x02, 0x90, 0x74, 0x16, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x20, 0x04, 0xf1, 0x20,
66 0x64, 0x04, 0x60, 0x1d, 0xec, 0x70, 0x4b, 0x7c, 0x0a, 0xed, 0x14, 0xfd, 0x70, 0x15, 0xee, 0x64, 66 0x02, 0x03, 0x30, 0x01, 0xeb, 0x74, 0x19, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x14, 0xfc,
67 0x02, 0x60, 0x07, 0x7e, 0x02, 0x7d, 0x32, 0x02, 0x02, 0x33, 0x7e, 0x01, 0x7d, 0xfa, 0x02, 0x02, 67 0xf0, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0x64, 0x04, 0x70, 0x0f, 0xec, 0x70, 0x62, 0x7e, 0x01,
68 0x33, 0x7c, 0x0a, 0x74, 0x18, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 68 0x12, 0x00, 0xc9, 0x7c, 0x0a, 0x7d, 0xfa, 0x02, 0x02, 0x61, 0x12, 0x00, 0xc9, 0xee, 0x64, 0x04,
69 0xa3, 0xee, 0xf0, 0x14, 0x60, 0x18, 0x20, 0xe1, 0x0f, 0x20, 0x01, 0x06, 0xd2, 0xb1, 0xc2, 0xb0, 69 0x60, 0x1d, 0xec, 0x70, 0x4b, 0x7c, 0x0a, 0xed, 0x14, 0xfd, 0x70, 0x15, 0xee, 0x64, 0x02, 0x60,
70 0x80, 0x10, 0xc2, 0xb1, 0xd2, 0xb0, 0x80, 0x0a, 0xc2, 0xb1, 0xc2, 0xb0, 0x80, 0x04, 0xd2, 0xb0, 70 0x07, 0x7e, 0x02, 0x7d, 0x32, 0x02, 0x02, 0x61, 0x7e, 0x01, 0x7d, 0xfa, 0x02, 0x02, 0x61, 0x7c,
71 0xd2, 0xb1, 0x78, 0x19, 0x79, 0x09, 0x7a, 0x07, 0xe7, 0x70, 0x04, 0xa6, 0x00, 0x80, 0x0b, 0xe6, 71 0x0a, 0x74, 0x19, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee,
72 0x60, 0x08, 0x16, 0xe6, 0x70, 0x04, 0xe7, 0x44, 0x80, 0xf7, 0x08, 0x09, 0xda, 0xea, 0xe5, 0x3d, 72 0xf0, 0x14, 0x60, 0x18, 0x20, 0xe1, 0x0f, 0x20, 0x01, 0x06, 0xd2, 0xb1, 0xc2, 0xb0, 0x80, 0x10,
73 0x60, 0x13, 0x14, 0xf5, 0x3d, 0x70, 0x0e, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 73 0xc2, 0xb1, 0xd2, 0xb0, 0x80, 0x0a, 0xc2, 0xb1, 0xc2, 0xb0, 0x80, 0x04, 0xd2, 0xb0, 0xd2, 0xb1,
74 0x0f, 0xd2, 0x8c, 0xd2, 0x8d, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 74 0x78, 0x19, 0x79, 0x09, 0x7a, 0x07, 0xe7, 0x70, 0x04, 0xa6, 0x00, 0x80, 0x0b, 0xe6, 0x60, 0x08,
75 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 75 0x16, 0xe6, 0x70, 0x04, 0xe7, 0x44, 0x80, 0xf7, 0x08, 0x09, 0xda, 0xea, 0xe5, 0x3d, 0x60, 0x13,
76 0x90, 0xff, 0x04, 0xe0, 0x90, 0xfa, 0xb6, 0xf0, 0x90, 0xff, 0x06, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 76 0x14, 0xf5, 0x3d, 0x70, 0x0e, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 0x57, 0xd2,
77 0xec, 0xff, 0xea, 0xfe, 0xef, 0xc3, 0x94, 0x08, 0xee, 0x94, 0x01, 0x50, 0x02, 0x80, 0x04, 0x7e, 77 0x8c, 0xd2, 0x8d, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0,
78 0x01, 0x7f, 0x08, 0x8e, 0x3b, 0x8f, 0x3c, 0x90, 0xff, 0x02, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 0xec, 78 0x01, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 0x90, 0xff,
79 0xff, 0xea, 0x90, 0xfa, 0xba, 0xf0, 0xef, 0xa3, 0xf0, 0x12, 0x1c, 0x30, 0xe4, 0xf5, 0x4d, 0xe5, 79 0x04, 0xe0, 0x90, 0xfa, 0xb9, 0xf0, 0x90, 0xff, 0x06, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 0xec, 0xff,
80 0x4d, 0xc3, 0x94, 0x02, 0x50, 0x0f, 0x12, 0x1c, 0x11, 0xe4, 0x12, 0x1a, 0x38, 0x05, 0x4d, 0x04, 80 0xea, 0xfe, 0xef, 0xc3, 0x94, 0x08, 0xee, 0x94, 0x01, 0x50, 0x02, 0x80, 0x04, 0x7e, 0x01, 0x7f,
81 0x12, 0x1c, 0x02, 0x80, 0xea, 0x12, 0x1c, 0x30, 0x90, 0xff, 0x00, 0xe0, 0xff, 0x54, 0x60, 0x24, 81 0x08, 0x8e, 0x3b, 0x8f, 0x3c, 0x90, 0xff, 0x02, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 0xec, 0xff, 0xea,
82 0xc0, 0x70, 0x03, 0x02, 0x08, 0xc5, 0x24, 0x40, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 82 0x90, 0xfa, 0xbd, 0xf0, 0xef, 0xa3, 0xf0, 0x12, 0x1c, 0xe0, 0xe4, 0xf5, 0x4d, 0xe5, 0x4d, 0xc3,
83 0xe0, 0xfe, 0x54, 0x0f, 0xf5, 0x4d, 0xee, 0x30, 0xe7, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x0a, 83 0x94, 0x02, 0x50, 0x0f, 0x12, 0x1c, 0xc1, 0xe4, 0x12, 0x1a, 0xe8, 0x05, 0x4d, 0x04, 0x12, 0x1c,
84 0x90, 0xff, 0x01, 0xe0, 0x12, 0x1b, 0x4c, 0x03, 0x56, 0x00, 0x04, 0x29, 0x01, 0x05, 0x3c, 0x03, 84 0xb2, 0x80, 0xea, 0x12, 0x1c, 0xe0, 0x90, 0xff, 0x00, 0xe0, 0xff, 0x54, 0x60, 0x24, 0xc0, 0x70,
85 0x06, 0x03, 0x05, 0x06, 0x45, 0x06, 0x07, 0xa7, 0x08, 0x07, 0xef, 0x09, 0x08, 0x4b, 0x0a, 0x08, 85 0x03, 0x02, 0x08, 0xf3, 0x24, 0x40, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0xfe,
86 0x8b, 0x0b, 0x00, 0x00, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 86 0x54, 0x0f, 0xf5, 0x4d, 0xee, 0x30, 0xe7, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x0a, 0x90, 0xff,
87 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x64, 0x02, 0x45, 87 0x01, 0xe0, 0x12, 0x1b, 0xfc, 0x03, 0x84, 0x00, 0x04, 0x57, 0x01, 0x05, 0x6a, 0x03, 0x06, 0x31,
88 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xef, 0x54, 0x1f, 0x14, 0x60, 0x2b, 0x14, 0x60, 0x47, 0x24, 88 0x05, 0x06, 0x73, 0x06, 0x07, 0xd5, 0x08, 0x08, 0x1d, 0x09, 0x08, 0x79, 0x0a, 0x08, 0xb9, 0x0b,
89 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xee, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0x11, 0x74, 89 0x00, 0x00, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0,
90 0x01, 0x12, 0x1a, 0x38, 0x78, 0x67, 0xe6, 0x30, 0xe0, 0x08, 0x12, 0x1c, 0x11, 0x74, 0x02, 0x12, 90 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x64, 0x02, 0x45, 0x3b, 0x60,
91 0x1a, 0x38, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe1, 0x09, 0x90, 0xfa, 0xb6, 0xe0, 91 0x03, 0x02, 0x0f, 0x6e, 0xef, 0x54, 0x1f, 0x14, 0x60, 0x2b, 0x14, 0x60, 0x47, 0x24, 0x02, 0x60,
92 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0xd3, 0x94, 0x01, 0x40, 0x03, 0x02, 0x0f, 92 0x03, 0x02, 0x0f, 0x6e, 0xee, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1c, 0xc1, 0x74, 0x01, 0x12,
93 0x26, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe1, 0x0e, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 93 0x1a, 0xe8, 0x78, 0x67, 0xe6, 0x30, 0xe0, 0x08, 0x12, 0x1c, 0xc1, 0x74, 0x02, 0x12, 0x1a, 0xe8,
94 0x60, 0x07, 0x64, 0x80, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0xb2, 0x40, 0x03, 0x02, 0x0f, 94 0x7f, 0x02, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x09, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03,
95 0x26, 0xe5, 0x4d, 0x70, 0x19, 0x30, 0x0a, 0x0b, 0x90, 0xff, 0x80, 0x12, 0x1c, 0x0e, 0x12, 0x1a, 95 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0xd3, 0x94, 0x01, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0x7f,
96 0x38, 0x80, 0x24, 0x90, 0xff, 0x82, 0x12, 0x1c, 0x0e, 0x12, 0x1a, 0x38, 0x80, 0x19, 0x15, 0x4d, 96 0x02, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x0e, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x60, 0x07,
97 0x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0x12, 0x1c, 0x0c, 0x12, 0x1a, 0x38, 0x80, 0x09, 0x12, 0x1c, 97 0x64, 0x80, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0xfa, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0xe5,
98 0xb3, 0x12, 0x1c, 0x0c, 0x12, 0x1a, 0x38, 0x12, 0x1c, 0x11, 0x12, 0x19, 0xf2, 0x60, 0x05, 0x74, 98 0x4d, 0x70, 0x19, 0x30, 0x0a, 0x0b, 0x90, 0xff, 0x80, 0x12, 0x1c, 0xbe, 0x12, 0x1a, 0xe8, 0x80,
99 0x01, 0x12, 0x1a, 0x38, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 99 0x24, 0x90, 0xff, 0x82, 0x12, 0x1c, 0xbe, 0x12, 0x1a, 0xe8, 0x80, 0x19, 0x15, 0x4d, 0x30, 0x0a,
100 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x14, 0x60, 0x2d, 100 0x0b, 0x12, 0x1d, 0x55, 0x12, 0x1c, 0xbc, 0x12, 0x1a, 0xe8, 0x80, 0x09, 0x12, 0x1d, 0x63, 0x12,
101 0x14, 0x60, 0x59, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x04, 101 0x1c, 0xbc, 0x12, 0x1a, 0xe8, 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xa2, 0x60, 0x05, 0x74, 0x01, 0x12,
102 0xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, 102 0x1a, 0xe8, 0x7f, 0x02, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5,
103 0x0f, 0x26, 0x78, 0x67, 0xe6, 0x54, 0xfe, 0xf6, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 103 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x14, 0x60, 0x2d, 0x14, 0x60,
104 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, 0x09, 0x90, 0xfa, 0xb6, 104 0x59, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x04, 0xa3, 0xe0,
105 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x0c, 0x90, 0xfa, 0xb6, 0xe0, 0xd3, 105 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e,
106 0x94, 0x01, 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xfa, 0xba, 0xe0, 106 0x78, 0x67, 0xe6, 0x54, 0xfe, 0xf6, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x06,
107 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0xb2, 0x40, 0x03, 0x02, 0x0f, 107 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe0, 0x09, 0x90, 0xfa, 0xb9, 0xe0, 0x60,
108 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, 108 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe1, 0x0c, 0x90, 0xfa, 0xb9, 0xe0, 0xd3, 0x94, 0x01,
109 0x07, 0xe5, 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x4d, 0x70, 0x0f, 0x90, 0xff, 0x82, 0xe0, 109 0x40, 0x03, 0x02, 0x0f, 0x6e, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02,
110 0x54, 0xf7, 0xf0, 0x90, 0xff, 0x80, 0xe0, 0x54, 0xf7, 0xf0, 0x22, 0xe5, 0x4d, 0x24, 0xfe, 0x60, 110 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0xfa, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0xe5,
111 0x20, 0x24, 0xfb, 0x60, 0x34, 0x24, 0x06, 0x70, 0x35, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 111 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe0, 0x07, 0xe5,
112 0xfd, 0x7f, 0x03, 0x12, 0x2d, 0xa8, 0x80, 0x26, 0xe4, 0xfd, 0x7f, 0x03, 0x12, 0x2d, 0xa8, 0x80, 112 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x4d, 0x70, 0x0f, 0x90, 0xff, 0x82, 0xe0, 0x54, 0xf7,
113 0x1d, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 0xfd, 0x7f, 0x04, 0x12, 0x2d, 0xa8, 0x80, 0x0e, 113 0xf0, 0x90, 0xff, 0x80, 0xe0, 0x54, 0xf7, 0xf0, 0x22, 0xe5, 0x4d, 0x24, 0xfe, 0x60, 0x20, 0x24,
114 0xe4, 0xfd, 0x7f, 0x04, 0x12, 0x2d, 0xa8, 0x80, 0x05, 0x7f, 0x87, 0x12, 0x31, 0x32, 0x15, 0x4d, 114 0xfb, 0x60, 0x34, 0x24, 0x06, 0x70, 0x35, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 0xfd, 0x7f,
115 0x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0x80, 0x09, 0x12, 0x1c, 115 0x03, 0x12, 0x2e, 0x79, 0x80, 0x26, 0xe4, 0xfd, 0x7f, 0x03, 0x12, 0x2e, 0x79, 0x80, 0x1d, 0x30,
116 0xb3, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 116 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 0xfd, 0x7f, 0x04, 0x12, 0x2e, 0x79, 0x80, 0x0e, 0xe4, 0xfd,
117 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 117 0x7f, 0x04, 0x12, 0x2e, 0x79, 0x80, 0x05, 0x7f, 0x87, 0x12, 0x31, 0xef, 0x15, 0x4d, 0x30, 0x0a,
118 0x14, 0x60, 0x2d, 0x14, 0x60, 0x55, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 118 0x0b, 0x12, 0x1d, 0x55, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0x80, 0x09, 0x12, 0x1d, 0x63, 0xf5,
119 0xe0, 0x70, 0x04, 0xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 119 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02,
120 0x60, 0x03, 0x02, 0x0f, 0x26, 0x78, 0x67, 0xe6, 0x44, 0x01, 0xf6, 0xe4, 0xff, 0x02, 0x31, 0xb1, 120 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x14, 0x60,
121 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, 0x07, 121 0x2d, 0x14, 0x60, 0x55, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70,
122 0xe5, 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x0a, 0xe5, 0x4d, 0xd3, 0x94, 122 0x04, 0xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03,
123 0x01, 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xfa, 0xba, 0xe0, 0x70, 123 0x02, 0x0f, 0x6e, 0x78, 0x67, 0xe6, 0x44, 0x01, 0xf6, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35,
124 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x12, 0x31, 0x82, 124 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe0, 0x07, 0xe5, 0x4d,
125 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 125 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe1, 0x0a, 0xe5, 0x4d, 0xd3, 0x94, 0x01, 0x40,
126 0xe5, 0x4d, 0x70, 0x09, 0x30, 0x0a, 0x03, 0x02, 0x1d, 0x64, 0x02, 0x1d, 0x2f, 0xe5, 0x35, 0x20, 126 0x03, 0x02, 0x0f, 0x6e, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02, 0xa3,
127 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x15, 0x4d, 0x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0xf5, 0x83, 0xe0, 127 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x12, 0x32, 0x3f, 0x40, 0x03,
128 0x44, 0x08, 0xf0, 0x80, 0x09, 0x12, 0x1c, 0xb3, 0xf5, 0x83, 0xe0, 0x44, 0x08, 0xf0, 0xe4, 0xff, 128 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x4d,
129 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 129 0x70, 0x09, 0x30, 0x0a, 0x03, 0x02, 0x1e, 0x14, 0x02, 0x1d, 0xdf, 0xe5, 0x35, 0x20, 0xe1, 0x03,
130 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 130 0x02, 0x0f, 0x6e, 0x15, 0x4d, 0x30, 0x0a, 0x0b, 0x12, 0x1d, 0x55, 0xf5, 0x83, 0xe0, 0x44, 0x08,
131 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xbb, 131 0xf0, 0x80, 0x09, 0x12, 0x1d, 0x63, 0xf5, 0x83, 0xe0, 0x44, 0x08, 0xf0, 0xe4, 0xff, 0x02, 0x32,
132 0xe0, 0x90, 0xff, 0xff, 0xf0, 0xe0, 0x60, 0x05, 0x43, 0x35, 0x01, 0x80, 0x03, 0x53, 0x35, 0xfe, 132 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02,
133 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 133 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x60, 0x03,
134 0x3b, 0x70, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 134 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe1, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbe, 0xe0, 0x90,
135 0xba, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0x24, 0xfe, 0x60, 0x3a, 0x14, 0x60, 0x75, 0x24, 0x02, 135 0xff, 0xff, 0xf0, 0xe0, 0x60, 0x05, 0x43, 0x35, 0x01, 0x80, 0x03, 0x53, 0x35, 0xfe, 0xe4, 0xff,
136 0x60, 0x03, 0x02, 0x0f, 0x26, 0xed, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0x30, 0x12, 0x1d, 136 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x70,
137 0x5d, 0x7d, 0x03, 0x12, 0x0f, 0x6d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0x2a, 0x90, 0xfa, 137 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0,
138 0xb3, 0xe0, 0xfd, 0xa3, 0x12, 0x1c, 0x7b, 0x12, 0x0f, 0x89, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 138 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0x24, 0xfe, 0x60, 0x3a, 0x14, 0x60, 0x75, 0x24, 0x02, 0x60, 0x03,
139 0xaf, 0x3c, 0x02, 0x0f, 0xba, 0x12, 0x1c, 0x30, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe4, 0x0d, 0x12, 139 0x02, 0x0f, 0x6e, 0xed, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1c, 0xe0, 0x12, 0x1e, 0x0d, 0x7d,
140 0x1d, 0x5d, 0x7d, 0x14, 0x12, 0x0f, 0x6d, 0x60, 0x10, 0x02, 0x0f, 0x26, 0x12, 0x1d, 0x5d, 0x7d, 140 0x03, 0x12, 0x0f, 0xb5, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0x72, 0x90, 0xfa, 0xb6, 0xe0,
141 0x04, 0x12, 0x0f, 0xc1, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0x2a, 0x90, 0xfa, 0xb3, 0xe0, 141 0xfd, 0xa3, 0x12, 0x1d, 0x2b, 0x12, 0x0f, 0xd1, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c,
142 0xfd, 0xa3, 0x12, 0x1c, 0x7b, 0x12, 0x0f, 0x89, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 142 0x02, 0x10, 0x02, 0x12, 0x1c, 0xe0, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe4, 0x0d, 0x12, 0x1e, 0x0d,
143 0x02, 0x0f, 0xba, 0x12, 0x1d, 0x5d, 0x7d, 0x05, 0x12, 0x0f, 0xc1, 0x60, 0x03, 0x02, 0x0f, 0x26, 143 0x7d, 0x14, 0x12, 0x0f, 0xb5, 0x60, 0x10, 0x02, 0x0f, 0x6e, 0x12, 0x1e, 0x0d, 0x7d, 0x04, 0x12,
144 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb3, 0x12, 0x1c, 0x78, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, 144 0x10, 0x09, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0x72, 0x90, 0xfa, 0xb6, 0xe0, 0xfd, 0xa3,
145 0xb4, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xbb, 0xe0, 0x90, 0xfa, 0xb2, 0xf0, 145 0x12, 0x1d, 0x2b, 0x12, 0x0f, 0xd1, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 0x02, 0x10,
146 0xe4, 0xf5, 0x4c, 0x90, 0xfa, 0xb2, 0xe0, 0xff, 0xe5, 0x4c, 0xc3, 0x9f, 0x50, 0x24, 0x12, 0x1c, 146 0x02, 0x12, 0x1e, 0x0d, 0x7d, 0x05, 0x12, 0x10, 0x09, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x7b, 0x01,
147 0x72, 0x12, 0x0f, 0xcc, 0xff, 0xfd, 0x90, 0xfa, 0xb4, 0xe4, 0x8d, 0xf0, 0x12, 0x1a, 0x6c, 0x90, 147 0x7a, 0xfa, 0x79, 0xb6, 0x12, 0x1d, 0x28, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xb7, 0xe4,
148 0xfa, 0xb3, 0xe0, 0xc3, 0x9f, 0xf0, 0xd3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x0f, 0x26, 0x05, 0x4c, 148 0x75, 0xf0, 0x03, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xbe, 0xe0, 0x90, 0xfa, 0xb5, 0xf0, 0xe4, 0xf5,
149 0x80, 0xd1, 0x12, 0x1c, 0x72, 0x12, 0x0f, 0xcc, 0x24, 0xfe, 0xff, 0x90, 0xfa, 0xb3, 0xf0, 0xfd, 149 0x4c, 0x90, 0xfa, 0xb5, 0xe0, 0xff, 0xe5, 0x4c, 0xc3, 0x9f, 0x50, 0x24, 0x12, 0x1d, 0x22, 0x12,
150 0xa3, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1a, 0x6c, 0x7a, 0xf9, 0x79, 0x6f, 0x7b, 0x01, 0x8b, 0x36, 150 0x10, 0x14, 0xff, 0xfd, 0x90, 0xfa, 0xb7, 0xe4, 0x8d, 0xf0, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xb6,
151 0x8a, 0x37, 0x89, 0x38, 0xe9, 0x24, 0x02, 0xf9, 0xe4, 0x3a, 0xfa, 0x12, 0x1c, 0x78, 0x12, 0x25, 151 0xe0, 0xc3, 0x9f, 0xf0, 0xd3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x0f, 0x6e, 0x05, 0x4c, 0x80, 0xd1,
152 0xd7, 0x8f, 0x4c, 0x05, 0x4c, 0x05, 0x4c, 0x12, 0x1c, 0x11, 0xe5, 0x4c, 0x12, 0x1a, 0x38, 0x12, 152 0x12, 0x1d, 0x22, 0x12, 0x10, 0x14, 0x24, 0xfe, 0xff, 0x90, 0xfa, 0xb6, 0xf0, 0xfd, 0xa3, 0xe4,
153 0x1c, 0x11, 0x90, 0x00, 0x01, 0x74, 0x03, 0x12, 0x1a, 0x4a, 0xaf, 0x4c, 0x7e, 0x00, 0xc3, 0xef, 153 0x75, 0xf0, 0x02, 0x12, 0x1b, 0x1c, 0x7a, 0xf9, 0x79, 0x72, 0x7b, 0x01, 0x8b, 0x36, 0x8a, 0x37,
154 0x95, 0x3c, 0xee, 0x95, 0x3b, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 0x8e, 0x39, 0x8f, 154 0x89, 0x38, 0xe9, 0x24, 0x02, 0xf9, 0xe4, 0x3a, 0xfa, 0x12, 0x1d, 0x28, 0x12, 0x26, 0x98, 0x8f,
155 0x3a, 0x02, 0x2c, 0x07, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 155 0x4c, 0x05, 0x4c, 0x05, 0x4c, 0x12, 0x1c, 0xc1, 0xe5, 0x4c, 0x12, 0x1a, 0xe8, 0x12, 0x1c, 0xc1,
156 0x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 156 0x90, 0x00, 0x01, 0x74, 0x03, 0x12, 0x1a, 0xfa, 0xaf, 0x4c, 0x7e, 0x00, 0xc3, 0xef, 0x95, 0x3c,
157 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 157 0xee, 0x95, 0x3b, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 0x8e, 0x39, 0x8f, 0x3a, 0x02,
158 0x12, 0x1c, 0xc9, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 158 0x2c, 0xd8, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x64,
159 0x02, 0x0f, 0x26, 0x75, 0x36, 0x00, 0x75, 0x37, 0x00, 0x75, 0x38, 0x32, 0x02, 0x0f, 0xa9, 0xe5, 159 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f,
160 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 160 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d,
161 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xd3, 0x90, 0xfa, 0xbb, 0xe0, 0x94, 0x01, 161 0x79, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 0x02, 0x0f,
162 0x90, 0xfa, 0xba, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x60, 0x03, 162 0x6e, 0x75, 0x36, 0x00, 0x75, 0x37, 0x00, 0x75, 0x38, 0x32, 0x02, 0x0f, 0xf1, 0xe5, 0x35, 0x30,
163 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 163 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa,
164 0xbb, 0xe0, 0xf5, 0x32, 0xe5, 0x32, 0x70, 0x08, 0x43, 0x35, 0x01, 0x53, 0x35, 0xfd, 0x80, 0x06, 164 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xd3, 0x90, 0xfa, 0xbe, 0xe0, 0x94, 0x01, 0x90, 0xfa,
165 0x53, 0x35, 0xfe, 0x43, 0x35, 0x02, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe7, 0x03, 165 0xbd, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x60, 0x03, 0x02, 0x0f,
166 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 166 0x6e, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbe, 0xe0,
167 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 167 0xf5, 0x32, 0xe5, 0x32, 0x70, 0x08, 0x43, 0x35, 0x01, 0x53, 0x35, 0xfd, 0x80, 0x06, 0x53, 0x35,
168 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 168 0xfe, 0x43, 0x35, 0x02, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f,
169 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x7f, 0x01, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, 169 0x6e, 0xe5, 0x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0,
170 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xd3, 0x90, 0xfa, 0xbb, 170 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02,
171 0xe0, 0x94, 0x00, 0x90, 0xfa, 0xba, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 171 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe1,
172 0xc9, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, 172 0x03, 0x02, 0x0f, 0x6e, 0x7f, 0x01, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f,
173 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xff, 0x01, 0x12, 0x1d, 0x74, 0xef, 0x12, 0x1a, 0x38, 0x90, 173 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xd3, 0x90, 0xfa, 0xbe, 0xe0, 0x94,
174 0xfa, 0xb6, 0x12, 0x1d, 0x74, 0x90, 0x00, 0x01, 0xef, 0x12, 0x1a, 0x4a, 0x90, 0x00, 0x02, 0xe4, 174 0x00, 0x90, 0xfa, 0xbd, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x64,
175 0x12, 0x1a, 0x4a, 0x74, 0x03, 0x12, 0x1c, 0x02, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0xa3, 0xe0, 0x85, 175 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x6e, 0xe4, 0xff,
176 0x38, 0x82, 0x85, 0x37, 0x83, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff, 0x01, 0xe0, 0x12, 0x1b, 176 0x02, 0x32, 0x6e, 0x90, 0xff, 0x01, 0x12, 0x1e, 0x24, 0xef, 0x12, 0x1a, 0xe8, 0x90, 0xfa, 0xb9,
177 0x4c, 0x09, 0x4a, 0x02, 0x09, 0x6c, 0x04, 0x09, 0x8e, 0x05, 0x09, 0xba, 0x06, 0x09, 0xd8, 0x07, 177 0x12, 0x1e, 0x24, 0x90, 0x00, 0x01, 0xef, 0x12, 0x1a, 0xfa, 0x90, 0x00, 0x02, 0xe4, 0x12, 0x1a,
178 0x09, 0xf6, 0x08, 0x0a, 0x14, 0x09, 0x0a, 0x32, 0x0b, 0x0a, 0xe7, 0x80, 0x0d, 0x6f, 0x81, 0x0d, 178 0xfa, 0x74, 0x03, 0x12, 0x1c, 0xb2, 0x90, 0xfa, 0xbd, 0xe0, 0xff, 0xa3, 0xe0, 0x85, 0x38, 0x82,
179 0xa0, 0x82, 0x0b, 0x2e, 0x83, 0x0b, 0x77, 0x84, 0x0b, 0x96, 0x85, 0x0b, 0xdb, 0x86, 0x0c, 0x26, 179 0x85, 0x37, 0x83, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff, 0x01, 0xe0, 0x12, 0x1b, 0xfc, 0x09,
180 0x87, 0x0c, 0xb7, 0x88, 0x0d, 0x42, 0x89, 0x0a, 0x50, 0x92, 0x0a, 0x50, 0x93, 0x0e, 0x53, 0xc0, 180 0x7b, 0x02, 0x09, 0x9d, 0x04, 0x09, 0xbf, 0x05, 0x09, 0xeb, 0x06, 0x0a, 0x09, 0x07, 0x0a, 0x27,
181 0x0e, 0x7f, 0xc1, 0x0e, 0x90, 0xc2, 0x00, 0x00, 0x0f, 0x15, 0xe5, 0x35, 0x20, 0xe7, 0x05, 0x7f, 181 0x08, 0x0a, 0x45, 0x09, 0x0a, 0x63, 0x0b, 0x0b, 0x18, 0x80, 0x0d, 0xb7, 0x81, 0x0d, 0xe8, 0x82,
182 0x05, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 182 0x0b, 0x5f, 0x83, 0x0b, 0xa8, 0x84, 0x0b, 0xc7, 0x85, 0x0c, 0x0c, 0x86, 0x0c, 0x57, 0x87, 0x0c,
183 0x7f, 0x07, 0x02, 0x11, 0x16, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0x18, 0xe5, 0x35, 0x20, 0xe7, 183 0xe8, 0x88, 0x0d, 0x73, 0x89, 0x0a, 0x81, 0x92, 0x0a, 0x81, 0x93, 0x0d, 0xa0, 0xb0, 0x0e, 0x9b,
184 0x05, 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 184 0xc0, 0x0e, 0xc7, 0xc1, 0x0e, 0xd8, 0xc2, 0x00, 0x00, 0x0f, 0x5d, 0xe5, 0x35, 0x20, 0xe7, 0x05,
185 0x7c, 0x00, 0x7f, 0x0c, 0x02, 0x11, 0x16, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0x18, 0xe5, 0x35, 185 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c,
186 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1d, 0x92, 0x50, 0x06, 0xe5, 0x3c, 0x45, 0x3b, 0x70, 186 0x00, 0x7f, 0x07, 0x02, 0x11, 0x5e, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0xb4, 0xe5, 0x35, 0x20,
187 0x05, 0x7f, 0x02, 0x02, 0x30, 0xec, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfe, 0x24, 0xfd, 0x50, 0x02, 187 0xe7, 0x05, 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef,
188 0x80, 0x03, 0x02, 0x31, 0x6f, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 188 0xfd, 0x7c, 0x00, 0x7f, 0x0c, 0x02, 0x11, 0x5e, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0xb4, 0xe5,
189 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x08, 189 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12, 0x1e, 0x42, 0x50, 0x06, 0xe5, 0x3c, 0x45, 0x3b,
190 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 190 0x70, 0x05, 0x7f, 0x02, 0x02, 0x31, 0xa9, 0x90, 0xfa, 0xb9, 0xe0, 0x24, 0xfe, 0x24, 0xfd, 0x50,
191 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x09, 0x02, 0x11, 191 0x02, 0x80, 0x03, 0x02, 0x32, 0x2c, 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03,
192 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, 192 0x02, 0x0f, 0x71, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f,
193 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0a, 0x02, 0x11, 0x16, 0x7f, 193 0x08, 0x02, 0x11, 0x5e, 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f,
194 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, 194 0x71, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x09, 0x02,
195 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0b, 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02, 195 0x11, 0x5e, 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12,
196 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 196 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0a, 0x02, 0x11, 0x5e,
197 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0e, 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec, 197 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12, 0x1d, 0x71,
198 0xe5, 0x35, 0x30, 0xe7, 0x56, 0x12, 0x1c, 0xc9, 0x70, 0x4a, 0x90, 0xff, 0x02, 0xe0, 0xf5, 0x4c, 198 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0b, 0x02, 0x11, 0x5e, 0x7f, 0x07,
199 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5, 0x4c, 0xb4, 0x83, 0x05, 0x75, 199 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12, 0x1d, 0x71, 0x60, 0x03,
200 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5, 0x4c, 0x12, 0x1b, 0x72, 0x12, 200 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0e, 0x02, 0x11, 0x5e, 0x7f, 0x07, 0x02, 0x31,
201 0x1d, 0x8b, 0x12, 0x25, 0x39, 0x12, 0x1c, 0xd9, 0x12, 0x1a, 0x0b, 0x60, 0x05, 0x12, 0x31, 0xbd, 201 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x56, 0x12, 0x1d, 0x79, 0x70, 0x4a, 0x90, 0xff, 0x02, 0xe0, 0xf5,
202 0x80, 0x06, 0x85, 0x33, 0x39, 0x85, 0x34, 0x3a, 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38, 202 0x4c, 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5, 0x4c, 0xb4, 0x83, 0x05,
203 0x72, 0x02, 0x2c, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 0x18, 0x12, 0x1c, 0xc9, 0x60, 0x05, 203 0x75, 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5, 0x4c, 0x12, 0x1c, 0x22,
204 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x1d, 0x92, 0x40, 0x05, 0x7f, 0x03, 0x02, 0x30, 0xec, 0x90, 204 0x12, 0x1e, 0x3b, 0x12, 0x25, 0xfa, 0x12, 0x1d, 0x89, 0x12, 0x1a, 0xbb, 0x60, 0x05, 0x12, 0x32,
205 0xff, 0x02, 0xe0, 0xf5, 0x4c, 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5, 205 0x7a, 0x80, 0x06, 0x85, 0x33, 0x39, 0x85, 0x34, 0x3a, 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75,
206 0x4c, 0xb4, 0x83, 0x05, 0x75, 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5, 206 0x38, 0x75, 0x02, 0x2c, 0xd8, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 0xb4, 0x12, 0x1d, 0x79, 0x60,
207 0x4c, 0x12, 0x1b, 0x72, 0x02, 0x31, 0x6f, 0x12, 0x1d, 0x9c, 0x12, 0x2a, 0x06, 0x12, 0x1c, 0x83, 207 0x05, 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x1e, 0x42, 0x40, 0x05, 0x7f, 0x03, 0x02, 0x31, 0xa9,
208 0xe0, 0x54, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x90, 0xfa, 0xb7, 0xf0, 0x78, 0x68, 0x12, 0x1b, 208 0x90, 0xff, 0x02, 0xe0, 0xf5, 0x4c, 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12,
209 0x28, 0x90, 0x00, 0x02, 0x12, 0x1a, 0x0b, 0x30, 0xe7, 0xf2, 0x90, 0x00, 0x02, 0xe4, 0x12, 0x1a, 209 0xe5, 0x4c, 0xb4, 0x83, 0x05, 0x75, 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04,
210 0x4a, 0x90, 0xfa, 0xb7, 0xe0, 0x44, 0x80, 0xff, 0xf0, 0x78, 0x7c, 0xe6, 0xfc, 0x08, 0xe6, 0x8c, 210 0xf5, 0x4c, 0x12, 0x1c, 0x22, 0x02, 0x32, 0x2c, 0x12, 0x1e, 0x4c, 0x12, 0x2a, 0xc7, 0x12, 0x1d,
211 0x83, 0x12, 0x1c, 0x8b, 0xef, 0xf0, 0x12, 0x31, 0xc7, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x90, 0xfa, 211 0x33, 0xe0, 0x54, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x90, 0xfa, 0xba, 0xf0, 0x78, 0x68, 0x12,
212 0xb6, 0xe0, 0x64, 0x01, 0x70, 0x1f, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3, 212 0x1b, 0xd8, 0x90, 0x00, 0x02, 0x12, 0x1a, 0xbb, 0x30, 0xe7, 0xf2, 0x90, 0x00, 0x02, 0xe4, 0x12,
213 0xe0, 0xf5, 0x90, 0x80, 0x2d, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0x90, 0x90, 0xfa, 0xbb, 0xe0, 0x42, 213 0x1a, 0xfa, 0x90, 0xfa, 0xba, 0xe0, 0x44, 0x80, 0xff, 0xf0, 0x78, 0x7c, 0xe6, 0xfc, 0x08, 0xe6,
214 0x90, 0xd2, 0xaf, 0x80, 0x1d, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3, 0xe0, 214 0x8c, 0x83, 0x12, 0x1d, 0x3b, 0xef, 0xf0, 0x12, 0x32, 0x84, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x90,
215 0xf5, 0xb0, 0x80, 0x0e, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0xb0, 0x90, 0xfa, 0xbb, 0xe0, 0x42, 0xb0, 215 0xfa, 0xb9, 0xe0, 0x64, 0x01, 0x70, 0x1f, 0x90, 0xfa, 0xbd, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06,
216 0xd2, 0xaf, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0x30, 0x90, 0xfa, 0xb6, 0xe0, 0xb4, 0x01, 216 0xa3, 0xe0, 0xf5, 0x90, 0x80, 0x2d, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0x90, 0x90, 0xfa, 0xbe, 0xe0,
217 0x0a, 0x12, 0x1c, 0x11, 0xe5, 0x90, 0x12, 0x1a, 0x38, 0x80, 0x08, 0x12, 0x1c, 0x11, 0xe5, 0xb0, 217 0x42, 0x90, 0xd2, 0xaf, 0x80, 0x1d, 0x90, 0xfa, 0xbd, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3,
218 0x12, 0x1a, 0x38, 0x02, 0x0f, 0xa9, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x24, 0x12, 0x12, 0x1c, 0x41, 218 0xe0, 0xf5, 0xb0, 0x80, 0x0e, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0xb0, 0x90, 0xfa, 0xbe, 0xe0, 0x42,
219 0x20, 0xe1, 0x33, 0x12, 0x1c, 0xd0, 0xef, 0x24, 0xfc, 0x60, 0x18, 0x04, 0x70, 0x28, 0x90, 0xfa, 219 0xb0, 0xd2, 0xaf, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1c, 0xe0, 0x90, 0xfa, 0xb9, 0xe0, 0xb4,
220 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x19, 0x12, 0x1d, 0xa6, 220 0x01, 0x0a, 0x12, 0x1c, 0xc1, 0xe5, 0x90, 0x12, 0x1a, 0xe8, 0x80, 0x08, 0x12, 0x1c, 0xc1, 0xe5,
221 0xf0, 0x80, 0x13, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0xf0, 221 0xb0, 0x12, 0x1a, 0xe8, 0x02, 0x0f, 0xf1, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x24, 0x13, 0x12, 0x1c,
222 0x80, 0x04, 0x12, 0x1d, 0xad, 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 222 0xf1, 0x20, 0xe1, 0x33, 0x12, 0x1d, 0x80, 0xef, 0x24, 0xfc, 0x60, 0x18, 0x04, 0x70, 0x28, 0x90,
223 0x24, 0x12, 0x12, 0x1c, 0x41, 0x20, 0xe1, 0x39, 0x12, 0x1c, 0xd0, 0xef, 0x24, 0xfc, 0x60, 0x1b, 223 0xfa, 0xba, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x19, 0x12, 0x1e,
224 0x04, 0x70, 0x2e, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, 0xf0, 224 0x56, 0xf0, 0x80, 0x13, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10,
225 0x80, 0x1f, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x16, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 225 0xf0, 0x80, 0x04, 0x12, 0x1e, 0x5d, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x90, 0xfa, 0xb9, 0xe0,
226 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf, 226 0xff, 0x24, 0x13, 0x12, 0x1c, 0xf1, 0x20, 0xe1, 0x39, 0x12, 0x1d, 0x80, 0xef, 0x24, 0xfc, 0x60,
227 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x12, 0x1c, 0xc1, 0x60, 0x4d, 0x04, 0x60, 227 0x1b, 0x04, 0x70, 0x2e, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20,
228 0x03, 0x02, 0x0c, 0xb2, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x0f, 0x90, 0xff, 0xa4, 0x12, 0x1c, 0x3a, 228 0xf0, 0x80, 0x1f, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x16, 0x90, 0xfa, 0xba, 0xe0,
229 0x30, 0xe1, 0x6f, 0x12, 0x1d, 0x7c, 0x02, 0x0c, 0xb2, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfb, 0x12, 229 0x60, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54,
230 0x1c, 0x3d, 0xfe, 0x30, 0xe1, 0x5c, 0x30, 0xe2, 0x11, 0x30, 0xb4, 0x05, 0x12, 0x1d, 0x7c, 0x80, 230 0xdf, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x12, 0x1d, 0x71, 0x60, 0x4d, 0x04,
231 0x51, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x48, 0x30, 0x95, 0x05, 0x12, 0x1d, 0x7c, 231 0x60, 0x03, 0x02, 0x0c, 0xe3, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x0f, 0x90, 0xff, 0xa4, 0x12, 0x1c,
232 0x80, 0x40, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x37, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 232 0xea, 0x30, 0xe1, 0x6f, 0x12, 0x1e, 0x2c, 0x02, 0x0c, 0xe3, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfb,
233 0x12, 0x90, 0xff, 0xb4, 0x12, 0x1c, 0x3a, 0x30, 0xe1, 0x28, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02, 233 0x12, 0x1c, 0xed, 0xfe, 0x30, 0xe1, 0x5c, 0x30, 0xe2, 0x11, 0x30, 0xb4, 0x05, 0x12, 0x1e, 0x2c,
234 0xf0, 0x80, 0x1f, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xfb, 0x12, 0x1c, 0x3d, 0x30, 0xe1, 0x13, 0x30, 234 0x80, 0x51, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x48, 0x30, 0x95, 0x05, 0x12, 0x1e,
235 0x93, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, 235 0x2c, 0x80, 0x40, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x37, 0x90, 0xfa, 0xba, 0xe0,
236 0xfd, 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfc, 236 0x60, 0x12, 0x90, 0xff, 0xb4, 0x12, 0x1c, 0xea, 0x30, 0xe1, 0x28, 0x90, 0xff, 0xb4, 0xe0, 0x44,
237 0x60, 0x40, 0x04, 0x70, 0x78, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xa2, 0xe0, 0x44, 237 0x02, 0xf0, 0x80, 0x1f, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xfb, 0x12, 0x1c, 0xed, 0x30, 0xe1, 0x13,
238 0x40, 0xf0, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x65, 0xd2, 0x03, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90, 238 0x30, 0x93, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0,
239 0xff, 0xa3, 0xef, 0x54, 0x7f, 0xf0, 0x80, 0x55, 0x30, 0x03, 0x0e, 0x90, 0xff, 0xa3, 0xe0, 0x44, 239 0x54, 0xfd, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x90, 0xfa, 0xb9, 0xe0, 0x24,
240 0x80, 0xf0, 0xc2, 0x03, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x54, 0xbf, 0xf0, 240 0xfc, 0x60, 0x40, 0x04, 0x70, 0x78, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xa2, 0xe0,
241 0x80, 0x3b, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xb2, 0xe0, 0x44, 0x40, 0xf0, 0xa3, 241 0x44, 0x40, 0xf0, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x65, 0xd2, 0x03, 0xa3, 0xe0, 0x54, 0xdf, 0xf0,
242 0xe0, 0xff, 0x30, 0xe7, 0x28, 0xd2, 0x04, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90, 0xff, 0xb3, 0xef, 242 0x90, 0xff, 0xa3, 0xef, 0x54, 0x7f, 0xf0, 0x80, 0x55, 0x30, 0x03, 0x0e, 0x90, 0xff, 0xa3, 0xe0,
243 0x54, 0x7f, 0xf0, 0x80, 0x18, 0x30, 0x04, 0x0e, 0x90, 0xff, 0xb3, 0xe0, 0x44, 0x80, 0xf0, 0xc2, 243 0x44, 0x80, 0xf0, 0xc2, 0x03, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x54, 0xbf,
244 0x04, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x54, 0xbf, 0xf0, 0xe4, 0xff, 0x02, 244 0xf0, 0x80, 0x3b, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xb2, 0xe0, 0x44, 0x40, 0xf0,
245 0x30, 0xec, 0x12, 0x1c, 0x30, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfc, 0x60, 0x0f, 0x04, 0x70, 0x16, 245 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x28, 0xd2, 0x04, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90, 0xff, 0xb3,
246 0x90, 0xff, 0xa6, 0xe0, 0x12, 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x80, 0x0a, 0x90, 0xff, 0xb6, 0xe0, 246 0xef, 0x54, 0x7f, 0xf0, 0x80, 0x18, 0x30, 0x04, 0x0e, 0x90, 0xff, 0xb3, 0xe0, 0x44, 0x80, 0xf0,
247 0x12, 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 0x2c, 0x07, 0xe4, 247 0xc2, 0x04, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x54, 0xbf, 0xf0, 0xe4, 0xff,
248 0xff, 0x12, 0x30, 0xec, 0x12, 0x1d, 0x37, 0x7f, 0x03, 0x12, 0x12, 0x19, 0x90, 0xf9, 0x15, 0xe0, 248 0x02, 0x31, 0xa9, 0x12, 0x1c, 0xe0, 0x90, 0xfa, 0xb9, 0xe0, 0x24, 0xfc, 0x60, 0x0f, 0x04, 0x70,
249 0x30, 0xe4, 0x08, 0x90, 0xff, 0x93, 0x74, 0x80, 0xf0, 0x80, 0x10, 0x90, 0xff, 0xfc, 0xe0, 0x54, 249 0x16, 0x90, 0xff, 0xa6, 0xe0, 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xe8, 0x80, 0x0a, 0x90, 0xff, 0xb6,
250 0x7f, 0xf0, 0x7f, 0xff, 0x7e, 0x00, 0x12, 0x30, 0x16, 0xc2, 0x90, 0xc2, 0xaf, 0x00, 0x80, 0xfd, 250 0xe0, 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xe8, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 0x2c, 0xd8,
251 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x90, 0xfa, 0xbc, 0x74, 0x3e, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0xfa, 251 0x90, 0xf9, 0x15, 0x74, 0x01, 0xf0, 0x90, 0xf9, 0x1c, 0x74, 0x19, 0xf0, 0x90, 0xf9, 0x66, 0x74,
252 0xb4, 0xf0, 0xa3, 0x74, 0x15, 0xf0, 0xe0, 0x54, 0x3f, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0xfa, 252 0xff, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0xe4, 0xff, 0x12, 0x31, 0xa9, 0x12, 0x1d, 0xe7, 0x7f,
253 0xb9, 0xf0, 0xd3, 0x94, 0x00, 0xe4, 0x94, 0x3e, 0x40, 0x08, 0x90, 0xfa, 0xbd, 0xe0, 0x90, 0xfa, 253 0x03, 0x12, 0x12, 0x61, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe4, 0x08, 0x90, 0xff, 0x93, 0x74, 0x80,
254 0xb9, 0xf0, 0x12, 0x0f, 0x50, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x73, 0x12, 0x1c, 0x4a, 0x90, 0xfa, 254 0xf0, 0x80, 0x10, 0x90, 0xff, 0xfc, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0xff, 0x7e, 0x00, 0x12, 0x30,
255 0xbc, 0x12, 0x1d, 0x56, 0x60, 0x27, 0xd3, 0xef, 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x08, 0x90, 255 0xd3, 0xc2, 0x90, 0xc2, 0xaf, 0x00, 0x80, 0xfd, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x90, 0xfa, 0xbf,
256 0xfa, 0xb9, 0x74, 0x40, 0xf0, 0x80, 0x08, 0x90, 0xfa, 0xbd, 0xe0, 0x90, 0xfa, 0xb9, 0xf0, 0x12, 256 0x74, 0x3e, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0xfa, 0xb7, 0xf0, 0xa3, 0x74, 0x15, 0xf0, 0xe0, 0x54,
257 0x0f, 0x50, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x46, 0x12, 0x1c, 0x4a, 0x80, 0xd1, 0x75, 0x4c, 0x02, 257 0x3f, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0xfa, 0xbc, 0xf0, 0xd3, 0x94, 0x00, 0xe4, 0x94, 0x3e,
258 0x90, 0xfa, 0xbc, 0xe4, 0xf0, 0xa3, 0x04, 0xf0, 0x90, 0xfa, 0xb4, 0xe4, 0xf0, 0xa3, 0x74, 0x0f, 258 0x40, 0x08, 0x90, 0xfa, 0xc0, 0xe0, 0x90, 0xfa, 0xbc, 0xf0, 0x12, 0x0f, 0x98, 0xe5, 0x31, 0x45,
259 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0x90, 0xfa, 0xbd, 0xe0, 0xf5, 0x4a, 0x7d, 0x0f, 0x7c, 259 0x30, 0x70, 0x73, 0x12, 0x1c, 0xfa, 0x90, 0xfa, 0xbf, 0x12, 0x1e, 0x06, 0x60, 0x27, 0xd3, 0xef,
260 0x00, 0x12, 0x28, 0x9f, 0x75, 0x30, 0x00, 0x8f, 0x31, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0xe4, 260 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x08, 0x90, 0xfa, 0xbc, 0x74, 0x40, 0xf0, 0x80, 0x08, 0x90,
261 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xaf, 0x31, 261 0xfa, 0xc0, 0xe0, 0x90, 0xfa, 0xbc, 0xf0, 0x12, 0x0f, 0x98, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x46,
262 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x30, 0xe7, 0x10, 0xe0, 0x54, 0x0f, 0x90, 0xf9, 0x64, 0xf0, 262 0x12, 0x1c, 0xfa, 0x80, 0xd1, 0x75, 0x4c, 0x02, 0x90, 0xfa, 0xbf, 0xe4, 0xf0, 0xa3, 0x04, 0xf0,
263 0xd3, 0x94, 0x00, 0x40, 0x15, 0xc2, 0x95, 0x80, 0x11, 0x90, 0xfa, 0xb7, 0xe0, 0x54, 0x0f, 0x90, 263 0x90, 0xfa, 0xb7, 0xe4, 0xf0, 0xa3, 0x74, 0x0f, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0x90,
264 0xf9, 0x63, 0xf0, 0xd3, 0x94, 0x00, 0x40, 0x02, 0xc2, 0x94, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 264 0xfa, 0xc0, 0xe0, 0xf5, 0x4a, 0x7d, 0x0f, 0x7c, 0x00, 0x12, 0x29, 0x60, 0x75, 0x30, 0x00, 0x8f,
265 0x1d, 0x9c, 0xbf, 0x01, 0x04, 0xd2, 0x93, 0x80, 0x02, 0xc2, 0x93, 0xe4, 0xff, 0x02, 0x30, 0xec, 265 0x31, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0xe4, 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26,
266 0x12, 0x1c, 0xd0, 0x54, 0x03, 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60, 0x08, 0x24, 0x03, 266 0x98, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xaf, 0x31, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x30, 0xe7,
267 0x70, 0x2b, 0xd2, 0x91, 0x80, 0x27, 0xc2, 0x91, 0x80, 0x23, 0x12, 0x1d, 0xa6, 0x12, 0x0f, 0x78, 267 0x10, 0xe0, 0x54, 0x0f, 0x90, 0xf9, 0x67, 0xf0, 0xd3, 0x94, 0x00, 0x40, 0x15, 0xc2, 0x95, 0x80,
268 0x60, 0x04, 0xd2, 0x91, 0x80, 0x17, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0x12, 0x0f, 0x78, 0xff, 268 0x11, 0x90, 0xfa, 0xba, 0xe0, 0x54, 0x0f, 0x90, 0xf9, 0x65, 0xf0, 0xd3, 0x94, 0x00, 0x40, 0x02,
269 0xbf, 0xa0, 0x04, 0xc2, 0x91, 0x80, 0x02, 0xd2, 0x91, 0x12, 0x1d, 0xa6, 0xf0, 0x90, 0xfa, 0xb7, 269 0xc2, 0x94, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1e, 0x4c, 0xbf, 0x01, 0x04, 0xd2, 0x93, 0x80,
270 0xe0, 0x54, 0x0c, 0xff, 0x13, 0x13, 0x54, 0x3f, 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60, 270 0x02, 0xc2, 0x93, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x54, 0x03, 0x14, 0x60, 0x0a,
271 0x08, 0x24, 0x03, 0x70, 0x2b, 0xd2, 0x92, 0x80, 0x27, 0xc2, 0x92, 0x80, 0x23, 0x12, 0x1d, 0xad, 271 0x14, 0x60, 0x0f, 0x14, 0x60, 0x08, 0x24, 0x03, 0x70, 0x2b, 0xd2, 0x91, 0x80, 0x27, 0xc2, 0x91,
272 0x12, 0x0f, 0x98, 0x60, 0x04, 0xd2, 0x92, 0x80, 0x17, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0x12, 272 0x80, 0x23, 0x12, 0x1e, 0x56, 0x12, 0x0f, 0xc0, 0x60, 0x04, 0xd2, 0x91, 0x80, 0x17, 0x90, 0xff,
273 0x0f, 0x98, 0xff, 0xbf, 0xa0, 0x04, 0xc2, 0x92, 0x80, 0x02, 0xd2, 0x92, 0x12, 0x1d, 0xad, 0xf0, 273 0xa4, 0xe0, 0x44, 0x10, 0x12, 0x0f, 0xc0, 0xff, 0xbf, 0xa0, 0x04, 0xc2, 0x91, 0x80, 0x02, 0xd2,
274 0xe4, 0xff, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 274 0x91, 0x12, 0x1e, 0x56, 0xf0, 0x90, 0xfa, 0xba, 0xe0, 0x54, 0x0c, 0xff, 0x13, 0x13, 0x54, 0x3f,
275 0x18, 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x31, 0xbd, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb3, 275 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60, 0x08, 0x24, 0x03, 0x70, 0x2b, 0xd2, 0x92, 0x80,
276 0x90, 0xfa, 0xb4, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 276 0x27, 0xc2, 0x92, 0x80, 0x23, 0x12, 0x1e, 0x5d, 0x12, 0x0f, 0xe0, 0x60, 0x04, 0xd2, 0x92, 0x80,
277 0xfa, 0xb4, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 277 0x17, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0x12, 0x0f, 0xe0, 0xff, 0xbf, 0xa0, 0x04, 0xc2, 0x92,
278 0xaa, 0x4e, 0xa9, 0x4f, 0x7b, 0xff, 0x90, 0xfa, 0xb4, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 278 0x80, 0x02, 0xd2, 0x92, 0x12, 0x1e, 0x5d, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30,
279 0xb9, 0xe0, 0xf5, 0x4a, 0x12, 0x28, 0x9f, 0x75, 0x30, 0x00, 0x8f, 0x31, 0x22, 0x12, 0x22, 0xa0, 279 0xe7, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 0xb4, 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x32,
280 0x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22, 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x19, 0x90, 0xff, 280 0x7a, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb6, 0x90, 0xfa, 0xb7, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0,
281 0xa6, 0xe0, 0x90, 0xfa, 0xb8, 0xf0, 0x54, 0xa0, 0x22, 0x12, 0x25, 0xd7, 0x8f, 0x4c, 0x7e, 0x00, 281 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xb7, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1b,
282 0xc3, 0xef, 0x95, 0x3c, 0xee, 0x95, 0x3b, 0x22, 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x19, 0x90, 0xff, 282 0x1c, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 0xaa, 0x4e, 0xa9, 0x4f, 0x7b, 0xff, 0x90, 0xfa,
283 0xb6, 0xe0, 0x90, 0xfa, 0xb8, 0xf0, 0x54, 0xa0, 0x22, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 283 0xb7, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 0xbc, 0xe0, 0xf5, 0x4a, 0x12, 0x29, 0x60, 0x75,
284 0x2c, 0x07, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x02, 0x31, 0x82, 0x8e, 0x39, 0x8f, 0x3a, 0x02, 0x2c, 284 0x30, 0x00, 0x8f, 0x31, 0x22, 0x12, 0x23, 0x61, 0x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22,
285 0x07, 0x12, 0x22, 0xa0, 0x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22, 0x7d, 0x01, 0x12, 0x25, 285 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x61, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xbb, 0xf0, 0x54, 0xa0,
286 0xd7, 0x90, 0xfa, 0xb1, 0xe0, 0x22, 0xef, 0x90, 0xf8, 0x04, 0xf0, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 286 0x22, 0x12, 0x26, 0x98, 0x8f, 0x4c, 0x7e, 0x00, 0xc3, 0xef, 0x95, 0x3c, 0xee, 0x95, 0x3b, 0x22,
287 0xee, 0x60, 0x0a, 0xc0, 0x05, 0x7d, 0x7f, 0xdd, 0xfe, 0xde, 0xfa, 0xd0, 0x05, 0xef, 0xc3, 0x94, 287 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x61, 0x90, 0xff, 0xb6, 0xe0, 0x90, 0xfa, 0xbb, 0xf0, 0x54, 0xa0,
288 0x15, 0x50, 0x03, 0xd0, 0xa8, 0x22, 0x13, 0x70, 0x03, 0xd0, 0xa8, 0x22, 0xff, 0xd5, 0x07, 0xfd, 288 0x22, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 0x2c, 0xd8, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x02,
289 0xd0, 0xa8, 0x22, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x04, 0xc0, 0x05, 0xe5, 0x3e, 0x24, 289 0x32, 0x3f, 0x8e, 0x39, 0x8f, 0x3a, 0x02, 0x2c, 0xd8, 0x12, 0x23, 0x61, 0x7e, 0x00, 0x8e, 0x30,
290 0x08, 0xf8, 0x86, 0x05, 0x53, 0x05, 0x7f, 0x7c, 0xff, 0x12, 0x10, 0x78, 0x7f, 0x00, 0x7e, 0x00, 290 0x8f, 0x31, 0xef, 0x22, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xb4, 0xe0, 0x22, 0xef, 0x90,
291 0xe5, 0x43, 0x60, 0x46, 0xfc, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x7f, 0x6d, 0x70, 0x0f, 0xc0, 0x83, 291 0xf8, 0x04, 0xf0, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 0xee, 0x60, 0x0a, 0xc0, 0x05, 0x7d, 0x7f, 0xdd,
292 0xc0, 0x82, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3, 292 0xfe, 0xde, 0xfa, 0xd0, 0x05, 0xef, 0xc3, 0x94, 0x15, 0x50, 0x03, 0xd0, 0xa8, 0x22, 0x13, 0x70,
293 0xdc, 0xe6, 0x80, 0x26, 0xdc, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80, 0x1e, 0xe0, 0xf8, 0xa3, 0xe0, 293 0x03, 0xd0, 0xa8, 0x22, 0xff, 0xd5, 0x07, 0xfd, 0xd0, 0xa8, 0x22, 0xc0, 0x00, 0xc0, 0x01, 0xc0,
294 0xf9, 0xa3, 0xe0, 0xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 294 0x02, 0xc0, 0x04, 0xc0, 0x05, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x86, 0x05, 0x53, 0x05, 0x7f, 0x7c,
295 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x12, 0x11, 0x0f, 0xd0, 0x05, 0xd0, 295 0xff, 0x12, 0x10, 0xc0, 0x7f, 0x00, 0x7e, 0x00, 0xe5, 0x43, 0x60, 0x46, 0xfc, 0x90, 0xf9, 0x1d,
296 0x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x85, 0xa8, 0x44, 0x75, 0xa8, 0x88, 0xec, 0x70, 296 0xe0, 0x54, 0x7f, 0x6d, 0x70, 0x0f, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff,
297 0x02, 0x7c, 0x3f, 0x8c, 0x3d, 0x22, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 0x66, 297 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3, 0xdc, 0xe6, 0x80, 0x26, 0xdc, 0x06, 0xd0, 0x82,
298 0x80, 0xfb, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x04, 0xc0, 0x06, 0x7c, 0xff, 0x12, 0x10, 298 0xd0, 0x83, 0x80, 0x1e, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xd0, 0x82, 0xd0, 0x83,
299 0x78, 0xe5, 0x43, 0x60, 0x42, 0xfe, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x7f, 0x6f, 0x70, 0x0b, 0xc0, 299 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3,
300 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3, 0xde, 0xea, 0x80, 300 0x80, 0xda, 0x12, 0x11, 0x57, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22,
301 0x26, 0xde, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80, 0xd8, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 301 0x85, 0xa8, 0x44, 0x75, 0xa8, 0x88, 0xec, 0x70, 0x02, 0x7c, 0x3f, 0x8c, 0x3d, 0x22, 0xe5, 0x3e,
302 0xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xc0, 0x83, 302 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 0xae, 0x80, 0xfb, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02,
303 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x78, 0x08, 0x08, 0x79, 0x18, 0x09, 0x7c, 0x01, 0xe6, 303 0xc0, 0x04, 0xc0, 0x06, 0x7c, 0xff, 0x12, 0x10, 0xc0, 0xe5, 0x43, 0x60, 0x42, 0xfe, 0x90, 0xf9,
304 0x54, 0x7f, 0x6f, 0x70, 0x06, 0x76, 0x00, 0x77, 0x00, 0x80, 0x06, 0x08, 0x09, 0x0c, 0xbc, 0x08, 304 0x1d, 0xe0, 0x54, 0x7f, 0x6f, 0x70, 0x0b, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x15, 0x43,
305 0xee, 0x12, 0x11, 0x0f, 0xd0, 0x06, 0xd0, 0x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x75, 305 0x80, 0x07, 0xa3, 0xa3, 0xa3, 0xde, 0xea, 0x80, 0x26, 0xde, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80,
306 0x3d, 0x00, 0x85, 0x44, 0xa8, 0x22, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc3, 0xe5, 0x43, 0x24, 306 0xd8, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3,
307 0xe8, 0x50, 0x05, 0x12, 0x11, 0x66, 0x80, 0xf4, 0xef, 0x60, 0x31, 0x90, 0x30, 0x54, 0xe4, 0x93, 307 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x78,
308 0xc3, 0x9f, 0x40, 0x2f, 0xc0, 0x04, 0x7c, 0xff, 0x12, 0x10, 0x78, 0xd0, 0x04, 0x43, 0x07, 0x80, 308 0x08, 0x08, 0x79, 0x18, 0x09, 0x7c, 0x01, 0xe6, 0x54, 0x7f, 0x6f, 0x70, 0x06, 0x76, 0x00, 0x77,
309 0xe5, 0x43, 0x75, 0xf0, 0x03, 0xa4, 0x24, 0x1b, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xef, 309 0x00, 0x80, 0x06, 0x08, 0x09, 0x0c, 0xbc, 0x08, 0xee, 0x12, 0x11, 0x57, 0xd0, 0x06, 0xd0, 0x04,
310 0xf0, 0xec, 0xa3, 0xf0, 0xed, 0xa3, 0xf0, 0x05, 0x43, 0x12, 0x11, 0x0f, 0xd0, 0x83, 0xd0, 0x82, 310 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x75, 0x3d, 0x00, 0x85, 0x44, 0xa8, 0x22, 0xc0, 0xf0,
311 0xd0, 0xf0, 0x22, 0x02, 0x11, 0x94, 0xc0, 0x04, 0x7c, 0x20, 0xd2, 0x8c, 0xd2, 0x8d, 0xd5, 0x04, 311 0xc0, 0x82, 0xc0, 0x83, 0xc3, 0xe5, 0x43, 0x24, 0xe8, 0x50, 0x05, 0x12, 0x11, 0xae, 0x80, 0xf4,
312 0xfd, 0xd0, 0x04, 0x22, 0x75, 0xa8, 0x00, 0x75, 0x88, 0x00, 0x75, 0xb8, 0x00, 0x75, 0xf0, 0x00, 312 0xef, 0x60, 0x31, 0x90, 0x31, 0x11, 0xe4, 0x93, 0xc3, 0x9f, 0x40, 0x2f, 0xc0, 0x04, 0x7c, 0xff,
313 0x75, 0xd0, 0x00, 0xe4, 0xf8, 0x90, 0xf8, 0x04, 0xf0, 0x90, 0x00, 0x00, 0xf6, 0x08, 0xb8, 0x00, 313 0x12, 0x10, 0xc0, 0xd0, 0x04, 0x43, 0x07, 0x80, 0xe5, 0x43, 0x75, 0xf0, 0x03, 0xa4, 0x24, 0x1d,
314 0xfb, 0x02, 0x00, 0x00, 0xc2, 0xaf, 0xe4, 0x90, 0xff, 0x48, 0xf0, 0x90, 0xff, 0x50, 0xf0, 0x90, 314 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xef, 0xf0, 0xec, 0xa3, 0xf0, 0xed, 0xa3, 0xf0, 0x05,
315 0xff, 0x08, 0xf0, 0x90, 0xff, 0x10, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xa3, 0xa3, 0xf0, 0xd2, 0xb1, 315 0x43, 0x12, 0x11, 0x57, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0x22, 0x02, 0x11, 0xdc, 0xc0, 0x04,
316 0xc2, 0xb0, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 316 0x7c, 0x20, 0xd2, 0x8c, 0xd2, 0x8d, 0xd5, 0x04, 0xfd, 0xd0, 0x04, 0x22, 0x75, 0xa8, 0x00, 0x75,
317 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0xd2, 0xb0, 0xd2, 0xb1, 0x7e, 0xff, 0x7f, 0xff, 0x12, 317 0x88, 0x00, 0x75, 0xb8, 0x00, 0x75, 0xf0, 0x00, 0x75, 0xd0, 0x00, 0xe4, 0xf8, 0x90, 0xf8, 0x04,
318 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 318 0xf0, 0x90, 0x00, 0x00, 0xf6, 0x08, 0xb8, 0x00, 0xfb, 0x02, 0x00, 0x00, 0xc2, 0xaf, 0xe4, 0x90,
319 0x80, 0xcc, 0xc3, 0xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x03, 0x7f, 0xe8, 0xef, 0xf4, 0xff, 0xee, 319 0xff, 0x48, 0xf0, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x08, 0xf0, 0x90, 0xff, 0x10, 0xf0, 0x90,
320 0xf4, 0xfe, 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x8f, 0x42, 0x8e, 0x41, 0x22, 0xc3, 0xef, 0x94, 0xbc, 320 0xff, 0x80, 0xf0, 0xa3, 0xa3, 0xf0, 0xd2, 0xb1, 0xc2, 0xb0, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10,
321 0xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x07, 0x7f, 0xd0, 0xef, 0xf4, 0xff, 0xee, 0xf4, 0xfe, 0x0f, 321 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0xd2,
322 0xbf, 0x00, 0x01, 0x0e, 0x8f, 0x40, 0x8e, 0x3f, 0x22, 0xef, 0x70, 0x01, 0x22, 0xc0, 0x00, 0xc0, 322 0xb0, 0xd2, 0xb1, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10,
323 0xa8, 0xc2, 0xaf, 0xe5, 0x3e, 0x24, 0x18, 0xf8, 0xa6, 0x07, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0xc6, 323 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0x80, 0xcc, 0xc3, 0xee, 0x94, 0x02, 0x50, 0x04,
324 0x54, 0x7f, 0xf6, 0xd0, 0xa8, 0xe6, 0x30, 0xe7, 0x03, 0xd0, 0x00, 0x22, 0x12, 0x11, 0x66, 0x80, 324 0x7e, 0x03, 0x7f, 0xe8, 0xef, 0xf4, 0xff, 0xee, 0xf4, 0xfe, 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x8f,
325 0xf4, 0xc0, 0x00, 0x7f, 0x01, 0xef, 0x24, 0x08, 0xf8, 0xe6, 0x60, 0x09, 0x0f, 0xbf, 0x08, 0xf5, 325 0x42, 0x8e, 0x41, 0x22, 0xc3, 0xef, 0x94, 0xbc, 0xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x07, 0x7f,
326 0x12, 0x11, 0x66, 0x80, 0xee, 0xd0, 0x00, 0x22, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 326 0xd0, 0xef, 0xf4, 0xff, 0xee, 0xf4, 0xfe, 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x8f, 0x40, 0x8e, 0x3f,
327 0xc0, 0x06, 0xc0, 0x04, 0xed, 0x24, 0x10, 0xf8, 0x76, 0x9a, 0xed, 0x75, 0xf0, 0x21, 0xa4, 0x24, 327 0x22, 0xef, 0x70, 0x01, 0x22, 0xc0, 0x00, 0xc0, 0xa8, 0xc2, 0xaf, 0xe5, 0x3e, 0x24, 0x18, 0xf8,
328 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0xc0, 0x82, 0xc0, 0x83, 0xa3, 0xa3, 0xe4, 0x78, 328 0xa6, 0x07, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0xc6, 0x54, 0x7f, 0xf6, 0xd0, 0xa8, 0xe6, 0x30, 0xe7,
329 0x0d, 0xf0, 0xa3, 0xd8, 0xfc, 0xef, 0x54, 0x7f, 0x75, 0xf0, 0x02, 0xa4, 0x24, 0x36, 0xf5, 0x82, 329 0x03, 0xd0, 0x00, 0x22, 0x12, 0x11, 0xae, 0x80, 0xf4, 0xc0, 0x00, 0x7f, 0x01, 0xef, 0x24, 0x08,
330 0xe5, 0xf0, 0x34, 0x30, 0xf5, 0x83, 0xe4, 0x93, 0xfe, 0x74, 0x01, 0x93, 0xfc, 0xd0, 0x83, 0xd0, 330 0xf8, 0xe6, 0x60, 0x09, 0x0f, 0xbf, 0x08, 0xf5, 0x12, 0x11, 0xae, 0x80, 0xee, 0xd0, 0x00, 0x22,
331 0x82, 0xec, 0xf0, 0xa3, 0xee, 0xf0, 0xed, 0x24, 0x08, 0xf8, 0xef, 0x44, 0x80, 0xf6, 0xd0, 0x04, 331 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 0xc0, 0x06, 0xc0, 0x04, 0xed, 0x24, 0x10, 0xf8,
332 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0x22, 0x75, 0x3e, 0x00, 0x75, 0x43, 332 0x76, 0x9a, 0xed, 0x75, 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83,
333 0x00, 0x7a, 0x08, 0x79, 0x18, 0x78, 0x08, 0x76, 0x00, 0x77, 0x00, 0x08, 0x09, 0xda, 0xf8, 0x90, 333 0xc0, 0x82, 0xc0, 0x83, 0xa3, 0xa3, 0xe4, 0x78, 0x0d, 0xf0, 0xa3, 0xd8, 0xfc, 0xef, 0x54, 0x7f,
334 0xf8, 0x04, 0xe0, 0xfc, 0x90, 0x30, 0x54, 0xe4, 0x93, 0xc3, 0x9c, 0x50, 0x05, 0xe4, 0x90, 0xf8, 334 0x75, 0xf0, 0x02, 0xa4, 0x24, 0xf3, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x30, 0xf5, 0x83, 0xe4, 0x93,
335 0x04, 0xf0, 0x78, 0x08, 0x74, 0x80, 0x44, 0x7f, 0xf6, 0x74, 0x01, 0x44, 0x10, 0xf5, 0x89, 0x75, 335 0xfe, 0x74, 0x01, 0x93, 0xfc, 0xd0, 0x83, 0xd0, 0x82, 0xec, 0xf0, 0xa3, 0xee, 0xf0, 0xed, 0x24,
336 0xb8, 0x00, 0xd2, 0xab, 0xd2, 0xa9, 0x22, 0x75, 0x81, 0x8b, 0xd2, 0x8e, 0xd2, 0x8c, 0xd2, 0xaf, 336 0x08, 0xf8, 0xef, 0x44, 0x80, 0xf6, 0xd0, 0x04, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82,
337 0xe5, 0x43, 0x60, 0x36, 0xff, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x80, 0x60, 0x28, 0x78, 0x08, 0x79, 337 0xd0, 0xf0, 0x22, 0x75, 0x3e, 0x00, 0x75, 0x43, 0x00, 0x7a, 0x08, 0x79, 0x18, 0x78, 0x08, 0x76,
338 0x08, 0xe0, 0x54, 0x7f, 0xfa, 0x7b, 0x00, 0xe6, 0x54, 0x7f, 0xb5, 0x02, 0x02, 0x7b, 0xff, 0x08, 338 0x00, 0x77, 0x00, 0x08, 0x09, 0xda, 0xf8, 0x90, 0xf8, 0x04, 0xe0, 0xfc, 0x90, 0x31, 0x11, 0xe4,
339 0xd9, 0xf5, 0xeb, 0x70, 0x10, 0xea, 0xf0, 0xc0, 0x07, 0x12, 0x12, 0x41, 0xad, 0x07, 0xaf, 0x02, 339 0x93, 0xc3, 0x9c, 0x50, 0x05, 0xe4, 0x90, 0xf8, 0x04, 0xf0, 0x78, 0x08, 0x74, 0x80, 0x44, 0x7f,
340 0x12, 0x12, 0x58, 0xd0, 0x07, 0xa3, 0xa3, 0xa3, 0xdf, 0xce, 0x12, 0x11, 0x66, 0x80, 0xc1, 0x8f, 340 0xf6, 0x74, 0x01, 0x44, 0x10, 0xf5, 0x89, 0x75, 0xb8, 0x00, 0xd2, 0xab, 0xd2, 0xa9, 0x22, 0x75,
341 0x24, 0x12, 0x2a, 0x06, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x08, 0x12, 341 0x81, 0x8b, 0xd2, 0x8e, 0xd2, 0x8c, 0xd2, 0xaf, 0xe5, 0x43, 0x60, 0x36, 0xff, 0x90, 0xf9, 0x1d,
342 0x21, 0xf3, 0xe0, 0xfd, 0x12, 0x22, 0x8a, 0x8a, 0x83, 0x24, 0x0a, 0x12, 0x21, 0xf3, 0xed, 0xf0, 342 0xe0, 0x54, 0x80, 0x60, 0x28, 0x78, 0x08, 0x79, 0x08, 0xe0, 0x54, 0x7f, 0xfa, 0x7b, 0x00, 0xe6,
343 0x12, 0x22, 0x56, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xe0, 0xff, 0x12, 0x22, 0x99, 0x24, 0x09, 0x12, 343 0x54, 0x7f, 0xb5, 0x02, 0x02, 0x7b, 0xff, 0x08, 0xd9, 0xf5, 0xeb, 0x70, 0x10, 0xea, 0xf0, 0xc0,
344 0x21, 0xf3, 0xef, 0xf0, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe4, 0x20, 0x08, 0x12, 0x22, 0x09, 0xc0, 344 0x07, 0x12, 0x12, 0x89, 0xad, 0x07, 0xaf, 0x02, 0x12, 0x12, 0xa0, 0xd0, 0x07, 0xa3, 0xa3, 0xa3,
345 0x83, 0xc0, 0x82, 0xa3, 0xe0, 0x25, 0xe0, 0xff, 0x05, 0x82, 0xd5, 0x82, 0x02, 0x15, 0x83, 0x15, 345 0xdf, 0xce, 0x12, 0x11, 0xae, 0x80, 0xc1, 0x8f, 0x24, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xb5, 0xa3,
346 0x82, 0xe0, 0x33, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0xa3, 0xef, 0xf0, 0x78, 0x80, 0x12, 0x22, 0x09, 346 0xa3, 0xe0, 0xa3, 0x30, 0xe7, 0x28, 0x78, 0x7e, 0x12, 0x22, 0x99, 0xe0, 0x44, 0x01, 0xf0, 0x12,
347 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0xff, 0x12, 0x22, 0x8a, 0x8a, 0x83, 0x24, 0x08, 0x12, 0x21, 347 0x22, 0xfa, 0x12, 0x22, 0x9d, 0xe0, 0x20, 0xe0, 0xf6, 0x12, 0x23, 0x50, 0x74, 0x02, 0xf0, 0x12,
348 0xf3, 0xef, 0xf0, 0xed, 0x12, 0x22, 0x99, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xed, 0xf0, 0x12, 0x21, 348 0x22, 0xda, 0xe0, 0xa3, 0x30, 0xe5, 0x07, 0x12, 0x23, 0x50, 0xe0, 0x44, 0x01, 0xf0, 0x78, 0x80,
349 0xfb, 0xe0, 0xff, 0x30, 0xe7, 0x19, 0x12, 0x22, 0x6e, 0x12, 0x21, 0xf3, 0xe0, 0x60, 0x09, 0x12, 349 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x08, 0x12, 0x22, 0xa1, 0xe0, 0xfd, 0x12, 0x23,
350 0x21, 0xfb, 0xef, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x12, 0x21, 0xfb, 0xef, 0x54, 0xfd, 0xf0, 0x78, 350 0x39, 0x8a, 0x83, 0x24, 0x0a, 0x12, 0x22, 0xa1, 0xed, 0xf0, 0x12, 0x23, 0x06, 0x24, 0x07, 0x12,
351 0x7e, 0x12, 0x22, 0x09, 0xa3, 0xa3, 0xe0, 0xff, 0x53, 0x07, 0xc7, 0x08, 0xe6, 0xfc, 0x08, 0xe6, 351 0x22, 0xa1, 0xe0, 0xff, 0x12, 0x23, 0x5a, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xef, 0xf0, 0x90, 0xf9,
352 0xfd, 0x12, 0x22, 0x43, 0xa3, 0xe0, 0x30, 0xe3, 0x12, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 352 0x16, 0xe0, 0x30, 0xe4, 0x20, 0x08, 0x12, 0x22, 0xb7, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xe0, 0x25,
353 0x05, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x31, 0x94, 0x93, 0x42, 0x07, 0x53, 0x07, 0xfb, 0x78, 0x80, 353 0xe0, 0xff, 0x05, 0x82, 0xd5, 0x82, 0x02, 0x15, 0x83, 0x15, 0x82, 0xe0, 0x33, 0xd0, 0x82, 0xd0,
354 0xe6, 0xfc, 0x08, 0xe6, 0x8c, 0x83, 0x24, 0x06, 0x12, 0x21, 0xf3, 0xe0, 0x60, 0x03, 0x43, 0x07, 354 0x83, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x22, 0xb5, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0xff, 0x12,
355 0x04, 0x53, 0x07, 0xfc, 0x78, 0x80, 0x12, 0x22, 0x7a, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x42, 355 0x23, 0x39, 0x8a, 0x83, 0x24, 0x08, 0x12, 0x22, 0xa1, 0xef, 0xf0, 0xed, 0x12, 0x23, 0x5a, 0x24,
356 0x07, 0x43, 0x07, 0x80, 0x12, 0x22, 0x8a, 0xf5, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xef, 0xf0, 0x12, 356 0x07, 0x12, 0x22, 0xa1, 0xed, 0xf0, 0x12, 0x22, 0xa9, 0xe0, 0x30, 0xe6, 0x0a, 0x12, 0x23, 0x41,
357 0x22, 0x99, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0xff, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xe0, 357 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe4, 0xf0, 0x12, 0x22, 0xa9, 0xe0, 0xff, 0x30, 0xe7, 0x1b, 0x12,
358 0xfc, 0xa3, 0xe0, 0xfd, 0x30, 0xe1, 0x05, 0x53, 0x07, 0xdf, 0x80, 0x03, 0x43, 0x07, 0x20, 0xec, 358 0x23, 0x1e, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0x60, 0x09, 0x12, 0x22, 0xa9, 0xef, 0x44, 0x02,
359 0x30, 0xe4, 0x05, 0x53, 0x07, 0xef, 0x80, 0x03, 0x43, 0x07, 0x10, 0x12, 0x21, 0xfb, 0xe0, 0xfe, 359 0xf0, 0x80, 0x07, 0x12, 0x22, 0xa9, 0xef, 0x54, 0xfd, 0xf0, 0x78, 0x7e, 0x12, 0x22, 0xb7, 0xa3,
360 0x54, 0x03, 0x60, 0x73, 0x53, 0x07, 0xdf, 0xee, 0x30, 0xe1, 0x69, 0x78, 0x80, 0x12, 0x22, 0x6f, 360 0xa3, 0xe0, 0xff, 0x53, 0x07, 0xc7, 0x08, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x12, 0x22, 0xe0, 0xa3,
361 0x12, 0x21, 0xf3, 0xe0, 0x12, 0x1b, 0x4c, 0x14, 0xa6, 0x00, 0x14, 0xda, 0x01, 0x14, 0xdf, 0x03, 361 0xe0, 0x30, 0xe3, 0x12, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x05, 0x12, 0x22, 0xa1, 0xe0,
362 0x14, 0xda, 0x05, 0x14, 0xdf, 0x07, 0x14, 0xda, 0x09, 0x14, 0xdf, 0x0b, 0x14, 0xda, 0x0d, 0x14, 362 0x90, 0x32, 0x51, 0x93, 0x42, 0x07, 0x53, 0x07, 0xfb, 0x12, 0x23, 0x1e, 0x24, 0x06, 0x12, 0x22,
363 0xdf, 0x0f, 0x00, 0x00, 0x14, 0xe7, 0xe5, 0x24, 0x64, 0x03, 0x70, 0x21, 0x90, 0xf9, 0x15, 0xe0, 363 0xa1, 0xe0, 0x60, 0x03, 0x43, 0x07, 0x04, 0x53, 0x07, 0xfc, 0x78, 0x80, 0x12, 0x23, 0x29, 0x24,
364 0x30, 0xe2, 0x0d, 0x30, 0xb4, 0x05, 0x43, 0x07, 0x02, 0x80, 0x2c, 0x53, 0x07, 0xfd, 0x80, 0x27, 364 0x04, 0x12, 0x22, 0xa1, 0xe0, 0x42, 0x07, 0x43, 0x07, 0x80, 0x12, 0x23, 0x39, 0xf5, 0x82, 0x8a,
365 0x30, 0x95, 0x05, 0x43, 0x07, 0x02, 0x80, 0x1f, 0x53, 0x07, 0xfd, 0x80, 0x1a, 0x30, 0x93, 0x05, 365 0x83, 0xa3, 0xa3, 0xef, 0xf0, 0x12, 0x23, 0x5a, 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0, 0xff, 0x8d,
366 0x43, 0x07, 0x02, 0x80, 0x12, 0x53, 0x07, 0xfd, 0x80, 0x0d, 0x43, 0x07, 0x02, 0x80, 0x08, 0x53, 366 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x30, 0xe1, 0x05, 0x53, 0x07, 0xdf,
367 0x07, 0xfd, 0x80, 0x03, 0x53, 0x07, 0xfd, 0x12, 0x22, 0x78, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xef, 367 0x80, 0x03, 0x43, 0x07, 0x20, 0xec, 0x30, 0xe4, 0x05, 0x53, 0x07, 0xef, 0x80, 0x03, 0x43, 0x07,
368 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xff, 0x12, 0x21, 0xfb, 0xe0, 0xfe, 0x54, 368 0x10, 0x12, 0x22, 0xa9, 0xe0, 0xfe, 0x54, 0x03, 0x60, 0x73, 0x53, 0x07, 0xdf, 0xee, 0x30, 0xe1,
369 0x03, 0x70, 0x03, 0x02, 0x15, 0xd7, 0xee, 0x20, 0xe1, 0x03, 0x02, 0x15, 0xd4, 0x12, 0x22, 0x6e, 369 0x69, 0x12, 0x23, 0x1e, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0x12, 0x1b, 0xfc, 0x15, 0x2c, 0x00,
370 0x12, 0x21, 0xf3, 0xe0, 0x12, 0x1b, 0x4c, 0x15, 0x36, 0x00, 0x15, 0x6c, 0x01, 0x15, 0x6c, 0x03, 370 0x15, 0x60, 0x01, 0x15, 0x65, 0x03, 0x15, 0x60, 0x05, 0x15, 0x65, 0x07, 0x15, 0x60, 0x09, 0x15,
371 0x15, 0xa0, 0x05, 0x15, 0xa0, 0x07, 0x15, 0x86, 0x09, 0x15, 0x86, 0x0b, 0x15, 0xba, 0x0d, 0x15, 371 0x65, 0x0b, 0x15, 0x60, 0x0d, 0x15, 0x65, 0x0f, 0x00, 0x00, 0x15, 0x6d, 0xe5, 0x24, 0x64, 0x03,
372 0xba, 0x0f, 0x00, 0x00, 0x15, 0xd7, 0xe5, 0x24, 0x64, 0x03, 0x70, 0x23, 0x90, 0xf9, 0x15, 0xe0, 372 0x70, 0x21, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe2, 0x0d, 0x30, 0xb4, 0x05, 0x43, 0x07, 0x02, 0x80,
373 0x30, 0xe2, 0x0f, 0x30, 0xb1, 0x06, 0x53, 0x07, 0x7f, 0x02, 0x15, 0xd7, 0x43, 0x07, 0x80, 0x02, 373 0x2c, 0x53, 0x07, 0xfd, 0x80, 0x27, 0x30, 0x95, 0x05, 0x43, 0x07, 0x02, 0x80, 0x1f, 0x53, 0x07,
374 0x15, 0xd7, 0x30, 0x94, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x7d, 0x43, 0x07, 0x80, 0x80, 0x78, 0x30, 374 0xfd, 0x80, 0x1a, 0x30, 0x93, 0x05, 0x43, 0x07, 0x02, 0x80, 0x12, 0x53, 0x07, 0xfd, 0x80, 0x0d,
375 0x92, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x70, 0x43, 0x07, 0x80, 0x80, 0x6b, 0xe5, 0x24, 0xb4, 0x03, 375 0x43, 0x07, 0x02, 0x80, 0x08, 0x53, 0x07, 0xfd, 0x80, 0x03, 0x53, 0x07, 0xfd, 0x12, 0x23, 0x27,
376 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xdf, 376 0x24, 0x04, 0x12, 0x22, 0xa1, 0xef, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xff,
377 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x51, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x44, 377 0x12, 0x22, 0xa9, 0xe0, 0xfe, 0x54, 0x03, 0x70, 0x03, 0x02, 0x16, 0x60, 0xee, 0x20, 0xe1, 0x03,
378 0x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x37, 378 0x02, 0x16, 0x5d, 0x08, 0x12, 0x23, 0x20, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0x12, 0x1b, 0xfc,
379 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff, 379 0x15, 0xbf, 0x00, 0x15, 0xf5, 0x01, 0x15, 0xf5, 0x03, 0x16, 0x29, 0x05, 0x16, 0x29, 0x07, 0x16,
380 0x9e, 0xe0, 0x54, 0xdf, 0xf0, 0x43, 0x07, 0x80, 0x80, 0x1d, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 380 0x0f, 0x09, 0x16, 0x0f, 0x0b, 0x16, 0x43, 0x0d, 0x16, 0x43, 0x0f, 0x00, 0x00, 0x16, 0x60, 0xe5,
381 0xff, 0x9e, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x43, 381 0x24, 0x64, 0x03, 0x70, 0x23, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe2, 0x0f, 0x30, 0xb1, 0x06, 0x53,
382 0x07, 0x80, 0x80, 0x03, 0x53, 0x07, 0x7f, 0x78, 0x80, 0x12, 0x22, 0x3f, 0xe0, 0xfc, 0xa3, 0xe0, 382 0x07, 0x7f, 0x02, 0x16, 0x60, 0x43, 0x07, 0x80, 0x02, 0x16, 0x60, 0x30, 0x94, 0x05, 0x53, 0x07,
383 0xfd, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x20, 0x80, 0x03, 0x53, 0x07, 0xdf, 0xec, 0x30, 0xe3, 0x05, 383 0x7f, 0x80, 0x7d, 0x43, 0x07, 0x80, 0x80, 0x78, 0x30, 0x92, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x70,
384 0x43, 0x07, 0x40, 0x80, 0x03, 0x53, 0x07, 0xbf, 0xec, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x10, 0x80, 384 0x43, 0x07, 0x80, 0x80, 0x6b, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef,
385 0x03, 0x53, 0x07, 0xef, 0xed, 0x30, 0xe4, 0x05, 0x43, 0x07, 0x08, 0x80, 0x03, 0x53, 0x07, 0xf7, 385 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xdf, 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x51, 0xe5,
386 0xed, 0x30, 0xe5, 0x05, 0x43, 0x07, 0x04, 0x80, 0x03, 0x53, 0x07, 0xfb, 0xed, 0x30, 0xe6, 0x05, 386 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e,
387 0x43, 0x07, 0x01, 0x80, 0x03, 0x53, 0x07, 0xfe, 0xed, 0x30, 0xe7, 0x05, 0x43, 0x07, 0x02, 0x80, 387 0xe0, 0x44, 0x20, 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x37, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff,
388 0x03, 0x53, 0x07, 0xfd, 0x78, 0x7e, 0x12, 0x22, 0x3f, 0xa3, 0xef, 0xf0, 0x12, 0x31, 0xc7, 0x7f, 388 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xdf, 0xf0, 0x43, 0x07,
389 0x00, 0x22, 0x90, 0xff, 0xfa, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x16, 0xf0, 0x90, 0xff, 0xf9, 0x74, 389 0x80, 0x80, 0x1d, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x10, 0xf0, 0x80,
390 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcc, 0xe4, 0xfd, 0x12, 0x22, 0xa0, 0x90, 0xfa, 0xcc, 390 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x43, 0x07, 0x80, 0x80, 0x03, 0x53, 0x07, 0x7f,
391 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0x12, 0x18, 0xe2, 0xe5, 0x23, 0x30, 0xe7, 0x02, 0xd2, 391 0x12, 0x22, 0xda, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x20, 0x80, 0x03,
392 0x02, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x90, 0xfa, 0xcc, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, 392 0x53, 0x07, 0xdf, 0xec, 0x30, 0xe3, 0x05, 0x43, 0x07, 0x40, 0x80, 0x03, 0x53, 0x07, 0xbf, 0xec,
393 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, 0x74, 0x0b, 0xf0, 0x7b, 393 0x30, 0xe0, 0x05, 0x43, 0x07, 0x10, 0x80, 0x03, 0x53, 0x07, 0xef, 0xed, 0x30, 0xe4, 0x05, 0x43,
394 0x00, 0x7a, 0x00, 0x79, 0x23, 0x75, 0x2d, 0x00, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0xe5, 394 0x07, 0x08, 0x80, 0x03, 0x53, 0x07, 0xf7, 0xed, 0x30, 0xe5, 0x05, 0x43, 0x07, 0x04, 0x80, 0x03,
395 0x23, 0x24, 0x80, 0x90, 0xff, 0xf8, 0xf0, 0xe5, 0x23, 0x64, 0x07, 0x60, 0x1e, 0xe5, 0x23, 0x64, 395 0x53, 0x07, 0xfb, 0xed, 0x30, 0xe6, 0x05, 0x43, 0x07, 0x01, 0x80, 0x03, 0x53, 0x07, 0xfe, 0xed,
396 0x06, 0x60, 0x18, 0xe5, 0x23, 0x64, 0x14, 0x60, 0x12, 0xe5, 0x23, 0x64, 0x41, 0x60, 0x0c, 0xe5, 396 0x30, 0xe7, 0x05, 0x43, 0x07, 0x02, 0x80, 0x03, 0x53, 0x07, 0xfd, 0x78, 0x7e, 0x12, 0x22, 0xdc,
397 0x23, 0x64, 0x1a, 0x70, 0x46, 0xe5, 0x24, 0x64, 0x02, 0x70, 0x40, 0xe5, 0x23, 0xb4, 0x07, 0x16, 397 0xa3, 0xef, 0xf0, 0x12, 0x32, 0x84, 0x7f, 0x00, 0x22, 0x90, 0xff, 0xfa, 0x74, 0x08, 0xf0, 0xa3,
398 0xd2, 0x94, 0xd2, 0x95, 0xd2, 0x92, 0xd2, 0x93, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x02, 0xf0, 0xa3, 398 0x74, 0x16, 0xf0, 0x90, 0xff, 0xf9, 0x74, 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcf, 0xe4,
399 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1e, 0xe5, 0x23, 0xb4, 0x41, 0x12, 0x90, 0xf9, 0x15, 0xe0, 0x44, 399 0xfd, 0x12, 0x23, 0x61, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1b, 0x1c, 0x12, 0x19,
400 0x06, 0xf0, 0xa3, 0xe0, 0x44, 0x06, 0xf0, 0xd2, 0xb1, 0xd2, 0xb4, 0x80, 0x07, 0x90, 0xf9, 0x15, 400 0x92, 0xe5, 0x23, 0x30, 0xe7, 0x02, 0xd2, 0x02, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x90, 0xfa,
401 0xe0, 0x44, 0x01, 0xf0, 0x90, 0xf9, 0x16, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x23, 0x64, 0x42, 0x60, 401 0xcf, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xcf,
402 0x05, 0xe5, 0x23, 0xb4, 0x43, 0x0c, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x80, 0xf0, 0xa3, 0xe0, 0x44, 402 0xe4, 0xf0, 0xa3, 0x74, 0x0b, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x75, 0x2d, 0x00, 0xf5,
403 0x80, 0xf0, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, 0x74, 0x0d, 0xf0, 0x12, 0x18, 0xe2, 0x90, 0xff, 403 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0xe5, 0x23, 0x24, 0x80, 0x90, 0xff, 0xf8, 0xf0, 0xe5, 0x23,
404 0xf5, 0xe5, 0x23, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x33, 0xf5, 0x34, 0xf5, 0x32, 0x12, 0x1d, 0x84, 404 0x64, 0x07, 0x60, 0x1e, 0xe5, 0x23, 0x64, 0x06, 0x60, 0x18, 0xe5, 0x23, 0x64, 0x14, 0x60, 0x12,
405 0x12, 0x1c, 0x30, 0x12, 0x1d, 0x8b, 0x90, 0xf9, 0x67, 0x12, 0x1b, 0x43, 0x90, 0xf9, 0x6c, 0x12, 405 0xe5, 0x23, 0x64, 0x41, 0x60, 0x0c, 0xe5, 0x23, 0x64, 0x1a, 0x70, 0x46, 0xe5, 0x24, 0x64, 0x02,
406 0x1b, 0x43, 0x90, 0xff, 0xff, 0xe4, 0xf0, 0x90, 0xff, 0x83, 0xe0, 0xe4, 0xf0, 0x90, 0xff, 0x81, 406 0x70, 0x40, 0xe5, 0x23, 0xb4, 0x07, 0x16, 0xd2, 0x94, 0xd2, 0x95, 0xd2, 0x92, 0xd2, 0x93, 0x90,
407 0xf9, 0x16, 0xe0, 0x44, 0x02, 0xf0, 0xa3, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1e, 0xe5, 0x23, 0xb4,
408 0x41, 0x12, 0x90, 0xf9, 0x16, 0xe0, 0x44, 0x06, 0xf0, 0xa3, 0xe0, 0x44, 0x06, 0xf0, 0xd2, 0xb1,
409 0xd2, 0xb4, 0x80, 0x07, 0x90, 0xf9, 0x16, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x44,
410 0x01, 0xf0, 0xe5, 0x23, 0x64, 0x42, 0x60, 0x0c, 0xe5, 0x23, 0x64, 0x43, 0x60, 0x06, 0xe5, 0x23,
411 0x64, 0x44, 0x70, 0x2e, 0x90, 0xf9, 0x16, 0xe0, 0xff, 0xe5, 0x23, 0xb4, 0x44, 0x04, 0x7e, 0x40,
412 0x80, 0x02, 0x7e, 0x00, 0xee, 0x24, 0x80, 0x4f, 0x90, 0xf9, 0x16, 0xf0, 0xa3, 0xe0, 0xff, 0xe5,
413 0x23, 0xb4, 0x44, 0x04, 0x7e, 0x40, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x24, 0x80, 0x4f, 0x90, 0xf9,
414 0x17, 0xf0, 0x90, 0xfa, 0xcf, 0xe4, 0xf0, 0xa3, 0x74, 0x0d, 0xf0, 0x12, 0x19, 0x92, 0x90, 0xff,
415 0xf5, 0xe5, 0x23, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x33, 0xf5, 0x34, 0xf5, 0x32, 0x12, 0x1e, 0x34,
416 0x12, 0x1c, 0xe0, 0x12, 0x1e, 0x3b, 0x90, 0xf9, 0x6a, 0x12, 0x1b, 0xf3, 0x90, 0xf9, 0x6f, 0x12,
417 0x1b, 0xf3, 0x90, 0xff, 0xff, 0xe4, 0xf0, 0x90, 0xff, 0x83, 0xe0, 0xe4, 0xf0, 0x90, 0xff, 0x81,
407 0x74, 0x80, 0xf0, 0xa3, 0x74, 0x84, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xe4, 0xf5, 0x23, 0xe5, 0x23, 418 0x74, 0x80, 0xf0, 0xa3, 0x74, 0x84, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xe4, 0xf5, 0x23, 0xe5, 0x23,
408 0x12, 0x1c, 0xa7, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x23, 0x12, 0x1c, 0xb5, 0xf5, 0x83, 0xe4, 0xf0, 419 0x12, 0x1d, 0x57, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x23, 0x12, 0x1d, 0x65, 0xf5, 0x83, 0xe4, 0xf0,
409 0x05, 0x23, 0xe5, 0x23, 0xb4, 0x07, 0xe7, 0x78, 0x7a, 0x76, 0xfe, 0x08, 0x76, 0xf0, 0x90, 0x31, 420 0x05, 0x23, 0xe5, 0x23, 0xb4, 0x07, 0xe7, 0x78, 0x7a, 0x76, 0xfe, 0x08, 0x76, 0xf0, 0x90, 0x32,
410 0x4d, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xad, 0x07, 0x90, 0x31, 0x5a, 0xe4, 0x93, 0xff, 421 0x0a, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xad, 0x07, 0x90, 0x32, 0x17, 0xe4, 0x93, 0xff,
411 0x08, 0xf6, 0xff, 0xed, 0x54, 0x0f, 0xfd, 0x12, 0x1c, 0x97, 0x74, 0x84, 0xf0, 0xed, 0x75, 0xf0, 422 0x08, 0xf6, 0xff, 0xed, 0x54, 0x0f, 0xfd, 0x12, 0x1d, 0x47, 0x74, 0x84, 0xf0, 0xed, 0x75, 0xf0,
412 0x08, 0xa4, 0x24, 0x47, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xc3, 0x74, 0xf0, 423 0x08, 0xa4, 0x24, 0x47, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xc3, 0x74, 0xf0,
413 0x9f, 0x78, 0x7b, 0xf6, 0x74, 0xfe, 0x94, 0x00, 0x18, 0x12, 0x1c, 0x28, 0xce, 0xc3, 0x13, 0xce, 424 0x9f, 0x78, 0x7b, 0xf6, 0x74, 0xfe, 0x94, 0x00, 0x18, 0x12, 0x1c, 0xd8, 0xce, 0xc3, 0x13, 0xce,
414 0x13, 0xd8, 0xf9, 0xff, 0xed, 0x12, 0x1c, 0xf8, 0xef, 0xf0, 0xed, 0x12, 0x1d, 0x1e, 0xe4, 0xf5, 425 0x13, 0xd8, 0xf9, 0xff, 0xed, 0x12, 0x1d, 0xa8, 0xef, 0xf0, 0xed, 0x12, 0x1d, 0xce, 0xe4, 0xf5,
415 0x23, 0xe5, 0x23, 0x90, 0x31, 0x47, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xe5, 0x23, 0x25, 0xe0, 426 0x23, 0xe5, 0x23, 0x90, 0x32, 0x04, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xe5, 0x23, 0x25, 0xe0,
416 0x24, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x31, 0xf5, 0x83, 0xe4, 0x93, 0x08, 0xf6, 0xed, 0x30, 0xe7, 427 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x34, 0x32, 0xf5, 0x83, 0xe4, 0x93, 0x08, 0xf6, 0xed, 0x30, 0xe7,
417 0x53, 0x18, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1c, 0x97, 0x12, 0x1d, 0x06, 0x24, 0x47, 0xf5, 0x82, 428 0x53, 0x18, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1d, 0x47, 0x12, 0x1d, 0xb6, 0x24, 0x47, 0xf5, 0x82,
418 0xe4, 0x34, 0xff, 0x12, 0x1c, 0x18, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xe9, 0x12, 429 0xe4, 0x34, 0xff, 0x12, 0x1c, 0xc8, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xe9, 0x12,
419 0x1c, 0xf8, 0xef, 0xf0, 0x12, 0x1c, 0x1f, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, 430 0x1d, 0xa8, 0xef, 0xf0, 0x12, 0x1c, 0xcf, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d,
420 0x0b, 0x24, 0x45, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x12, 0x1d, 0x1e, 431 0xbb, 0x24, 0x45, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x12, 0x1d, 0xce,
421 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x46, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, 432 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x46, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80,
422 0xf0, 0x02, 0x18, 0xb7, 0x78, 0x78, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1c, 0xea, 0x12, 0x1d, 0x06, 433 0xf0, 0x02, 0x19, 0x67, 0x78, 0x78, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1d, 0x9a, 0x12, 0x1d, 0xb6,
423 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0x12, 0x1c, 0x18, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 434 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0x12, 0x1c, 0xc8, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8,
424 0xf9, 0x12, 0x1d, 0x0b, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0x12, 435 0xf9, 0x12, 0x1d, 0xbb, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0x12,
425 0x1c, 0x1f, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, 0x0b, 0x24, 0x05, 0xf5, 0x82, 436 0x1c, 0xcf, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, 0xbb, 0x24, 0x05, 0xf5, 0x82,
426 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, 437 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82,
427 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, 438 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82,
428 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x23, 0xe5, 0x23, 0x64, 0x04, 0x60, 0x03, 0x02, 439 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x23, 0xe5, 0x23, 0x64, 0x04, 0x60, 0x03, 0x02,
429 0x17, 0xe1, 0x90, 0x31, 0x4c, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0x12, 0x1c, 0xe8, 0xe4, 0xf0, 440 0x18, 0x91, 0x90, 0x32, 0x09, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0x12, 0x1d, 0x98, 0xe4, 0xf0,
430 0x90, 0x31, 0x4b, 0x93, 0xff, 0xf6, 0x12, 0x1c, 0x95, 0xe4, 0xf0, 0x90, 0xff, 0xfd, 0x74, 0x05, 441 0x90, 0x32, 0x08, 0x93, 0xff, 0xf6, 0x12, 0x1d, 0x45, 0xe4, 0xf0, 0x90, 0xff, 0xfd, 0x74, 0x05,
431 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12, 442 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, 0x12,
432 0x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x25, 0xd7, 0xe7, 0x09, 0xf6, 0x08, 443 0x1b, 0x32, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x26, 0x98, 0xe7, 0x09, 0xf6, 0x08,
433 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, 444 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83,
434 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78, 445 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78,
435 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3, 446 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3,
436 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58, 447 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58,
437 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa, 448 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa,
438 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xa6, 0x80, 0xea, 449 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xa6, 0x80, 0xea,
439 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33, 0x89, 0x82, 0x8a, 0x83, 450 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33, 0x89, 0x82, 0x8a, 0x83,
440 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 451 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8,
441 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a, 452 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a,
442 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89, 453 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89,
443 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 454 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0,
444 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89, 455 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89,
445 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60, 456 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60,
446 0x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5, 457 0x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5,
447 0x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x19, 458 0x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x19,
448 0x4c, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 459 0xfc, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb,
449 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 460 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82,
450 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 461 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8,
451 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 462 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82,
452 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 463 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0,
453 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 464 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82,
454 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 465 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82,
455 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0x22, 0xc5, 0xf0, 0xf8, 0xa3, 466 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0x22, 0xc5, 0xf0, 0xf8, 0xa3,
456 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x38, 467 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x38,
457 0xf0, 0x22, 0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 468 0xf0, 0x22, 0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02,
458 0x15, 0x83, 0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 469 0x15, 0x83, 0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82,
459 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 470 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82,
460 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 471 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0,
461 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22, 472 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22,
462 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x06, 0xf7, 473 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x06, 0xf7,
463 0x09, 0xa7, 0xf0, 0x19, 0x22, 0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 0x09, 0xf3, 0x19, 0x22, 0xf8, 474 0x09, 0xa7, 0xf0, 0x19, 0x22, 0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 0x09, 0xf3, 0x19, 0x22, 0xf8,
464 0xbb, 0x01, 0x11, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0xe5, 475 0xbb, 0x01, 0x11, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0xe5,
465 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x08, 0xa6, 0xf0, 0x22, 0xbb, 476 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x08, 0xa6, 0xf0, 0x22, 0xbb,
466 0xfe, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 0x22, 0xa4, 0x25, 0x82, 0xf5, 477 0xfe, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 0x22, 0xa4, 0x25, 0x82, 0xf5,
467 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0x22, 0xe6, 0xfb, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xf9, 478 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0x22, 0xe6, 0xfb, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xf9,
468 0x22, 0xeb, 0xf6, 0x08, 0xea, 0xf6, 0x08, 0xe9, 0xf6, 0x22, 0xe0, 0xfb, 0xa3, 0xe0, 0xfa, 0xa3, 479 0x22, 0xeb, 0xf6, 0x08, 0xea, 0xf6, 0x08, 0xe9, 0xf6, 0x22, 0xe0, 0xfb, 0xa3, 0xe0, 0xfa, 0xa3,
469 0xe0, 0xf9, 0x22, 0xeb, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xe9, 0xf0, 0x22, 0xd0, 0x83, 0xd0, 0x82, 480 0xe0, 0xf9, 0x22, 0xeb, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xe9, 0xf0, 0x22, 0xd0, 0x83, 0xd0, 0x82,
470 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, 481 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01,
471 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, 482 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3,
472 0x80, 0xdf, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0xe5, 0x4c, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, 483 0x80, 0xdf, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0xe5, 0x4c, 0x12, 0x1a, 0xe8, 0x74, 0x01, 0x25,
473 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0x74, 0x11, 0x12, 484 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0x74, 0x11, 0x12,
474 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x06, 485 0x1a, 0xe8, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x06,
475 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 486 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0xe8, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38,
476 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, 0x38, 0x04, 0x25, 487 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, 0xe8, 0x04, 0x25,
477 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, 488 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a,
478 0x38, 0x04, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x04, 0xe0, 0xab, 489 0xe8, 0x04, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x04, 0xe0, 0xab,
479 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 490 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0xe8, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35,
480 0x37, 0xf5, 0x37, 0x90, 0xff, 0x05, 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, 491 0x37, 0xf5, 0x37, 0x90, 0xff, 0x05, 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0xe8,
481 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x22, 0xf5, 0x83, 0xe0, 0x54, 492 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x22, 0xf5, 0x83, 0xe0, 0x54,
482 0x08, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 0xf5, 0x83, 0xef, 0xf0, 0xfd, 0x7c, 0x00, 0xc3, 493 0x08, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 0xf5, 0x83, 0xef, 0xf0, 0xfd, 0x7c, 0x00, 0xc3,
483 0x78, 0x7b, 0xe6, 0x9d, 0xf6, 0x18, 0xe6, 0x9c, 0xf6, 0xe6, 0xfe, 0x08, 0xe6, 0x78, 0x03, 0x22, 494 0x78, 0x7b, 0xe6, 0x9d, 0xf6, 0x18, 0xe6, 0x9c, 0xf6, 0xe6, 0xfe, 0x08, 0xe6, 0x78, 0x03, 0x22,
484 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38, 0x6f, 0x22, 0xe0, 0x44, 0x04, 0xf0, 0x74, 0x12, 495 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38, 0x72, 0x22, 0xe0, 0x44, 0x04, 0xf0, 0x74, 0x13,
485 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xe0, 0x22, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x7e, 496 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xe0, 0x22, 0x90, 0xfa, 0xbc, 0xe0, 0xff, 0x7e,
486 0x00, 0xc3, 0x90, 0xfa, 0xbd, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xbc, 0xe0, 0x9e, 0xf0, 0x90, 0xfa, 497 0x00, 0xc3, 0x90, 0xfa, 0xc0, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xbf, 0xe0, 0x9e, 0xf0, 0x90, 0xfa,
487 0xb4, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0xef, 0x25, 0x4f, 0xf5, 0x4f, 0xee, 0x35, 0x4e, 0xf5, 498 0xb7, 0xee, 0x8f, 0xf0, 0x12, 0x1b, 0x1c, 0xef, 0x25, 0x4f, 0xf5, 0x4f, 0xee, 0x35, 0x4e, 0xf5,
488 0x4e, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb1, 0x90, 0xfa, 0xb4, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 499 0x4e, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb4, 0x90, 0xfa, 0xb7, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0,
489 0xf5, 0x2e, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x04, 0xf5, 0x82, 0xe4, 500 0xf5, 0x2e, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x04, 0xf5, 0x82, 0xe4,
490 0x35, 0x83, 0xf5, 0x83, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe4, 501 0x35, 0x83, 0xf5, 0x83, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe4,
491 0x34, 0xff, 0xf5, 0x83, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x48, 0xf5, 0x82, 0xe4, 502 0x34, 0xff, 0xf5, 0x83, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x48, 0xf5, 0x82, 0xe4,
492 0x34, 0xff, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x34, 0xff, 503 0x34, 0xff, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x34, 0xff,
493 0x22, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x24, 0xfc, 0x22, 0x90, 0xff, 0x00, 0xe0, 0x54, 0x1f, 0x22, 504 0x22, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x24, 0xfc, 0x22, 0x90, 0xff, 0x00, 0xe0, 0x54, 0x1f, 0x22,
494 0x90, 0xfa, 0xbb, 0xe0, 0x90, 0xfa, 0xb7, 0xf0, 0x22, 0x75, 0x33, 0x00, 0x8f, 0x34, 0x90, 0xf9, 505 0x90, 0xfa, 0xbe, 0xe0, 0x90, 0xfa, 0xba, 0xf0, 0x22, 0x75, 0x33, 0x00, 0x8f, 0x34, 0x90, 0xf9,
495 0x6c, 0x12, 0x1b, 0x3a, 0x90, 0x00, 0x02, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 506 0x6f, 0x12, 0x1b, 0xea, 0x90, 0x00, 0x02, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00,
496 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x41, 0xf5, 0x82, 507 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x41, 0xf5, 0x82,
497 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x74, 0x80, 0xf0, 0x08, 0xe6, 0xff, 0xe9, 0x75, 0xf0, 0x08, 508 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x74, 0x80, 0xf0, 0x08, 0xe6, 0xff, 0xe9, 0x75, 0xf0, 0x08,
498 0xa4, 0x22, 0x74, 0xaf, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 0x22, 0x75, 0xf0, 509 0xa4, 0x22, 0x74, 0xb2, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 0x22, 0x75, 0xf0,
499 0x08, 0xa4, 0x24, 0x42, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, 0xf0, 0x22, 0x90, 510 0x08, 0xa4, 0x24, 0x42, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, 0xf0, 0x22, 0x90,
500 0xff, 0x82, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x03, 0xf0, 0x90, 0xff, 511 0xff, 0x82, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x03, 0xf0, 0x90, 0xff,
501 0xfc, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x78, 0x67, 0xe6, 0x54, 0xfd, 0xf6, 0x90, 0xff, 0xfd, 0x74, 512 0xfc, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x78, 0x67, 0xe6, 0x54, 0xfd, 0xf6, 0x90, 0xff, 0xfd, 0x74,
502 0x65, 0xf0, 0x22, 0x12, 0x1b, 0x1c, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x22, 0x7b, 0x01, 0x7a, 513 0x65, 0xf0, 0x22, 0x12, 0x1b, 0xcc, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x22, 0x7b, 0x01, 0x7a,
503 0xfa, 0x79, 0xb4, 0x22, 0x90, 0xff, 0x80, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0x83, 0xe0, 514 0xfa, 0x79, 0xb7, 0x22, 0x90, 0xff, 0x80, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0x83, 0xe0,
504 0x54, 0x7f, 0xf0, 0x22, 0xe0, 0xff, 0x90, 0xf9, 0x67, 0x02, 0x1b, 0x3a, 0x90, 0xff, 0xa4, 0xe0, 515 0x54, 0x7f, 0xf0, 0x22, 0xe0, 0xff, 0x90, 0xf9, 0x6a, 0x02, 0x1b, 0xea, 0x90, 0xff, 0xa4, 0xe0,
505 0x44, 0x02, 0xf0, 0x22, 0x75, 0x39, 0x01, 0x75, 0x3a, 0x09, 0x22, 0x7b, 0x01, 0x7a, 0xf9, 0x79, 516 0x44, 0x02, 0xf0, 0x22, 0x75, 0x39, 0x01, 0x75, 0x3a, 0x09, 0x22, 0x7b, 0x01, 0x7a, 0xf9, 0x79,
506 0x6f, 0x22, 0xd3, 0xe5, 0x3c, 0x94, 0x08, 0xe5, 0x3b, 0x94, 0x01, 0x22, 0x90, 0xfa, 0xbb, 0xe0, 517 0x72, 0x22, 0xd3, 0xe5, 0x3c, 0x94, 0x08, 0xe5, 0x3b, 0x94, 0x01, 0x22, 0x90, 0xfa, 0xbe, 0xe0,
507 0xff, 0x90, 0xfa, 0xb7, 0xf0, 0x22, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xef, 0x22, 0x90, 0xff, 0xb4, 518 0xff, 0x90, 0xfa, 0xba, 0xf0, 0x22, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xef, 0x22, 0x90, 0xff, 0xb4,
508 0xe0, 0x54, 0xef, 0x22, 0x12, 0x10, 0x03, 0x78, 0x88, 0xef, 0xf6, 0x12, 0x2a, 0x06, 0x12, 0x22, 519 0xe0, 0x54, 0xef, 0x22, 0x12, 0x10, 0x4b, 0x78, 0x88, 0xef, 0xf6, 0x12, 0x2a, 0xc7, 0x12, 0x22,
509 0x4a, 0x8e, 0x83, 0x24, 0x09, 0x12, 0x21, 0xf3, 0xe0, 0xfd, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x0a, 520 0xfa, 0x8e, 0x83, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0xfd, 0x12, 0x22, 0xe8, 0x90, 0x00, 0x0a,
510 0x12, 0x22, 0x52, 0x24, 0x0a, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x00, 0x0b, 0x12, 0x1a, 0x4a, 0x12, 521 0x12, 0x23, 0x02, 0x24, 0x0a, 0x12, 0x22, 0xa1, 0xe0, 0x90, 0x00, 0x0b, 0x12, 0x1a, 0xfa, 0x12,
511 0x22, 0x4a, 0xf5, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf5, 0x53, 0x12, 0x22, 0x56, 0x24, 522 0x22, 0xfa, 0xf5, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf5, 0x53, 0x12, 0x23, 0x06, 0x24,
512 0x04, 0x12, 0x21, 0xf3, 0xe0, 0xf5, 0x54, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xf5, 0x55, 523 0x04, 0x12, 0x22, 0xa1, 0xe0, 0xf5, 0x54, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xf5, 0x55,
513 0xe5, 0x53, 0xc4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x78, 0x88, 0xf6, 0xd3, 0x94, 0x00, 0x40, 0x06, 524 0xe5, 0x53, 0xc4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x78, 0x88, 0xf6, 0xd3, 0x94, 0x00, 0x40, 0x06,
514 0xe5, 0x54, 0x30, 0xe1, 0x01, 0x06, 0x78, 0x88, 0xe6, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x0c, 0xef, 525 0xe5, 0x54, 0x30, 0xe1, 0x01, 0x06, 0x78, 0x88, 0xe6, 0x12, 0x22, 0xe7, 0x90, 0x00, 0x0c, 0xef,
515 0x12, 0x1a, 0x4a, 0x78, 0x80, 0x12, 0x22, 0x09, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x53, 526 0x12, 0x1a, 0xfa, 0x12, 0x22, 0xb5, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x53, 0x07, 0x0c,
516 0x07, 0x0c, 0x53, 0x06, 0xe6, 0xe5, 0x53, 0x30, 0xe5, 0x03, 0x43, 0x07, 0x01, 0xe5, 0x54, 0x20, 527 0x53, 0x06, 0xe6, 0xe5, 0x53, 0x30, 0xe5, 0x03, 0x43, 0x07, 0x01, 0xe5, 0x54, 0x20, 0xe5, 0x0e,
517 0xe5, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 0x03, 0x43, 0x07, 0x02, 528 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 0x03, 0x43, 0x07, 0x02, 0xe5, 0x53,
518 0xe5, 0x53, 0x30, 0xe3, 0x03, 0x43, 0x07, 0x10, 0xe5, 0x53, 0x30, 0xe2, 0x03, 0x43, 0x07, 0x20, 529 0x30, 0xe3, 0x03, 0x43, 0x07, 0x10, 0xe5, 0x53, 0x30, 0xe2, 0x03, 0x43, 0x07, 0x20, 0xe5, 0x53,
519 0xe5, 0x53, 0x54, 0x03, 0x60, 0x03, 0x43, 0x07, 0x40, 0xe5, 0x53, 0x30, 0xe1, 0x03, 0x43, 0x07, 530 0x54, 0x03, 0x60, 0x03, 0x43, 0x07, 0x40, 0xe5, 0x53, 0x30, 0xe1, 0x03, 0x43, 0x07, 0x80, 0xe5,
520 0x80, 0xe5, 0x53, 0x30, 0xe4, 0x03, 0x43, 0x06, 0x01, 0xe5, 0x53, 0x30, 0xe6, 0x03, 0x43, 0x06, 531 0x53, 0x30, 0xe4, 0x03, 0x43, 0x06, 0x01, 0xe5, 0x53, 0x30, 0xe6, 0x03, 0x43, 0x06, 0x08, 0xe5,
521 0x08, 0xe5, 0x54, 0x20, 0xe4, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 532 0x54, 0x20, 0xe4, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 0x03, 0x43,
522 0x03, 0x43, 0x06, 0x10, 0x53, 0x07, 0xfb, 0x53, 0x06, 0x79, 0x90, 0x00, 0x05, 0xee, 0x8f, 0xf0, 533 0x06, 0x10, 0x53, 0x07, 0xfb, 0x53, 0x06, 0x79, 0x90, 0x00, 0x05, 0xee, 0x8f, 0xf0, 0x12, 0x1b,
523 0x12, 0x1a, 0xef, 0xe5, 0x55, 0x30, 0xe3, 0x12, 0x54, 0x30, 0xff, 0xc4, 0x54, 0x0f, 0x12, 0x22, 534 0x9f, 0xe5, 0x55, 0x30, 0xe3, 0x12, 0x54, 0x30, 0xff, 0xc4, 0x54, 0x0f, 0x12, 0x22, 0xe7, 0x90,
524 0x2c, 0x90, 0x00, 0x08, 0xef, 0x12, 0x1a, 0x4a, 0x80, 0x0a, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x08, 535 0x00, 0x08, 0xef, 0x12, 0x1a, 0xfa, 0x80, 0x0a, 0x12, 0x22, 0xe8, 0x90, 0x00, 0x08, 0xe4, 0x12,
525 0xe4, 0x12, 0x1a, 0x4a, 0xe5, 0x55, 0x54, 0x03, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x07, 0xef, 0x12, 536 0x1a, 0xfa, 0xe5, 0x55, 0x54, 0x03, 0x12, 0x22, 0xe7, 0x90, 0x00, 0x07, 0xef, 0x12, 0x1a, 0xfa,
526 0x1a, 0x4a, 0xe5, 0x55, 0x54, 0x04, 0xff, 0xc3, 0x13, 0x90, 0x00, 0x09, 0x12, 0x1a, 0x4a, 0x90, 537 0xe5, 0x55, 0x54, 0x04, 0xff, 0xc3, 0x13, 0x90, 0x00, 0x09, 0x12, 0x1a, 0xfa, 0x90, 0x00, 0x07,
527 0x00, 0x07, 0x12, 0x1a, 0x0b, 0x70, 0x13, 0x12, 0x22, 0x2d, 0xe9, 0x24, 0x09, 0xf9, 0xe4, 0x3a, 538 0x12, 0x1a, 0xbb, 0x70, 0x13, 0x12, 0x22, 0xe8, 0xe9, 0x24, 0x09, 0xf9, 0xe4, 0x3a, 0xfa, 0x12,
528 0xfa, 0x12, 0x19, 0xf2, 0xff, 0xc3, 0x13, 0x12, 0x1a, 0x38, 0x12, 0x22, 0x78, 0x24, 0x08, 0x12, 539 0x1a, 0xa2, 0xff, 0xc3, 0x13, 0x12, 0x1a, 0xe8, 0x12, 0x23, 0x27, 0x24, 0x08, 0x12, 0x22, 0xa1,
529 0x21, 0xf3, 0xe0, 0xfe, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xe0, 540 0xe0, 0xfe, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x07, 0x12, 0x22, 0xa1, 0xe0, 0xfd, 0xee,
530 0xfd, 0xee, 0xed, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x03, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0xef, 0x12, 541 0xed, 0x12, 0x22, 0xe7, 0x90, 0x00, 0x03, 0xee, 0x8f, 0xf0, 0x12, 0x1b, 0x9f, 0x12, 0x32, 0x84,
531 0x31, 0xc7, 0x7d, 0x0a, 0xe4, 0xff, 0x12, 0x2f, 0x18, 0x02, 0x10, 0x86, 0x90, 0xfa, 0xe3, 0xe0, 542 0x7d, 0x0a, 0xe4, 0xff, 0x12, 0x2f, 0xb4, 0x02, 0x10, 0xce, 0x90, 0xfa, 0xe6, 0xe0, 0xb4, 0x03,
532 0xb4, 0x03, 0x06, 0x7e, 0x00, 0x7f, 0x40, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x08, 0x90, 0xfa, 0xd7, 543 0x06, 0x7e, 0x00, 0x7f, 0x40, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x08, 0x90, 0xfa, 0xda, 0xee, 0xf0,
533 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0xff, 0x7e, 0x00, 0x90, 0xfa, 544 0xa3, 0xef, 0xf0, 0x90, 0x00, 0x05, 0x12, 0x1a, 0xbb, 0xff, 0x7e, 0x00, 0x90, 0xfa, 0xd6, 0xee,
534 0xd3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x70, 0x03, 0x7f, 0x08, 0x22, 0x90, 0x00, 0x08, 0x12, 0x1a, 545 0xf0, 0xa3, 0xef, 0xf0, 0x70, 0x03, 0x7f, 0x08, 0x22, 0x90, 0x00, 0x08, 0x12, 0x1b, 0x48, 0xff,
535 0x98, 0xff, 0x90, 0xfa, 0xd5, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0xae, 0x02, 0xaf, 0x01, 0x8e, 546 0x90, 0xfa, 0xd8, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0xae, 0x02, 0xaf, 0x01, 0x8e, 0x50, 0x8f,
536 0x50, 0x8f, 0x51, 0x74, 0x0a, 0x25, 0x51, 0xf5, 0x51, 0xe4, 0x35, 0x50, 0xf5, 0x50, 0x90, 0xfa, 547 0x51, 0x74, 0x0a, 0x25, 0x51, 0xf5, 0x51, 0xe4, 0x35, 0x50, 0xf5, 0x50, 0x90, 0xfa, 0xdb, 0xe0,
537 0xd8, 0xe0, 0xff, 0x14, 0xfe, 0x90, 0xfa, 0xd6, 0xe0, 0x5e, 0xfe, 0xc3, 0xef, 0x9e, 0xff, 0x90, 548 0xff, 0x14, 0xfe, 0x90, 0xfa, 0xd9, 0xe0, 0x5e, 0xfe, 0xc3, 0xef, 0x9e, 0xff, 0x90, 0xfa, 0xdd,
538 0xfa, 0xda, 0xf0, 0xc3, 0x90, 0xfa, 0xd4, 0xe0, 0x9f, 0x90, 0xfa, 0xd3, 0xe0, 0x94, 0x00, 0x50, 549 0xf0, 0xc3, 0x90, 0xfa, 0xd7, 0xe0, 0x9f, 0x90, 0xfa, 0xd6, 0xe0, 0x94, 0x00, 0x50, 0x06, 0xa3,
539 0x06, 0xa3, 0xe0, 0x90, 0xfa, 0xda, 0xf0, 0x12, 0x1f, 0xfb, 0x60, 0x03, 0xe0, 0xff, 0x22, 0x12, 550 0xe0, 0x90, 0xfa, 0xdd, 0xf0, 0x12, 0x20, 0xa9, 0x60, 0x03, 0xe0, 0xff, 0x22, 0x12, 0x2e, 0x2b,
540 0x2d, 0x5a, 0x90, 0xfa, 0xd3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x60, 0x2b, 0x90, 0xfa, 0xd7, 551 0x90, 0xfa, 0xd6, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x60, 0x2b, 0x90, 0xfa, 0xda, 0xe0, 0xfc,
541 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x07, 0xe0, 0x90, 0xfa, 0xda, 552 0xa3, 0xe0, 0xfd, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x07, 0xe0, 0x90, 0xfa, 0xdd, 0xf0, 0x80,
542 0xf0, 0x80, 0x08, 0x90, 0xfa, 0xd4, 0xe0, 0x90, 0xfa, 0xda, 0xf0, 0x12, 0x1f, 0xfb, 0x60, 0x03, 553 0x08, 0x90, 0xfa, 0xd7, 0xe0, 0x90, 0xfa, 0xdd, 0xf0, 0x12, 0x20, 0xa9, 0x60, 0x03, 0xe0, 0xff,
543 0xe0, 0xff, 0x22, 0x12, 0x2d, 0x5a, 0x80, 0xca, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x52, 0xe4, 0xf5, 554 0x22, 0x12, 0x2e, 0x2b, 0x80, 0xca, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x52, 0xe4, 0xf5, 0x2d, 0xf5,
544 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x7f, 0x00, 0x22, 0xaa, 0x50, 0xa9, 0x51, 0x7b, 555 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x7f, 0x00, 0x22, 0xaa, 0x50, 0xa9, 0x51, 0x7b, 0x01, 0x90,
545 0x01, 0x90, 0xfa, 0xd5, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 0xda, 0xe0, 0xf5, 0x4a, 0x12, 556 0xfa, 0xd8, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 0xdd, 0xe0, 0xf5, 0x4a, 0x12, 0x29, 0x60,
546 0x28, 0x9f, 0x90, 0xfa, 0xd9, 0xef, 0xf0, 0x22, 0xef, 0x24, 0xae, 0x60, 0x52, 0x24, 0xfe, 0x60, 557 0x90, 0xfa, 0xdc, 0xef, 0xf0, 0x22, 0xef, 0x24, 0xae, 0x60, 0x52, 0x24, 0xfe, 0x60, 0x2e, 0x24,
547 0x2e, 0x24, 0xfe, 0x70, 0x03, 0x02, 0x20, 0xbb, 0x24, 0x06, 0x60, 0x03, 0x02, 0x21, 0x03, 0x78, 558 0xfe, 0x70, 0x03, 0x02, 0x21, 0x69, 0x24, 0x06, 0x60, 0x03, 0x02, 0x21, 0xb1, 0x78, 0x71, 0xe6,
548 0x71, 0xe6, 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xa5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x33, 559 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xa5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x33, 0x90, 0xfa,
549 0x90, 0xfa, 0x91, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xaf, 0x74, 0x01, 0xf0, 0x22, 0x78, 560 0x94, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xb2, 0x74, 0x01, 0xf0, 0x22, 0x78, 0x72, 0xe6,
550 0x72, 0xe6, 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xb5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x43, 561 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xb5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x43, 0x90, 0xfa,
551 0x90, 0xfa, 0x93, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xb0, 0x74, 0x01, 0xf0, 0x22, 0x90, 562 0x96, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xb3, 0x74, 0x01, 0xf0, 0x22, 0x90, 0xfa, 0xa0,
552 0xfa, 0x9d, 0xe0, 0xa3, 0x20, 0xe5, 0x03, 0x02, 0x21, 0x03, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 563 0xe0, 0xa3, 0x20, 0xe5, 0x03, 0x02, 0x21, 0xb1, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xcd, 0xf0,
553 0xca, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xca, 0xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 564 0xa3, 0xf0, 0x90, 0xfa, 0xcd, 0xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 0xa6, 0x12,
554 0xa6, 0x12, 0x22, 0x5d, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 565 0x23, 0x0d, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xcd, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 0xce, 0xe0,
555 0xcb, 0xe0, 0xff, 0x74, 0x34, 0xfe, 0x12, 0x2c, 0xb4, 0xef, 0x70, 0x57, 0x90, 0xfa, 0xcb, 0xe0, 566 0xff, 0x74, 0x34, 0xfe, 0x12, 0x2d, 0x85, 0xef, 0x70, 0x57, 0x90, 0xfa, 0xce, 0xe0, 0xff, 0x74,
556 0xff, 0x74, 0x34, 0x90, 0xfa, 0x95, 0xf0, 0xef, 0xa3, 0xf0, 0x22, 0x90, 0xfa, 0xa7, 0xe0, 0xa3, 567 0x34, 0x90, 0xfa, 0x98, 0xf0, 0xef, 0xa3, 0xf0, 0x22, 0x90, 0xfa, 0xaa, 0xe0, 0xa3, 0x30, 0xe5,
557 0x30, 0xe5, 0x40, 0x90, 0xff, 0xb6, 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xca, 568 0x40, 0x90, 0xff, 0xb6, 0xe0, 0x90, 0xfa, 0xcd, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xcd, 0xe0, 0xff,
558 0xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 0xb6, 0x12, 0x22, 0x5d, 0x90, 0xff, 0xb6, 569 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 0xb6, 0x12, 0x23, 0x0d, 0x90, 0xff, 0xb6, 0xe0, 0x90,
559 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 0xcb, 0xe0, 0xff, 0x74, 0x44, 0xfe, 0x12, 570 0xfa, 0xcd, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 0xce, 0xe0, 0xff, 0x74, 0x44, 0xfe, 0x12, 0x2d, 0x85,
560 0x2c, 0xb4, 0xef, 0x70, 0x0e, 0x90, 0xfa, 0xcb, 0xe0, 0xff, 0x74, 0x44, 0x90, 0xfa, 0x97, 0xf0, 571 0xef, 0x70, 0x0e, 0x90, 0xfa, 0xce, 0xe0, 0xff, 0x74, 0x44, 0x90, 0xfa, 0x9a, 0xf0, 0xef, 0xa3,
561 0xef, 0xa3, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 572 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0,
562 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 573 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x90,
563 0x07, 0x90, 0xff, 0x92, 0xe0, 0xff, 0x90, 0xfa, 0xc9, 0xf0, 0x90, 0xff, 0x92, 0xe4, 0xf0, 0xef, 574 0xff, 0x92, 0xe0, 0xff, 0x90, 0xfa, 0xcc, 0xf0, 0x90, 0xff, 0x92, 0xe4, 0xf0, 0xef, 0x12, 0x1b,
564 0x12, 0x1b, 0x4c, 0x21, 0xbb, 0x26, 0x21, 0xbb, 0x2e, 0x21, 0x5e, 0x30, 0x21, 0x5e, 0x32, 0x21, 575 0xfc, 0x22, 0x69, 0x26, 0x22, 0x69, 0x2e, 0x22, 0x0c, 0x30, 0x22, 0x0c, 0x32, 0x22, 0x1a, 0x38,
565 0x6c, 0x38, 0x21, 0x7e, 0x3a, 0x21, 0xb0, 0x3e, 0x21, 0x9b, 0x44, 0x21, 0x90, 0x46, 0x21, 0xa6, 576 0x22, 0x2c, 0x3a, 0x22, 0x5e, 0x3e, 0x22, 0x49, 0x44, 0x22, 0x3e, 0x46, 0x22, 0x54, 0x50, 0x22,
566 0x50, 0x21, 0xa6, 0x52, 0x21, 0xa6, 0x54, 0x21, 0xa6, 0x56, 0x00, 0x00, 0x21, 0xc0, 0x90, 0xfa, 577 0x54, 0x52, 0x22, 0x54, 0x54, 0x22, 0x54, 0x56, 0x00, 0x00, 0x22, 0x6e, 0x90, 0xfa, 0xcc, 0xe0,
567 0xc9, 0xe0, 0xfd, 0x7c, 0x00, 0x7f, 0x01, 0x12, 0x11, 0x16, 0x80, 0x62, 0x7c, 0x00, 0x7d, 0x01, 578 0xfd, 0x7c, 0x00, 0x7f, 0x01, 0x12, 0x11, 0x5e, 0x80, 0x62, 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x03,
568 0x7f, 0x03, 0x12, 0x11, 0x16, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x50, 0x7c, 0x00, 579 0x12, 0x11, 0x5e, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x50, 0x7c, 0x00, 0x7d, 0x01,
569 0x7d, 0x01, 0x7f, 0x02, 0x12, 0x11, 0x16, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x40, 0xf0, 0x80, 0x3e, 580 0x7f, 0x02, 0x12, 0x11, 0x5e, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x40, 0xf0, 0x80, 0x3e, 0x7c, 0x00,
570 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x05, 0x12, 0x11, 0x16, 0x80, 0x33, 0x7c, 0x00, 0x7d, 0x01, 0x7f, 581 0x7d, 0x01, 0x7f, 0x05, 0x12, 0x11, 0x5e, 0x80, 0x33, 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x06, 0x12,
571 0x06, 0x12, 0x11, 0x16, 0x80, 0x28, 0x90, 0xfa, 0xc9, 0xe0, 0xff, 0x12, 0x20, 0x18, 0x80, 0x1e, 582 0x11, 0x5e, 0x80, 0x28, 0x90, 0xfa, 0xcc, 0xe0, 0xff, 0x12, 0x20, 0xc6, 0x80, 0x1e, 0x7c, 0x00,
572 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x04, 0x12, 0x11, 0x16, 0x80, 0x13, 0x12, 0x27, 0x8d, 0x80, 0x0e, 583 0x7d, 0x01, 0x7f, 0x04, 0x12, 0x11, 0x5e, 0x80, 0x13, 0x12, 0x28, 0x4e, 0x80, 0x0e, 0x90, 0xfa,
573 0x90, 0xfa, 0xc9, 0xe0, 0x24, 0x00, 0xff, 0xe4, 0x34, 0xff, 0xfe, 0x12, 0x2c, 0xb4, 0xd0, 0x07, 584 0xcc, 0xe0, 0x24, 0x00, 0xff, 0xe4, 0x34, 0xff, 0xfe, 0x12, 0x2d, 0x85, 0xd0, 0x07, 0xd0, 0x06,
574 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 585 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82,
575 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x24, 586 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x24, 0x04, 0x8e,
576 0x04, 0x8e, 0x83, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, 0x74, 0x12, 0x25, 0x24, 0xf5, 587 0x83, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, 0x74, 0x13, 0x25, 0x24, 0xf5, 0x82, 0xe4,
577 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 588 0x34, 0xf9, 0xf5, 0x83, 0x22, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 0x83, 0x22,
578 0x83, 0x22, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0x7b, 589 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0x7b, 0xff, 0x7a,
579 0xff, 0x7a, 0x31, 0x79, 0x99, 0x7e, 0x00, 0x7f, 0x0a, 0x02, 0x19, 0xcc, 0xff, 0x90, 0xf9, 0x6c, 590 0x32, 0x79, 0x56, 0x7e, 0x00, 0x7f, 0x0a, 0x02, 0x1a, 0x7c, 0x78, 0x80, 0xe6, 0xfc, 0x08, 0xe6,
580 0x02, 0x1b, 0x3a, 0x90, 0xf9, 0x67, 0x12, 0x1b, 0x3a, 0x90, 0x00, 0x04, 0x02, 0x1a, 0x0b, 0xe6, 591 0xf5, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0x22, 0xff, 0x90, 0xf9, 0x6f, 0x02, 0x1b, 0xea, 0x90, 0xf9,
581 0xfc, 0x08, 0xe6, 0xf5, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0x22, 0x78, 0x7e, 0xe6, 0xfe, 0x08, 0xe6, 592 0x6a, 0x12, 0x1b, 0xea, 0x90, 0x00, 0x04, 0x02, 0x1a, 0xbb, 0x78, 0x7e, 0xe6, 0xfe, 0x08, 0xe6,
582 0xff, 0x22, 0xed, 0x12, 0x1a, 0x4a, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x22, 0xef, 0xf0, 0x90, 593 0xff, 0x22, 0xed, 0x12, 0x1a, 0xfa, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x22, 0xef, 0xf0, 0x90,
583 0xfa, 0xcb, 0xe0, 0x54, 0x0f, 0x4e, 0xfe, 0xf0, 0xef, 0x54, 0xf0, 0x4e, 0xf0, 0x22, 0x08, 0xe6, 594 0xfa, 0xce, 0xe0, 0x54, 0x0f, 0x4e, 0xfe, 0xf0, 0xef, 0x54, 0xf0, 0x4e, 0xf0, 0x22, 0x78, 0x80,
584 0xfc, 0x08, 0xe6, 0x8c, 0x83, 0x24, 0x09, 0x22, 0x78, 0x7e, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x8c, 595 0xe6, 0xfc, 0x08, 0xe6, 0x8c, 0x83, 0x22, 0x78, 0x7e, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x8c, 0x83,
585 0x83, 0x22, 0xa6, 0x07, 0xe6, 0x24, 0x6e, 0xf8, 0xe6, 0x22, 0x78, 0x7e, 0xe6, 0xfa, 0x08, 0xe6, 596 0x22, 0xa6, 0x07, 0xe6, 0x24, 0x6e, 0xf8, 0xe6, 0x22, 0x78, 0x7e, 0xe6, 0xfa, 0x08, 0xe6, 0xfb,
586 0xfb, 0x22, 0x26, 0xf6, 0x18, 0xee, 0x36, 0xf6, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe5, 0x82, 0x22, 597 0x22, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x22, 0x26, 0xf6, 0x18, 0xee, 0x36, 0xf6, 0x22,
587 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0x8d, 0x28, 0x90, 0xfa, 0xcf, 0xe4, 0xf0, 0xa3, 0x74, 0x02, 598 0xef, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe5, 0x82,
588 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xce, 0x90, 0xfa, 0xcf, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, 599 0x22, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0x8d, 0x28, 0x90, 0xfa, 0xd2, 0xe4, 0xf0, 0xa3, 0x74,
589 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xce, 0xe0, 0x65, 0x28, 0x60, 0x46, 0xa3, 0xe0, 600 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xd1, 0x90, 0xfa, 0xd2, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0,
590 0xff, 0xa3, 0xe0, 0xa3, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x23, 0x2f, 0x90, 0xfa, 0xce, 0xe0, 601 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xd1, 0xe0, 0x65, 0x28, 0x60, 0x46, 0xa3,
591 0xff, 0x90, 0xfa, 0xd1, 0xe4, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0x12, 0x23, 0x2f, 0x90, 0xfa, 0xd1, 602 0xe0, 0xff, 0xa3, 0xe0, 0xa3, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x23, 0xf0, 0x90, 0xfa, 0xd1,
592 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0xfa, 0xcf, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xfa, 0xce, 0xe0, 603 0xe0, 0xff, 0x90, 0xfa, 0xd4, 0xe4, 0x8f, 0xf0, 0x12, 0x1b, 0x1c, 0x12, 0x23, 0xf0, 0x90, 0xfa,
593 0xa3, 0x75, 0xf0, 0x00, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x04, 0x12, 0x1a, 604 0xd4, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0xfa, 0xd2, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xfa, 0xd1,
594 0x6c, 0x02, 0x22, 0xb1, 0x90, 0xfa, 0xd0, 0xe0, 0x24, 0x01, 0xff, 0x90, 0xfa, 0xcf, 0xe0, 0x34, 605 0xe0, 0xa3, 0x75, 0xf0, 0x00, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xd2, 0xe4, 0x75, 0xf0, 0x04, 0x12,
595 0x00, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x8f, 0xf0, 0x12, 0x1a, 0xd0, 0x7f, 0x00, 0x22, 0x7b, 606 0x1b, 0x1c, 0x02, 0x23, 0x72, 0x90, 0xfa, 0xd3, 0xe0, 0x24, 0x01, 0xff, 0x90, 0xfa, 0xd2, 0xe0,
596 0x01, 0x7a, 0xfa, 0x79, 0xce, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1a, 0x6c, 0x85, 607 0x34, 0x00, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x8f, 0xf0, 0x12, 0x1b, 0x80, 0x7f, 0x00, 0x22,
597 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x25, 0xd7, 0x8f, 0x62, 0x12, 0x2a, 0x06, 0x12, 0x22, 608 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xd1, 0x90, 0xfa, 0xd2, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1b, 0x1c,
598 0x4a, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x21, 0xf3, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x02, 0xf0, 0x08, 609 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x26, 0x98, 0x8f, 0x62, 0x12, 0x2a, 0xc7, 0x12,
599 0x12, 0x22, 0x3f, 0xe0, 0xa3, 0x30, 0xe5, 0x0c, 0x12, 0x22, 0x56, 0x24, 0x0b, 0x12, 0x21, 0xf3, 610 0x22, 0xfa, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x22, 0xa1, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x02, 0xf0,
600 0xe0, 0x44, 0x01, 0xf0, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 611 0x08, 0x12, 0x22, 0xdc, 0xe0, 0xa3, 0x30, 0xe5, 0x0c, 0x12, 0x23, 0x06, 0x24, 0x0b, 0x12, 0x22,
601 0x54, 0xb8, 0xfd, 0xf0, 0xe5, 0x62, 0x24, 0xfe, 0x44, 0x20, 0xfc, 0x4d, 0xf0, 0xe5, 0x82, 0x24, 612 0xa1, 0xe0, 0x44, 0x01, 0xf0, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0xf5, 0x82, 0x8e, 0x83,
602 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x54, 0xb8, 0xf0, 0x4c, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0x74, 613 0xe0, 0x54, 0xb8, 0xfd, 0xf0, 0xe5, 0x62, 0x24, 0xfe, 0x44, 0x20, 0xfc, 0x4d, 0xf0, 0xe5, 0x82,
603 0x03, 0xf0, 0x18, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x05, 0x12, 0x21, 0xf3, 0xc0, 614 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0, 0x54, 0xb8, 0xf0, 0x4c, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3,
604 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x74, 0x96, 0x25, 0x62, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 615 0x74, 0x03, 0xf0, 0x18, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x05, 0x12, 0x22, 0xa1,
605 0xe0, 0x54, 0xfc, 0x44, 0x03, 0xfc, 0xed, 0x4c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 616 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x74, 0x99, 0x25, 0x62, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5,
606 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x44, 0x80, 0xf0, 617 0x83, 0xe0, 0x54, 0xfc, 0x44, 0x03, 0xfc, 0xed, 0x4c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82,
607 0x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x62, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 0x00, 0x22, 0x12, 618 0x8e, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0, 0x44, 0x80,
608 0x10, 0x03, 0x7f, 0x02, 0x12, 0x12, 0x19, 0x78, 0x67, 0xe6, 0x44, 0x02, 0xf6, 0xd2, 0xb0, 0xd2, 619 0xf0, 0x12, 0x32, 0x84, 0x74, 0x6e, 0x25, 0x62, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 0x00, 0x22,
609 0xb1, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe7, 0x07, 0x90, 0xff, 0x9e, 0xe4, 0xf0, 0x80, 0x36, 0xd2, 620 0x12, 0x10, 0x4b, 0x7f, 0x02, 0x12, 0x12, 0x61, 0x78, 0x67, 0xe6, 0x44, 0x02, 0xf6, 0xd2, 0xb0,
610 0xb3, 0x90, 0xff, 0xa4, 0xe0, 0x90, 0xfa, 0x7b, 0xf0, 0x90, 0xff, 0xb4, 0xe0, 0x90, 0xfa, 0x7c, 621 0xd2, 0xb1, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe7, 0x07, 0x90, 0xff, 0x9e, 0xe4, 0xf0, 0x80, 0x36,
611 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x90, 0xfa, 0x79, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x90, 0xfa, 0x7a, 622 0xd2, 0xb3, 0x90, 0xff, 0xa4, 0xe0, 0x90, 0xfa, 0x7e, 0xf0, 0x90, 0xff, 0xb4, 0xe0, 0x90, 0xfa,
612 0xf0, 0x90, 0xff, 0xa4, 0x74, 0x30, 0xf0, 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xff, 0xa2, 0x74, 0x40, 623 0x7f, 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x90, 0xfa, 0x7c, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x90, 0xfa,
613 0xf0, 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xfa, 0xe4, 0xe5, 0xa8, 0xf0, 0x75, 0xa8, 0x81, 0x90, 0xff, 624 0x7d, 0xf0, 0x90, 0xff, 0xa4, 0x74, 0x30, 0xf0, 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xff, 0xa2, 0x74,
614 0x92, 0xe0, 0x60, 0x04, 0xe4, 0xf0, 0x80, 0xf6, 0x90, 0xff, 0xfd, 0x74, 0x3a, 0xf0, 0x43, 0x87, 625 0x40, 0xf0, 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xfa, 0xe7, 0xe5, 0xa8, 0xf0, 0x75, 0xa8, 0x81, 0x90,
615 0x01, 0x00, 0x00, 0x00, 0x90, 0xfa, 0x7b, 0xe0, 0x90, 0xff, 0xa4, 0xf0, 0x90, 0xfa, 0x7c, 0xe0, 626 0xff, 0x92, 0xe0, 0x60, 0x04, 0xe4, 0xf0, 0x80, 0xf6, 0x90, 0xff, 0xfd, 0x74, 0x3a, 0xf0, 0x43,
616 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xfa, 0x79, 0xe0, 0x90, 0xff, 0xa2, 0xf0, 0x90, 0xfa, 0x7a, 0xe0, 627 0x87, 0x01, 0x00, 0x00, 0x00, 0x90, 0xfa, 0x7e, 0xe0, 0x90, 0xff, 0xa4, 0xf0, 0x90, 0xfa, 0x7f,
617 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x60, 0x02, 0xc2, 0xb3, 0x90, 0xfa, 0xe4, 0xe0, 628 0xe0, 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xfa, 0x7c, 0xe0, 0x90, 0xff, 0xa2, 0xf0, 0x90, 0xfa, 0x7d,
618 0xf5, 0xa8, 0x02, 0x10, 0x86, 0x8b, 0x5c, 0x8a, 0x5d, 0x89, 0x5e, 0x12, 0x2d, 0x3c, 0x90, 0xfa, 629 0xe0, 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xf9, 0x18, 0xe0, 0x60, 0x02, 0xc2, 0xb3, 0x90, 0xfa, 0xe7,
619 0xc0, 0x12, 0x1b, 0x43, 0xaa, 0x5d, 0xa9, 0x5e, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0x43, 0x90, 0xfa, 630 0xe0, 0xf5, 0xa8, 0x02, 0x10, 0xce, 0x8b, 0x5c, 0x8a, 0x5d, 0x89, 0x5e, 0x12, 0x2e, 0x0d, 0x90,
620 0xc4, 0xe4, 0x75, 0xf0, 0x0a, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0x3a, 0xe9, 0x24, 631 0xfa, 0xc3, 0x12, 0x1b, 0xf3, 0xaa, 0x5d, 0xa9, 0x5e, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0xf3, 0x90,
621 0x01, 0xf9, 0xe4, 0x3a, 0xfa, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x43, 0xab, 0x5c, 0xaa, 0x5d, 0xa9, 632 0xfa, 0xc7, 0xe4, 0x75, 0xf0, 0x0a, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0xea, 0xe9,
622 0x5e, 0x12, 0x2d, 0x48, 0xe0, 0xff, 0xc3, 0x13, 0xf0, 0xe4, 0x78, 0x82, 0xf6, 0x90, 0xfa, 0xbe, 633 0x24, 0x01, 0xf9, 0xe4, 0x3a, 0xfa, 0x90, 0xfa, 0xc9, 0x12, 0x1b, 0xf3, 0xab, 0x5c, 0xaa, 0x5d,
623 0xe0, 0xff, 0x78, 0x82, 0xe6, 0xc3, 0x9f, 0x50, 0x4a, 0x90, 0xfa, 0xc0, 0x12, 0x2d, 0x1d, 0xff, 634 0xa9, 0x5e, 0x12, 0x2e, 0x19, 0xe0, 0xff, 0xc3, 0x13, 0xf0, 0xe4, 0x78, 0x82, 0xf6, 0x90, 0xfa,
624 0x78, 0x83, 0xf6, 0x90, 0xfa, 0xc3, 0x12, 0x2d, 0x1d, 0xfe, 0xf4, 0x5f, 0xff, 0x78, 0x83, 0xf6, 635 0xc1, 0xe0, 0xff, 0x78, 0x82, 0xe6, 0xc3, 0x9f, 0x50, 0x4a, 0x90, 0xfa, 0xc3, 0x12, 0x2d, 0xee,
625 0x12, 0x2d, 0x1a, 0x5e, 0x4f, 0xff, 0x78, 0x83, 0xf6, 0x12, 0x2d, 0x23, 0x75, 0xf0, 0x02, 0x12, 636 0xff, 0x78, 0x83, 0xf6, 0x90, 0xfa, 0xc6, 0x12, 0x2d, 0xee, 0xfe, 0xf4, 0x5f, 0xff, 0x78, 0x83,
626 0x1a, 0x6c, 0x90, 0xfa, 0xc4, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1a, 0x6c, 0xab, 0x5c, 0xaa, 0x5d, 637 0xf6, 0x12, 0x2d, 0xeb, 0x5e, 0x4f, 0xff, 0x78, 0x83, 0xf6, 0x12, 0x2d, 0xf4, 0x75, 0xf0, 0x02,
627 0xa9, 0x5e, 0x90, 0x00, 0x04, 0x12, 0x1a, 0x0b, 0x30, 0xe4, 0x03, 0x12, 0x2d, 0x32, 0x78, 0x82, 638 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xc7, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1b, 0x1c, 0xab, 0x5c, 0xaa,
628 0x06, 0x80, 0xaa, 0xe4, 0x90, 0xfa, 0xbf, 0xf0, 0x22, 0x8b, 0x56, 0x8a, 0x57, 0x89, 0x58, 0x90, 639 0x5d, 0xa9, 0x5e, 0x90, 0x00, 0x04, 0x12, 0x1a, 0xbb, 0x30, 0xe4, 0x03, 0x12, 0x2e, 0x03, 0x78,
629 0xfa, 0xbf, 0x74, 0x06, 0xf0, 0xe4, 0x90, 0xfa, 0xbe, 0xf0, 0x12, 0x19, 0xf2, 0x24, 0x6e, 0x60, 640 0x82, 0x06, 0x80, 0xaa, 0xe4, 0x90, 0xfa, 0xc2, 0xf0, 0x22, 0x8b, 0x56, 0x8a, 0x57, 0x89, 0x58,
630 0x26, 0x14, 0x70, 0x70, 0x12, 0x2d, 0x09, 0x60, 0x09, 0x24, 0x30, 0x70, 0x12, 0x12, 0x24, 0x95, 641 0x90, 0xfa, 0xc2, 0x74, 0x06, 0xf0, 0xe4, 0x90, 0xfa, 0xc1, 0xf0, 0x12, 0x1a, 0xa2, 0x24, 0x6e,
631 0x80, 0x62, 0x12, 0x2d, 0x53, 0x12, 0x1f, 0x2c, 0x90, 0xfa, 0xbf, 0xef, 0xf0, 0x80, 0x55, 0x90, 642 0x60, 0x26, 0x14, 0x70, 0x70, 0x12, 0x2d, 0xda, 0x60, 0x09, 0x24, 0x30, 0x70, 0x12, 0x12, 0x25,
632 0xfa, 0xbf, 0x74, 0x81, 0xf0, 0x80, 0x4d, 0x12, 0x2d, 0x09, 0x60, 0x09, 0x24, 0x30, 0x70, 0x3e, 643 0x56, 0x80, 0x62, 0x12, 0x2e, 0x24, 0x12, 0x1f, 0xda, 0x90, 0xfa, 0xc2, 0xef, 0xf0, 0x80, 0x55,
633 0x12, 0x2c, 0x5f, 0x80, 0x3f, 0xe5, 0x58, 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x57, 0xfa, 0x7b, 0x01, 644 0x90, 0xfa, 0xc2, 0x74, 0x81, 0xf0, 0x80, 0x4d, 0x12, 0x2d, 0xda, 0x60, 0x09, 0x24, 0x30, 0x70,
634 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x12, 0x2d, 0x53, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0xfd, 645 0x3e, 0x12, 0x2d, 0x30, 0x80, 0x3f, 0xe5, 0x58, 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x57, 0xfa, 0x7b,
635 0x90, 0x00, 0x08, 0x12, 0x1a, 0x98, 0xf5, 0x2e, 0x85, 0xf0, 0x2d, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 646 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x12, 0x2e, 0x24, 0x90, 0x00, 0x05, 0x12, 0x1a, 0xbb,
636 0x03, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xbe, 0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0x80, 0x06, 0x90, 0xfa, 647 0xfd, 0x90, 0x00, 0x08, 0x12, 0x1b, 0x48, 0xf5, 0x2e, 0x85, 0xf0, 0x2d, 0xd0, 0x01, 0xd0, 0x02,
637 0xbf, 0x74, 0x81, 0xf0, 0x90, 0xfa, 0xbf, 0xe0, 0x12, 0x2d, 0x53, 0x90, 0x00, 0x02, 0x12, 0x1a, 648 0xd0, 0x03, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xc1, 0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0x80, 0x06, 0x90,
638 0x4a, 0x90, 0xfa, 0xbe, 0xe0, 0xff, 0x22, 0x8b, 0x29, 0x8a, 0x2a, 0x89, 0x2b, 0x8d, 0x2c, 0xe5, 649 0xfa, 0xc2, 0x74, 0x81, 0xf0, 0x90, 0xfa, 0xc2, 0xe0, 0x12, 0x2e, 0x24, 0x90, 0x00, 0x02, 0x12,
639 0x2c, 0x70, 0x03, 0xaf, 0x2c, 0x22, 0x12, 0x2d, 0x82, 0x70, 0x16, 0x12, 0x2d, 0xa1, 0xe5, 0x2d, 650 0x1a, 0xfa, 0x90, 0xfa, 0xc1, 0xe0, 0xff, 0x22, 0x8b, 0x29, 0x8a, 0x2a, 0x89, 0x2b, 0x8d, 0x2c,
640 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0x1b, 0x50, 0xf2, 0x12, 0x26, 0x64, 0x40, 0x0b, 0x7f, 0x00, 651 0xe5, 0x2c, 0x70, 0x03, 0xaf, 0x2c, 0x22, 0x12, 0x2e, 0x53, 0x70, 0x16, 0x12, 0x2e, 0x72, 0xe5,
641 0x22, 0x12, 0x2d, 0xa1, 0x12, 0x26, 0x64, 0x50, 0xf8, 0x90, 0xff, 0xf3, 0x74, 0xa1, 0xf0, 0xe5, 652 0x2d, 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0xd8, 0x50, 0xf2, 0x12, 0x27, 0x25, 0x40, 0x0b, 0x7f,
642 0x2c, 0xb4, 0x01, 0x07, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0xf1, 0xe4, 0xf0, 653 0x00, 0x22, 0x12, 0x2e, 0x72, 0x12, 0x27, 0x25, 0x50, 0xf8, 0x90, 0xff, 0xf3, 0x74, 0xa1, 0xf0,
643 0xf5, 0x2f, 0xe5, 0x2c, 0x14, 0xff, 0xe5, 0x2f, 0xc3, 0x9f, 0x50, 0x2a, 0x12, 0x31, 0x04, 0x40, 654 0xe5, 0x2c, 0xb4, 0x01, 0x07, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0xf1, 0xe4,
644 0x03, 0xaf, 0x2f, 0x22, 0xc3, 0xe5, 0x2c, 0x95, 0x2f, 0xff, 0xbf, 0x02, 0x07, 0x90, 0xff, 0xf0, 655 0xf0, 0xf5, 0x2f, 0xe5, 0x2c, 0x14, 0xff, 0xe5, 0x2f, 0xc3, 0x9f, 0x50, 0x2a, 0x12, 0x31, 0xc1,
645 0xe0, 0x44, 0x02, 0xf0, 0x12, 0x2d, 0x94, 0x05, 0x2f, 0x74, 0x01, 0x25, 0x2b, 0xf5, 0x2b, 0xe4, 656 0x40, 0x03, 0xaf, 0x2f, 0x22, 0xc3, 0xe5, 0x2c, 0x95, 0x2f, 0xff, 0xbf, 0x02, 0x07, 0x90, 0xff,
646 0x35, 0x2a, 0xf5, 0x2a, 0x80, 0xcc, 0x12, 0x31, 0x04, 0x40, 0x03, 0x7f, 0x18, 0x22, 0x12, 0x2d, 657 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x12, 0x2e, 0x65, 0x05, 0x2f, 0x74, 0x01, 0x25, 0x2b, 0xf5, 0x2b,
647 0x94, 0xaf, 0x2c, 0x22, 0x90, 0xff, 0xf1, 0xe5, 0x2e, 0xf0, 0x02, 0x31, 0x1b, 0x12, 0x10, 0x03, 658 0xe4, 0x35, 0x2a, 0xf5, 0x2a, 0x80, 0xcc, 0x12, 0x31, 0xc1, 0x40, 0x03, 0x7f, 0x18, 0x22, 0x12,
648 0x78, 0x84, 0x12, 0x22, 0x82, 0x30, 0xe1, 0x08, 0x7f, 0x13, 0x12, 0x30, 0xec, 0x02, 0x26, 0xfb, 659 0x2e, 0x65, 0xaf, 0x2c, 0x22, 0x90, 0xff, 0xf1, 0xe5, 0x2e, 0xf0, 0x02, 0x31, 0xd8, 0x12, 0x10,
649 0x78, 0x84, 0xe6, 0xf9, 0x24, 0x12, 0x12, 0x21, 0xff, 0xe0, 0xff, 0x30, 0xe7, 0x40, 0x54, 0x03, 660 0x4b, 0x78, 0x84, 0x12, 0x23, 0x31, 0x30, 0xe1, 0x08, 0x7f, 0x13, 0x12, 0x31, 0xa9, 0x02, 0x27,
650 0x60, 0x1e, 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x44, 0x04, 661 0xbc, 0x78, 0x84, 0xe6, 0xf9, 0x24, 0x13, 0x12, 0x22, 0xad, 0xe0, 0xff, 0x30, 0xe7, 0x40, 0x54,
651 0xf0, 0x80, 0x46, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x80, 0x39, 662 0x03, 0x60, 0x1e, 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x44,
652 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x80, 663 0x04, 0xf0, 0x80, 0x46, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x80,
653 0x28, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1b, 0xef, 0x54, 664 0x39, 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x01, 0xf0,
654 0x03, 0x60, 0x14, 0xe9, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x07, 665 0x80, 0x28, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1b, 0xef,
655 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf, 0xf0, 0xc2, 0xb3, 0x90, 0xf9, 0x17, 0xe0, 0x04, 0xf0, 0xaf, 666 0x54, 0x03, 0x60, 0x14, 0xe9, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80,
656 0x01, 0x12, 0x22, 0x33, 0xfd, 0x12, 0x2f, 0x49, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x75, 0xa8, 667 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf, 0xf0, 0xc2, 0xb3, 0x90, 0xf9, 0x18, 0xe0, 0x04, 0xf0,
657 0x40, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x8b, 0x02, 0x27, 0x48, 0x02, 0x30, 0xcf, 668 0xaf, 0x01, 0x12, 0x22, 0xee, 0xfd, 0x12, 0x2f, 0xe5, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce, 0x75,
658 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 669 0xa8, 0x40, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x8b, 0x02, 0x28, 0x09, 0x02, 0x31,
659 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 670 0x8c, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf,
660 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 671 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54,
661 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x2b, 0x4c, 0xe4, 0x7e, 0x01, 0x93, 0x60, 672 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80,
662 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 673 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x2b, 0xa9, 0xe4, 0x7e, 0x01, 0x93,
663 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 674 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60,
664 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 675 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4,
665 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xe4, 0xf5, 0x22, 676 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3,
666 0x12, 0x1d, 0x12, 0xe0, 0xb4, 0x04, 0x0d, 0xe5, 0x22, 0x24, 0x03, 0xff, 0x12, 0x2f, 0x77, 0x12, 677 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xe4, 0xf5,
667 0x1d, 0x12, 0xe4, 0xf0, 0x05, 0x22, 0xe5, 0x22, 0xc3, 0x94, 0x02, 0x40, 0xe3, 0xe4, 0xf5, 0x22, 678 0x22, 0x12, 0x1d, 0xc2, 0xe0, 0xb4, 0x04, 0x0d, 0xe5, 0x22, 0x24, 0x03, 0xff, 0x12, 0x30, 0x13,
668 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x91, 0x12, 0x1d, 0x53, 0x60, 0x2c, 0x12, 0x2c, 0xb4, 679 0x12, 0x1d, 0xc2, 0xe4, 0xf0, 0x05, 0x22, 0xe5, 0x22, 0xc3, 0x94, 0x02, 0x40, 0xe3, 0xe4, 0xf5,
669 0xef, 0x60, 0x52, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x91, 0x12, 0x1b, 0x1c, 0xe4, 0xf0, 680 0x22, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x94, 0x12, 0x1e, 0x03, 0x60, 0x2c, 0x12, 0x2d,
670 0xa3, 0xf0, 0x75, 0xf0, 0x0a, 0xe5, 0x22, 0x90, 0xfa, 0x9d, 0x12, 0x1b, 0x1c, 0xe0, 0xa3, 0x30, 681 0x85, 0xef, 0x60, 0x52, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x94, 0x12, 0x1b, 0xcc, 0xe4,
671 0xe6, 0x33, 0x12, 0x1d, 0x12, 0x74, 0x04, 0xf0, 0x22, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 682 0xf0, 0xa3, 0xf0, 0x75, 0xf0, 0x0a, 0xe5, 0x22, 0x90, 0xfa, 0xa0, 0x12, 0x1b, 0xcc, 0xe0, 0xa3,
672 0x95, 0x12, 0x1d, 0x53, 0x60, 0x16, 0x12, 0x2c, 0xb4, 0xef, 0x60, 0x19, 0x75, 0xf0, 0x02, 0xe5, 683 0x30, 0xe6, 0x33, 0x12, 0x1d, 0xc2, 0x74, 0x04, 0xf0, 0x22, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90,
673 0x22, 0x90, 0xfa, 0x95, 0x12, 0x1b, 0x1c, 0xe4, 0xf0, 0xa3, 0xf0, 0x22, 0x05, 0x22, 0xe5, 0x22, 684 0xfa, 0x98, 0x12, 0x1e, 0x03, 0x60, 0x16, 0x12, 0x2d, 0x85, 0xef, 0x60, 0x19, 0x75, 0xf0, 0x02,
674 0xc3, 0x94, 0x02, 0x40, 0x9b, 0x22, 0xe4, 0xff, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xfe, 0xef, 685 0xe5, 0x22, 0x90, 0xfa, 0x98, 0x12, 0x1b, 0xcc, 0xe4, 0xf0, 0xa3, 0xf0, 0x22, 0x05, 0x22, 0xe5,
675 0xc3, 0x9e, 0x50, 0x17, 0x74, 0xf0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xe0, 0x12, 686 0x22, 0xc3, 0x94, 0x02, 0x40, 0x9b, 0x22, 0xe4, 0xff, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xfe,
676 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x0f, 0x12, 0x1c, 0x00, 0x80, 0xdd, 0xef, 0xfd, 0xc3, 0xe5, 0x3a, 687 0xef, 0xc3, 0x9e, 0x50, 0x17, 0x74, 0xf0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xe0,
677 0x9d, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39, 0xd3, 0xe5, 0x3a, 0x94, 0x00, 0xe5, 0x39, 688 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xe8, 0x0f, 0x12, 0x1c, 0xb0, 0x80, 0xdd, 0xef, 0xfd, 0xc3, 0xe5,
678 0x94, 0x00, 0x40, 0x06, 0xe4, 0x90, 0xff, 0x83, 0xf0, 0x22, 0x12, 0x1d, 0x2f, 0x12, 0x1d, 0x84, 689 0x3a, 0x9d, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39, 0xd3, 0xe5, 0x3a, 0x94, 0x00, 0xe5,
679 0x12, 0x1d, 0x76, 0x12, 0x19, 0xf2, 0x24, 0x6e, 0x60, 0x1e, 0x14, 0x60, 0x1b, 0x24, 0x8e, 0x70, 690 0x39, 0x94, 0x00, 0x40, 0x06, 0xe4, 0x90, 0xff, 0x83, 0xf0, 0x22, 0x12, 0x1d, 0xdf, 0x12, 0x1e,
680 0x2d, 0x90, 0x00, 0x01, 0x12, 0x1a, 0x0b, 0xff, 0x24, 0xfc, 0x60, 0x03, 0x04, 0x70, 0x1f, 0xef, 691 0x34, 0x12, 0x1e, 0x26, 0x12, 0x1a, 0xa2, 0x24, 0x6e, 0x60, 0x1e, 0x14, 0x60, 0x1b, 0x24, 0x8e,
681 0xfd, 0x7c, 0x00, 0x7f, 0x0d, 0x02, 0x11, 0x16, 0x12, 0x1d, 0x8b, 0x12, 0x25, 0x39, 0x12, 0x1c, 692 0x70, 0x2d, 0x90, 0x00, 0x01, 0x12, 0x1a, 0xbb, 0xff, 0x24, 0xfc, 0x60, 0x03, 0x04, 0x70, 0x1f,
682 0xd9, 0x12, 0x1a, 0x0b, 0x60, 0x03, 0x02, 0x31, 0xbd, 0xe4, 0xff, 0x12, 0x31, 0xb1, 0x22, 0x8b, 693 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0d, 0x02, 0x11, 0x5e, 0x12, 0x1e, 0x3b, 0x12, 0x25, 0xfa, 0x12,
683 0x45, 0x8a, 0x46, 0x89, 0x47, 0x8c, 0x48, 0x8d, 0x49, 0xd2, 0x00, 0x12, 0x2d, 0x82, 0x70, 0x16, 694 0x1d, 0x89, 0x12, 0x1a, 0xbb, 0x60, 0x03, 0x02, 0x32, 0x7a, 0xe4, 0xff, 0x12, 0x32, 0x6e, 0x22,
684 0x12, 0x2d, 0xa1, 0xe5, 0x48, 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0x1b, 0x50, 0xf2, 0x12, 0x29, 695 0x8b, 0x45, 0x8a, 0x46, 0x89, 0x47, 0x8c, 0x48, 0x8d, 0x49, 0xd2, 0x00, 0x12, 0x2e, 0x53, 0x70,
685 0x14, 0x40, 0x0b, 0x7f, 0x18, 0x22, 0x12, 0x2d, 0xa1, 0x12, 0x29, 0x14, 0x50, 0xf8, 0xe4, 0xf5, 696 0x16, 0x12, 0x2e, 0x72, 0xe5, 0x48, 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0xd8, 0x50, 0xf2, 0x12,
686 0x4b, 0xe5, 0x4a, 0x14, 0xff, 0xe5, 0x4b, 0xc3, 0x9f, 0x50, 0x17, 0x12, 0x29, 0x04, 0x40, 0x03, 697 0x29, 0xd5, 0x40, 0x0b, 0x7f, 0x18, 0x22, 0x12, 0x2e, 0x72, 0x12, 0x29, 0xd5, 0x50, 0xf8, 0xe4,
687 0x7f, 0x18, 0x22, 0x05, 0x4b, 0x74, 0x01, 0x25, 0x47, 0xf5, 0x47, 0xe4, 0x35, 0x46, 0xf5, 0x46, 698 0xf5, 0x4b, 0xe5, 0x4a, 0x14, 0xff, 0xe5, 0x4b, 0xc3, 0x9f, 0x50, 0x17, 0x12, 0x29, 0xc5, 0x40,
688 0x80, 0xdf, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x29, 0x04, 0x40, 0x03, 0x7f, 0x18, 699 0x03, 0x7f, 0x18, 0x22, 0x05, 0x4b, 0x74, 0x01, 0x25, 0x47, 0xf5, 0x47, 0xe4, 0x35, 0x46, 0xf5,
689 0x22, 0x7f, 0x00, 0x22, 0xab, 0x45, 0xaa, 0x46, 0xa9, 0x47, 0x12, 0x19, 0xf2, 0x90, 0xff, 0xf1, 700 0x46, 0x80, 0xdf, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x29, 0xc5, 0x40, 0x03, 0x7f,
690 0xf0, 0x02, 0x31, 0x1b, 0x90, 0xff, 0xf1, 0xe5, 0x49, 0xf0, 0x02, 0x31, 0x1b, 0x7b, 0x01, 0x7a, 701 0x18, 0x22, 0x7f, 0x00, 0x22, 0xab, 0x45, 0xaa, 0x46, 0xa9, 0x47, 0x12, 0x1a, 0xa2, 0x90, 0xff,
691 0xfa, 0x79, 0xcc, 0xe4, 0xfd, 0x12, 0x22, 0xa0, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x09, 0x12, 702 0xf1, 0xf0, 0x02, 0x31, 0xd8, 0x90, 0xff, 0xf1, 0xe5, 0x49, 0xf0, 0x02, 0x31, 0xd8, 0x7b, 0x01,
692 0x1a, 0x6c, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12, 703 0x7a, 0xfa, 0x79, 0xcf, 0xe4, 0xfd, 0x12, 0x23, 0x61, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x09,
693 0x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xff, 0xf7, 0xe5, 704 0x12, 0x1b, 0x1c, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01,
694 0x23, 0x12, 0x29, 0x78, 0x90, 0xff, 0xf6, 0xe5, 0x23, 0xf0, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, 705 0x12, 0x1b, 0x32, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xff, 0xf7,
695 0x74, 0x06, 0x12, 0x29, 0x78, 0xe5, 0x23, 0x30, 0xe0, 0x07, 0x90, 0xff, 0xfc, 0x74, 0x94, 0xf0, 706 0xe5, 0x23, 0x12, 0x2a, 0x39, 0x90, 0xff, 0xf6, 0xe5, 0x23, 0xf0, 0x90, 0xfa, 0xcf, 0xe4, 0xf0,
696 0x22, 0x90, 0xff, 0xfc, 0x74, 0x90, 0xf0, 0x22, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 707 0xa3, 0x74, 0x06, 0x12, 0x2a, 0x39, 0xe5, 0x23, 0x30, 0xe0, 0x07, 0x90, 0xff, 0xfc, 0x74, 0x94,
697 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 708 0xf0, 0x22, 0x90, 0xff, 0xfc, 0x74, 0x90, 0xf0, 0x22, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23,
698 0x02, 0x25, 0xd7, 0x90, 0xff, 0x93, 0x74, 0x2a, 0xf0, 0x90, 0xff, 0xff, 0xe0, 0x60, 0x06, 0x90, 709 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1b, 0x32, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d,
699 0xff, 0xfc, 0x74, 0x10, 0xf0, 0x90, 0xff, 0x91, 0xe0, 0x44, 0x90, 0xf0, 0xe4, 0x90, 0xf9, 0x15, 710 0x01, 0x02, 0x26, 0x98, 0x90, 0xff, 0x93, 0x74, 0x81, 0xf0, 0x90, 0xff, 0xff, 0xe0, 0x60, 0x06,
700 0xf0, 0xa3, 0xf0, 0x12, 0x2a, 0x78, 0x12, 0x16, 0x42, 0x12, 0x2f, 0xcd, 0x7e, 0x07, 0x7f, 0xd0, 711 0x90, 0xff, 0xfc, 0x74, 0x10, 0xf0, 0x90, 0xff, 0x91, 0xe0, 0x44, 0x90, 0xf0, 0xe4, 0x90, 0xf9,
701 0x12, 0x11, 0xe2, 0x7e, 0x0f, 0x7f, 0xa0, 0x12, 0x11, 0xfc, 0xe4, 0x78, 0x77, 0xf6, 0x78, 0x77, 712 0x16, 0xf0, 0xa3, 0xf0, 0x12, 0x2b, 0x39, 0x12, 0x16, 0xc9, 0x12, 0x30, 0x69, 0x7e, 0x07, 0x7f,
702 0xe6, 0xff, 0xc3, 0x94, 0x06, 0x50, 0x0b, 0x74, 0x6e, 0x2f, 0xf8, 0xe4, 0xf6, 0x78, 0x77, 0x06, 713 0xd0, 0x12, 0x12, 0x2a, 0x7e, 0x0f, 0x7f, 0xa0, 0x12, 0x12, 0x44, 0xe4, 0x78, 0x77, 0xf6, 0x78,
703 0x80, 0xec, 0x7f, 0x03, 0x12, 0x2e, 0xb3, 0x90, 0xf9, 0x15, 0xe0, 0x20, 0xe4, 0x05, 0x7f, 0x04, 714 0x77, 0xe6, 0xff, 0xc3, 0x94, 0x06, 0x50, 0x0b, 0x74, 0x6e, 0x2f, 0xf8, 0xe4, 0xf6, 0x78, 0x77,
704 0x12, 0x2e, 0xb3, 0x90, 0xff, 0x9b, 0xe4, 0xf0, 0x90, 0xff, 0x9a, 0xf0, 0x90, 0xff, 0xe8, 0xe0, 715 0x06, 0x80, 0xec, 0x7f, 0x03, 0x12, 0x30, 0xb2, 0x90, 0xf9, 0x16, 0xe0, 0x20, 0xe4, 0x05, 0x7f,
705 0x54, 0x1f, 0xf0, 0xd2, 0xa8, 0x22, 0x15, 0x65, 0xa8, 0x65, 0xa6, 0x07, 0x30, 0x08, 0x05, 0x12, 716 0x04, 0x12, 0x30, 0xb2, 0x90, 0xff, 0x9b, 0xe4, 0xf0, 0x90, 0xff, 0x9a, 0xf0, 0x90, 0xff, 0xe8,
706 0x11, 0x66, 0x80, 0xf8, 0xd2, 0x08, 0xa8, 0x65, 0xe6, 0xff, 0xb4, 0x03, 0x0f, 0x78, 0x7c, 0x76, 717 0xe0, 0x54, 0x1f, 0xf0, 0xd2, 0xa8, 0x22, 0x15, 0x65, 0xa8, 0x65, 0xa6, 0x07, 0x30, 0x08, 0x05,
707 0xff, 0x08, 0x76, 0xe0, 0x08, 0x76, 0xff, 0x08, 0x76, 0xa0, 0x80, 0x0d, 0x78, 0x7c, 0x76, 0xff, 718 0x12, 0x11, 0xae, 0x80, 0xf8, 0xd2, 0x08, 0xa8, 0x65, 0xe6, 0xff, 0xb4, 0x03, 0x0f, 0x78, 0x7c,
708 0x08, 0x76, 0xe2, 0x08, 0x76, 0xff, 0x08, 0x76, 0xb0, 0x78, 0x80, 0x76, 0xfa, 0x08, 0x76, 0x9b, 719 0x76, 0xff, 0x08, 0x76, 0xe0, 0x08, 0x76, 0xff, 0x08, 0x76, 0xa0, 0x80, 0x0d, 0x78, 0x7c, 0x76,
709 0xef, 0x24, 0xfd, 0x75, 0xf0, 0x0a, 0xa4, 0xae, 0xf0, 0x12, 0x22, 0x92, 0x7b, 0x01, 0x7a, 0xff, 720 0xff, 0x08, 0x76, 0xe2, 0x08, 0x76, 0xff, 0x08, 0x76, 0xb0, 0x78, 0x80, 0x76, 0xfa, 0x08, 0x76,
710 0x79, 0x48, 0x78, 0x68, 0x12, 0x1b, 0x31, 0xa8, 0x65, 0xe6, 0x24, 0xfd, 0x75, 0xf0, 0x08, 0xa4, 721 0x9e, 0xef, 0x24, 0xfd, 0x75, 0xf0, 0x0a, 0xa4, 0xae, 0xf0, 0x12, 0x23, 0x49, 0x7b, 0x01, 0x7a,
711 0xff, 0xae, 0xf0, 0x78, 0x6a, 0x12, 0x22, 0x92, 0x79, 0x08, 0x78, 0x6b, 0x12, 0x1b, 0x31, 0x78, 722 0xff, 0x79, 0x48, 0x78, 0x68, 0x12, 0x1b, 0xe1, 0xa8, 0x65, 0xe6, 0x24, 0xfd, 0x75, 0xf0, 0x08,
712 0x6d, 0xef, 0x12, 0x22, 0x92, 0x05, 0x65, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xab, 0xf0, 0xe0, 723 0xa4, 0xff, 0xae, 0xf0, 0x78, 0x6a, 0x12, 0x23, 0x49, 0x79, 0x08, 0x78, 0x6b, 0x12, 0x1b, 0xe1,
713 0x44, 0x20, 0xf0, 0x90, 0xfa, 0xe3, 0x74, 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcc, 0xe4, 724 0x78, 0x6d, 0xef, 0x12, 0x23, 0x49, 0x05, 0x65, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xab, 0xf0,
714 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x7e, 0x00, 0x90, 0xfa, 0xe1, 0xee, 0xf0, 725 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xfa, 0xe6, 0x74, 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcf,
715 0xa3, 0xef, 0xf0, 0x64, 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcc, 0xe0, 0xb4, 0x52, 0x09, 0x90, 0xf9, 726 0xe4, 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x7e, 0x00, 0x90, 0xfa, 0xe4, 0xee,
716 0x15, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x29, 0x90, 0xfa, 0xe1, 0xe0, 0x70, 0x04, 0xa3, 0xe0, 0x64, 727 0xf0, 0xa3, 0xef, 0xf0, 0x64, 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcf, 0xe0, 0xb4, 0x52, 0x09, 0x90,
717 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcc, 0xe0, 0xb4, 0x10, 0x09, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x10, 728 0xf9, 0x16, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x29, 0x90, 0xfa, 0xe4, 0xe0, 0x70, 0x04, 0xa3, 0xe0,
718 0xf0, 0x80, 0x0d, 0x90, 0xfa, 0xe3, 0x74, 0x03, 0xf0, 0x90, 0xf9, 0x15, 0xe0, 0x54, 0xef, 0xf0, 729 0x64, 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcf, 0xe0, 0xb4, 0x10, 0x09, 0x90, 0xf9, 0x16, 0xe0, 0x44,
719 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x22, 0x12, 0x10, 0x03, 0x78, 0x8a, 0xef, 0xf6, 0x12, 730 0x10, 0xf0, 0x80, 0x0d, 0x90, 0xfa, 0xe6, 0x74, 0x03, 0xf0, 0x90, 0xf9, 0x16, 0xe0, 0x54, 0xef,
720 0x2a, 0x06, 0x12, 0x22, 0x33, 0x30, 0xe0, 0x25, 0x12, 0x22, 0x07, 0xe0, 0x54, 0x7f, 0xf0, 0x78, 731 0xf0, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x22, 0x03, 0x68, 0x01, 0xff, 0x48, 0x03, 0x6b,
721 0x6b, 0x12, 0x1b, 0x28, 0x90, 0x00, 0x02, 0x12, 0x1a, 0x0b, 0x30, 0xe7, 0x09, 0x90, 0x00, 0x02, 732 0x01, 0xff, 0x08, 0x02, 0x66, 0x00, 0x00, 0x44, 0xfa, 0x98, 0x00, 0x00, 0x00, 0x00, 0x44, 0xfa,
722 0xe4, 0x12, 0x1a, 0x4a, 0x80, 0xe9, 0x12, 0x22, 0x07, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x22, 0x33, 733 0x94, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfa, 0xb2, 0x00, 0x00, 0x42, 0xfa, 0x7e, 0x00, 0x00, 0x42,
723 0x30, 0xe1, 0x1e, 0x12, 0x21, 0xe9, 0xe0, 0x54, 0x7f, 0xf0, 0x12, 0x31, 0x5c, 0x78, 0x68, 0x12, 734 0xfa, 0x7c, 0x00, 0x00, 0x42, 0xf9, 0x6d, 0xff, 0xff, 0x42, 0xfa, 0x7a, 0x00, 0x00, 0x41, 0xf9,
724 0x1b, 0x28, 0x90, 0x00, 0x02, 0x74, 0x80, 0x12, 0x1a, 0x4a, 0x12, 0x21, 0xe9, 0xe0, 0x44, 0x80, 735 0x66, 0xff, 0x41, 0xf9, 0x1c, 0x19, 0x41, 0xf9, 0x15, 0x00, 0x43, 0xf9, 0x19, 0x0a, 0x32, 0x02,
725 0xf0, 0x12, 0x31, 0xc7, 0xe4, 0xff, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x03, 0x68, 0x01, 0xff, 736 0x41, 0xf9, 0x68, 0x20, 0x41, 0xf9, 0x69, 0x20, 0x41, 0xf9, 0x65, 0x00, 0x41, 0xf9, 0x67, 0x00,
726 0x48, 0x03, 0x6b, 0x01, 0xff, 0x08, 0x02, 0x66, 0x00, 0x00, 0x44, 0xfa, 0x95, 0x00, 0x00, 0x00, 737 0x44, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xf9, 0x16, 0x00, 0x00, 0x41, 0xf9, 0x18, 0x00,
727 0x00, 0x44, 0xfa, 0x91, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfa, 0xaf, 0x00, 0x00, 0x42, 0xfa, 0x7b, 738 0x01, 0x20, 0x00, 0x41, 0xf8, 0x04, 0x00, 0x00, 0x12, 0x10, 0x4b, 0x78, 0x8a, 0xef, 0xf6, 0x12,
728 0x00, 0x00, 0x42, 0xfa, 0x79, 0x00, 0x00, 0x42, 0xf9, 0x6a, 0xff, 0xff, 0x42, 0xfa, 0x77, 0x00, 739 0x2a, 0xc7, 0x12, 0x22, 0xee, 0x30, 0xe0, 0x29, 0x78, 0x7c, 0x12, 0x22, 0xb7, 0xe0, 0x54, 0x7f,
729 0x00, 0x43, 0xf9, 0x18, 0x0a, 0x32, 0x02, 0x41, 0xf9, 0x65, 0x20, 0x41, 0xf9, 0x66, 0x20, 0x41, 740 0xf0, 0x78, 0x6b, 0x12, 0x1b, 0xd8, 0x90, 0x00, 0x02, 0x12, 0x1a, 0xbb, 0x30, 0xe7, 0x09, 0x90,
730 0xf9, 0x63, 0x00, 0x41, 0xf9, 0x64, 0x00, 0x44, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xf9, 741 0x00, 0x02, 0xe4, 0x12, 0x1a, 0xfa, 0x80, 0xe9, 0x78, 0x7c, 0x12, 0x22, 0xb7, 0xe0, 0x44, 0x80,
731 0x15, 0x00, 0x00, 0x41, 0xf9, 0x17, 0x00, 0x01, 0x20, 0x00, 0x41, 0xf8, 0x04, 0x00, 0x00, 0x12, 742 0xf0, 0x12, 0x22, 0xee, 0x30, 0xe1, 0x1e, 0x12, 0x22, 0x97, 0xe0, 0x54, 0x7f, 0xf0, 0x12, 0x32,
732 0x10, 0x03, 0x78, 0x85, 0xef, 0xf6, 0x12, 0x30, 0x93, 0x12, 0x30, 0xec, 0x78, 0x85, 0xe6, 0xff, 743 0x19, 0x78, 0x68, 0x12, 0x1b, 0xd8, 0x90, 0x00, 0x02, 0x74, 0x80, 0x12, 0x1a, 0xfa, 0x12, 0x22,
733 0x24, 0x12, 0x12, 0x21, 0xff, 0xe0, 0xfe, 0x30, 0xe7, 0x16, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff, 744 0x97, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x32, 0x84, 0xe4, 0xff, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce,
734 0x9e, 0xe0, 0x54, 0xfa, 0xf0, 0x80, 0x22, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf5, 0xf0, 0x80, 0x19, 745 0x12, 0x10, 0x4b, 0x78, 0x85, 0xef, 0xf6, 0x12, 0x31, 0x50, 0x12, 0x31, 0xa9, 0x78, 0x85, 0xe6,
735 0xee, 0x54, 0x03, 0x60, 0x14, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, 0xf0, 746 0xff, 0x24, 0x13, 0x12, 0x22, 0xad, 0xe0, 0xfe, 0x30, 0xe7, 0x16, 0xef, 0xb4, 0x03, 0x09, 0x90,
736 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x14, 0xf0, 0xe0, 747 0xff, 0x9e, 0xe0, 0x54, 0xfa, 0xf0, 0x80, 0x22, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf5, 0xf0, 0x80,
737 0x70, 0x02, 0xd2, 0xb3, 0x02, 0x10, 0x86, 0x12, 0x1d, 0x6c, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 748 0x19, 0xee, 0x54, 0x03, 0x60, 0x14, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20,
738 0xe5, 0x39, 0x64, 0x01, 0x60, 0x48, 0xc3, 0xe5, 0x3a, 0x94, 0x08, 0xe5, 0x39, 0x94, 0x00, 0x40, 749 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xf9, 0x18, 0xe0, 0x14, 0xf0,
739 0x11, 0x7f, 0x08, 0xef, 0xe5, 0x3a, 0x94, 0x08, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39, 750 0xe0, 0x70, 0x02, 0xd2, 0xb3, 0x02, 0x10, 0xce, 0x12, 0x1e, 0x1c, 0xe5, 0x3a, 0x64, 0x09, 0x70,
740 0x80, 0x05, 0xaf, 0x3a, 0x12, 0x1d, 0x84, 0xe4, 0xfe, 0xee, 0xc3, 0x9f, 0x50, 0x19, 0x12, 0x1c, 751 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 0x48, 0xc3, 0xe5, 0x3a, 0x94, 0x08, 0xe5, 0x39, 0x94, 0x00,
741 0x11, 0x12, 0x19, 0xf2, 0xfd, 0x74, 0xf8, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xed, 752 0x40, 0x11, 0x7f, 0x08, 0xef, 0xe5, 0x3a, 0x94, 0x08, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5,
742 0xf0, 0x0e, 0x12, 0x1c, 0x00, 0x80, 0xe2, 0xef, 0x54, 0x7f, 0x90, 0xff, 0x81, 0xf0, 0x22, 0x8b, 753 0x39, 0x80, 0x05, 0xaf, 0x3a, 0x12, 0x1e, 0x34, 0xe4, 0xfe, 0xee, 0xc3, 0x9f, 0x50, 0x19, 0x12,
743 0x59, 0x8a, 0x5a, 0x89, 0x5b, 0x12, 0x2d, 0x48, 0x70, 0x05, 0xa3, 0x74, 0x08, 0xf0, 0x22, 0xab, 754 0x1c, 0xc1, 0x12, 0x1a, 0xa2, 0xfd, 0x74, 0xf8, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83,
744 0x59, 0xaa, 0x5a, 0xa9, 0x5b, 0x12, 0x2d, 0x3c, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x43, 0xe5, 0x5b, 755 0xed, 0xf0, 0x0e, 0x12, 0x1c, 0xb0, 0x80, 0xe2, 0xef, 0x54, 0x7f, 0x90, 0xff, 0x81, 0xf0, 0x22,
745 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x5a, 0xfa, 0x90, 0xfa, 0xc0, 0x12, 0x1b, 0x43, 0xe4, 0x90, 0xfa, 756 0x8b, 0x59, 0x8a, 0x5a, 0x89, 0x5b, 0x12, 0x2e, 0x19, 0x70, 0x05, 0xa3, 0x74, 0x08, 0xf0, 0x22,
746 0xbf, 0xf0, 0x78, 0x8b, 0xf6, 0x90, 0xfa, 0xbe, 0xe0, 0xff, 0x78, 0x8b, 0xe6, 0xc3, 0x9f, 0x50, 757 0xab, 0x59, 0xaa, 0x5a, 0xa9, 0x5b, 0x12, 0x2e, 0x0d, 0x90, 0xfa, 0xc9, 0x12, 0x1b, 0xf3, 0xe5,
747 0x12, 0x12, 0x2d, 0x1a, 0xff, 0x12, 0x2d, 0x23, 0x12, 0x2d, 0x36, 0x78, 0x8b, 0x06, 0x12, 0x2d, 758 0x5b, 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x5a, 0xfa, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0xf3, 0xe4, 0x90,
748 0x32, 0x80, 0xe2, 0x22, 0xad, 0x07, 0xac, 0x06, 0x90, 0x31, 0x4d, 0xe4, 0x93, 0xff, 0x78, 0x74, 759 0xfa, 0xc2, 0xf0, 0x78, 0x8b, 0xf6, 0x90, 0xfa, 0xc1, 0xe0, 0xff, 0x78, 0x8b, 0xe6, 0xc3, 0x9f,
749 0xf6, 0x54, 0x0f, 0x12, 0x1c, 0xf8, 0xe0, 0x08, 0x76, 0x00, 0x08, 0xf6, 0x18, 0x12, 0x1c, 0x29, 760 0x50, 0x12, 0x12, 0x2d, 0xeb, 0xff, 0x12, 0x2d, 0xf4, 0x12, 0x2e, 0x07, 0x78, 0x8b, 0x06, 0x12,
750 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x78, 0x75, 0xee, 0xf6, 0x08, 0xef, 0xf6, 0xee, 761 0x2e, 0x03, 0x80, 0xe2, 0x22, 0xad, 0x07, 0xac, 0x06, 0x90, 0x32, 0x0a, 0xe4, 0x93, 0xff, 0x78,
751 0x44, 0xf8, 0x18, 0xf6, 0xef, 0x08, 0xf6, 0x90, 0xff, 0x7a, 0xe0, 0x20, 0xe7, 0x03, 0x7f, 0x00, 762 0x74, 0xf6, 0x54, 0x0f, 0x12, 0x1d, 0xa8, 0xe0, 0x08, 0x76, 0x00, 0x08, 0xf6, 0x18, 0x12, 0x1c,
752 0x22, 0x78, 0x75, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 763 0xd9, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x78, 0x75, 0xee, 0xf6, 0x08, 0xef, 0xf6,
753 0x90, 0xff, 0x7a, 0x74, 0x02, 0xf0, 0x7f, 0x01, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x90, 764 0xee, 0x44, 0xf8, 0x18, 0xf6, 0xef, 0x08, 0xf6, 0x90, 0xff, 0x7a, 0xe0, 0x20, 0xe7, 0x03, 0x7f,
754 0x00, 0x03, 0x12, 0x1a, 0x0b, 0x54, 0xf0, 0x24, 0xa0, 0x22, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x3a, 765 0x00, 0x22, 0x78, 0x75, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 0x83, 0xec, 0xf0, 0xa3, 0xed,
755 0x02, 0x19, 0xf2, 0x90, 0xfa, 0xc0, 0x12, 0x1b, 0x3a, 0xef, 0x12, 0x1a, 0x38, 0x90, 0xfa, 0xc7, 766 0xf0, 0x90, 0xff, 0x7a, 0x74, 0x02, 0xf0, 0x7f, 0x01, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58,
756 0xe4, 0x22, 0x90, 0xfa, 0xc1, 0xe4, 0x75, 0xf0, 0x01, 0x02, 0x1a, 0x6c, 0x90, 0x00, 0x08, 0x12, 767 0x90, 0x00, 0x03, 0x12, 0x1a, 0xbb, 0x54, 0xf0, 0x24, 0xa0, 0x22, 0x90, 0xfa, 0xc9, 0x12, 0x1b,
757 0x1a, 0x98, 0xaa, 0xf0, 0xf9, 0x7b, 0x01, 0x22, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0x90, 0xfa, 768 0xea, 0x02, 0x1a, 0xa2, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0xea, 0xef, 0x12, 0x1a, 0xe8, 0x90, 0xfa,
758 0xbe, 0xf0, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x22, 0x90, 0xfa, 0xda, 0xe0, 0xff, 0x7e, 769 0xca, 0xe4, 0x22, 0x90, 0xfa, 0xc4, 0xe4, 0x75, 0xf0, 0x01, 0x02, 0x1b, 0x1c, 0x90, 0x00, 0x08,
759 0x00, 0xc3, 0x90, 0xfa, 0xd4, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xd3, 0xe0, 0x9e, 0xf0, 0x90, 0xfa, 770 0x12, 0x1b, 0x48, 0xaa, 0xf0, 0xf9, 0x7b, 0x01, 0x22, 0x90, 0x00, 0x05, 0x12, 0x1a, 0xbb, 0x90,
760 0xd5, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0xef, 0x25, 0x51, 0xf5, 0x51, 0xee, 0x35, 0x50, 0xf5, 771 0xfa, 0xc1, 0xf0, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x22, 0x90, 0xfa, 0xdd, 0xe0, 0xff,
761 0x50, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0xfa, 0xe3, 772 0x7e, 0x00, 0xc3, 0x90, 0xfa, 0xd7, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xd6, 0xe0, 0x9e, 0xf0, 0x90,
762 0xe0, 0x64, 0x03, 0x22, 0x90, 0xff, 0xf2, 0xe0, 0xab, 0x29, 0xaa, 0x2a, 0xa9, 0x2b, 0x02, 0x1a, 773 0xfa, 0xd8, 0xee, 0x8f, 0xf0, 0x12, 0x1b, 0x1c, 0xef, 0x25, 0x51, 0xf5, 0x51, 0xee, 0x35, 0x50,
763 0x38, 0x90, 0xff, 0xf3, 0x74, 0xa0, 0xf0, 0x22, 0x8f, 0x64, 0xed, 0x70, 0x0f, 0xe5, 0x64, 0xb4, 774 0xf5, 0x50, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0xfa,
764 0x03, 0x05, 0x7f, 0x01, 0x02, 0x31, 0x32, 0x7f, 0x02, 0x02, 0x31, 0x32, 0xaf, 0x64, 0x12, 0x2a, 775 0xe6, 0xe0, 0x64, 0x03, 0x22, 0x90, 0xff, 0xf2, 0xe0, 0xab, 0x29, 0xaa, 0x2a, 0xa9, 0x2b, 0x02,
765 0x06, 0x74, 0x6e, 0x25, 0x64, 0xf8, 0xe6, 0x30, 0xe2, 0x0b, 0xd2, 0x09, 0x12, 0x1c, 0x83, 0xe0, 776 0x1a, 0xe8, 0x90, 0xff, 0xf3, 0x74, 0xa0, 0xf0, 0x22, 0x8f, 0x64, 0xed, 0x70, 0x0f, 0xe5, 0x64,
766 0x54, 0x7f, 0xf0, 0x80, 0x02, 0xc2, 0x09, 0xe5, 0x64, 0xb4, 0x03, 0x07, 0x7f, 0x81, 0x12, 0x31, 777 0xb4, 0x03, 0x05, 0x7f, 0x01, 0x02, 0x31, 0xef, 0x7f, 0x02, 0x02, 0x31, 0xef, 0xaf, 0x64, 0x12,
767 0x32, 0x80, 0x05, 0x7f, 0x82, 0x12, 0x31, 0x32, 0x30, 0x09, 0x07, 0x12, 0x1c, 0x83, 0xe0, 0x44, 778 0x2a, 0xc7, 0x74, 0x6e, 0x25, 0x64, 0xf8, 0xe6, 0x30, 0xe2, 0x0b, 0xd2, 0x09, 0x12, 0x1d, 0x33,
768 0x80, 0xf0, 0x12, 0x31, 0xc7, 0x22, 0x12, 0x10, 0x03, 0x90, 0xff, 0xfd, 0xe0, 0x44, 0x60, 0xf0, 779 0xe0, 0x54, 0x7f, 0xf0, 0x80, 0x02, 0xc2, 0x09, 0xe5, 0x64, 0xb4, 0x03, 0x07, 0x7f, 0x81, 0x12,
769 0xd2, 0x01, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0x00, 0xe0, 0x30, 0xe7, 0x13, 780 0x31, 0xef, 0x80, 0x05, 0x7f, 0x82, 0x12, 0x31, 0xef, 0x30, 0x09, 0x07, 0x12, 0x1d, 0x33, 0xe0,
770 0x90, 0xff, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x35, 0x80, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x01, 781 0x44, 0x80, 0xf0, 0x12, 0x32, 0x84, 0x22, 0x12, 0x10, 0x4b, 0x90, 0xff, 0xfd, 0xe0, 0x44, 0x60,
771 0xf0, 0x80, 0x0d, 0x12, 0x1d, 0x2f, 0x53, 0x35, 0x7f, 0x90, 0xff, 0xfc, 0xe0, 0x54, 0xfe, 0xf0, 782 0xf0, 0xd2, 0x01, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0x00, 0xe0, 0x30, 0xe7,
772 0x90, 0xff, 0x81, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x02, 0xb0, 0x12, 0x1d, 0x37, 0x02, 0x10, 0x86, 783 0x13, 0x90, 0xff, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x35, 0x80, 0x90, 0xff, 0xfc, 0xe0, 0x44,
773 0x12, 0x10, 0x03, 0x78, 0x89, 0xef, 0xf6, 0xd2, 0x00, 0x12, 0x2a, 0x06, 0x90, 0xf9, 0x67, 0x12, 784 0x01, 0xf0, 0x80, 0x0d, 0x12, 0x1d, 0xdf, 0x53, 0x35, 0x7f, 0x90, 0xff, 0xfc, 0xe0, 0x54, 0xfe,
774 0x1b, 0x3a, 0xe9, 0x24, 0x03, 0xf9, 0xe4, 0x3a, 0xfa, 0xc0, 0x02, 0x78, 0x80, 0xe6, 0xfe, 0x08, 785 0xf0, 0x90, 0xff, 0x81, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x02, 0xde, 0x12, 0x1d, 0xe7, 0x02, 0x10,
775 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0xd0, 0x02, 0x12, 0x22, 0x25, 0x12, 0x31, 0xc7, 786 0xce, 0x12, 0x10, 0x4b, 0x78, 0x89, 0xef, 0xf6, 0xd2, 0x00, 0x12, 0x2a, 0xc7, 0x90, 0xf9, 0x6a,
776 0x78, 0x89, 0xe6, 0xff, 0x12, 0x13, 0x3f, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x8f, 0x63, 0x12, 787 0x12, 0x1b, 0xea, 0xe9, 0x24, 0x03, 0xf9, 0xe4, 0x3a, 0xfa, 0xc0, 0x02, 0x78, 0x80, 0xe6, 0xfe,
777 0x2a, 0x06, 0x12, 0x22, 0x07, 0xe0, 0x54, 0x3f, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x21, 0xf3, 788 0x08, 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0xd0, 0x02, 0x12, 0x22, 0xd3, 0x12, 0x32,
778 0xe0, 0x54, 0x3f, 0xf0, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x21, 0xf3, 789 0x84, 0x78, 0x89, 0xe6, 0xff, 0x12, 0x13, 0x87, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce, 0x8f, 0x63,
779 0xe0, 0x54, 0xf8, 0xf0, 0x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x63, 0xf8, 0x74, 0xfb, 0x56, 0xf6, 790 0x12, 0x2a, 0xc7, 0x78, 0x7c, 0x12, 0x22, 0xb7, 0xe0, 0x54, 0x3f, 0xf0, 0xe5, 0x82, 0x24, 0x04,
780 0x7f, 0x00, 0x22, 0x8f, 0x23, 0xc2, 0x08, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x12, 0x78, 0x7e, 0x12, 791 0x12, 0x22, 0xa1, 0xe0, 0x54, 0x3f, 0xf0, 0x12, 0x23, 0x41, 0x24, 0x0b, 0x12, 0x22, 0xa1, 0xe0,
781 0x21, 0xeb, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x22, 0x4a, 0x12, 0x21, 0xef, 0xe0, 0x20, 0xe0, 0xf6, 792 0x54, 0xf8, 0xf0, 0x12, 0x32, 0x84, 0x74, 0x6e, 0x25, 0x63, 0xf8, 0x74, 0xfb, 0x56, 0xf6, 0x7f,
782 0xef, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xf8, 0xf0, 0x12, 0x31, 0xc7, 793 0x00, 0x22, 0x12, 0x10, 0x4b, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xfa, 0x24, 0x06, 0x12, 0x22, 0x9f,
783 0xaf, 0x23, 0x12, 0x13, 0x3f, 0x22, 0x12, 0x10, 0x03, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x4a, 0x24, 794 0xe0, 0xfd, 0x12, 0x22, 0xe8, 0x90, 0x00, 0x03, 0x12, 0x23, 0x02, 0x24, 0x05, 0x12, 0x22, 0xa1,
784 0x06, 0x12, 0x21, 0xf1, 0xe0, 0xfd, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x03, 0x12, 0x22, 0x52, 0x24, 795 0xe0, 0x90, 0x00, 0x04, 0x12, 0x1a, 0xfa, 0x12, 0x32, 0x84, 0x7d, 0x02, 0xe4, 0xff, 0x12, 0x2f,
785 0x05, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x00, 0x04, 0x12, 0x1a, 0x4a, 0x12, 0x31, 0xc7, 0x7d, 0x02, 796 0xb4, 0x02, 0x10, 0xce, 0xae, 0x05, 0x12, 0x1d, 0x8e, 0xef, 0x12, 0x1a, 0xfa, 0x0e, 0x0e, 0x0e,
786 0xe4, 0xff, 0x12, 0x2f, 0x18, 0x02, 0x10, 0x86, 0xae, 0x05, 0x12, 0x1c, 0xde, 0xef, 0x12, 0x1a, 797 0xee, 0xd3, 0x95, 0x3c, 0xe4, 0x95, 0x3b, 0x40, 0x02, 0xae, 0x3c, 0xee, 0xd3, 0x94, 0x08, 0x74,
787 0x4a, 0x0e, 0x0e, 0x0e, 0xee, 0xd3, 0x95, 0x3c, 0xe4, 0x95, 0x3b, 0x40, 0x02, 0xae, 0x3c, 0xee, 798 0x80, 0x94, 0x81, 0x40, 0x0a, 0x7e, 0x03, 0x90, 0x00, 0x02, 0x74, 0x02, 0x12, 0x1a, 0xfa, 0xaf,
788 0xd3, 0x94, 0x08, 0x74, 0x80, 0x94, 0x81, 0x40, 0x0a, 0x7e, 0x03, 0x90, 0x00, 0x02, 0x74, 0x02, 799 0x06, 0x12, 0x32, 0x6e, 0x22, 0xae, 0x07, 0xed, 0x54, 0x03, 0x64, 0x01, 0x60, 0x03, 0x7f, 0x10,
789 0x12, 0x1a, 0x4a, 0xaf, 0x06, 0x12, 0x31, 0xb1, 0x22, 0xae, 0x07, 0xed, 0x54, 0x03, 0x64, 0x01, 800 0x22, 0xed, 0x54, 0x7c, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x7f, 0x0b, 0x22, 0x74, 0x6e, 0x2e, 0xf8,
790 0x60, 0x03, 0x7f, 0x10, 0x22, 0xed, 0x54, 0x7c, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x7f, 0x0b, 0x22, 801 0x74, 0x02, 0x46, 0xf6, 0x74, 0x99, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 0xed, 0xf0,
791 0x74, 0x6e, 0x2e, 0xf8, 0x74, 0x02, 0x46, 0xf6, 0x74, 0x96, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 802 0x7f, 0x00, 0x22, 0xbf, 0x03, 0x06, 0x7c, 0xff, 0x7d, 0xe0, 0x80, 0x04, 0x7c, 0xff, 0x7d, 0xe2,
792 0xf5, 0x83, 0xed, 0xf0, 0x7f, 0x00, 0x22, 0xbf, 0x03, 0x06, 0x7c, 0xff, 0x7d, 0xe0, 0x80, 0x04, 803 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0,
793 0x7c, 0xff, 0x7d, 0xe2, 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 804 0x44, 0x80, 0xf0, 0x74, 0x6e, 0x2f, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 0x00, 0x22, 0x12, 0x10,
794 0x12, 0x21, 0xf3, 0xe0, 0x44, 0x80, 0xf0, 0x74, 0x6e, 0x2f, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 805 0x4b, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 0x16, 0x90, 0xff, 0x83,
795 0x00, 0x22, 0x12, 0x10, 0x03, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 806 0xe0, 0x54, 0x0f, 0xff, 0xc3, 0xe5, 0x3a, 0x9f, 0xe5, 0x39, 0x94, 0x00, 0x40, 0x05, 0x12, 0x28,
796 0x16, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xff, 0xc3, 0xe5, 0x3a, 0x9f, 0xe5, 0x39, 0x94, 0x00, 807 0xd7, 0x80, 0x03, 0x12, 0x32, 0x7a, 0x02, 0x10, 0xce, 0x90, 0xff, 0xfc, 0xe0, 0x20, 0xe7, 0x1f,
797 0x40, 0x05, 0x12, 0x28, 0x16, 0x80, 0x03, 0x12, 0x31, 0xbd, 0x02, 0x10, 0x86, 0x90, 0xff, 0xfc, 808 0xc2, 0xaf, 0x7d, 0xff, 0xac, 0x05, 0x1d, 0xec, 0x60, 0x15, 0x7e, 0x04, 0x7f, 0x00, 0xef, 0x1f,
798 0xe0, 0x20, 0xe7, 0x1f, 0xc2, 0xaf, 0x7d, 0xff, 0xac, 0x05, 0x1d, 0xec, 0x60, 0x15, 0x7e, 0x04, 809 0xaa, 0x06, 0x70, 0x01, 0x1e, 0x4a, 0x60, 0xec, 0x90, 0xff, 0x92, 0xe4, 0xf0, 0x80, 0xef, 0x22,
799 0x7f, 0x00, 0xef, 0x1f, 0xaa, 0x06, 0x70, 0x01, 0x1e, 0x4a, 0x60, 0xec, 0x90, 0xff, 0x92, 0xe4, 810 0x12, 0x10, 0x4b, 0x78, 0x66, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x30, 0xe0, 0x12, 0x30, 0xe1, 0x0f,
800 0xf0, 0x80, 0xef, 0x22, 0x12, 0x10, 0x03, 0x78, 0x66, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x30, 0xe0, 811 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x20, 0xf0, 0x7f, 0x04, 0x12, 0x12, 0x61, 0x12, 0x1d, 0xf6, 0x02,
801 0x12, 0x30, 0xe1, 0x0f, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x20, 0xf0, 0x7f, 0x04, 0x12, 0x12, 0x19, 812 0x10, 0xce, 0x8f, 0x23, 0xc2, 0x08, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xc0, 0x78, 0x7e, 0x12, 0x23,
802 0x12, 0x1d, 0x46, 0x02, 0x10, 0x86, 0x8e, 0x5f, 0x8f, 0x60, 0xe5, 0x60, 0x15, 0x60, 0xae, 0x5f, 813 0x42, 0x24, 0x0b, 0x12, 0x22, 0xa1, 0xe0, 0x54, 0xf8, 0xf0, 0x12, 0x32, 0x84, 0xaf, 0x23, 0x12,
803 0x70, 0x02, 0x15, 0x5f, 0xd3, 0x94, 0x00, 0xee, 0x94, 0x00, 0x40, 0x09, 0x7e, 0x07, 0x7f, 0xd0, 814 0x13, 0x87, 0x22, 0x8e, 0x5f, 0x8f, 0x60, 0xe5, 0x60, 0x15, 0x60, 0xae, 0x5f, 0x70, 0x02, 0x15,
804 0x12, 0x0f, 0xdc, 0x80, 0xe5, 0x22, 0x11, 0x94, 0x2d, 0xf6, 0x23, 0xef, 0x31, 0xa3, 0x2f, 0xf4, 815 0x5f, 0xd3, 0x94, 0x00, 0xee, 0x94, 0x00, 0x40, 0x09, 0x7e, 0x07, 0x7f, 0xd0, 0x12, 0x10, 0x24,
805 0x2f, 0xa2, 0x30, 0xb2, 0x2e, 0xe6, 0x26, 0x6d, 0x2b, 0xaf, 0x30, 0x55, 0x30, 0x74, 0x1d, 0xb4, 816 0x80, 0xe5, 0x22, 0x11, 0xdc, 0x2e, 0xc7, 0x24, 0xb0, 0x32, 0x60, 0x30, 0x90, 0x30, 0x3e, 0x31,
806 0x2e, 0x40, 0x2a, 0xe8, 0x0e, 0x12, 0x10, 0x03, 0x78, 0x86, 0x12, 0x22, 0x82, 0x20, 0xe1, 0x07, 817 0x6f, 0x2f, 0x82, 0x27, 0x2e, 0x2c, 0x80, 0x31, 0x12, 0x31, 0x31, 0x1e, 0x64, 0x2f, 0x11, 0x2c,
807 0x7f, 0x12, 0x12, 0x30, 0xec, 0x80, 0x0a, 0x78, 0x86, 0xe6, 0xff, 0x12, 0x23, 0x49, 0x12, 0x30, 818 0x18, 0x0e, 0x12, 0x10, 0x4b, 0x78, 0x86, 0x12, 0x23, 0x31, 0x20, 0xe1, 0x07, 0x7f, 0x12, 0x12,
808 0xec, 0x02, 0x10, 0x86, 0x12, 0x10, 0x03, 0x78, 0x87, 0x12, 0x22, 0x82, 0x20, 0xe2, 0x07, 0x7f, 819 0x31, 0xa9, 0x80, 0x0a, 0x78, 0x86, 0xe6, 0xff, 0x12, 0x24, 0x0a, 0x12, 0x31, 0xa9, 0x02, 0x10,
809 0x11, 0x12, 0x30, 0xec, 0x80, 0x0a, 0x78, 0x87, 0xe6, 0xff, 0x12, 0x2e, 0x7d, 0x12, 0x30, 0xec, 820 0xce, 0x12, 0x10, 0x4b, 0x78, 0x87, 0x12, 0x23, 0x31, 0x20, 0xe2, 0x07, 0x7f, 0x11, 0x12, 0x31,
810 0x02, 0x10, 0x86, 0x8f, 0x61, 0x12, 0x2e, 0x7d, 0xaf, 0x61, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x12, 821 0xa9, 0x80, 0x0a, 0x78, 0x87, 0xe6, 0xff, 0x12, 0x2f, 0x4e, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce,
811 0x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x61, 0xf8, 0x74, 0xfd, 0x56, 0xf6, 0xaf, 0x61, 0x12, 0x13, 822 0x8f, 0x61, 0x12, 0x2f, 0x4e, 0xaf, 0x61, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xc0, 0x12, 0x32, 0x84,
812 0x3f, 0x22, 0x12, 0x10, 0x03, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 823 0x74, 0x6e, 0x25, 0x61, 0xf8, 0x74, 0xfd, 0x56, 0xf6, 0xaf, 0x61, 0x12, 0x13, 0x87, 0x22, 0x12,
813 0x05, 0x12, 0x2c, 0x07, 0x80, 0x06, 0x12, 0x1d, 0x64, 0x12, 0x1d, 0x6c, 0x02, 0x10, 0x86, 0x12, 824 0x10, 0x4b, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 0x05, 0x12, 0x2c,
814 0x29, 0x93, 0x12, 0x12, 0xbb, 0x90, 0xf8, 0x04, 0xe0, 0xff, 0x60, 0x05, 0x7d, 0x01, 0x12, 0x12, 825 0xd8, 0x80, 0x06, 0x12, 0x1e, 0x14, 0x12, 0x1e, 0x1c, 0x02, 0x10, 0xce, 0x12, 0x2a, 0x54, 0x12,
815 0x58, 0x12, 0x29, 0x1d, 0x12, 0x12, 0xf7, 0x12, 0x11, 0x74, 0x80, 0xe3, 0x12, 0x1c, 0xde, 0xef, 826 0x13, 0x03, 0x90, 0xf8, 0x04, 0xe0, 0xff, 0x60, 0x05, 0x7d, 0x01, 0x12, 0x12, 0xa0, 0x12, 0x29,
816 0x12, 0x1a, 0x4a, 0xe4, 0xf5, 0x33, 0xf5, 0x34, 0xef, 0x60, 0x03, 0x02, 0x31, 0xbd, 0xe4, 0xff, 827 0xde, 0x12, 0x13, 0x3f, 0x12, 0x11, 0xbc, 0x80, 0xe3, 0x12, 0x1d, 0x8e, 0xef, 0x12, 0x1a, 0xfa,
817 0x12, 0x31, 0xb1, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 0x54, 0xa0, 0x60, 0xf7, 0xef, 0x30, 0xe5, 828 0xe4, 0xf5, 0x33, 0xf5, 0x34, 0xef, 0x60, 0x03, 0x02, 0x32, 0x7a, 0xe4, 0xff, 0x12, 0x32, 0x6e,
818 0x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 0xd3, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 829 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 0x54, 0xa0, 0x60, 0xf7, 0xef, 0x30, 0xe5, 0x08, 0x90, 0xff,
819 0x54, 0x28, 0x60, 0xf7, 0xef, 0x30, 0xe5, 0x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 830 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 0xd3, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 0x54, 0x28, 0x60,
820 0xd3, 0x22, 0xef, 0x30, 0xe7, 0x08, 0x12, 0x1c, 0x95, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0xef, 0x12, 831 0xf7, 0xef, 0x30, 0xe5, 0x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 0xd3, 0x22, 0xef,
821 0x1c, 0xe8, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0x81, 0x01, 0x82, 0x02, 0x83, 0x03, 0x87, 0x40, 0x00, 832 0x30, 0xe7, 0x08, 0x12, 0x1d, 0x45, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0xef, 0x12, 0x1d, 0x98, 0xe0,
822 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x08, 0x00, 0x78, 0x7e, 0x12, 0x22, 833 0x54, 0xdf, 0xf0, 0x22, 0x81, 0x01, 0x82, 0x02, 0x83, 0x03, 0x87, 0x40, 0x00, 0x40, 0x00, 0x40,
823 0x09, 0xa3, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x06, 0x54, 0x7f, 0xf0, 0x44, 0x80, 0xf0, 0x22, 0x85, 834 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x08, 0x00, 0x78, 0x7e, 0x12, 0x22, 0xb7, 0xa3, 0xa3,
824 0x3b, 0x39, 0x85, 0x3c, 0x3a, 0x90, 0xff, 0x82, 0xe0, 0x54, 0xf7, 0xf0, 0xa3, 0xe0, 0x54, 0x7f, 835 0xe0, 0xff, 0x30, 0xe7, 0x06, 0x54, 0x7f, 0xf0, 0x44, 0x80, 0xf0, 0x22, 0x85, 0x3b, 0x39, 0x85,
825 0xf0, 0x22, 0xe4, 0xfe, 0xee, 0x90, 0x31, 0x47, 0x93, 0xb5, 0x07, 0x02, 0xd3, 0x22, 0x0e, 0xbe, 836 0x3c, 0x3a, 0x90, 0xff, 0x82, 0xe0, 0x54, 0xf7, 0xf0, 0xa3, 0xe0, 0x54, 0x7f, 0xf0, 0x22, 0xe4,
826 0x07, 0xf2, 0xc3, 0x22, 0x00, 0x08, 0x18, 0x28, 0x38, 0x01, 0x81, 0x10, 0x0a, 0x02, 0x00, 0x00, 837 0xfe, 0xee, 0x90, 0x32, 0x04, 0x93, 0xb5, 0x07, 0x02, 0xd3, 0x22, 0x0e, 0xbe, 0x07, 0xf2, 0xc3,
827 0x00, 0x00, 0x00, 0x12, 0x10, 0x03, 0x7f, 0x02, 0x12, 0x10, 0x92, 0x12, 0x1d, 0x46, 0x02, 0x10, 838 0x22, 0x00, 0x08, 0x18, 0x28, 0x38, 0x01, 0x81, 0x90, 0x0a, 0x02, 0x00, 0x00, 0x11, 0x13, 0x00,
828 0x86, 0x75, 0x39, 0x00, 0x8f, 0x3a, 0x12, 0x1c, 0x30, 0x12, 0x2c, 0x07, 0x22, 0x12, 0x1d, 0x6c, 839 0x12, 0x10, 0x4b, 0x7f, 0x02, 0x12, 0x10, 0xda, 0x12, 0x1d, 0xf6, 0x02, 0x10, 0xce, 0x75, 0x39,
829 0x12, 0x1d, 0x2f, 0x12, 0x1d, 0x64, 0x22, 0xc2, 0x08, 0x22, 840 0x00, 0x8f, 0x3a, 0x12, 0x1c, 0xe0, 0x12, 0x2c, 0xd8, 0x22, 0x12, 0x1e, 0x1c, 0x12, 0x1d, 0xdf,
841 0x12, 0x1e, 0x14, 0x22, 0xc2, 0x08, 0x22,
830 }; 842 };
831 843
832 #undef IMAGE_VERSION_NAME 844 #undef IMAGE_VERSION_NAME
833 845
834 #undef IMAGE_ARRAY_NAME 846 #undef IMAGE_ARRAY_NAME
835 847
836 848
drivers/usb/serial/io_ti.c
1 /* 1 /*
2 * Edgeport USB Serial Converter driver 2 * Edgeport USB Serial Converter driver
3 * 3 *
4 * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved. 4 * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved.
5 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com> 5 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or 9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version. 10 * (at your option) any later version.
11 * 11 *
12 * Supports the following devices: 12 * Supports the following devices:
13 * EP/1 EP/2 EP/4 EP/21 EP/22 EP/221 EP/42 EP/421 WATCHPORT 13 * EP/1 EP/2 EP/4 EP/21 EP/22 EP/221 EP/42 EP/421 WATCHPORT
14 * 14 *
15 * For questions or problems with this driver, contact Inside Out 15 * For questions or problems with this driver, contact Inside Out
16 * Networks technical support, or Peter Berger <pberger@brimson.com>, 16 * Networks technical support, or Peter Berger <pberger@brimson.com>,
17 * or Al Borchers <alborchers@steinerpoint.com>. 17 * or Al Borchers <alborchers@steinerpoint.com>.
18 * 18 *
19 * Version history: 19 * Version history:
20 * 20 *
21 * July 11, 2002 Removed 4 port device structure since all TI UMP 21 * July 11, 2002 Removed 4 port device structure since all TI UMP
22 * chips have only 2 ports 22 * chips have only 2 ports
23 * David Iacovelli (davidi@ionetworks.com) 23 * David Iacovelli (davidi@ionetworks.com)
24 * 24 *
25 */ 25 */
26 26
27 #include <linux/kernel.h> 27 #include <linux/kernel.h>
28 #include <linux/jiffies.h> 28 #include <linux/jiffies.h>
29 #include <linux/errno.h> 29 #include <linux/errno.h>
30 #include <linux/init.h> 30 #include <linux/init.h>
31 #include <linux/slab.h> 31 #include <linux/slab.h>
32 #include <linux/tty.h> 32 #include <linux/tty.h>
33 #include <linux/tty_driver.h> 33 #include <linux/tty_driver.h>
34 #include <linux/tty_flip.h> 34 #include <linux/tty_flip.h>
35 #include <linux/module.h> 35 #include <linux/module.h>
36 #include <linux/spinlock.h> 36 #include <linux/spinlock.h>
37 #include <linux/serial.h> 37 #include <linux/serial.h>
38 #include <linux/ioctl.h> 38 #include <linux/ioctl.h>
39 #include <asm/uaccess.h> 39 #include <asm/uaccess.h>
40 #include <asm/semaphore.h> 40 #include <asm/semaphore.h>
41 #include <linux/usb.h> 41 #include <linux/usb.h>
42 #include <linux/usb/serial.h> 42 #include <linux/usb/serial.h>
43 43
44 #include "io_16654.h" 44 #include "io_16654.h"
45 #include "io_usbvend.h" 45 #include "io_usbvend.h"
46 #include "io_ti.h" 46 #include "io_ti.h"
47 47
48 /* 48 /*
49 * Version Information 49 * Version Information
50 */ 50 */
51 #define DRIVER_VERSION "v0.7" 51 #define DRIVER_VERSION "v0.7mode043006"
52 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli" 52 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
53 #define DRIVER_DESC "Edgeport USB Serial Driver" 53 #define DRIVER_DESC "Edgeport USB Serial Driver"
54 54
55 55
56 /* firmware image code */ 56 /* firmware image code */
57 #define IMAGE_VERSION_NAME PagableOperationalCodeImageVersion 57 #define IMAGE_VERSION_NAME PagableOperationalCodeImageVersion
58 #define IMAGE_ARRAY_NAME PagableOperationalCodeImage 58 #define IMAGE_ARRAY_NAME PagableOperationalCodeImage
59 #define IMAGE_SIZE PagableOperationalCodeSize 59 #define IMAGE_SIZE PagableOperationalCodeSize
60 #include "io_fw_down3.h" /* Define array OperationalCodeImage[] */ 60 #include "io_fw_down3.h" /* Define array OperationalCodeImage[] */
61 61
62 #define EPROM_PAGE_SIZE 64 62 #define EPROM_PAGE_SIZE 64
63 63
64 64
65 struct edgeport_uart_buf_desc { 65 struct edgeport_uart_buf_desc {
66 __u32 count; // Number of bytes currently in buffer 66 __u32 count; // Number of bytes currently in buffer
67 }; 67 };
68 68
69 /* different hardware types */ 69 /* different hardware types */
70 #define HARDWARE_TYPE_930 0 70 #define HARDWARE_TYPE_930 0
71 #define HARDWARE_TYPE_TIUMP 1 71 #define HARDWARE_TYPE_TIUMP 1
72 72
73 // IOCTL_PRIVATE_TI_GET_MODE Definitions 73 // IOCTL_PRIVATE_TI_GET_MODE Definitions
74 #define TI_MODE_CONFIGURING 0 // Device has not entered start device 74 #define TI_MODE_CONFIGURING 0 // Device has not entered start device
75 #define TI_MODE_BOOT 1 // Staying in boot mode 75 #define TI_MODE_BOOT 1 // Staying in boot mode
76 #define TI_MODE_DOWNLOAD 2 // Made it to download mode 76 #define TI_MODE_DOWNLOAD 2 // Made it to download mode
77 #define TI_MODE_TRANSITIONING 3 // Currently in boot mode but transitioning to download mode 77 #define TI_MODE_TRANSITIONING 3 // Currently in boot mode but transitioning to download mode
78 78
79 /* read urb state */ 79 /* read urb state */
80 #define EDGE_READ_URB_RUNNING 0 80 #define EDGE_READ_URB_RUNNING 0
81 #define EDGE_READ_URB_STOPPING 1 81 #define EDGE_READ_URB_STOPPING 1
82 #define EDGE_READ_URB_STOPPED 2 82 #define EDGE_READ_URB_STOPPED 2
83 83
84 #define EDGE_LOW_LATENCY 1 84 #define EDGE_LOW_LATENCY 1
85 #define EDGE_CLOSING_WAIT 4000 /* in .01 sec */ 85 #define EDGE_CLOSING_WAIT 4000 /* in .01 sec */
86 86
87 #define EDGE_OUT_BUF_SIZE 1024 87 #define EDGE_OUT_BUF_SIZE 1024
88 88
89 89
90 /* Product information read from the Edgeport */ 90 /* Product information read from the Edgeport */
91 struct product_info 91 struct product_info
92 { 92 {
93 int TiMode; // Current TI Mode 93 int TiMode; // Current TI Mode
94 __u8 hardware_type; // Type of hardware 94 __u8 hardware_type; // Type of hardware
95 } __attribute__((packed)); 95 } __attribute__((packed));
96 96
97 /* circular buffer */ 97 /* circular buffer */
98 struct edge_buf { 98 struct edge_buf {
99 unsigned int buf_size; 99 unsigned int buf_size;
100 char *buf_buf; 100 char *buf_buf;
101 char *buf_get; 101 char *buf_get;
102 char *buf_put; 102 char *buf_put;
103 }; 103 };
104 104
105 struct edgeport_port { 105 struct edgeport_port {
106 __u16 uart_base; 106 __u16 uart_base;
107 __u16 dma_address; 107 __u16 dma_address;
108 __u8 shadow_msr; 108 __u8 shadow_msr;
109 __u8 shadow_mcr; 109 __u8 shadow_mcr;
110 __u8 shadow_lsr; 110 __u8 shadow_lsr;
111 __u8 lsr_mask; 111 __u8 lsr_mask;
112 __u32 ump_read_timeout; /* Number of miliseconds the UMP will 112 __u32 ump_read_timeout; /* Number of miliseconds the UMP will
113 wait without data before completing 113 wait without data before completing
114 a read short */ 114 a read short */
115 int baud_rate; 115 int baud_rate;
116 int close_pending; 116 int close_pending;
117 int lsr_event; 117 int lsr_event;
118 struct edgeport_uart_buf_desc tx; 118 struct edgeport_uart_buf_desc tx;
119 struct async_icount icount; 119 struct async_icount icount;
120 wait_queue_head_t delta_msr_wait; /* for handling sleeping while 120 wait_queue_head_t delta_msr_wait; /* for handling sleeping while
121 waiting for msr change to 121 waiting for msr change to
122 happen */ 122 happen */
123 struct edgeport_serial *edge_serial; 123 struct edgeport_serial *edge_serial;
124 struct usb_serial_port *port; 124 struct usb_serial_port *port;
125 __u8 bUartMode; /* Port type, 0: RS232, etc. */ 125 __u8 bUartMode; /* Port type, 0: RS232, etc. */
126 spinlock_t ep_lock; 126 spinlock_t ep_lock;
127 int ep_read_urb_state; 127 int ep_read_urb_state;
128 int ep_write_urb_in_use; 128 int ep_write_urb_in_use;
129 struct edge_buf *ep_out_buf; 129 struct edge_buf *ep_out_buf;
130 }; 130 };
131 131
132 struct edgeport_serial { 132 struct edgeport_serial {
133 struct product_info product_info; 133 struct product_info product_info;
134 u8 TI_I2C_Type; // Type of I2C in UMP 134 u8 TI_I2C_Type; // Type of I2C in UMP
135 u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode 135 u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode
136 struct semaphore es_sem; 136 struct semaphore es_sem;
137 int num_ports_open; 137 int num_ports_open;
138 struct usb_serial *serial; 138 struct usb_serial *serial;
139 }; 139 };
140 140
141 141
142 /* Devices that this driver supports */ 142 /* Devices that this driver supports */
143 static struct usb_device_id edgeport_1port_id_table [] = { 143 static struct usb_device_id edgeport_1port_id_table [] = {
144 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) }, 144 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
145 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) }, 145 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
146 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) }, 146 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
147 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) }, 147 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
148 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) }, 148 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
149 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) }, 149 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
150 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) }, 150 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
151 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) }, 151 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
152 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) }, 152 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
153 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) }, 153 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
154 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) }, 154 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
155 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) }, 155 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
156 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) }, 156 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
157 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) }, 157 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
158 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) }, 158 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
159 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) }, 159 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
160 { } 160 { }
161 }; 161 };
162 162
163 static struct usb_device_id edgeport_2port_id_table [] = { 163 static struct usb_device_id edgeport_2port_id_table [] = {
164 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, 164 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
165 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, 165 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
166 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, 166 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
167 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, 167 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
168 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) }, 168 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
169 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) }, 169 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
170 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) }, 170 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
171 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) }, 171 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
172 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) }, 172 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
173 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) }, 173 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
174 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) }, 174 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
175 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) }, 175 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
176 // The 4-port shows up as two 2-port devices 176 /* The 4, 8 and 16 port devices show up as multiple 2 port devices */
177 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) }, 177 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
178 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) },
179 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) },
180 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) },
181 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) },
178 { } 182 { }
179 }; 183 };
180 184
181 /* Devices that this driver supports */ 185 /* Devices that this driver supports */
182 static struct usb_device_id id_table_combined [] = { 186 static struct usb_device_id id_table_combined [] = {
183 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) }, 187 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
184 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) }, 188 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
185 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) }, 189 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
186 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) }, 190 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
187 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) }, 191 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
188 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) }, 192 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
189 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) }, 193 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
190 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) }, 194 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
191 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) }, 195 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
192 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) }, 196 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
193 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) }, 197 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
194 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) }, 198 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
195 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) }, 199 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
196 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) }, 200 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
197 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) }, 201 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
198 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) }, 202 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
199 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, 203 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
200 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, 204 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
201 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, 205 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
202 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, 206 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
203 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) }, 207 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
204 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) }, 208 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
205 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) }, 209 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
206 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) }, 210 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
207 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) }, 211 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
208 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) }, 212 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
209 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) }, 213 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
210 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) }, 214 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
211 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) }, 215 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
216 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) },
217 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) },
218 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) },
219 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) },
212 { } 220 { }
213 }; 221 };
214 222
215 MODULE_DEVICE_TABLE (usb, id_table_combined); 223 MODULE_DEVICE_TABLE (usb, id_table_combined);
216 224
217 static struct usb_driver io_driver = { 225 static struct usb_driver io_driver = {
218 .name = "io_ti", 226 .name = "io_ti",
219 .probe = usb_serial_probe, 227 .probe = usb_serial_probe,
220 .disconnect = usb_serial_disconnect, 228 .disconnect = usb_serial_disconnect,
221 .id_table = id_table_combined, 229 .id_table = id_table_combined,
222 .no_dynamic_id = 1, 230 .no_dynamic_id = 1,
223 }; 231 };
224 232
225 233
226 static struct EDGE_FIRMWARE_VERSION_INFO OperationalCodeImageVersion; 234 static struct EDGE_FIRMWARE_VERSION_INFO OperationalCodeImageVersion;
227 235
228 static int debug; 236 static int debug;
229 237
230 static int TIStayInBootMode = 0; 238 static int TIStayInBootMode = 0;
231 static int low_latency = EDGE_LOW_LATENCY; 239 static int low_latency = EDGE_LOW_LATENCY;
232 static int closing_wait = EDGE_CLOSING_WAIT; 240 static int closing_wait = EDGE_CLOSING_WAIT;
233 static int ignore_cpu_rev = 0; 241 static int ignore_cpu_rev = 0;
242 static int default_uart_mode = 0; /* RS232 */
234 243
235 244
236 static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length); 245 static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length);
237 246
238 static void stop_read(struct edgeport_port *edge_port); 247 static void stop_read(struct edgeport_port *edge_port);
239 static int restart_read(struct edgeport_port *edge_port); 248 static int restart_read(struct edgeport_port *edge_port);
240 249
241 static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); 250 static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios);
242 static void edge_send(struct usb_serial_port *port); 251 static void edge_send(struct usb_serial_port *port);
243 252
253 /* sysfs attributes */
254 static int edge_create_sysfs_attrs(struct usb_serial_port *port);
255 static int edge_remove_sysfs_attrs(struct usb_serial_port *port);
256
244 /* circular buffer */ 257 /* circular buffer */
245 static struct edge_buf *edge_buf_alloc(unsigned int size); 258 static struct edge_buf *edge_buf_alloc(unsigned int size);
246 static void edge_buf_free(struct edge_buf *eb); 259 static void edge_buf_free(struct edge_buf *eb);
247 static void edge_buf_clear(struct edge_buf *eb); 260 static void edge_buf_clear(struct edge_buf *eb);
248 static unsigned int edge_buf_data_avail(struct edge_buf *eb); 261 static unsigned int edge_buf_data_avail(struct edge_buf *eb);
249 static unsigned int edge_buf_space_avail(struct edge_buf *eb); 262 static unsigned int edge_buf_space_avail(struct edge_buf *eb);
250 static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf, 263 static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf,
251 unsigned int count); 264 unsigned int count);
252 static unsigned int edge_buf_get(struct edge_buf *eb, char *buf, 265 static unsigned int edge_buf_get(struct edge_buf *eb, char *buf,
253 unsigned int count); 266 unsigned int count);
254 267
255 268
256 static int TIReadVendorRequestSync (struct usb_device *dev, 269 static int TIReadVendorRequestSync (struct usb_device *dev,
257 __u8 request, 270 __u8 request,
258 __u16 value, 271 __u16 value,
259 __u16 index, 272 __u16 index,
260 u8 *data, 273 u8 *data,
261 int size) 274 int size)
262 { 275 {
263 int status; 276 int status;
264 277
265 status = usb_control_msg (dev, 278 status = usb_control_msg (dev,
266 usb_rcvctrlpipe(dev, 0), 279 usb_rcvctrlpipe(dev, 0),
267 request, 280 request,
268 (USB_TYPE_VENDOR | 281 (USB_TYPE_VENDOR |
269 USB_RECIP_DEVICE | 282 USB_RECIP_DEVICE |
270 USB_DIR_IN), 283 USB_DIR_IN),
271 value, 284 value,
272 index, 285 index,
273 data, 286 data,
274 size, 287 size,
275 1000); 288 1000);
276 if (status < 0) 289 if (status < 0)
277 return status; 290 return status;
278 if (status != size) { 291 if (status != size) {
279 dbg ("%s - wanted to write %d, but only wrote %d", 292 dbg ("%s - wanted to write %d, but only wrote %d",
280 __FUNCTION__, size, status); 293 __FUNCTION__, size, status);
281 return -ECOMM; 294 return -ECOMM;
282 } 295 }
283 return 0; 296 return 0;
284 } 297 }
285 298
286 static int TISendVendorRequestSync (struct usb_device *dev, 299 static int TISendVendorRequestSync (struct usb_device *dev,
287 __u8 request, 300 __u8 request,
288 __u16 value, 301 __u16 value,
289 __u16 index, 302 __u16 index,
290 u8 *data, 303 u8 *data,
291 int size) 304 int size)
292 { 305 {
293 int status; 306 int status;
294 307
295 status = usb_control_msg (dev, 308 status = usb_control_msg (dev,
296 usb_sndctrlpipe(dev, 0), 309 usb_sndctrlpipe(dev, 0),
297 request, 310 request,
298 (USB_TYPE_VENDOR | 311 (USB_TYPE_VENDOR |
299 USB_RECIP_DEVICE | 312 USB_RECIP_DEVICE |
300 USB_DIR_OUT), 313 USB_DIR_OUT),
301 value, 314 value,
302 index, 315 index,
303 data, 316 data,
304 size, 317 size,
305 1000); 318 1000);
306 if (status < 0) 319 if (status < 0)
307 return status; 320 return status;
308 if (status != size) { 321 if (status != size) {
309 dbg ("%s - wanted to write %d, but only wrote %d", 322 dbg ("%s - wanted to write %d, but only wrote %d",
310 __FUNCTION__, size, status); 323 __FUNCTION__, size, status);
311 return -ECOMM; 324 return -ECOMM;
312 } 325 }
313 return 0; 326 return 0;
314 } 327 }
315 328
316 static int TIWriteCommandSync (struct usb_device *dev, __u8 command, 329 static int TIWriteCommandSync (struct usb_device *dev, __u8 command,
317 __u8 moduleid, __u16 value, u8 *data, 330 __u8 moduleid, __u16 value, u8 *data,
318 int size) 331 int size)
319 { 332 {
320 return TISendVendorRequestSync (dev, 333 return TISendVendorRequestSync (dev,
321 command, // Request 334 command, // Request
322 value, // wValue 335 value, // wValue
323 moduleid, // wIndex 336 moduleid, // wIndex
324 data, // TransferBuffer 337 data, // TransferBuffer
325 size); // TransferBufferLength 338 size); // TransferBufferLength
326 339
327 } 340 }
328 341
329 /* clear tx/rx buffers and fifo in TI UMP */ 342 /* clear tx/rx buffers and fifo in TI UMP */
330 static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask) 343 static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask)
331 { 344 {
332 int port_number = port->number - port->serial->minor; 345 int port_number = port->number - port->serial->minor;
333 346
334 dbg ("%s - port %d, mask %x", __FUNCTION__, port_number, mask); 347 dbg ("%s - port %d, mask %x", __FUNCTION__, port_number, mask);
335 348
336 return TIWriteCommandSync (port->serial->dev, 349 return TIWriteCommandSync (port->serial->dev,
337 UMPC_PURGE_PORT, 350 UMPC_PURGE_PORT,
338 (__u8)(UMPM_UART1_PORT + port_number), 351 (__u8)(UMPM_UART1_PORT + port_number),
339 mask, 352 mask,
340 NULL, 353 NULL,
341 0); 354 0);
342 } 355 }
343 356
344 /** 357 /**
345 * TIReadDownloadMemory - Read edgeport memory from TI chip 358 * TIReadDownloadMemory - Read edgeport memory from TI chip
346 * @dev: usb device pointer 359 * @dev: usb device pointer
347 * @start_address: Device CPU address at which to read 360 * @start_address: Device CPU address at which to read
348 * @length: Length of above data 361 * @length: Length of above data
349 * @address_type: Can read both XDATA and I2C 362 * @address_type: Can read both XDATA and I2C
350 * @buffer: pointer to input data buffer 363 * @buffer: pointer to input data buffer
351 */ 364 */
352 static int TIReadDownloadMemory(struct usb_device *dev, int start_address, 365 static int TIReadDownloadMemory(struct usb_device *dev, int start_address,
353 int length, __u8 address_type, __u8 *buffer) 366 int length, __u8 address_type, __u8 *buffer)
354 { 367 {
355 int status = 0; 368 int status = 0;
356 __u8 read_length; 369 __u8 read_length;
357 __be16 be_start_address; 370 __be16 be_start_address;
358 371
359 dbg ("%s - @ %x for %d", __FUNCTION__, start_address, length); 372 dbg ("%s - @ %x for %d", __FUNCTION__, start_address, length);
360 373
361 /* Read in blocks of 64 bytes 374 /* Read in blocks of 64 bytes
362 * (TI firmware can't handle more than 64 byte reads) 375 * (TI firmware can't handle more than 64 byte reads)
363 */ 376 */
364 while (length) { 377 while (length) {
365 if (length > 64) 378 if (length > 64)
366 read_length= 64; 379 read_length= 64;
367 else 380 else
368 read_length = (__u8)length; 381 read_length = (__u8)length;
369 382
370 if (read_length > 1) { 383 if (read_length > 1) {
371 dbg ("%s - @ %x for %d", __FUNCTION__, 384 dbg ("%s - @ %x for %d", __FUNCTION__,
372 start_address, read_length); 385 start_address, read_length);
373 } 386 }
374 be_start_address = cpu_to_be16 (start_address); 387 be_start_address = cpu_to_be16 (start_address);
375 status = TIReadVendorRequestSync (dev, 388 status = TIReadVendorRequestSync (dev,
376 UMPC_MEMORY_READ, // Request 389 UMPC_MEMORY_READ, // Request
377 (__u16)address_type, // wValue (Address type) 390 (__u16)address_type, // wValue (Address type)
378 (__force __u16)be_start_address, // wIndex (Address to read) 391 (__force __u16)be_start_address, // wIndex (Address to read)
379 buffer, // TransferBuffer 392 buffer, // TransferBuffer
380 read_length); // TransferBufferLength 393 read_length); // TransferBufferLength
381 394
382 if (status) { 395 if (status) {
383 dbg ("%s - ERROR %x", __FUNCTION__, status); 396 dbg ("%s - ERROR %x", __FUNCTION__, status);
384 return status; 397 return status;
385 } 398 }
386 399
387 if (read_length > 1) { 400 if (read_length > 1) {
388 usb_serial_debug_data(debug, &dev->dev, __FUNCTION__, 401 usb_serial_debug_data(debug, &dev->dev, __FUNCTION__,
389 read_length, buffer); 402 read_length, buffer);
390 } 403 }
391 404
392 /* Update pointers/length */ 405 /* Update pointers/length */
393 start_address += read_length; 406 start_address += read_length;
394 buffer += read_length; 407 buffer += read_length;
395 length -= read_length; 408 length -= read_length;
396 } 409 }
397 410
398 return status; 411 return status;
399 } 412 }
400 413
401 static int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer) 414 static int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer)
402 { 415 {
403 return TIReadDownloadMemory (dev, 416 return TIReadDownloadMemory (dev,
404 start_address, 417 start_address,
405 length, 418 length,
406 DTK_ADDR_SPACE_XDATA, 419 DTK_ADDR_SPACE_XDATA,
407 buffer); 420 buffer);
408 } 421 }
409 422
410 /* Read edgeport memory to a given block */ 423 /* Read edgeport memory to a given block */
411 static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer) 424 static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer)
412 { 425 {
413 int status = 0; 426 int status = 0;
414 int i; 427 int i;
415 428
416 for (i=0; i< length; i++) { 429 for (i=0; i< length; i++) {
417 status = TIReadVendorRequestSync (serial->serial->dev, 430 status = TIReadVendorRequestSync (serial->serial->dev,
418 UMPC_MEMORY_READ, // Request 431 UMPC_MEMORY_READ, // Request
419 serial->TI_I2C_Type, // wValue (Address type) 432 serial->TI_I2C_Type, // wValue (Address type)
420 (__u16)(start_address+i), // wIndex 433 (__u16)(start_address+i), // wIndex
421 &buffer[i], // TransferBuffer 434 &buffer[i], // TransferBuffer
422 0x01); // TransferBufferLength 435 0x01); // TransferBufferLength
423 if (status) { 436 if (status) {
424 dbg ("%s - ERROR %x", __FUNCTION__, status); 437 dbg ("%s - ERROR %x", __FUNCTION__, status);
425 return status; 438 return status;
426 } 439 }
427 } 440 }
428 441
429 dbg ("%s - start_address = %x, length = %d", __FUNCTION__, start_address, length); 442 dbg ("%s - start_address = %x, length = %d", __FUNCTION__, start_address, length);
430 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer); 443 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer);
431 444
432 serial->TiReadI2C = 1; 445 serial->TiReadI2C = 1;
433 446
434 return status; 447 return status;
435 } 448 }
436 449
437 /* Write given block to TI EPROM memory */ 450 /* Write given block to TI EPROM memory */
438 static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) 451 static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
439 { 452 {
440 int status = 0; 453 int status = 0;
441 int i; 454 int i;
442 __u8 temp; 455 __u8 temp;
443 456
444 /* Must do a read before write */ 457 /* Must do a read before write */
445 if (!serial->TiReadI2C) { 458 if (!serial->TiReadI2C) {
446 status = TIReadBootMemory(serial, 0, 1, &temp); 459 status = TIReadBootMemory(serial, 0, 1, &temp);
447 if (status) 460 if (status)
448 return status; 461 return status;
449 } 462 }
450 463
451 for (i=0; i < length; ++i) { 464 for (i=0; i < length; ++i) {
452 status = TISendVendorRequestSync (serial->serial->dev, 465 status = TISendVendorRequestSync (serial->serial->dev,
453 UMPC_MEMORY_WRITE, // Request 466 UMPC_MEMORY_WRITE, // Request
454 buffer[i], // wValue 467 buffer[i], // wValue
455 (__u16)(i+start_address), // wIndex 468 (__u16)(i+start_address), // wIndex
456 NULL, // TransferBuffer 469 NULL, // TransferBuffer
457 0); // TransferBufferLength 470 0); // TransferBufferLength
458 if (status) 471 if (status)
459 return status; 472 return status;
460 } 473 }
461 474
462 dbg ("%s - start_sddr = %x, length = %d", __FUNCTION__, start_address, length); 475 dbg ("%s - start_sddr = %x, length = %d", __FUNCTION__, start_address, length);
463 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer); 476 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer);
464 477
465 return status; 478 return status;
466 } 479 }
467 480
468 481
469 /* Write edgeport I2C memory to TI chip */ 482 /* Write edgeport I2C memory to TI chip */
470 static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer) 483 static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer)
471 { 484 {
472 int status = 0; 485 int status = 0;
473 int write_length; 486 int write_length;
474 __be16 be_start_address; 487 __be16 be_start_address;
475 488
476 /* We can only send a maximum of 1 aligned byte page at a time */ 489 /* We can only send a maximum of 1 aligned byte page at a time */
477 490
478 /* calulate the number of bytes left in the first page */ 491 /* calulate the number of bytes left in the first page */
479 write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1)); 492 write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1));
480 493
481 if (write_length > length) 494 if (write_length > length)
482 write_length = length; 495 write_length = length;
483 496
484 dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __FUNCTION__, start_address, write_length); 497 dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __FUNCTION__, start_address, write_length);
485 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer); 498 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer);
486 499
487 /* Write first page */ 500 /* Write first page */
488 be_start_address = cpu_to_be16 (start_address); 501 be_start_address = cpu_to_be16 (start_address);
489 status = TISendVendorRequestSync (serial->serial->dev, 502 status = TISendVendorRequestSync (serial->serial->dev,
490 UMPC_MEMORY_WRITE, // Request 503 UMPC_MEMORY_WRITE, // Request
491 (__u16)address_type, // wValue 504 (__u16)address_type, // wValue
492 (__force __u16)be_start_address, // wIndex 505 (__force __u16)be_start_address, // wIndex
493 buffer, // TransferBuffer 506 buffer, // TransferBuffer
494 write_length); 507 write_length);
495 if (status) { 508 if (status) {
496 dbg ("%s - ERROR %d", __FUNCTION__, status); 509 dbg ("%s - ERROR %d", __FUNCTION__, status);
497 return status; 510 return status;
498 } 511 }
499 512
500 length -= write_length; 513 length -= write_length;
501 start_address += write_length; 514 start_address += write_length;
502 buffer += write_length; 515 buffer += write_length;
503 516
504 /* We should be aligned now -- can write max page size bytes at a time */ 517 /* We should be aligned now -- can write max page size bytes at a time */
505 while (length) { 518 while (length) {
506 if (length > EPROM_PAGE_SIZE) 519 if (length > EPROM_PAGE_SIZE)
507 write_length = EPROM_PAGE_SIZE; 520 write_length = EPROM_PAGE_SIZE;
508 else 521 else
509 write_length = length; 522 write_length = length;
510 523
511 dbg ("%s - Page Write Addr = %x, length = %d", __FUNCTION__, start_address, write_length); 524 dbg ("%s - Page Write Addr = %x, length = %d", __FUNCTION__, start_address, write_length);
512 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer); 525 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer);
513 526
514 /* Write next page */ 527 /* Write next page */
515 be_start_address = cpu_to_be16 (start_address); 528 be_start_address = cpu_to_be16 (start_address);
516 status = TISendVendorRequestSync (serial->serial->dev, 529 status = TISendVendorRequestSync (serial->serial->dev,
517 UMPC_MEMORY_WRITE, // Request 530 UMPC_MEMORY_WRITE, // Request
518 (__u16)address_type, // wValue 531 (__u16)address_type, // wValue
519 (__force __u16)be_start_address, // wIndex 532 (__force __u16)be_start_address, // wIndex
520 buffer, // TransferBuffer 533 buffer, // TransferBuffer
521 write_length); // TransferBufferLength 534 write_length); // TransferBufferLength
522 if (status) { 535 if (status) {
523 dev_err (&serial->serial->dev->dev, "%s - ERROR %d\n", __FUNCTION__, status); 536 dev_err (&serial->serial->dev->dev, "%s - ERROR %d\n", __FUNCTION__, status);
524 return status; 537 return status;
525 } 538 }
526 539
527 length -= write_length; 540 length -= write_length;
528 start_address += write_length; 541 start_address += write_length;
529 buffer += write_length; 542 buffer += write_length;
530 } 543 }
531 return status; 544 return status;
532 } 545 }
533 546
534 /* Examine the UMP DMA registers and LSR 547 /* Examine the UMP DMA registers and LSR
535 * 548 *
536 * Check the MSBit of the X and Y DMA byte count registers. 549 * Check the MSBit of the X and Y DMA byte count registers.
537 * A zero in this bit indicates that the TX DMA buffers are empty 550 * A zero in this bit indicates that the TX DMA buffers are empty
538 * then check the TX Empty bit in the UART. 551 * then check the TX Empty bit in the UART.
539 */ 552 */
540 static int TIIsTxActive (struct edgeport_port *port) 553 static int TIIsTxActive (struct edgeport_port *port)
541 { 554 {
542 int status; 555 int status;
543 struct out_endpoint_desc_block *oedb; 556 struct out_endpoint_desc_block *oedb;
544 __u8 *lsr; 557 __u8 *lsr;
545 int bytes_left = 0; 558 int bytes_left = 0;
546 559
547 oedb = kmalloc (sizeof (* oedb), GFP_KERNEL); 560 oedb = kmalloc (sizeof (* oedb), GFP_KERNEL);
548 if (!oedb) { 561 if (!oedb) {
549 dev_err (&port->port->dev, "%s - out of memory\n", __FUNCTION__); 562 dev_err (&port->port->dev, "%s - out of memory\n", __FUNCTION__);
550 return -ENOMEM; 563 return -ENOMEM;
551 } 564 }
552 565
553 lsr = kmalloc (1, GFP_KERNEL); /* Sigh, that's right, just one byte, 566 lsr = kmalloc (1, GFP_KERNEL); /* Sigh, that's right, just one byte,
554 as not all platforms can do DMA 567 as not all platforms can do DMA
555 from stack */ 568 from stack */
556 if (!lsr) { 569 if (!lsr) {
557 kfree(oedb); 570 kfree(oedb);
558 return -ENOMEM; 571 return -ENOMEM;
559 } 572 }
560 /* Read the DMA Count Registers */ 573 /* Read the DMA Count Registers */
561 status = TIReadRam (port->port->serial->dev, 574 status = TIReadRam (port->port->serial->dev,
562 port->dma_address, 575 port->dma_address,
563 sizeof( *oedb), 576 sizeof( *oedb),
564 (void *)oedb); 577 (void *)oedb);
565 578
566 if (status) 579 if (status)
567 goto exit_is_tx_active; 580 goto exit_is_tx_active;
568 581
569 dbg ("%s - XByteCount 0x%X", __FUNCTION__, oedb->XByteCount); 582 dbg ("%s - XByteCount 0x%X", __FUNCTION__, oedb->XByteCount);
570 583
571 /* and the LSR */ 584 /* and the LSR */
572 status = TIReadRam (port->port->serial->dev, 585 status = TIReadRam (port->port->serial->dev,
573 port->uart_base + UMPMEM_OFFS_UART_LSR, 586 port->uart_base + UMPMEM_OFFS_UART_LSR,
574 1, 587 1,
575 lsr); 588 lsr);
576 589
577 if (status) 590 if (status)
578 goto exit_is_tx_active; 591 goto exit_is_tx_active;
579 dbg ("%s - LSR = 0x%X", __FUNCTION__, *lsr); 592 dbg ("%s - LSR = 0x%X", __FUNCTION__, *lsr);
580 593
581 /* If either buffer has data or we are transmitting then return TRUE */ 594 /* If either buffer has data or we are transmitting then return TRUE */
582 if ((oedb->XByteCount & 0x80 ) != 0 ) 595 if ((oedb->XByteCount & 0x80 ) != 0 )
583 bytes_left += 64; 596 bytes_left += 64;
584 597
585 if ((*lsr & UMP_UART_LSR_TX_MASK ) == 0 ) 598 if ((*lsr & UMP_UART_LSR_TX_MASK ) == 0 )
586 bytes_left += 1; 599 bytes_left += 1;
587 600
588 /* We return Not Active if we get any kind of error */ 601 /* We return Not Active if we get any kind of error */
589 exit_is_tx_active: 602 exit_is_tx_active:
590 dbg ("%s - return %d", __FUNCTION__, bytes_left ); 603 dbg ("%s - return %d", __FUNCTION__, bytes_left );
591 604
592 kfree(lsr); 605 kfree(lsr);
593 kfree(oedb); 606 kfree(oedb);
594 return bytes_left; 607 return bytes_left;
595 } 608 }
596 609
597 static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int flush) 610 static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int flush)
598 { 611 {
599 int baud_rate; 612 int baud_rate;
600 struct tty_struct *tty = port->port->tty; 613 struct tty_struct *tty = port->port->tty;
601 wait_queue_t wait; 614 wait_queue_t wait;
602 unsigned long flags; 615 unsigned long flags;
603 616
604 if (!timeout) 617 if (!timeout)
605 timeout = (HZ*EDGE_CLOSING_WAIT)/100; 618 timeout = (HZ*EDGE_CLOSING_WAIT)/100;
606 619
607 /* wait for data to drain from the buffer */ 620 /* wait for data to drain from the buffer */
608 spin_lock_irqsave(&port->ep_lock, flags); 621 spin_lock_irqsave(&port->ep_lock, flags);
609 init_waitqueue_entry(&wait, current); 622 init_waitqueue_entry(&wait, current);
610 add_wait_queue(&tty->write_wait, &wait); 623 add_wait_queue(&tty->write_wait, &wait);
611 for (;;) { 624 for (;;) {
612 set_current_state(TASK_INTERRUPTIBLE); 625 set_current_state(TASK_INTERRUPTIBLE);
613 if (edge_buf_data_avail(port->ep_out_buf) == 0 626 if (edge_buf_data_avail(port->ep_out_buf) == 0
614 || timeout == 0 || signal_pending(current) 627 || timeout == 0 || signal_pending(current)
615 || !usb_get_intfdata(port->port->serial->interface)) /* disconnect */ 628 || !usb_get_intfdata(port->port->serial->interface)) /* disconnect */
616 break; 629 break;
617 spin_unlock_irqrestore(&port->ep_lock, flags); 630 spin_unlock_irqrestore(&port->ep_lock, flags);
618 timeout = schedule_timeout(timeout); 631 timeout = schedule_timeout(timeout);
619 spin_lock_irqsave(&port->ep_lock, flags); 632 spin_lock_irqsave(&port->ep_lock, flags);
620 } 633 }
621 set_current_state(TASK_RUNNING); 634 set_current_state(TASK_RUNNING);
622 remove_wait_queue(&tty->write_wait, &wait); 635 remove_wait_queue(&tty->write_wait, &wait);
623 if (flush) 636 if (flush)
624 edge_buf_clear(port->ep_out_buf); 637 edge_buf_clear(port->ep_out_buf);
625 spin_unlock_irqrestore(&port->ep_lock, flags); 638 spin_unlock_irqrestore(&port->ep_lock, flags);
626 639
627 /* wait for data to drain from the device */ 640 /* wait for data to drain from the device */
628 timeout += jiffies; 641 timeout += jiffies;
629 while ((long)(jiffies - timeout) < 0 && !signal_pending(current) 642 while ((long)(jiffies - timeout) < 0 && !signal_pending(current)
630 && usb_get_intfdata(port->port->serial->interface)) { /* not disconnected */ 643 && usb_get_intfdata(port->port->serial->interface)) { /* not disconnected */
631 if (!TIIsTxActive(port)) 644 if (!TIIsTxActive(port))
632 break; 645 break;
633 msleep(10); 646 msleep(10);
634 } 647 }
635 648
636 /* disconnected */ 649 /* disconnected */
637 if (!usb_get_intfdata(port->port->serial->interface)) 650 if (!usb_get_intfdata(port->port->serial->interface))
638 return; 651 return;
639 652
640 /* wait one more character time, based on baud rate */ 653 /* wait one more character time, based on baud rate */
641 /* (TIIsTxActive doesn't seem to wait for the last byte) */ 654 /* (TIIsTxActive doesn't seem to wait for the last byte) */
642 if ((baud_rate=port->baud_rate) == 0) 655 if ((baud_rate=port->baud_rate) == 0)
643 baud_rate = 50; 656 baud_rate = 50;
644 msleep(max(1,(10000+baud_rate-1)/baud_rate)); 657 msleep(max(1,(10000+baud_rate-1)/baud_rate));
645 } 658 }
646 659
647 static int TIChooseConfiguration (struct usb_device *dev) 660 static int TIChooseConfiguration (struct usb_device *dev)
648 { 661 {
649 // There may be multiple configurations on this device, in which case 662 // There may be multiple configurations on this device, in which case
650 // we would need to read and parse all of them to find out which one 663 // we would need to read and parse all of them to find out which one
651 // we want. However, we just support one config at this point, 664 // we want. However, we just support one config at this point,
652 // configuration # 1, which is Config Descriptor 0. 665 // configuration # 1, which is Config Descriptor 0.
653 666
654 dbg ("%s - Number of Interfaces = %d", __FUNCTION__, dev->config->desc.bNumInterfaces); 667 dbg ("%s - Number of Interfaces = %d", __FUNCTION__, dev->config->desc.bNumInterfaces);
655 dbg ("%s - MAX Power = %d", __FUNCTION__, dev->config->desc.bMaxPower*2); 668 dbg ("%s - MAX Power = %d", __FUNCTION__, dev->config->desc.bMaxPower*2);
656 669
657 if (dev->config->desc.bNumInterfaces != 1) { 670 if (dev->config->desc.bNumInterfaces != 1) {
658 dev_err (&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __FUNCTION__); 671 dev_err (&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __FUNCTION__);
659 return -ENODEV; 672 return -ENODEV;
660 } 673 }
661 674
662 return 0; 675 return 0;
663 } 676 }
664 677
665 static int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) 678 static int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
666 { 679 {
667 int status; 680 int status;
668 681
669 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { 682 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
670 status = TIReadDownloadMemory (serial->serial->dev, 683 status = TIReadDownloadMemory (serial->serial->dev,
671 start_address, 684 start_address,
672 length, 685 length,
673 serial->TI_I2C_Type, 686 serial->TI_I2C_Type,
674 buffer); 687 buffer);
675 } else { 688 } else {
676 status = TIReadBootMemory (serial, 689 status = TIReadBootMemory (serial,
677 start_address, 690 start_address,
678 length, 691 length,
679 buffer); 692 buffer);
680 } 693 }
681 694
682 return status; 695 return status;
683 } 696 }
684 697
685 static int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) 698 static int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
686 { 699 {
687 if (serial->product_info.TiMode == TI_MODE_BOOT) 700 if (serial->product_info.TiMode == TI_MODE_BOOT)
688 return TIWriteBootMemory (serial, 701 return TIWriteBootMemory (serial,
689 start_address, 702 start_address,
690 length, 703 length,
691 buffer); 704 buffer);
692 705
693 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) 706 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD)
694 return TIWriteDownloadI2C (serial, 707 return TIWriteDownloadI2C (serial,
695 start_address, 708 start_address,
696 length, 709 length,
697 serial->TI_I2C_Type, 710 serial->TI_I2C_Type,
698 buffer); 711 buffer);
699 712
700 return -EINVAL; 713 return -EINVAL;
701 } 714 }
702 715
703 716
704 717
705 /* Read a descriptor header from I2C based on type */ 718 /* Read a descriptor header from I2C based on type */
706 static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc) 719 static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc)
707 { 720 {
708 int start_address; 721 int start_address;
709 int status; 722 int status;
710 723
711 /* Search for requested descriptor in I2C */ 724 /* Search for requested descriptor in I2C */
712 start_address = 2; 725 start_address = 2;
713 do { 726 do {
714 status = TIReadRom (serial, 727 status = TIReadRom (serial,
715 start_address, 728 start_address,
716 sizeof(struct ti_i2c_desc), 729 sizeof(struct ti_i2c_desc),
717 (__u8 *)rom_desc ); 730 (__u8 *)rom_desc );
718 if (status) 731 if (status)
719 return 0; 732 return 0;
720 733
721 if (rom_desc->Type == desc_type) 734 if (rom_desc->Type == desc_type)
722 return start_address; 735 return start_address;
723 736
724 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; 737 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size;
725 738
726 } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); 739 } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type);
727 740
728 return 0; 741 return 0;
729 } 742 }
730 743
731 /* Validate descriptor checksum */ 744 /* Validate descriptor checksum */
732 static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer) 745 static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer)
733 { 746 {
734 __u16 i; 747 __u16 i;
735 __u8 cs = 0; 748 __u8 cs = 0;
736 749
737 for (i=0; i < rom_desc->Size; i++) { 750 for (i=0; i < rom_desc->Size; i++) {
738 cs = (__u8)(cs + buffer[i]); 751 cs = (__u8)(cs + buffer[i]);
739 } 752 }
740 if (cs != rom_desc->CheckSum) { 753 if (cs != rom_desc->CheckSum) {
741 dbg ("%s - Mismatch %x - %x", __FUNCTION__, rom_desc->CheckSum, cs); 754 dbg ("%s - Mismatch %x - %x", __FUNCTION__, rom_desc->CheckSum, cs);
742 return -EINVAL; 755 return -EINVAL;
743 } 756 }
744 return 0; 757 return 0;
745 } 758 }
746 759
747 /* Make sure that the I2C image is good */ 760 /* Make sure that the I2C image is good */
748 static int TiValidateI2cImage (struct edgeport_serial *serial) 761 static int TiValidateI2cImage (struct edgeport_serial *serial)
749 { 762 {
750 struct device *dev = &serial->serial->dev->dev; 763 struct device *dev = &serial->serial->dev->dev;
751 int status = 0; 764 int status = 0;
752 struct ti_i2c_desc *rom_desc; 765 struct ti_i2c_desc *rom_desc;
753 int start_address = 2; 766 int start_address = 2;
754 __u8 *buffer; 767 __u8 *buffer;
755 __u16 ttype; 768 __u16 ttype;
756 769
757 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); 770 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
758 if (!rom_desc) { 771 if (!rom_desc) {
759 dev_err (dev, "%s - out of memory\n", __FUNCTION__); 772 dev_err (dev, "%s - out of memory\n", __FUNCTION__);
760 return -ENOMEM; 773 return -ENOMEM;
761 } 774 }
762 buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL); 775 buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL);
763 if (!buffer) { 776 if (!buffer) {
764 dev_err (dev, "%s - out of memory when allocating buffer\n", __FUNCTION__); 777 dev_err (dev, "%s - out of memory when allocating buffer\n", __FUNCTION__);
765 kfree (rom_desc); 778 kfree (rom_desc);
766 return -ENOMEM; 779 return -ENOMEM;
767 } 780 }
768 781
769 // Read the first byte (Signature0) must be 0x52 or 0x10 782 // Read the first byte (Signature0) must be 0x52 or 0x10
770 status = TIReadRom (serial, 0, 1, buffer); 783 status = TIReadRom (serial, 0, 1, buffer);
771 if (status) 784 if (status)
772 goto ExitTiValidateI2cImage; 785 goto ExitTiValidateI2cImage;
773 786
774 if (*buffer != UMP5152 && *buffer != UMP3410) { 787 if (*buffer != UMP5152 && *buffer != UMP3410) {
775 dev_err (dev, "%s - invalid buffer signature\n", __FUNCTION__); 788 dev_err (dev, "%s - invalid buffer signature\n", __FUNCTION__);
776 status = -ENODEV; 789 status = -ENODEV;
777 goto ExitTiValidateI2cImage; 790 goto ExitTiValidateI2cImage;
778 } 791 }
779 792
780 do { 793 do {
781 // Validate the I2C 794 // Validate the I2C
782 status = TIReadRom (serial, 795 status = TIReadRom (serial,
783 start_address, 796 start_address,
784 sizeof(struct ti_i2c_desc), 797 sizeof(struct ti_i2c_desc),
785 (__u8 *)rom_desc); 798 (__u8 *)rom_desc);
786 if (status) 799 if (status)
787 break; 800 break;
788 801
789 if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) { 802 if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) {
790 status = -ENODEV; 803 status = -ENODEV;
791 dbg ("%s - structure too big, erroring out.", __FUNCTION__); 804 dbg ("%s - structure too big, erroring out.", __FUNCTION__);
792 break; 805 break;
793 } 806 }
794 807
795 dbg ("%s Type = 0x%x", __FUNCTION__, rom_desc->Type); 808 dbg ("%s Type = 0x%x", __FUNCTION__, rom_desc->Type);
796 809
797 // Skip type 2 record 810 // Skip type 2 record
798 ttype = rom_desc->Type & 0x0f; 811 ttype = rom_desc->Type & 0x0f;
799 if ( ttype != I2C_DESC_TYPE_FIRMWARE_BASIC 812 if ( ttype != I2C_DESC_TYPE_FIRMWARE_BASIC
800 && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO ) { 813 && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO ) {
801 // Read the descriptor data 814 // Read the descriptor data
802 status = TIReadRom(serial, 815 status = TIReadRom(serial,
803 start_address+sizeof(struct ti_i2c_desc), 816 start_address+sizeof(struct ti_i2c_desc),
804 rom_desc->Size, 817 rom_desc->Size,
805 buffer); 818 buffer);
806 if (status) 819 if (status)
807 break; 820 break;
808 821
809 status = ValidChecksum(rom_desc, buffer); 822 status = ValidChecksum(rom_desc, buffer);
810 if (status) 823 if (status)
811 break; 824 break;
812 } 825 }
813 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; 826 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size;
814 827
815 } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE)); 828 } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE));
816 829
817 if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE)) 830 if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE))
818 status = -ENODEV; 831 status = -ENODEV;
819 832
820 ExitTiValidateI2cImage: 833 ExitTiValidateI2cImage:
821 kfree (buffer); 834 kfree (buffer);
822 kfree (rom_desc); 835 kfree (rom_desc);
823 return status; 836 return status;
824 } 837 }
825 838
826 static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer) 839 static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer)
827 { 840 {
828 int status; 841 int status;
829 int start_address; 842 int start_address;
830 struct ti_i2c_desc *rom_desc; 843 struct ti_i2c_desc *rom_desc;
831 struct edge_ti_manuf_descriptor *desc; 844 struct edge_ti_manuf_descriptor *desc;
832 845
833 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); 846 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
834 if (!rom_desc) { 847 if (!rom_desc) {
835 dev_err (&serial->serial->dev->dev, "%s - out of memory\n", __FUNCTION__); 848 dev_err (&serial->serial->dev->dev, "%s - out of memory\n", __FUNCTION__);
836 return -ENOMEM; 849 return -ENOMEM;
837 } 850 }
838 start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc); 851 start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc);
839 852
840 if (!start_address) { 853 if (!start_address) {
841 dbg ("%s - Edge Descriptor not found in I2C", __FUNCTION__); 854 dbg ("%s - Edge Descriptor not found in I2C", __FUNCTION__);
842 status = -ENODEV; 855 status = -ENODEV;
843 goto exit; 856 goto exit;
844 } 857 }
845 858
846 // Read the descriptor data 859 // Read the descriptor data
847 status = TIReadRom (serial, 860 status = TIReadRom (serial,
848 start_address+sizeof(struct ti_i2c_desc), 861 start_address+sizeof(struct ti_i2c_desc),
849 rom_desc->Size, 862 rom_desc->Size,
850 buffer); 863 buffer);
851 if (status) 864 if (status)
852 goto exit; 865 goto exit;
853 866
854 status = ValidChecksum(rom_desc, buffer); 867 status = ValidChecksum(rom_desc, buffer);
855 868
856 desc = (struct edge_ti_manuf_descriptor *)buffer; 869 desc = (struct edge_ti_manuf_descriptor *)buffer;
857 dbg ( "%s - IonConfig 0x%x", __FUNCTION__, desc->IonConfig ); 870 dbg ( "%s - IonConfig 0x%x", __FUNCTION__, desc->IonConfig );
858 dbg ( "%s - Version %d", __FUNCTION__, desc->Version ); 871 dbg ( "%s - Version %d", __FUNCTION__, desc->Version );
859 dbg ( "%s - Cpu/Board 0x%x", __FUNCTION__, desc->CpuRev_BoardRev ); 872 dbg ( "%s - Cpu/Board 0x%x", __FUNCTION__, desc->CpuRev_BoardRev );
860 dbg ( "%s - NumPorts %d", __FUNCTION__, desc->NumPorts ); 873 dbg ( "%s - NumPorts %d", __FUNCTION__, desc->NumPorts );
861 dbg ( "%s - NumVirtualPorts %d", __FUNCTION__, desc->NumVirtualPorts ); 874 dbg ( "%s - NumVirtualPorts %d", __FUNCTION__, desc->NumVirtualPorts );
862 dbg ( "%s - TotalPorts %d", __FUNCTION__, desc->TotalPorts ); 875 dbg ( "%s - TotalPorts %d", __FUNCTION__, desc->TotalPorts );
863 876
864 exit: 877 exit:
865 kfree (rom_desc); 878 kfree (rom_desc);
866 return status; 879 return status;
867 } 880 }
868 881
869 /* Build firmware header used for firmware update */ 882 /* Build firmware header used for firmware update */
870 static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) 883 static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev)
871 { 884 {
872 __u8 *buffer; 885 __u8 *buffer;
873 int buffer_size; 886 int buffer_size;
874 int i; 887 int i;
875 __u8 cs = 0; 888 __u8 cs = 0;
876 struct ti_i2c_desc *i2c_header; 889 struct ti_i2c_desc *i2c_header;
877 struct ti_i2c_image_header *img_header; 890 struct ti_i2c_image_header *img_header;
878 struct ti_i2c_firmware_rec *firmware_rec; 891 struct ti_i2c_firmware_rec *firmware_rec;
879 892
880 // In order to update the I2C firmware we must change the type 2 record to type 0xF2. 893 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
881 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver 894 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
882 // will download the latest firmware (padded to 15.5k) into the UMP ram. 895 // will download the latest firmware (padded to 15.5k) into the UMP ram.
883 // And finally when the device comes back up in download mode the driver will cause 896 // And finally when the device comes back up in download mode the driver will cause
884 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update 897 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
885 // the record type from 0xf2 to 0x02. 898 // the record type from 0xf2 to 0x02.
886 899
887 // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record) 900 // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record)
888 buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec)); 901 buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec));
889 902
890 buffer = kmalloc (buffer_size, GFP_KERNEL); 903 buffer = kmalloc (buffer_size, GFP_KERNEL);
891 if (!buffer) { 904 if (!buffer) {
892 dev_err (dev, "%s - out of memory\n", __FUNCTION__); 905 dev_err (dev, "%s - out of memory\n", __FUNCTION__);
893 return -ENOMEM; 906 return -ENOMEM;
894 } 907 }
895 908
896 // Set entire image of 0xffs 909 // Set entire image of 0xffs
897 memset (buffer, 0xff, buffer_size); 910 memset (buffer, 0xff, buffer_size);
898 911
899 // Copy version number into firmware record 912 // Copy version number into firmware record
900 firmware_rec = (struct ti_i2c_firmware_rec *)buffer; 913 firmware_rec = (struct ti_i2c_firmware_rec *)buffer;
901 914
902 firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion; 915 firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion;
903 firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion; 916 firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion;
904 917
905 // Pointer to fw_down memory image 918 // Pointer to fw_down memory image
906 img_header = (struct ti_i2c_image_header *)&PagableOperationalCodeImage[0]; 919 img_header = (struct ti_i2c_image_header *)&PagableOperationalCodeImage[0];
907 920
908 memcpy (buffer + sizeof(struct ti_i2c_firmware_rec), 921 memcpy (buffer + sizeof(struct ti_i2c_firmware_rec),
909 &PagableOperationalCodeImage[sizeof(struct ti_i2c_image_header)], 922 &PagableOperationalCodeImage[sizeof(struct ti_i2c_image_header)],
910 le16_to_cpu(img_header->Length)); 923 le16_to_cpu(img_header->Length));
911 924
912 for (i=0; i < buffer_size; i++) { 925 for (i=0; i < buffer_size; i++) {
913 cs = (__u8)(cs + buffer[i]); 926 cs = (__u8)(cs + buffer[i]);
914 } 927 }
915 928
916 kfree (buffer); 929 kfree (buffer);
917 930
918 // Build new header 931 // Build new header
919 i2c_header = (struct ti_i2c_desc *)header; 932 i2c_header = (struct ti_i2c_desc *)header;
920 firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data; 933 firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data;
921 934
922 i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK; 935 i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK;
923 i2c_header->Size = (__u16)buffer_size; 936 i2c_header->Size = (__u16)buffer_size;
924 i2c_header->CheckSum = cs; 937 i2c_header->CheckSum = cs;
925 firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion; 938 firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion;
926 firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion; 939 firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion;
927 940
928 return 0; 941 return 0;
929 } 942 }
930 943
931 /* Try to figure out what type of I2c we have */ 944 /* Try to figure out what type of I2c we have */
932 static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial) 945 static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial)
933 { 946 {
934 int status; 947 int status;
935 __u8 data; 948 __u8 data;
936 949
937 // Try to read type 2 950 // Try to read type 2
938 status = TIReadVendorRequestSync (serial->serial->dev, 951 status = TIReadVendorRequestSync (serial->serial->dev,
939 UMPC_MEMORY_READ, // Request 952 UMPC_MEMORY_READ, // Request
940 DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type) 953 DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type)
941 0, // wIndex 954 0, // wIndex
942 &data, // TransferBuffer 955 &data, // TransferBuffer
943 0x01); // TransferBufferLength 956 0x01); // TransferBufferLength
944 if (status) 957 if (status)
945 dbg ("%s - read 2 status error = %d", __FUNCTION__, status); 958 dbg ("%s - read 2 status error = %d", __FUNCTION__, status);
946 else 959 else
947 dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data); 960 dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data);
948 if ((!status) && (data == UMP5152 || data == UMP3410)) { 961 if ((!status) && (data == UMP5152 || data == UMP3410)) {
949 dbg ("%s - ROM_TYPE_II", __FUNCTION__); 962 dbg ("%s - ROM_TYPE_II", __FUNCTION__);
950 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 963 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
951 return 0; 964 return 0;
952 } 965 }
953 966
954 // Try to read type 3 967 // Try to read type 3
955 status = TIReadVendorRequestSync (serial->serial->dev, 968 status = TIReadVendorRequestSync (serial->serial->dev,
956 UMPC_MEMORY_READ, // Request 969 UMPC_MEMORY_READ, // Request
957 DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type) 970 DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type)
958 0, // wIndex 971 0, // wIndex
959 &data, // TransferBuffer 972 &data, // TransferBuffer
960 0x01); // TransferBufferLength 973 0x01); // TransferBufferLength
961 if (status) 974 if (status)
962 dbg ("%s - read 3 status error = %d", __FUNCTION__, status); 975 dbg ("%s - read 3 status error = %d", __FUNCTION__, status);
963 else 976 else
964 dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data); 977 dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data);
965 if ((!status) && (data == UMP5152 || data == UMP3410)) { 978 if ((!status) && (data == UMP5152 || data == UMP3410)) {
966 dbg ("%s - ROM_TYPE_III", __FUNCTION__); 979 dbg ("%s - ROM_TYPE_III", __FUNCTION__);
967 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III; 980 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III;
968 return 0; 981 return 0;
969 } 982 }
970 983
971 dbg ("%s - Unknown", __FUNCTION__); 984 dbg ("%s - Unknown", __FUNCTION__);
972 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 985 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
973 return -ENODEV; 986 return -ENODEV;
974 } 987 }
975 988
976 static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent) 989 static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent)
977 { 990 {
978 int status; 991 int status;
979 992
980 status = usb_bulk_msg (serial->dev, 993 status = usb_bulk_msg (serial->dev,
981 usb_sndbulkpipe(serial->dev, 994 usb_sndbulkpipe(serial->dev,
982 serial->port[0]->bulk_out_endpointAddress), 995 serial->port[0]->bulk_out_endpointAddress),
983 buffer, 996 buffer,
984 length, 997 length,
985 num_sent, 998 num_sent,
986 1000); 999 1000);
987 return status; 1000 return status;
988 } 1001 }
989 1002
990 /* Download given firmware image to the device (IN BOOT MODE) */ 1003 /* Download given firmware image to the device (IN BOOT MODE) */
991 static int TIDownloadCodeImage (struct edgeport_serial *serial, __u8 *image, int image_length) 1004 static int TIDownloadCodeImage (struct edgeport_serial *serial, __u8 *image, int image_length)
992 { 1005 {
993 int status = 0; 1006 int status = 0;
994 int pos; 1007 int pos;
995 int transfer; 1008 int transfer;
996 int done; 1009 int done;
997 1010
998 // Transfer firmware image 1011 // Transfer firmware image
999 for (pos = 0; pos < image_length; ) { 1012 for (pos = 0; pos < image_length; ) {
1000 // Read the next buffer from file 1013 // Read the next buffer from file
1001 transfer = image_length - pos; 1014 transfer = image_length - pos;
1002 if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE) 1015 if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE)
1003 transfer = EDGE_FW_BULK_MAX_PACKET_SIZE; 1016 transfer = EDGE_FW_BULK_MAX_PACKET_SIZE;
1004 1017
1005 // Transfer data 1018 // Transfer data
1006 status = TISendBulkTransferSync (serial->serial, &image[pos], transfer, &done); 1019 status = TISendBulkTransferSync (serial->serial, &image[pos], transfer, &done);
1007 if (status) 1020 if (status)
1008 break; 1021 break;
1009 // Advance buffer pointer 1022 // Advance buffer pointer
1010 pos += done; 1023 pos += done;
1011 } 1024 }
1012 1025
1013 return status; 1026 return status;
1014 } 1027 }
1015 1028
1016 // FIXME!!! 1029 // FIXME!!!
1017 static int TIConfigureBootDevice (struct usb_device *dev) 1030 static int TIConfigureBootDevice (struct usb_device *dev)
1018 { 1031 {
1019 return 0; 1032 return 0;
1020 } 1033 }
1021 1034
1022 /** 1035 /**
1023 * DownloadTIFirmware - Download run-time operating firmware to the TI5052 1036 * DownloadTIFirmware - Download run-time operating firmware to the TI5052
1024 * 1037 *
1025 * This routine downloads the main operating code into the TI5052, using the 1038 * This routine downloads the main operating code into the TI5052, using the
1026 * boot code already burned into E2PROM or ROM. 1039 * boot code already burned into E2PROM or ROM.
1027 */ 1040 */
1028 static int TIDownloadFirmware (struct edgeport_serial *serial) 1041 static int TIDownloadFirmware (struct edgeport_serial *serial)
1029 { 1042 {
1030 struct device *dev = &serial->serial->dev->dev; 1043 struct device *dev = &serial->serial->dev->dev;
1031 int status = 0; 1044 int status = 0;
1032 int start_address; 1045 int start_address;
1033 struct edge_ti_manuf_descriptor *ti_manuf_desc; 1046 struct edge_ti_manuf_descriptor *ti_manuf_desc;
1034 struct usb_interface_descriptor *interface; 1047 struct usb_interface_descriptor *interface;
1035 int download_cur_ver; 1048 int download_cur_ver;
1036 int download_new_ver; 1049 int download_new_ver;
1037 1050
1038 /* This routine is entered by both the BOOT mode and the Download mode 1051 /* This routine is entered by both the BOOT mode and the Download mode
1039 * We can determine which code is running by the reading the config 1052 * We can determine which code is running by the reading the config
1040 * descriptor and if we have only one bulk pipe it is in boot mode 1053 * descriptor and if we have only one bulk pipe it is in boot mode
1041 */ 1054 */
1042 serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP; 1055 serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP;
1043 1056
1044 /* Default to type 2 i2c */ 1057 /* Default to type 2 i2c */
1045 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 1058 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1046 1059
1047 status = TIChooseConfiguration (serial->serial->dev); 1060 status = TIChooseConfiguration (serial->serial->dev);
1048 if (status) 1061 if (status)
1049 return status; 1062 return status;
1050 1063
1051 interface = &serial->serial->interface->cur_altsetting->desc; 1064 interface = &serial->serial->interface->cur_altsetting->desc;
1052 if (!interface) { 1065 if (!interface) {
1053 dev_err (dev, "%s - no interface set, error!\n", __FUNCTION__); 1066 dev_err (dev, "%s - no interface set, error!\n", __FUNCTION__);
1054 return -ENODEV; 1067 return -ENODEV;
1055 } 1068 }
1056 1069
1057 // Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING 1070 // Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING
1058 // if we have more than one endpoint we are definitely in download mode 1071 // if we have more than one endpoint we are definitely in download mode
1059 if (interface->bNumEndpoints > 1) 1072 if (interface->bNumEndpoints > 1)
1060 serial->product_info.TiMode = TI_MODE_DOWNLOAD; 1073 serial->product_info.TiMode = TI_MODE_DOWNLOAD;
1061 else 1074 else
1062 // Otherwise we will remain in configuring mode 1075 // Otherwise we will remain in configuring mode
1063 serial->product_info.TiMode = TI_MODE_CONFIGURING; 1076 serial->product_info.TiMode = TI_MODE_CONFIGURING;
1064 1077
1065 // Save Download Version Number 1078 // Save Download Version Number
1066 OperationalCodeImageVersion.MajorVersion = PagableOperationalCodeImageVersion.MajorVersion; 1079 OperationalCodeImageVersion.MajorVersion = PagableOperationalCodeImageVersion.MajorVersion;
1067 OperationalCodeImageVersion.MinorVersion = PagableOperationalCodeImageVersion.MinorVersion; 1080 OperationalCodeImageVersion.MinorVersion = PagableOperationalCodeImageVersion.MinorVersion;
1068 OperationalCodeImageVersion.BuildNumber = PagableOperationalCodeImageVersion.BuildNumber; 1081 OperationalCodeImageVersion.BuildNumber = PagableOperationalCodeImageVersion.BuildNumber;
1069 1082
1070 /********************************************************************/ 1083 /********************************************************************/
1071 /* Download Mode */ 1084 /* Download Mode */
1072 /********************************************************************/ 1085 /********************************************************************/
1073 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { 1086 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
1074 struct ti_i2c_desc *rom_desc; 1087 struct ti_i2c_desc *rom_desc;
1075 1088
1076 dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN DOWNLOAD MODE>>>>>>>>>>", __FUNCTION__); 1089 dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN DOWNLOAD MODE>>>>>>>>>>", __FUNCTION__);
1077 1090
1078 status = TiValidateI2cImage (serial); 1091 status = TiValidateI2cImage (serial);
1079 if (status) { 1092 if (status) {
1080 dbg ("%s - <<<<<<<<<<<<<<<DOWNLOAD MODE -- BAD I2C >>>>>>>>>>", 1093 dbg ("%s - <<<<<<<<<<<<<<<DOWNLOAD MODE -- BAD I2C >>>>>>>>>>",
1081 __FUNCTION__); 1094 __FUNCTION__);
1082 return status; 1095 return status;
1083 } 1096 }
1084 1097
1085 /* Validate Hardware version number 1098 /* Validate Hardware version number
1086 * Read Manufacturing Descriptor from TI Based Edgeport 1099 * Read Manufacturing Descriptor from TI Based Edgeport
1087 */ 1100 */
1088 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); 1101 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL);
1089 if (!ti_manuf_desc) { 1102 if (!ti_manuf_desc) {
1090 dev_err (dev, "%s - out of memory.\n", __FUNCTION__); 1103 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1091 return -ENOMEM; 1104 return -ENOMEM;
1092 } 1105 }
1093 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); 1106 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc);
1094 if (status) { 1107 if (status) {
1095 kfree (ti_manuf_desc); 1108 kfree (ti_manuf_desc);
1096 return status; 1109 return status;
1097 } 1110 }
1098 1111
1099 // Check version number of ION descriptor 1112 // Check version number of ION descriptor
1100 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { 1113 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) {
1101 dbg ( "%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__, 1114 dbg ( "%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__,
1102 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); 1115 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev));
1103 kfree (ti_manuf_desc); 1116 kfree (ti_manuf_desc);
1104 return -EINVAL; 1117 return -EINVAL;
1105 } 1118 }
1106 1119
1107 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); 1120 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
1108 if (!rom_desc) { 1121 if (!rom_desc) {
1109 dev_err (dev, "%s - out of memory.\n", __FUNCTION__); 1122 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1110 kfree (ti_manuf_desc); 1123 kfree (ti_manuf_desc);
1111 return -ENOMEM; 1124 return -ENOMEM;
1112 } 1125 }
1113 1126
1114 // Search for type 2 record (firmware record) 1127 // Search for type 2 record (firmware record)
1115 if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc)) != 0) { 1128 if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc)) != 0) {
1116 struct ti_i2c_firmware_rec *firmware_version; 1129 struct ti_i2c_firmware_rec *firmware_version;
1117 __u8 record; 1130 __u8 record;
1118 1131
1119 dbg ("%s - Found Type FIRMWARE (Type 2) record", __FUNCTION__); 1132 dbg ("%s - Found Type FIRMWARE (Type 2) record", __FUNCTION__);
1120 1133
1121 firmware_version = kmalloc (sizeof (*firmware_version), GFP_KERNEL); 1134 firmware_version = kmalloc (sizeof (*firmware_version), GFP_KERNEL);
1122 if (!firmware_version) { 1135 if (!firmware_version) {
1123 dev_err (dev, "%s - out of memory.\n", __FUNCTION__); 1136 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1124 kfree (rom_desc); 1137 kfree (rom_desc);
1125 kfree (ti_manuf_desc); 1138 kfree (ti_manuf_desc);
1126 return -ENOMEM; 1139 return -ENOMEM;
1127 } 1140 }
1128 1141
1129 // Validate version number 1142 // Validate version number
1130 // Read the descriptor data 1143 // Read the descriptor data
1131 status = TIReadRom (serial, 1144 status = TIReadRom (serial,
1132 start_address+sizeof(struct ti_i2c_desc), 1145 start_address+sizeof(struct ti_i2c_desc),
1133 sizeof(struct ti_i2c_firmware_rec), 1146 sizeof(struct ti_i2c_firmware_rec),
1134 (__u8 *)firmware_version); 1147 (__u8 *)firmware_version);
1135 if (status) { 1148 if (status) {
1136 kfree (firmware_version); 1149 kfree (firmware_version);
1137 kfree (rom_desc); 1150 kfree (rom_desc);
1138 kfree (ti_manuf_desc); 1151 kfree (ti_manuf_desc);
1139 return status; 1152 return status;
1140 } 1153 }
1141 1154
1142 // Check version number of download with current version in I2c 1155 // Check version number of download with current version in I2c
1143 download_cur_ver = (firmware_version->Ver_Major << 8) + 1156 download_cur_ver = (firmware_version->Ver_Major << 8) +
1144 (firmware_version->Ver_Minor); 1157 (firmware_version->Ver_Minor);
1145 download_new_ver = (OperationalCodeImageVersion.MajorVersion << 8) + 1158 download_new_ver = (OperationalCodeImageVersion.MajorVersion << 8) +
1146 (OperationalCodeImageVersion.MinorVersion); 1159 (OperationalCodeImageVersion.MinorVersion);
1147 1160
1148 dbg ("%s - >>>Firmware Versions Device %d.%d Driver %d.%d", 1161 dbg ("%s - >>>Firmware Versions Device %d.%d Driver %d.%d",
1149 __FUNCTION__, 1162 __FUNCTION__,
1150 firmware_version->Ver_Major, 1163 firmware_version->Ver_Major,
1151 firmware_version->Ver_Minor, 1164 firmware_version->Ver_Minor,
1152 OperationalCodeImageVersion.MajorVersion, 1165 OperationalCodeImageVersion.MajorVersion,
1153 OperationalCodeImageVersion.MinorVersion); 1166 OperationalCodeImageVersion.MinorVersion);
1154 1167
1155 // Check if we have an old version in the I2C and update if necessary 1168 // Check if we have an old version in the I2C and update if necessary
1156 if (download_cur_ver != download_new_ver) { 1169 if (download_cur_ver != download_new_ver) {
1157 dbg ("%s - Update I2C Download from %d.%d to %d.%d", 1170 dbg ("%s - Update I2C Download from %d.%d to %d.%d",
1158 __FUNCTION__, 1171 __FUNCTION__,
1159 firmware_version->Ver_Major, 1172 firmware_version->Ver_Major,
1160 firmware_version->Ver_Minor, 1173 firmware_version->Ver_Minor,
1161 OperationalCodeImageVersion.MajorVersion, 1174 OperationalCodeImageVersion.MajorVersion,
1162 OperationalCodeImageVersion.MinorVersion); 1175 OperationalCodeImageVersion.MinorVersion);
1163 1176
1164 // In order to update the I2C firmware we must change the type 2 record to type 0xF2. 1177 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
1165 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver 1178 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
1166 // will download the latest firmware (padded to 15.5k) into the UMP ram. 1179 // will download the latest firmware (padded to 15.5k) into the UMP ram.
1167 // And finally when the device comes back up in download mode the driver will cause 1180 // And finally when the device comes back up in download mode the driver will cause
1168 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update 1181 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
1169 // the record type from 0xf2 to 0x02. 1182 // the record type from 0xf2 to 0x02.
1170 1183
1171 record = I2C_DESC_TYPE_FIRMWARE_BLANK; 1184 record = I2C_DESC_TYPE_FIRMWARE_BLANK;
1172 1185
1173 // Change the I2C Firmware record type to 0xf2 to trigger an update 1186 // Change the I2C Firmware record type to 0xf2 to trigger an update
1174 status = TIWriteRom (serial, 1187 status = TIWriteRom (serial,
1175 start_address, 1188 start_address,
1176 sizeof(record), 1189 sizeof(record),
1177 &record); 1190 &record);
1178 if (status) { 1191 if (status) {
1179 kfree (firmware_version); 1192 kfree (firmware_version);
1180 kfree (rom_desc); 1193 kfree (rom_desc);
1181 kfree (ti_manuf_desc); 1194 kfree (ti_manuf_desc);
1182 return status; 1195 return status;
1183 } 1196 }
1184 1197
1185 // verify the write -- must do this in order for write to 1198 // verify the write -- must do this in order for write to
1186 // complete before we do the hardware reset 1199 // complete before we do the hardware reset
1187 status = TIReadRom (serial, 1200 status = TIReadRom (serial,
1188 start_address, 1201 start_address,
1189 sizeof(record), 1202 sizeof(record),
1190 &record); 1203 &record);
1191 1204
1192 if (status) { 1205 if (status) {
1193 kfree (firmware_version); 1206 kfree (firmware_version);
1194 kfree (rom_desc); 1207 kfree (rom_desc);
1195 kfree (ti_manuf_desc); 1208 kfree (ti_manuf_desc);
1196 return status; 1209 return status;
1197 } 1210 }
1198 1211
1199 if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) { 1212 if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) {
1200 dev_err (dev, "%s - error resetting device\n", __FUNCTION__); 1213 dev_err (dev, "%s - error resetting device\n", __FUNCTION__);
1201 kfree (firmware_version); 1214 kfree (firmware_version);
1202 kfree (rom_desc); 1215 kfree (rom_desc);
1203 kfree (ti_manuf_desc); 1216 kfree (ti_manuf_desc);
1204 return -ENODEV; 1217 return -ENODEV;
1205 } 1218 }
1206 1219
1207 dbg ("%s - HARDWARE RESET", __FUNCTION__); 1220 dbg ("%s - HARDWARE RESET", __FUNCTION__);
1208 1221
1209 // Reset UMP -- Back to BOOT MODE 1222 // Reset UMP -- Back to BOOT MODE
1210 status = TISendVendorRequestSync (serial->serial->dev, 1223 status = TISendVendorRequestSync (serial->serial->dev,
1211 UMPC_HARDWARE_RESET, // Request 1224 UMPC_HARDWARE_RESET, // Request
1212 0, // wValue 1225 0, // wValue
1213 0, // wIndex 1226 0, // wIndex
1214 NULL, // TransferBuffer 1227 NULL, // TransferBuffer
1215 0); // TransferBufferLength 1228 0); // TransferBufferLength
1216 1229
1217 dbg ( "%s - HARDWARE RESET return %d", __FUNCTION__, status); 1230 dbg ( "%s - HARDWARE RESET return %d", __FUNCTION__, status);
1218 1231
1219 /* return an error on purpose. */ 1232 /* return an error on purpose. */
1220 kfree (firmware_version); 1233 kfree (firmware_version);
1221 kfree (rom_desc); 1234 kfree (rom_desc);
1222 kfree (ti_manuf_desc); 1235 kfree (ti_manuf_desc);
1223 return -ENODEV; 1236 return -ENODEV;
1224 } 1237 }
1225 kfree (firmware_version); 1238 kfree (firmware_version);
1226 } 1239 }
1227 // Search for type 0xF2 record (firmware blank record) 1240 // Search for type 0xF2 record (firmware blank record)
1228 else if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) { 1241 else if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) {
1229 #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + sizeof(struct ti_i2c_firmware_rec)) 1242 #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + sizeof(struct ti_i2c_firmware_rec))
1230 __u8 *header; 1243 __u8 *header;
1231 __u8 *vheader; 1244 __u8 *vheader;
1232 1245
1233 header = kmalloc (HEADER_SIZE, GFP_KERNEL); 1246 header = kmalloc (HEADER_SIZE, GFP_KERNEL);
1234 if (!header) { 1247 if (!header) {
1235 dev_err (dev, "%s - out of memory.\n", __FUNCTION__); 1248 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1236 kfree (rom_desc); 1249 kfree (rom_desc);
1237 kfree (ti_manuf_desc); 1250 kfree (ti_manuf_desc);
1238 return -ENOMEM; 1251 return -ENOMEM;
1239 } 1252 }
1240 1253
1241 vheader = kmalloc (HEADER_SIZE, GFP_KERNEL); 1254 vheader = kmalloc (HEADER_SIZE, GFP_KERNEL);
1242 if (!vheader) { 1255 if (!vheader) {
1243 dev_err (dev, "%s - out of memory.\n", __FUNCTION__); 1256 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1244 kfree (header); 1257 kfree (header);
1245 kfree (rom_desc); 1258 kfree (rom_desc);
1246 kfree (ti_manuf_desc); 1259 kfree (ti_manuf_desc);
1247 return -ENOMEM; 1260 return -ENOMEM;
1248 } 1261 }
1249 1262
1250 dbg ("%s - Found Type BLANK FIRMWARE (Type F2) record", __FUNCTION__); 1263 dbg ("%s - Found Type BLANK FIRMWARE (Type F2) record", __FUNCTION__);
1251 1264
1252 // In order to update the I2C firmware we must change the type 2 record to type 0xF2. 1265 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
1253 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver 1266 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
1254 // will download the latest firmware (padded to 15.5k) into the UMP ram. 1267 // will download the latest firmware (padded to 15.5k) into the UMP ram.
1255 // And finally when the device comes back up in download mode the driver will cause 1268 // And finally when the device comes back up in download mode the driver will cause
1256 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update 1269 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
1257 // the record type from 0xf2 to 0x02. 1270 // the record type from 0xf2 to 0x02.
1258 status = BuildI2CFirmwareHeader(header, dev); 1271 status = BuildI2CFirmwareHeader(header, dev);
1259 if (status) { 1272 if (status) {
1260 kfree (vheader); 1273 kfree (vheader);
1261 kfree (header); 1274 kfree (header);
1262 kfree (rom_desc); 1275 kfree (rom_desc);
1263 kfree (ti_manuf_desc); 1276 kfree (ti_manuf_desc);
1264 return status; 1277 return status;
1265 } 1278 }
1266 1279
1267 // Update I2C with type 0xf2 record with correct size and checksum 1280 // Update I2C with type 0xf2 record with correct size and checksum
1268 status = TIWriteRom (serial, 1281 status = TIWriteRom (serial,
1269 start_address, 1282 start_address,
1270 HEADER_SIZE, 1283 HEADER_SIZE,
1271 header); 1284 header);
1272 if (status) { 1285 if (status) {
1273 kfree (vheader); 1286 kfree (vheader);
1274 kfree (header); 1287 kfree (header);
1275 kfree (rom_desc); 1288 kfree (rom_desc);
1276 kfree (ti_manuf_desc); 1289 kfree (ti_manuf_desc);
1277 return status; 1290 return status;
1278 } 1291 }
1279 1292
1280 // verify the write -- must do this in order for write to 1293 // verify the write -- must do this in order for write to
1281 // complete before we do the hardware reset 1294 // complete before we do the hardware reset
1282 status = TIReadRom (serial, 1295 status = TIReadRom (serial,
1283 start_address, 1296 start_address,
1284 HEADER_SIZE, 1297 HEADER_SIZE,
1285 vheader); 1298 vheader);
1286 1299
1287 if (status) { 1300 if (status) {
1288 dbg ("%s - can't read header back", __FUNCTION__); 1301 dbg ("%s - can't read header back", __FUNCTION__);
1289 kfree (vheader); 1302 kfree (vheader);
1290 kfree (header); 1303 kfree (header);
1291 kfree (rom_desc); 1304 kfree (rom_desc);
1292 kfree (ti_manuf_desc); 1305 kfree (ti_manuf_desc);
1293 return status; 1306 return status;
1294 } 1307 }
1295 if (memcmp(vheader, header, HEADER_SIZE)) { 1308 if (memcmp(vheader, header, HEADER_SIZE)) {
1296 dbg ("%s - write download record failed", __FUNCTION__); 1309 dbg ("%s - write download record failed", __FUNCTION__);
1297 kfree (vheader); 1310 kfree (vheader);
1298 kfree (header); 1311 kfree (header);
1299 kfree (rom_desc); 1312 kfree (rom_desc);
1300 kfree (ti_manuf_desc); 1313 kfree (ti_manuf_desc);
1301 return status; 1314 return status;
1302 } 1315 }
1303 1316
1304 kfree (vheader); 1317 kfree (vheader);
1305 kfree (header); 1318 kfree (header);
1306 1319
1307 dbg ("%s - Start firmware update", __FUNCTION__); 1320 dbg ("%s - Start firmware update", __FUNCTION__);
1308 1321
1309 // Tell firmware to copy download image into I2C 1322 // Tell firmware to copy download image into I2C
1310 status = TISendVendorRequestSync (serial->serial->dev, 1323 status = TISendVendorRequestSync (serial->serial->dev,
1311 UMPC_COPY_DNLD_TO_I2C, // Request 1324 UMPC_COPY_DNLD_TO_I2C, // Request
1312 0, // wValue 1325 0, // wValue
1313 0, // wIndex 1326 0, // wIndex
1314 NULL, // TransferBuffer 1327 NULL, // TransferBuffer
1315 0); // TransferBufferLength 1328 0); // TransferBufferLength
1316 1329
1317 dbg ("%s - Update complete 0x%x", __FUNCTION__, status); 1330 dbg ("%s - Update complete 0x%x", __FUNCTION__, status);
1318 if (status) { 1331 if (status) {
1319 dev_err (dev, "%s - UMPC_COPY_DNLD_TO_I2C failed\n", __FUNCTION__); 1332 dev_err (dev, "%s - UMPC_COPY_DNLD_TO_I2C failed\n", __FUNCTION__);
1320 kfree (rom_desc); 1333 kfree (rom_desc);
1321 kfree (ti_manuf_desc); 1334 kfree (ti_manuf_desc);
1322 return status; 1335 return status;
1323 } 1336 }
1324 } 1337 }
1325 1338
1326 // The device is running the download code 1339 // The device is running the download code
1327 kfree (rom_desc); 1340 kfree (rom_desc);
1328 kfree (ti_manuf_desc); 1341 kfree (ti_manuf_desc);
1329 return 0; 1342 return 0;
1330 } 1343 }
1331 1344
1332 /********************************************************************/ 1345 /********************************************************************/
1333 /* Boot Mode */ 1346 /* Boot Mode */
1334 /********************************************************************/ 1347 /********************************************************************/
1335 dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN BOOT MODE>>>>>>>>>>>>>>>", 1348 dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN BOOT MODE>>>>>>>>>>>>>>>",
1336 __FUNCTION__); 1349 __FUNCTION__);
1337 1350
1338 // Configure the TI device so we can use the BULK pipes for download 1351 // Configure the TI device so we can use the BULK pipes for download
1339 status = TIConfigureBootDevice (serial->serial->dev); 1352 status = TIConfigureBootDevice (serial->serial->dev);
1340 if (status) 1353 if (status)
1341 return status; 1354 return status;
1342 1355
1343 if (le16_to_cpu(serial->serial->dev->descriptor.idVendor) != USB_VENDOR_ID_ION) { 1356 if (le16_to_cpu(serial->serial->dev->descriptor.idVendor) != USB_VENDOR_ID_ION) {
1344 dbg ("%s - VID = 0x%x", __FUNCTION__, 1357 dbg ("%s - VID = 0x%x", __FUNCTION__,
1345 le16_to_cpu(serial->serial->dev->descriptor.idVendor)); 1358 le16_to_cpu(serial->serial->dev->descriptor.idVendor));
1346 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 1359 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1347 goto StayInBootMode; 1360 goto StayInBootMode;
1348 } 1361 }
1349 1362
1350 // We have an ION device (I2c Must be programmed) 1363 // We have an ION device (I2c Must be programmed)
1351 // Determine I2C image type 1364 // Determine I2C image type
1352 if (TIGetI2cTypeInBootMode(serial)) { 1365 if (TIGetI2cTypeInBootMode(serial)) {
1353 goto StayInBootMode; 1366 goto StayInBootMode;
1354 } 1367 }
1355 1368
1356 // Registry variable set? 1369 // Registry variable set?
1357 if (TIStayInBootMode) { 1370 if (TIStayInBootMode) {
1358 dbg ("%s - TIStayInBootMode", __FUNCTION__); 1371 dbg ("%s - TIStayInBootMode", __FUNCTION__);
1359 goto StayInBootMode; 1372 goto StayInBootMode;
1360 } 1373 }
1361 1374
1362 // Check for ION Vendor ID and that the I2C is valid 1375 // Check for ION Vendor ID and that the I2C is valid
1363 if (!TiValidateI2cImage(serial)) { 1376 if (!TiValidateI2cImage(serial)) {
1364 struct ti_i2c_image_header *header; 1377 struct ti_i2c_image_header *header;
1365 int i; 1378 int i;
1366 __u8 cs = 0; 1379 __u8 cs = 0;
1367 __u8 *buffer; 1380 __u8 *buffer;
1368 int buffer_size; 1381 int buffer_size;
1369 1382
1370 /* Validate Hardware version number 1383 /* Validate Hardware version number
1371 * Read Manufacturing Descriptor from TI Based Edgeport 1384 * Read Manufacturing Descriptor from TI Based Edgeport
1372 */ 1385 */
1373 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); 1386 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL);
1374 if (!ti_manuf_desc) { 1387 if (!ti_manuf_desc) {
1375 dev_err (dev, "%s - out of memory.\n", __FUNCTION__); 1388 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1376 return -ENOMEM; 1389 return -ENOMEM;
1377 } 1390 }
1378 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); 1391 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc);
1379 if (status) { 1392 if (status) {
1380 kfree (ti_manuf_desc); 1393 kfree (ti_manuf_desc);
1381 goto StayInBootMode; 1394 goto StayInBootMode;
1382 } 1395 }
1383 1396
1384 // Check for version 2 1397 // Check for version 2
1385 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { 1398 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) {
1386 dbg ("%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__, 1399 dbg ("%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__,
1387 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); 1400 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev));
1388 kfree (ti_manuf_desc); 1401 kfree (ti_manuf_desc);
1389 goto StayInBootMode; 1402 goto StayInBootMode;
1390 } 1403 }
1391 1404
1392 kfree (ti_manuf_desc); 1405 kfree (ti_manuf_desc);
1393 1406
1394 // In order to update the I2C firmware we must change the type 2 record to type 0xF2. 1407 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
1395 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver 1408 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
1396 // will download the latest firmware (padded to 15.5k) into the UMP ram. 1409 // will download the latest firmware (padded to 15.5k) into the UMP ram.
1397 // And finally when the device comes back up in download mode the driver will cause 1410 // And finally when the device comes back up in download mode the driver will cause
1398 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update 1411 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
1399 // the record type from 0xf2 to 0x02. 1412 // the record type from 0xf2 to 0x02.
1400 1413
1401 /* 1414 /*
1402 * Do we really have to copy the whole firmware image, 1415 * Do we really have to copy the whole firmware image,
1403 * or could we do this in place! 1416 * or could we do this in place!
1404 */ 1417 */
1405 1418
1406 // Allocate a 15.5k buffer + 3 byte header 1419 // Allocate a 15.5k buffer + 3 byte header
1407 buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header)); 1420 buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header));
1408 buffer = kmalloc (buffer_size, GFP_KERNEL); 1421 buffer = kmalloc (buffer_size, GFP_KERNEL);
1409 if (!buffer) { 1422 if (!buffer) {
1410 dev_err (dev, "%s - out of memory\n", __FUNCTION__); 1423 dev_err (dev, "%s - out of memory\n", __FUNCTION__);
1411 return -ENOMEM; 1424 return -ENOMEM;
1412 } 1425 }
1413 1426
1414 // Initialize the buffer to 0xff (pad the buffer) 1427 // Initialize the buffer to 0xff (pad the buffer)
1415 memset (buffer, 0xff, buffer_size); 1428 memset (buffer, 0xff, buffer_size);
1416 1429
1417 memcpy (buffer, &PagableOperationalCodeImage[0], PagableOperationalCodeSize); 1430 memcpy (buffer, &PagableOperationalCodeImage[0], PagableOperationalCodeSize);
1418 1431
1419 for(i = sizeof(struct ti_i2c_image_header); i < buffer_size; i++) { 1432 for(i = sizeof(struct ti_i2c_image_header); i < buffer_size; i++) {
1420 cs = (__u8)(cs + buffer[i]); 1433 cs = (__u8)(cs + buffer[i]);
1421 } 1434 }
1422 1435
1423 header = (struct ti_i2c_image_header *)buffer; 1436 header = (struct ti_i2c_image_header *)buffer;
1424 1437
1425 // update length and checksum after padding 1438 // update length and checksum after padding
1426 header->Length = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_i2c_image_header))); 1439 header->Length = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_i2c_image_header)));
1427 header->CheckSum = cs; 1440 header->CheckSum = cs;
1428 1441
1429 // Download the operational code 1442 // Download the operational code
1430 dbg ("%s - Downloading operational code image (TI UMP)", __FUNCTION__); 1443 dbg ("%s - Downloading operational code image (TI UMP)", __FUNCTION__);
1431 status = TIDownloadCodeImage (serial, buffer, buffer_size); 1444 status = TIDownloadCodeImage (serial, buffer, buffer_size);
1432 1445
1433 kfree (buffer); 1446 kfree (buffer);
1434 1447
1435 if (status) { 1448 if (status) {
1436 dbg ("%s - Error downloading operational code image", __FUNCTION__); 1449 dbg ("%s - Error downloading operational code image", __FUNCTION__);
1437 return status; 1450 return status;
1438 } 1451 }
1439 1452
1440 // Device will reboot 1453 // Device will reboot
1441 serial->product_info.TiMode = TI_MODE_TRANSITIONING; 1454 serial->product_info.TiMode = TI_MODE_TRANSITIONING;
1442 1455
1443 dbg ("%s - Download successful -- Device rebooting...", __FUNCTION__); 1456 dbg ("%s - Download successful -- Device rebooting...", __FUNCTION__);
1444 1457
1445 /* return an error on purpose */ 1458 /* return an error on purpose */
1446 return -ENODEV; 1459 return -ENODEV;
1447 } 1460 }
1448 1461
1449 StayInBootMode: 1462 StayInBootMode:
1450 // Eprom is invalid or blank stay in boot mode 1463 // Eprom is invalid or blank stay in boot mode
1451 dbg ("%s - <<<<<<<<<<<<<<<STAYING IN BOOT MODE>>>>>>>>>>>>", __FUNCTION__); 1464 dbg ("%s - <<<<<<<<<<<<<<<STAYING IN BOOT MODE>>>>>>>>>>>>", __FUNCTION__);
1452 serial->product_info.TiMode = TI_MODE_BOOT; 1465 serial->product_info.TiMode = TI_MODE_BOOT;
1453 1466
1454 return 0; 1467 return 0;
1455 } 1468 }
1456 1469
1457 1470
1458 static int TISetDtr (struct edgeport_port *port) 1471 static int TISetDtr (struct edgeport_port *port)
1459 { 1472 {
1460 int port_number = port->port->number - port->port->serial->minor; 1473 int port_number = port->port->number - port->port->serial->minor;
1461 1474
1462 dbg ("%s", __FUNCTION__); 1475 dbg ("%s", __FUNCTION__);
1463 port->shadow_mcr |= MCR_DTR; 1476 port->shadow_mcr |= MCR_DTR;
1464 1477
1465 return TIWriteCommandSync (port->port->serial->dev, 1478 return TIWriteCommandSync (port->port->serial->dev,
1466 UMPC_SET_CLR_DTR, 1479 UMPC_SET_CLR_DTR,
1467 (__u8)(UMPM_UART1_PORT + port_number), 1480 (__u8)(UMPM_UART1_PORT + port_number),
1468 1, /* set */ 1481 1, /* set */
1469 NULL, 1482 NULL,
1470 0); 1483 0);
1471 } 1484 }
1472 1485
1473 static int TIClearDtr (struct edgeport_port *port) 1486 static int TIClearDtr (struct edgeport_port *port)
1474 { 1487 {
1475 int port_number = port->port->number - port->port->serial->minor; 1488 int port_number = port->port->number - port->port->serial->minor;
1476 1489
1477 dbg ("%s", __FUNCTION__); 1490 dbg ("%s", __FUNCTION__);
1478 port->shadow_mcr &= ~MCR_DTR; 1491 port->shadow_mcr &= ~MCR_DTR;
1479 1492
1480 return TIWriteCommandSync (port->port->serial->dev, 1493 return TIWriteCommandSync (port->port->serial->dev,
1481 UMPC_SET_CLR_DTR, 1494 UMPC_SET_CLR_DTR,
1482 (__u8)(UMPM_UART1_PORT + port_number), 1495 (__u8)(UMPM_UART1_PORT + port_number),
1483 0, /* clear */ 1496 0, /* clear */
1484 NULL, 1497 NULL,
1485 0); 1498 0);
1486 } 1499 }
1487 1500
1488 static int TISetRts (struct edgeport_port *port) 1501 static int TISetRts (struct edgeport_port *port)
1489 { 1502 {
1490 int port_number = port->port->number - port->port->serial->minor; 1503 int port_number = port->port->number - port->port->serial->minor;
1491 1504
1492 dbg ("%s", __FUNCTION__); 1505 dbg ("%s", __FUNCTION__);
1493 port->shadow_mcr |= MCR_RTS; 1506 port->shadow_mcr |= MCR_RTS;
1494 1507
1495 return TIWriteCommandSync (port->port->serial->dev, 1508 return TIWriteCommandSync (port->port->serial->dev,
1496 UMPC_SET_CLR_RTS, 1509 UMPC_SET_CLR_RTS,
1497 (__u8)(UMPM_UART1_PORT + port_number), 1510 (__u8)(UMPM_UART1_PORT + port_number),
1498 1, /* set */ 1511 1, /* set */
1499 NULL, 1512 NULL,
1500 0); 1513 0);
1501 } 1514 }
1502 1515
1503 static int TIClearRts (struct edgeport_port *port) 1516 static int TIClearRts (struct edgeport_port *port)
1504 { 1517 {
1505 int port_number = port->port->number - port->port->serial->minor; 1518 int port_number = port->port->number - port->port->serial->minor;
1506 1519
1507 dbg ("%s", __FUNCTION__); 1520 dbg ("%s", __FUNCTION__);
1508 port->shadow_mcr &= ~MCR_RTS; 1521 port->shadow_mcr &= ~MCR_RTS;
1509 1522
1510 return TIWriteCommandSync (port->port->serial->dev, 1523 return TIWriteCommandSync (port->port->serial->dev,
1511 UMPC_SET_CLR_RTS, 1524 UMPC_SET_CLR_RTS,
1512 (__u8)(UMPM_UART1_PORT + port_number), 1525 (__u8)(UMPM_UART1_PORT + port_number),
1513 0, /* clear */ 1526 0, /* clear */
1514 NULL, 1527 NULL,
1515 0); 1528 0);
1516 } 1529 }
1517 1530
1518 static int TISetLoopBack (struct edgeport_port *port) 1531 static int TISetLoopBack (struct edgeport_port *port)
1519 { 1532 {
1520 int port_number = port->port->number - port->port->serial->minor; 1533 int port_number = port->port->number - port->port->serial->minor;
1521 1534
1522 dbg ("%s", __FUNCTION__); 1535 dbg ("%s", __FUNCTION__);
1523 1536
1524 return TIWriteCommandSync (port->port->serial->dev, 1537 return TIWriteCommandSync (port->port->serial->dev,
1525 UMPC_SET_CLR_LOOPBACK, 1538 UMPC_SET_CLR_LOOPBACK,
1526 (__u8)(UMPM_UART1_PORT + port_number), 1539 (__u8)(UMPM_UART1_PORT + port_number),
1527 1, /* set */ 1540 1, /* set */
1528 NULL, 1541 NULL,
1529 0); 1542 0);
1530 } 1543 }
1531 1544
1532 static int TIClearLoopBack (struct edgeport_port *port) 1545 static int TIClearLoopBack (struct edgeport_port *port)
1533 { 1546 {
1534 int port_number = port->port->number - port->port->serial->minor; 1547 int port_number = port->port->number - port->port->serial->minor;
1535 1548
1536 dbg ("%s", __FUNCTION__); 1549 dbg ("%s", __FUNCTION__);
1537 1550
1538 return TIWriteCommandSync (port->port->serial->dev, 1551 return TIWriteCommandSync (port->port->serial->dev,
1539 UMPC_SET_CLR_LOOPBACK, 1552 UMPC_SET_CLR_LOOPBACK,
1540 (__u8)(UMPM_UART1_PORT + port_number), 1553 (__u8)(UMPM_UART1_PORT + port_number),
1541 0, /* clear */ 1554 0, /* clear */
1542 NULL, 1555 NULL,
1543 0); 1556 0);
1544 } 1557 }
1545 1558
1546 static int TISetBreak (struct edgeport_port *port) 1559 static int TISetBreak (struct edgeport_port *port)
1547 { 1560 {
1548 int port_number = port->port->number - port->port->serial->minor; 1561 int port_number = port->port->number - port->port->serial->minor;
1549 1562
1550 dbg ("%s", __FUNCTION__); 1563 dbg ("%s", __FUNCTION__);
1551 1564
1552 return TIWriteCommandSync (port->port->serial->dev, 1565 return TIWriteCommandSync (port->port->serial->dev,
1553 UMPC_SET_CLR_BREAK, 1566 UMPC_SET_CLR_BREAK,
1554 (__u8)(UMPM_UART1_PORT + port_number), 1567 (__u8)(UMPM_UART1_PORT + port_number),
1555 1, /* set */ 1568 1, /* set */
1556 NULL, 1569 NULL,
1557 0); 1570 0);
1558 } 1571 }
1559 1572
1560 static int TIClearBreak (struct edgeport_port *port) 1573 static int TIClearBreak (struct edgeport_port *port)
1561 { 1574 {
1562 int port_number = port->port->number - port->port->serial->minor; 1575 int port_number = port->port->number - port->port->serial->minor;
1563 1576
1564 dbg ("%s", __FUNCTION__); 1577 dbg ("%s", __FUNCTION__);
1565 1578
1566 return TIWriteCommandSync (port->port->serial->dev, 1579 return TIWriteCommandSync (port->port->serial->dev,
1567 UMPC_SET_CLR_BREAK, 1580 UMPC_SET_CLR_BREAK,
1568 (__u8)(UMPM_UART1_PORT + port_number), 1581 (__u8)(UMPM_UART1_PORT + port_number),
1569 0, /* clear */ 1582 0, /* clear */
1570 NULL, 1583 NULL,
1571 0); 1584 0);
1572 } 1585 }
1573 1586
1574 static int TIRestoreMCR (struct edgeport_port *port, __u8 mcr) 1587 static int TIRestoreMCR (struct edgeport_port *port, __u8 mcr)
1575 { 1588 {
1576 int status = 0; 1589 int status = 0;
1577 1590
1578 dbg ("%s - %x", __FUNCTION__, mcr); 1591 dbg ("%s - %x", __FUNCTION__, mcr);
1579 1592
1580 if (mcr & MCR_DTR) 1593 if (mcr & MCR_DTR)
1581 status = TISetDtr (port); 1594 status = TISetDtr (port);
1582 else 1595 else
1583 status = TIClearDtr (port); 1596 status = TIClearDtr (port);
1584 1597
1585 if (status) 1598 if (status)
1586 return status; 1599 return status;
1587 1600
1588 if (mcr & MCR_RTS) 1601 if (mcr & MCR_RTS)
1589 status = TISetRts (port); 1602 status = TISetRts (port);
1590 else 1603 else
1591 status = TIClearRts (port); 1604 status = TIClearRts (port);
1592 1605
1593 if (status) 1606 if (status)
1594 return status; 1607 return status;
1595 1608
1596 if (mcr & MCR_LOOPBACK) 1609 if (mcr & MCR_LOOPBACK)
1597 status = TISetLoopBack (port); 1610 status = TISetLoopBack (port);
1598 else 1611 else
1599 status = TIClearLoopBack (port); 1612 status = TIClearLoopBack (port);
1600 1613
1601 return status; 1614 return status;
1602 } 1615 }
1603 1616
1604 1617
1605 1618
1606 /* Convert TI LSR to standard UART flags */ 1619 /* Convert TI LSR to standard UART flags */
1607 static __u8 MapLineStatus (__u8 ti_lsr) 1620 static __u8 MapLineStatus (__u8 ti_lsr)
1608 { 1621 {
1609 __u8 lsr = 0; 1622 __u8 lsr = 0;
1610 1623
1611 #define MAP_FLAG(flagUmp, flagUart) \ 1624 #define MAP_FLAG(flagUmp, flagUart) \
1612 if (ti_lsr & flagUmp) \ 1625 if (ti_lsr & flagUmp) \
1613 lsr |= flagUart; 1626 lsr |= flagUart;
1614 1627
1615 MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR) /* overrun */ 1628 MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR) /* overrun */
1616 MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */ 1629 MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */
1617 MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */ 1630 MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */
1618 MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */ 1631 MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */
1619 MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* receive data available */ 1632 MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* receive data available */
1620 MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* transmit holding register empty */ 1633 MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* transmit holding register empty */
1621 1634
1622 #undef MAP_FLAG 1635 #undef MAP_FLAG
1623 1636
1624 return lsr; 1637 return lsr;
1625 } 1638 }
1626 1639
1627 static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr) 1640 static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr)
1628 { 1641 {
1629 struct async_icount *icount; 1642 struct async_icount *icount;
1630 struct tty_struct *tty; 1643 struct tty_struct *tty;
1631 1644
1632 dbg ("%s - %02x", __FUNCTION__, msr); 1645 dbg ("%s - %02x", __FUNCTION__, msr);
1633 1646
1634 if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) { 1647 if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) {
1635 icount = &edge_port->icount; 1648 icount = &edge_port->icount;
1636 1649
1637 /* update input line counters */ 1650 /* update input line counters */
1638 if (msr & EDGEPORT_MSR_DELTA_CTS) 1651 if (msr & EDGEPORT_MSR_DELTA_CTS)
1639 icount->cts++; 1652 icount->cts++;
1640 if (msr & EDGEPORT_MSR_DELTA_DSR) 1653 if (msr & EDGEPORT_MSR_DELTA_DSR)
1641 icount->dsr++; 1654 icount->dsr++;
1642 if (msr & EDGEPORT_MSR_DELTA_CD) 1655 if (msr & EDGEPORT_MSR_DELTA_CD)
1643 icount->dcd++; 1656 icount->dcd++;
1644 if (msr & EDGEPORT_MSR_DELTA_RI) 1657 if (msr & EDGEPORT_MSR_DELTA_RI)
1645 icount->rng++; 1658 icount->rng++;
1646 wake_up_interruptible (&edge_port->delta_msr_wait); 1659 wake_up_interruptible (&edge_port->delta_msr_wait);
1647 } 1660 }
1648 1661
1649 /* Save the new modem status */ 1662 /* Save the new modem status */
1650 edge_port->shadow_msr = msr & 0xf0; 1663 edge_port->shadow_msr = msr & 0xf0;
1651 1664
1652 tty = edge_port->port->tty; 1665 tty = edge_port->port->tty;
1653 /* handle CTS flow control */ 1666 /* handle CTS flow control */
1654 if (tty && C_CRTSCTS(tty)) { 1667 if (tty && C_CRTSCTS(tty)) {
1655 if (msr & EDGEPORT_MSR_CTS) { 1668 if (msr & EDGEPORT_MSR_CTS) {
1656 tty->hw_stopped = 0; 1669 tty->hw_stopped = 0;
1657 tty_wakeup(tty); 1670 tty_wakeup(tty);
1658 } else { 1671 } else {
1659 tty->hw_stopped = 1; 1672 tty->hw_stopped = 1;
1660 } 1673 }
1661 } 1674 }
1662 1675
1663 return; 1676 return;
1664 } 1677 }
1665 1678
1666 static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8 lsr, __u8 data) 1679 static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8 lsr, __u8 data)
1667 { 1680 {
1668 struct async_icount *icount; 1681 struct async_icount *icount;
1669 __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK)); 1682 __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK));
1670 1683
1671 dbg ("%s - %02x", __FUNCTION__, new_lsr); 1684 dbg ("%s - %02x", __FUNCTION__, new_lsr);
1672 1685
1673 edge_port->shadow_lsr = lsr; 1686 edge_port->shadow_lsr = lsr;
1674 1687
1675 if (new_lsr & LSR_BREAK) { 1688 if (new_lsr & LSR_BREAK) {
1676 /* 1689 /*
1677 * Parity and Framing errors only count if they 1690 * Parity and Framing errors only count if they
1678 * occur exclusive of a break being received. 1691 * occur exclusive of a break being received.
1679 */ 1692 */
1680 new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); 1693 new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
1681 } 1694 }
1682 1695
1683 /* Place LSR data byte into Rx buffer */ 1696 /* Place LSR data byte into Rx buffer */
1684 if (lsr_data && edge_port->port->tty) 1697 if (lsr_data && edge_port->port->tty)
1685 edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1); 1698 edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1);
1686 1699
1687 /* update input line counters */ 1700 /* update input line counters */
1688 icount = &edge_port->icount; 1701 icount = &edge_port->icount;
1689 if (new_lsr & LSR_BREAK) 1702 if (new_lsr & LSR_BREAK)
1690 icount->brk++; 1703 icount->brk++;
1691 if (new_lsr & LSR_OVER_ERR) 1704 if (new_lsr & LSR_OVER_ERR)
1692 icount->overrun++; 1705 icount->overrun++;
1693 if (new_lsr & LSR_PAR_ERR) 1706 if (new_lsr & LSR_PAR_ERR)
1694 icount->parity++; 1707 icount->parity++;
1695 if (new_lsr & LSR_FRM_ERR) 1708 if (new_lsr & LSR_FRM_ERR)
1696 icount->frame++; 1709 icount->frame++;
1697 } 1710 }
1698 1711
1699 1712
1700 static void edge_interrupt_callback (struct urb *urb) 1713 static void edge_interrupt_callback (struct urb *urb)
1701 { 1714 {
1702 struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context; 1715 struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context;
1703 struct usb_serial_port *port; 1716 struct usb_serial_port *port;
1704 struct edgeport_port *edge_port; 1717 struct edgeport_port *edge_port;
1705 unsigned char *data = urb->transfer_buffer; 1718 unsigned char *data = urb->transfer_buffer;
1706 int length = urb->actual_length; 1719 int length = urb->actual_length;
1707 int port_number; 1720 int port_number;
1708 int function; 1721 int function;
1709 int status; 1722 int status;
1710 __u8 lsr; 1723 __u8 lsr;
1711 __u8 msr; 1724 __u8 msr;
1712 1725
1713 dbg("%s", __FUNCTION__); 1726 dbg("%s", __FUNCTION__);
1714 1727
1715 switch (urb->status) { 1728 switch (urb->status) {
1716 case 0: 1729 case 0:
1717 /* success */ 1730 /* success */
1718 break; 1731 break;
1719 case -ECONNRESET: 1732 case -ECONNRESET:
1720 case -ENOENT: 1733 case -ENOENT:
1721 case -ESHUTDOWN: 1734 case -ESHUTDOWN:
1722 /* this urb is terminated, clean up */ 1735 /* this urb is terminated, clean up */
1723 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); 1736 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
1724 return; 1737 return;
1725 default: 1738 default:
1726 dev_err(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __FUNCTION__, urb->status); 1739 dev_err(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __FUNCTION__, urb->status);
1727 goto exit; 1740 goto exit;
1728 } 1741 }
1729 1742
1730 if (!length) { 1743 if (!length) {
1731 dbg ("%s - no data in urb", __FUNCTION__); 1744 dbg ("%s - no data in urb", __FUNCTION__);
1732 goto exit; 1745 goto exit;
1733 } 1746 }
1734 1747
1735 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __FUNCTION__, length, data); 1748 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __FUNCTION__, length, data);
1736 1749
1737 if (length != 2) { 1750 if (length != 2) {
1738 dbg ("%s - expecting packet of size 2, got %d", __FUNCTION__, length); 1751 dbg ("%s - expecting packet of size 2, got %d", __FUNCTION__, length);
1739 goto exit; 1752 goto exit;
1740 } 1753 }
1741 1754
1742 port_number = TIUMP_GET_PORT_FROM_CODE (data[0]); 1755 port_number = TIUMP_GET_PORT_FROM_CODE (data[0]);
1743 function = TIUMP_GET_FUNC_FROM_CODE (data[0]); 1756 function = TIUMP_GET_FUNC_FROM_CODE (data[0]);
1744 dbg ("%s - port_number %d, function %d, info 0x%x", 1757 dbg ("%s - port_number %d, function %d, info 0x%x",
1745 __FUNCTION__, port_number, function, data[1]); 1758 __FUNCTION__, port_number, function, data[1]);
1746 port = edge_serial->serial->port[port_number]; 1759 port = edge_serial->serial->port[port_number];
1747 edge_port = usb_get_serial_port_data(port); 1760 edge_port = usb_get_serial_port_data(port);
1748 if (!edge_port) { 1761 if (!edge_port) {
1749 dbg ("%s - edge_port not found", __FUNCTION__); 1762 dbg ("%s - edge_port not found", __FUNCTION__);
1750 return; 1763 return;
1751 } 1764 }
1752 switch (function) { 1765 switch (function) {
1753 case TIUMP_INTERRUPT_CODE_LSR: 1766 case TIUMP_INTERRUPT_CODE_LSR:
1754 lsr = MapLineStatus(data[1]); 1767 lsr = MapLineStatus(data[1]);
1755 if (lsr & UMP_UART_LSR_DATA_MASK) { 1768 if (lsr & UMP_UART_LSR_DATA_MASK) {
1756 /* Save the LSR event for bulk read completion routine */ 1769 /* Save the LSR event for bulk read completion routine */
1757 dbg ("%s - LSR Event Port %u LSR Status = %02x", 1770 dbg ("%s - LSR Event Port %u LSR Status = %02x",
1758 __FUNCTION__, port_number, lsr); 1771 __FUNCTION__, port_number, lsr);
1759 edge_port->lsr_event = 1; 1772 edge_port->lsr_event = 1;
1760 edge_port->lsr_mask = lsr; 1773 edge_port->lsr_mask = lsr;
1761 } else { 1774 } else {
1762 dbg ("%s - ===== Port %d LSR Status = %02x ======", 1775 dbg ("%s - ===== Port %d LSR Status = %02x ======",
1763 __FUNCTION__, port_number, lsr); 1776 __FUNCTION__, port_number, lsr);
1764 handle_new_lsr (edge_port, 0, lsr, 0); 1777 handle_new_lsr (edge_port, 0, lsr, 0);
1765 } 1778 }
1766 break; 1779 break;
1767 1780
1768 case TIUMP_INTERRUPT_CODE_MSR: // MSR 1781 case TIUMP_INTERRUPT_CODE_MSR: // MSR
1769 /* Copy MSR from UMP */ 1782 /* Copy MSR from UMP */
1770 msr = data[1]; 1783 msr = data[1];
1771 dbg ("%s - ===== Port %u MSR Status = %02x ======\n", 1784 dbg ("%s - ===== Port %u MSR Status = %02x ======\n",
1772 __FUNCTION__, port_number, msr); 1785 __FUNCTION__, port_number, msr);
1773 handle_new_msr (edge_port, msr); 1786 handle_new_msr (edge_port, msr);
1774 break; 1787 break;
1775 1788
1776 default: 1789 default:
1777 dev_err (&urb->dev->dev, "%s - Unknown Interrupt code from UMP %x\n", 1790 dev_err (&urb->dev->dev, "%s - Unknown Interrupt code from UMP %x\n",
1778 __FUNCTION__, data[1]); 1791 __FUNCTION__, data[1]);
1779 break; 1792 break;
1780 1793
1781 } 1794 }
1782 1795
1783 exit: 1796 exit:
1784 status = usb_submit_urb (urb, GFP_ATOMIC); 1797 status = usb_submit_urb (urb, GFP_ATOMIC);
1785 if (status) 1798 if (status)
1786 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", 1799 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n",
1787 __FUNCTION__, status); 1800 __FUNCTION__, status);
1788 } 1801 }
1789 1802
1790 static void edge_bulk_in_callback (struct urb *urb) 1803 static void edge_bulk_in_callback (struct urb *urb)
1791 { 1804 {
1792 struct edgeport_port *edge_port = (struct edgeport_port *)urb->context; 1805 struct edgeport_port *edge_port = (struct edgeport_port *)urb->context;
1793 unsigned char *data = urb->transfer_buffer; 1806 unsigned char *data = urb->transfer_buffer;
1794 struct tty_struct *tty; 1807 struct tty_struct *tty;
1795 int status = 0; 1808 int status = 0;
1796 int port_number; 1809 int port_number;
1797 1810
1798 dbg("%s", __FUNCTION__); 1811 dbg("%s", __FUNCTION__);
1799 1812
1800 switch (urb->status) { 1813 switch (urb->status) {
1801 case 0: 1814 case 0:
1802 /* success */ 1815 /* success */
1803 break; 1816 break;
1804 case -ECONNRESET: 1817 case -ECONNRESET:
1805 case -ENOENT: 1818 case -ENOENT:
1806 case -ESHUTDOWN: 1819 case -ESHUTDOWN:
1807 /* this urb is terminated, clean up */ 1820 /* this urb is terminated, clean up */
1808 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); 1821 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
1809 return; 1822 return;
1810 default: 1823 default:
1811 dev_err (&urb->dev->dev,"%s - nonzero read bulk status received: %d\n", 1824 dev_err (&urb->dev->dev,"%s - nonzero read bulk status received: %d\n",
1812 __FUNCTION__, urb->status ); 1825 __FUNCTION__, urb->status );
1813 } 1826 }
1814 1827
1815 if (urb->status == -EPIPE) 1828 if (urb->status == -EPIPE)
1816 goto exit; 1829 goto exit;
1817 1830
1818 if (urb->status) { 1831 if (urb->status) {
1819 dev_err(&urb->dev->dev,"%s - stopping read!\n", __FUNCTION__); 1832 dev_err(&urb->dev->dev,"%s - stopping read!\n", __FUNCTION__);
1820 return; 1833 return;
1821 } 1834 }
1822 1835
1823 port_number = edge_port->port->number - edge_port->port->serial->minor; 1836 port_number = edge_port->port->number - edge_port->port->serial->minor;
1824 1837
1825 if (edge_port->lsr_event) { 1838 if (edge_port->lsr_event) {
1826 edge_port->lsr_event = 0; 1839 edge_port->lsr_event = 0;
1827 dbg ("%s ===== Port %u LSR Status = %02x, Data = %02x ======", 1840 dbg ("%s ===== Port %u LSR Status = %02x, Data = %02x ======",
1828 __FUNCTION__, port_number, edge_port->lsr_mask, *data); 1841 __FUNCTION__, port_number, edge_port->lsr_mask, *data);
1829 handle_new_lsr (edge_port, 1, edge_port->lsr_mask, *data); 1842 handle_new_lsr (edge_port, 1, edge_port->lsr_mask, *data);
1830 /* Adjust buffer length/pointer */ 1843 /* Adjust buffer length/pointer */
1831 --urb->actual_length; 1844 --urb->actual_length;
1832 ++data; 1845 ++data;
1833 } 1846 }
1834 1847
1835 tty = edge_port->port->tty; 1848 tty = edge_port->port->tty;
1836 if (tty && urb->actual_length) { 1849 if (tty && urb->actual_length) {
1837 usb_serial_debug_data(debug, &edge_port->port->dev, __FUNCTION__, urb->actual_length, data); 1850 usb_serial_debug_data(debug, &edge_port->port->dev, __FUNCTION__, urb->actual_length, data);
1838 1851
1839 if (edge_port->close_pending) { 1852 if (edge_port->close_pending) {
1840 dbg ("%s - close is pending, dropping data on the floor.", __FUNCTION__); 1853 dbg ("%s - close is pending, dropping data on the floor.", __FUNCTION__);
1841 } else { 1854 } else {
1842 edge_tty_recv(&edge_port->port->dev, tty, data, urb->actual_length); 1855 edge_tty_recv(&edge_port->port->dev, tty, data, urb->actual_length);
1843 } 1856 }
1844 edge_port->icount.rx += urb->actual_length; 1857 edge_port->icount.rx += urb->actual_length;
1845 } 1858 }
1846 1859
1847 exit: 1860 exit:
1848 /* continue read unless stopped */ 1861 /* continue read unless stopped */
1849 spin_lock(&edge_port->ep_lock); 1862 spin_lock(&edge_port->ep_lock);
1850 if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) { 1863 if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) {
1851 urb->dev = edge_port->port->serial->dev; 1864 urb->dev = edge_port->port->serial->dev;
1852 status = usb_submit_urb(urb, GFP_ATOMIC); 1865 status = usb_submit_urb(urb, GFP_ATOMIC);
1853 } else if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPING) { 1866 } else if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPING) {
1854 edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPED; 1867 edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPED;
1855 } 1868 }
1856 spin_unlock(&edge_port->ep_lock); 1869 spin_unlock(&edge_port->ep_lock);
1857 if (status) 1870 if (status)
1858 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", 1871 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n",
1859 __FUNCTION__, status); 1872 __FUNCTION__, status);
1860 } 1873 }
1861 1874
1862 static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length) 1875 static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length)
1863 { 1876 {
1864 int cnt; 1877 int cnt;
1865 1878
1866 do { 1879 do {
1867 cnt = tty_buffer_request_room(tty, length); 1880 cnt = tty_buffer_request_room(tty, length);
1868 if (cnt < length) { 1881 if (cnt < length) {
1869 dev_err(dev, "%s - dropping data, %d bytes lost\n", 1882 dev_err(dev, "%s - dropping data, %d bytes lost\n",
1870 __FUNCTION__, length - cnt); 1883 __FUNCTION__, length - cnt);
1871 if(cnt == 0) 1884 if(cnt == 0)
1872 break; 1885 break;
1873 } 1886 }
1874 tty_insert_flip_string(tty, data, cnt); 1887 tty_insert_flip_string(tty, data, cnt);
1875 data += cnt; 1888 data += cnt;
1876 length -= cnt; 1889 length -= cnt;
1877 } while (length > 0); 1890 } while (length > 0);
1878 1891
1879 tty_flip_buffer_push(tty); 1892 tty_flip_buffer_push(tty);
1880 } 1893 }
1881 1894
1882 static void edge_bulk_out_callback (struct urb *urb) 1895 static void edge_bulk_out_callback (struct urb *urb)
1883 { 1896 {
1884 struct usb_serial_port *port = (struct usb_serial_port *)urb->context; 1897 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1885 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1898 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1886 1899
1887 dbg ("%s - port %d", __FUNCTION__, port->number); 1900 dbg ("%s - port %d", __FUNCTION__, port->number);
1888 1901
1889 edge_port->ep_write_urb_in_use = 0; 1902 edge_port->ep_write_urb_in_use = 0;
1890 1903
1891 switch (urb->status) { 1904 switch (urb->status) {
1892 case 0: 1905 case 0:
1893 /* success */ 1906 /* success */
1894 break; 1907 break;
1895 case -ECONNRESET: 1908 case -ECONNRESET:
1896 case -ENOENT: 1909 case -ENOENT:
1897 case -ESHUTDOWN: 1910 case -ESHUTDOWN:
1898 /* this urb is terminated, clean up */ 1911 /* this urb is terminated, clean up */
1899 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); 1912 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
1900 return; 1913 return;
1901 default: 1914 default:
1902 dev_err (&urb->dev->dev,"%s - nonzero write bulk status received: %d\n", 1915 dev_err (&urb->dev->dev,"%s - nonzero write bulk status received: %d\n",
1903 __FUNCTION__, urb->status); 1916 __FUNCTION__, urb->status);
1904 } 1917 }
1905 1918
1906 /* send any buffered data */ 1919 /* send any buffered data */
1907 edge_send(port); 1920 edge_send(port);
1908 } 1921 }
1909 1922
1910 static int edge_open (struct usb_serial_port *port, struct file * filp) 1923 static int edge_open (struct usb_serial_port *port, struct file * filp)
1911 { 1924 {
1912 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1925 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1913 struct edgeport_serial *edge_serial; 1926 struct edgeport_serial *edge_serial;
1914 struct usb_device *dev; 1927 struct usb_device *dev;
1915 struct urb *urb; 1928 struct urb *urb;
1916 int port_number; 1929 int port_number;
1917 int status; 1930 int status;
1918 u16 open_settings; 1931 u16 open_settings;
1919 u8 transaction_timeout; 1932 u8 transaction_timeout;
1920 1933
1921 dbg("%s - port %d", __FUNCTION__, port->number); 1934 dbg("%s - port %d", __FUNCTION__, port->number);
1922 1935
1923 if (edge_port == NULL) 1936 if (edge_port == NULL)
1924 return -ENODEV; 1937 return -ENODEV;
1925 1938
1926 if (port->tty) 1939 if (port->tty)
1927 port->tty->low_latency = low_latency; 1940 port->tty->low_latency = low_latency;
1928 1941
1929 port_number = port->number - port->serial->minor; 1942 port_number = port->number - port->serial->minor;
1930 switch (port_number) { 1943 switch (port_number) {
1931 case 0: 1944 case 0:
1932 edge_port->uart_base = UMPMEM_BASE_UART1; 1945 edge_port->uart_base = UMPMEM_BASE_UART1;
1933 edge_port->dma_address = UMPD_OEDB1_ADDRESS; 1946 edge_port->dma_address = UMPD_OEDB1_ADDRESS;
1934 break; 1947 break;
1935 case 1: 1948 case 1:
1936 edge_port->uart_base = UMPMEM_BASE_UART2; 1949 edge_port->uart_base = UMPMEM_BASE_UART2;
1937 edge_port->dma_address = UMPD_OEDB2_ADDRESS; 1950 edge_port->dma_address = UMPD_OEDB2_ADDRESS;
1938 break; 1951 break;
1939 default: 1952 default:
1940 dev_err (&port->dev, "Unknown port number!!!\n"); 1953 dev_err (&port->dev, "Unknown port number!!!\n");
1941 return -ENODEV; 1954 return -ENODEV;
1942 } 1955 }
1943 1956
1944 dbg ("%s - port_number = %d, uart_base = %04x, dma_address = %04x", 1957 dbg ("%s - port_number = %d, uart_base = %04x, dma_address = %04x",
1945 __FUNCTION__, port_number, edge_port->uart_base, edge_port->dma_address); 1958 __FUNCTION__, port_number, edge_port->uart_base, edge_port->dma_address);
1946 1959
1947 dev = port->serial->dev; 1960 dev = port->serial->dev;
1948 1961
1949 memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount)); 1962 memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount));
1950 init_waitqueue_head (&edge_port->delta_msr_wait); 1963 init_waitqueue_head (&edge_port->delta_msr_wait);
1951 1964
1952 /* turn off loopback */ 1965 /* turn off loopback */
1953 status = TIClearLoopBack (edge_port); 1966 status = TIClearLoopBack (edge_port);
1954 if (status) { 1967 if (status) {
1955 dev_err(&port->dev,"%s - cannot send clear loopback command, %d\n", 1968 dev_err(&port->dev,"%s - cannot send clear loopback command, %d\n",
1956 __FUNCTION__, status); 1969 __FUNCTION__, status);
1957 return status; 1970 return status;
1958 } 1971 }
1959 1972
1960 /* set up the port settings */ 1973 /* set up the port settings */
1961 edge_set_termios (port, NULL); 1974 edge_set_termios (port, NULL);
1962 1975
1963 /* open up the port */ 1976 /* open up the port */
1964 1977
1965 /* milliseconds to timeout for DMA transfer */ 1978 /* milliseconds to timeout for DMA transfer */
1966 transaction_timeout = 2; 1979 transaction_timeout = 2;
1967 1980
1968 edge_port->ump_read_timeout = max (20, ((transaction_timeout * 3) / 2) ); 1981 edge_port->ump_read_timeout = max (20, ((transaction_timeout * 3) / 2) );
1969 1982
1970 // milliseconds to timeout for DMA transfer 1983 // milliseconds to timeout for DMA transfer
1971 open_settings = (u8)(UMP_DMA_MODE_CONTINOUS | 1984 open_settings = (u8)(UMP_DMA_MODE_CONTINOUS |
1972 UMP_PIPE_TRANS_TIMEOUT_ENA | 1985 UMP_PIPE_TRANS_TIMEOUT_ENA |
1973 (transaction_timeout << 2)); 1986 (transaction_timeout << 2));
1974 1987
1975 dbg ("%s - Sending UMPC_OPEN_PORT", __FUNCTION__); 1988 dbg ("%s - Sending UMPC_OPEN_PORT", __FUNCTION__);
1976 1989
1977 /* Tell TI to open and start the port */ 1990 /* Tell TI to open and start the port */
1978 status = TIWriteCommandSync (dev, 1991 status = TIWriteCommandSync (dev,
1979 UMPC_OPEN_PORT, 1992 UMPC_OPEN_PORT,
1980 (u8)(UMPM_UART1_PORT + port_number), 1993 (u8)(UMPM_UART1_PORT + port_number),
1981 open_settings, 1994 open_settings,
1982 NULL, 1995 NULL,
1983 0); 1996 0);
1984 if (status) { 1997 if (status) {
1985 dev_err(&port->dev,"%s - cannot send open command, %d\n", __FUNCTION__, status); 1998 dev_err(&port->dev,"%s - cannot send open command, %d\n", __FUNCTION__, status);
1986 return status; 1999 return status;
1987 } 2000 }
1988 2001
1989 /* Start the DMA? */ 2002 /* Start the DMA? */
1990 status = TIWriteCommandSync (dev, 2003 status = TIWriteCommandSync (dev,
1991 UMPC_START_PORT, 2004 UMPC_START_PORT,
1992 (u8)(UMPM_UART1_PORT + port_number), 2005 (u8)(UMPM_UART1_PORT + port_number),
1993 0, 2006 0,
1994 NULL, 2007 NULL,
1995 0); 2008 0);
1996 if (status) { 2009 if (status) {
1997 dev_err(&port->dev,"%s - cannot send start DMA command, %d\n", __FUNCTION__, status); 2010 dev_err(&port->dev,"%s - cannot send start DMA command, %d\n", __FUNCTION__, status);
1998 return status; 2011 return status;
1999 } 2012 }
2000 2013
2001 /* Clear TX and RX buffers in UMP */ 2014 /* Clear TX and RX buffers in UMP */
2002 status = TIPurgeDataSync (port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN); 2015 status = TIPurgeDataSync (port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN);
2003 if (status) { 2016 if (status) {
2004 dev_err(&port->dev,"%s - cannot send clear buffers command, %d\n", __FUNCTION__, status); 2017 dev_err(&port->dev,"%s - cannot send clear buffers command, %d\n", __FUNCTION__, status);
2005 return status; 2018 return status;
2006 } 2019 }
2007 2020
2008 /* Read Initial MSR */ 2021 /* Read Initial MSR */
2009 status = TIReadVendorRequestSync (dev, 2022 status = TIReadVendorRequestSync (dev,
2010 UMPC_READ_MSR, // Request 2023 UMPC_READ_MSR, // Request
2011 0, // wValue 2024 0, // wValue
2012 (__u16)(UMPM_UART1_PORT + port_number), // wIndex (Address) 2025 (__u16)(UMPM_UART1_PORT + port_number), // wIndex (Address)
2013 &edge_port->shadow_msr, // TransferBuffer 2026 &edge_port->shadow_msr, // TransferBuffer
2014 1); // TransferBufferLength 2027 1); // TransferBufferLength
2015 if (status) { 2028 if (status) {
2016 dev_err(&port->dev,"%s - cannot send read MSR command, %d\n", __FUNCTION__, status); 2029 dev_err(&port->dev,"%s - cannot send read MSR command, %d\n", __FUNCTION__, status);
2017 return status; 2030 return status;
2018 } 2031 }
2019 2032
2020 dbg ("ShadowMSR 0x%X", edge_port->shadow_msr); 2033 dbg ("ShadowMSR 0x%X", edge_port->shadow_msr);
2021 2034
2022 /* Set Initial MCR */ 2035 /* Set Initial MCR */
2023 edge_port->shadow_mcr = MCR_RTS | MCR_DTR; 2036 edge_port->shadow_mcr = MCR_RTS | MCR_DTR;
2024 dbg ("ShadowMCR 0x%X", edge_port->shadow_mcr); 2037 dbg ("ShadowMCR 0x%X", edge_port->shadow_mcr);
2025 2038
2026 edge_serial = edge_port->edge_serial; 2039 edge_serial = edge_port->edge_serial;
2027 if (down_interruptible(&edge_serial->es_sem)) 2040 if (down_interruptible(&edge_serial->es_sem))
2028 return -ERESTARTSYS; 2041 return -ERESTARTSYS;
2029 if (edge_serial->num_ports_open == 0) { 2042 if (edge_serial->num_ports_open == 0) {
2030 /* we are the first port to be opened, let's post the interrupt urb */ 2043 /* we are the first port to be opened, let's post the interrupt urb */
2031 urb = edge_serial->serial->port[0]->interrupt_in_urb; 2044 urb = edge_serial->serial->port[0]->interrupt_in_urb;
2032 if (!urb) { 2045 if (!urb) {
2033 dev_err (&port->dev, "%s - no interrupt urb present, exiting\n", __FUNCTION__); 2046 dev_err (&port->dev, "%s - no interrupt urb present, exiting\n", __FUNCTION__);
2034 status = -EINVAL; 2047 status = -EINVAL;
2035 goto up_es_sem; 2048 goto up_es_sem;
2036 } 2049 }
2037 urb->complete = edge_interrupt_callback; 2050 urb->complete = edge_interrupt_callback;
2038 urb->context = edge_serial; 2051 urb->context = edge_serial;
2039 urb->dev = dev; 2052 urb->dev = dev;
2040 status = usb_submit_urb (urb, GFP_KERNEL); 2053 status = usb_submit_urb (urb, GFP_KERNEL);
2041 if (status) { 2054 if (status) {
2042 dev_err (&port->dev, "%s - usb_submit_urb failed with value %d\n", __FUNCTION__, status); 2055 dev_err (&port->dev, "%s - usb_submit_urb failed with value %d\n", __FUNCTION__, status);
2043 goto up_es_sem; 2056 goto up_es_sem;
2044 } 2057 }
2045 } 2058 }
2046 2059
2047 /* 2060 /*
2048 * reset the data toggle on the bulk endpoints to work around bug in 2061 * reset the data toggle on the bulk endpoints to work around bug in
2049 * host controllers where things get out of sync some times 2062 * host controllers where things get out of sync some times
2050 */ 2063 */
2051 usb_clear_halt (dev, port->write_urb->pipe); 2064 usb_clear_halt (dev, port->write_urb->pipe);
2052 usb_clear_halt (dev, port->read_urb->pipe); 2065 usb_clear_halt (dev, port->read_urb->pipe);
2053 2066
2054 /* start up our bulk read urb */ 2067 /* start up our bulk read urb */
2055 urb = port->read_urb; 2068 urb = port->read_urb;
2056 if (!urb) { 2069 if (!urb) {
2057 dev_err (&port->dev, "%s - no read urb present, exiting\n", __FUNCTION__); 2070 dev_err (&port->dev, "%s - no read urb present, exiting\n", __FUNCTION__);
2058 status = -EINVAL; 2071 status = -EINVAL;
2059 goto unlink_int_urb; 2072 goto unlink_int_urb;
2060 } 2073 }
2061 edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING; 2074 edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
2062 urb->complete = edge_bulk_in_callback; 2075 urb->complete = edge_bulk_in_callback;
2063 urb->context = edge_port; 2076 urb->context = edge_port;
2064 urb->dev = dev; 2077 urb->dev = dev;
2065 status = usb_submit_urb (urb, GFP_KERNEL); 2078 status = usb_submit_urb (urb, GFP_KERNEL);
2066 if (status) { 2079 if (status) {
2067 dev_err (&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status); 2080 dev_err (&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status);
2068 goto unlink_int_urb; 2081 goto unlink_int_urb;
2069 } 2082 }
2070 2083
2071 ++edge_serial->num_ports_open; 2084 ++edge_serial->num_ports_open;
2072 2085
2073 dbg("%s - exited", __FUNCTION__); 2086 dbg("%s - exited", __FUNCTION__);
2074 2087
2075 goto up_es_sem; 2088 goto up_es_sem;
2076 2089
2077 unlink_int_urb: 2090 unlink_int_urb:
2078 if (edge_port->edge_serial->num_ports_open == 0) 2091 if (edge_port->edge_serial->num_ports_open == 0)
2079 usb_kill_urb(port->serial->port[0]->interrupt_in_urb); 2092 usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
2080 up_es_sem: 2093 up_es_sem:
2081 up(&edge_serial->es_sem); 2094 up(&edge_serial->es_sem);
2082 return status; 2095 return status;
2083 } 2096 }
2084 2097
2085 static void edge_close (struct usb_serial_port *port, struct file *filp) 2098 static void edge_close (struct usb_serial_port *port, struct file *filp)
2086 { 2099 {
2087 struct edgeport_serial *edge_serial; 2100 struct edgeport_serial *edge_serial;
2088 struct edgeport_port *edge_port; 2101 struct edgeport_port *edge_port;
2089 int port_number; 2102 int port_number;
2090 int status; 2103 int status;
2091 2104
2092 dbg("%s - port %d", __FUNCTION__, port->number); 2105 dbg("%s - port %d", __FUNCTION__, port->number);
2093 2106
2094 edge_serial = usb_get_serial_data(port->serial); 2107 edge_serial = usb_get_serial_data(port->serial);
2095 edge_port = usb_get_serial_port_data(port); 2108 edge_port = usb_get_serial_port_data(port);
2096 if ((edge_serial == NULL) || (edge_port == NULL)) 2109 if ((edge_serial == NULL) || (edge_port == NULL))
2097 return; 2110 return;
2098 2111
2099 /* The bulkreadcompletion routine will check 2112 /* The bulkreadcompletion routine will check
2100 * this flag and dump add read data */ 2113 * this flag and dump add read data */
2101 edge_port->close_pending = 1; 2114 edge_port->close_pending = 1;
2102 2115
2103 /* chase the port close and flush */ 2116 /* chase the port close and flush */
2104 TIChasePort (edge_port, (HZ*closing_wait)/100, 1); 2117 TIChasePort (edge_port, (HZ*closing_wait)/100, 1);
2105 2118
2106 usb_kill_urb(port->read_urb); 2119 usb_kill_urb(port->read_urb);
2107 usb_kill_urb(port->write_urb); 2120 usb_kill_urb(port->write_urb);
2108 edge_port->ep_write_urb_in_use = 0; 2121 edge_port->ep_write_urb_in_use = 0;
2109 2122
2110 /* assuming we can still talk to the device, 2123 /* assuming we can still talk to the device,
2111 * send a close port command to it */ 2124 * send a close port command to it */
2112 dbg("%s - send umpc_close_port", __FUNCTION__); 2125 dbg("%s - send umpc_close_port", __FUNCTION__);
2113 port_number = port->number - port->serial->minor; 2126 port_number = port->number - port->serial->minor;
2114 status = TIWriteCommandSync (port->serial->dev, 2127 status = TIWriteCommandSync (port->serial->dev,
2115 UMPC_CLOSE_PORT, 2128 UMPC_CLOSE_PORT,
2116 (__u8)(UMPM_UART1_PORT + port_number), 2129 (__u8)(UMPM_UART1_PORT + port_number),
2117 0, 2130 0,
2118 NULL, 2131 NULL,
2119 0); 2132 0);
2120 down(&edge_serial->es_sem); 2133 down(&edge_serial->es_sem);
2121 --edge_port->edge_serial->num_ports_open; 2134 --edge_port->edge_serial->num_ports_open;
2122 if (edge_port->edge_serial->num_ports_open <= 0) { 2135 if (edge_port->edge_serial->num_ports_open <= 0) {
2123 /* last port is now closed, let's shut down our interrupt urb */ 2136 /* last port is now closed, let's shut down our interrupt urb */
2124 usb_kill_urb(port->serial->port[0]->interrupt_in_urb); 2137 usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
2125 edge_port->edge_serial->num_ports_open = 0; 2138 edge_port->edge_serial->num_ports_open = 0;
2126 } 2139 }
2127 up(&edge_serial->es_sem); 2140 up(&edge_serial->es_sem);
2128 edge_port->close_pending = 0; 2141 edge_port->close_pending = 0;
2129 2142
2130 dbg("%s - exited", __FUNCTION__); 2143 dbg("%s - exited", __FUNCTION__);
2131 } 2144 }
2132 2145
2133 static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count) 2146 static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count)
2134 { 2147 {
2135 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2148 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2136 unsigned long flags; 2149 unsigned long flags;
2137 2150
2138 dbg("%s - port %d", __FUNCTION__, port->number); 2151 dbg("%s - port %d", __FUNCTION__, port->number);
2139 2152
2140 if (count == 0) { 2153 if (count == 0) {
2141 dbg("%s - write request of 0 bytes", __FUNCTION__); 2154 dbg("%s - write request of 0 bytes", __FUNCTION__);
2142 return 0; 2155 return 0;
2143 } 2156 }
2144 2157
2145 if (edge_port == NULL) 2158 if (edge_port == NULL)
2146 return -ENODEV; 2159 return -ENODEV;
2147 if (edge_port->close_pending == 1) 2160 if (edge_port->close_pending == 1)
2148 return -ENODEV; 2161 return -ENODEV;
2149 2162
2150 spin_lock_irqsave(&edge_port->ep_lock, flags); 2163 spin_lock_irqsave(&edge_port->ep_lock, flags);
2151 count = edge_buf_put(edge_port->ep_out_buf, data, count); 2164 count = edge_buf_put(edge_port->ep_out_buf, data, count);
2152 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2165 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2153 2166
2154 edge_send(port); 2167 edge_send(port);
2155 2168
2156 return count; 2169 return count;
2157 } 2170 }
2158 2171
2159 static void edge_send(struct usb_serial_port *port) 2172 static void edge_send(struct usb_serial_port *port)
2160 { 2173 {
2161 int count, result; 2174 int count, result;
2162 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2175 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2163 struct tty_struct *tty = port->tty; 2176 struct tty_struct *tty = port->tty;
2164 unsigned long flags; 2177 unsigned long flags;
2165 2178
2166 2179
2167 dbg("%s - port %d", __FUNCTION__, port->number); 2180 dbg("%s - port %d", __FUNCTION__, port->number);
2168 2181
2169 spin_lock_irqsave(&edge_port->ep_lock, flags); 2182 spin_lock_irqsave(&edge_port->ep_lock, flags);
2170 2183
2171 if (edge_port->ep_write_urb_in_use) { 2184 if (edge_port->ep_write_urb_in_use) {
2172 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2185 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2173 return; 2186 return;
2174 } 2187 }
2175 2188
2176 count = edge_buf_get(edge_port->ep_out_buf, 2189 count = edge_buf_get(edge_port->ep_out_buf,
2177 port->write_urb->transfer_buffer, 2190 port->write_urb->transfer_buffer,
2178 port->bulk_out_size); 2191 port->bulk_out_size);
2179 2192
2180 if (count == 0) { 2193 if (count == 0) {
2181 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2194 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2182 return; 2195 return;
2183 } 2196 }
2184 2197
2185 edge_port->ep_write_urb_in_use = 1; 2198 edge_port->ep_write_urb_in_use = 1;
2186 2199
2187 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2200 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2188 2201
2189 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer); 2202 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer);
2190 2203
2191 /* set up our urb */ 2204 /* set up our urb */
2192 usb_fill_bulk_urb (port->write_urb, port->serial->dev, 2205 usb_fill_bulk_urb (port->write_urb, port->serial->dev,
2193 usb_sndbulkpipe (port->serial->dev, 2206 usb_sndbulkpipe (port->serial->dev,
2194 port->bulk_out_endpointAddress), 2207 port->bulk_out_endpointAddress),
2195 port->write_urb->transfer_buffer, count, 2208 port->write_urb->transfer_buffer, count,
2196 edge_bulk_out_callback, 2209 edge_bulk_out_callback,
2197 port); 2210 port);
2198 2211
2199 /* send the data out the bulk port */ 2212 /* send the data out the bulk port */
2200 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 2213 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
2201 if (result) { 2214 if (result) {
2202 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result); 2215 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
2203 edge_port->ep_write_urb_in_use = 0; 2216 edge_port->ep_write_urb_in_use = 0;
2204 // TODO: reschedule edge_send 2217 // TODO: reschedule edge_send
2205 } else { 2218 } else {
2206 edge_port->icount.tx += count; 2219 edge_port->icount.tx += count;
2207 } 2220 }
2208 2221
2209 /* wakeup any process waiting for writes to complete */ 2222 /* wakeup any process waiting for writes to complete */
2210 /* there is now more room in the buffer for new writes */ 2223 /* there is now more room in the buffer for new writes */
2211 if (tty) { 2224 if (tty) {
2212 /* let the tty driver wakeup if it has a special write_wakeup function */ 2225 /* let the tty driver wakeup if it has a special write_wakeup function */
2213 tty_wakeup(tty); 2226 tty_wakeup(tty);
2214 } 2227 }
2215 } 2228 }
2216 2229
2217 static int edge_write_room (struct usb_serial_port *port) 2230 static int edge_write_room (struct usb_serial_port *port)
2218 { 2231 {
2219 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2232 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2220 int room = 0; 2233 int room = 0;
2221 unsigned long flags; 2234 unsigned long flags;
2222 2235
2223 dbg("%s - port %d", __FUNCTION__, port->number); 2236 dbg("%s - port %d", __FUNCTION__, port->number);
2224 2237
2225 if (edge_port == NULL) 2238 if (edge_port == NULL)
2226 return -ENODEV; 2239 return -ENODEV;
2227 if (edge_port->close_pending == 1) 2240 if (edge_port->close_pending == 1)
2228 return -ENODEV; 2241 return -ENODEV;
2229 2242
2230 spin_lock_irqsave(&edge_port->ep_lock, flags); 2243 spin_lock_irqsave(&edge_port->ep_lock, flags);
2231 room = edge_buf_space_avail(edge_port->ep_out_buf); 2244 room = edge_buf_space_avail(edge_port->ep_out_buf);
2232 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2245 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2233 2246
2234 dbg("%s - returns %d", __FUNCTION__, room); 2247 dbg("%s - returns %d", __FUNCTION__, room);
2235 return room; 2248 return room;
2236 } 2249 }
2237 2250
2238 static int edge_chars_in_buffer (struct usb_serial_port *port) 2251 static int edge_chars_in_buffer (struct usb_serial_port *port)
2239 { 2252 {
2240 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2253 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2241 int chars = 0; 2254 int chars = 0;
2242 unsigned long flags; 2255 unsigned long flags;
2243 2256
2244 dbg("%s - port %d", __FUNCTION__, port->number); 2257 dbg("%s - port %d", __FUNCTION__, port->number);
2245 2258
2246 if (edge_port == NULL) 2259 if (edge_port == NULL)
2247 return -ENODEV; 2260 return -ENODEV;
2248 if (edge_port->close_pending == 1) 2261 if (edge_port->close_pending == 1)
2249 return -ENODEV; 2262 return -ENODEV;
2250 2263
2251 spin_lock_irqsave(&edge_port->ep_lock, flags); 2264 spin_lock_irqsave(&edge_port->ep_lock, flags);
2252 chars = edge_buf_data_avail(edge_port->ep_out_buf); 2265 chars = edge_buf_data_avail(edge_port->ep_out_buf);
2253 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2266 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2254 2267
2255 dbg ("%s - returns %d", __FUNCTION__, chars); 2268 dbg ("%s - returns %d", __FUNCTION__, chars);
2256 return chars; 2269 return chars;
2257 } 2270 }
2258 2271
2259 static void edge_throttle (struct usb_serial_port *port) 2272 static void edge_throttle (struct usb_serial_port *port)
2260 { 2273 {
2261 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2274 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2262 struct tty_struct *tty; 2275 struct tty_struct *tty;
2263 int status; 2276 int status;
2264 2277
2265 dbg("%s - port %d", __FUNCTION__, port->number); 2278 dbg("%s - port %d", __FUNCTION__, port->number);
2266 2279
2267 if (edge_port == NULL) 2280 if (edge_port == NULL)
2268 return; 2281 return;
2269 2282
2270 tty = port->tty; 2283 tty = port->tty;
2271 if (!tty) { 2284 if (!tty) {
2272 dbg ("%s - no tty available", __FUNCTION__); 2285 dbg ("%s - no tty available", __FUNCTION__);
2273 return; 2286 return;
2274 } 2287 }
2275 2288
2276 /* if we are implementing XON/XOFF, send the stop character */ 2289 /* if we are implementing XON/XOFF, send the stop character */
2277 if (I_IXOFF(tty)) { 2290 if (I_IXOFF(tty)) {
2278 unsigned char stop_char = STOP_CHAR(tty); 2291 unsigned char stop_char = STOP_CHAR(tty);
2279 status = edge_write (port, &stop_char, 1); 2292 status = edge_write (port, &stop_char, 1);
2280 if (status <= 0) { 2293 if (status <= 0) {
2281 dev_err(&port->dev, "%s - failed to write stop character, %d\n", __FUNCTION__, status); 2294 dev_err(&port->dev, "%s - failed to write stop character, %d\n", __FUNCTION__, status);
2282 } 2295 }
2283 } 2296 }
2284 2297
2285 /* if we are implementing RTS/CTS, stop reads */ 2298 /* if we are implementing RTS/CTS, stop reads */
2286 /* and the Edgeport will clear the RTS line */ 2299 /* and the Edgeport will clear the RTS line */
2287 if (C_CRTSCTS(tty)) 2300 if (C_CRTSCTS(tty))
2288 stop_read(edge_port); 2301 stop_read(edge_port);
2289 2302
2290 } 2303 }
2291 2304
2292 static void edge_unthrottle (struct usb_serial_port *port) 2305 static void edge_unthrottle (struct usb_serial_port *port)
2293 { 2306 {
2294 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2307 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2295 struct tty_struct *tty; 2308 struct tty_struct *tty;
2296 int status; 2309 int status;
2297 2310
2298 dbg("%s - port %d", __FUNCTION__, port->number); 2311 dbg("%s - port %d", __FUNCTION__, port->number);
2299 2312
2300 if (edge_port == NULL) 2313 if (edge_port == NULL)
2301 return; 2314 return;
2302 2315
2303 tty = port->tty; 2316 tty = port->tty;
2304 if (!tty) { 2317 if (!tty) {
2305 dbg ("%s - no tty available", __FUNCTION__); 2318 dbg ("%s - no tty available", __FUNCTION__);
2306 return; 2319 return;
2307 } 2320 }
2308 2321
2309 /* if we are implementing XON/XOFF, send the start character */ 2322 /* if we are implementing XON/XOFF, send the start character */
2310 if (I_IXOFF(tty)) { 2323 if (I_IXOFF(tty)) {
2311 unsigned char start_char = START_CHAR(tty); 2324 unsigned char start_char = START_CHAR(tty);
2312 status = edge_write (port, &start_char, 1); 2325 status = edge_write (port, &start_char, 1);
2313 if (status <= 0) { 2326 if (status <= 0) {
2314 dev_err(&port->dev, "%s - failed to write start character, %d\n", __FUNCTION__, status); 2327 dev_err(&port->dev, "%s - failed to write start character, %d\n", __FUNCTION__, status);
2315 } 2328 }
2316 } 2329 }
2317 2330
2318 /* if we are implementing RTS/CTS, restart reads */ 2331 /* if we are implementing RTS/CTS, restart reads */
2319 /* are the Edgeport will assert the RTS line */ 2332 /* are the Edgeport will assert the RTS line */
2320 if (C_CRTSCTS(tty)) { 2333 if (C_CRTSCTS(tty)) {
2321 status = restart_read(edge_port); 2334 status = restart_read(edge_port);
2322 if (status) 2335 if (status)
2323 dev_err(&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status); 2336 dev_err(&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status);
2324 } 2337 }
2325 2338
2326 } 2339 }
2327 2340
2328 static void stop_read(struct edgeport_port *edge_port) 2341 static void stop_read(struct edgeport_port *edge_port)
2329 { 2342 {
2330 unsigned long flags; 2343 unsigned long flags;
2331 2344
2332 spin_lock_irqsave(&edge_port->ep_lock, flags); 2345 spin_lock_irqsave(&edge_port->ep_lock, flags);
2333 2346
2334 if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) 2347 if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING)
2335 edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPING; 2348 edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPING;
2336 edge_port->shadow_mcr &= ~MCR_RTS; 2349 edge_port->shadow_mcr &= ~MCR_RTS;
2337 2350
2338 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2351 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2339 } 2352 }
2340 2353
2341 static int restart_read(struct edgeport_port *edge_port) 2354 static int restart_read(struct edgeport_port *edge_port)
2342 { 2355 {
2343 struct urb *urb; 2356 struct urb *urb;
2344 int status = 0; 2357 int status = 0;
2345 unsigned long flags; 2358 unsigned long flags;
2346 2359
2347 spin_lock_irqsave(&edge_port->ep_lock, flags); 2360 spin_lock_irqsave(&edge_port->ep_lock, flags);
2348 2361
2349 if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPED) { 2362 if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPED) {
2350 urb = edge_port->port->read_urb; 2363 urb = edge_port->port->read_urb;
2351 urb->complete = edge_bulk_in_callback; 2364 urb->complete = edge_bulk_in_callback;
2352 urb->context = edge_port; 2365 urb->context = edge_port;
2353 urb->dev = edge_port->port->serial->dev; 2366 urb->dev = edge_port->port->serial->dev;
2354 status = usb_submit_urb(urb, GFP_KERNEL); 2367 status = usb_submit_urb(urb, GFP_KERNEL);
2355 } 2368 }
2356 edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING; 2369 edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
2357 edge_port->shadow_mcr |= MCR_RTS; 2370 edge_port->shadow_mcr |= MCR_RTS;
2358 2371
2359 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2372 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2360 2373
2361 return status; 2374 return status;
2362 } 2375 }
2363 2376
2364 static void change_port_settings (struct edgeport_port *edge_port, struct ktermios *old_termios) 2377 static void change_port_settings (struct edgeport_port *edge_port, struct ktermios *old_termios)
2365 { 2378 {
2366 struct ump_uart_config *config; 2379 struct ump_uart_config *config;
2367 struct tty_struct *tty; 2380 struct tty_struct *tty;
2368 int baud; 2381 int baud;
2369 unsigned cflag; 2382 unsigned cflag;
2370 int status; 2383 int status;
2371 int port_number = edge_port->port->number - edge_port->port->serial->minor; 2384 int port_number = edge_port->port->number - edge_port->port->serial->minor;
2372 2385
2373 dbg("%s - port %d", __FUNCTION__, edge_port->port->number); 2386 dbg("%s - port %d", __FUNCTION__, edge_port->port->number);
2374 2387
2375 tty = edge_port->port->tty; 2388 tty = edge_port->port->tty;
2376 if ((!tty) || 2389 if ((!tty) ||
2377 (!tty->termios)) { 2390 (!tty->termios)) {
2378 dbg("%s - no tty structures", __FUNCTION__); 2391 dbg("%s - no tty structures", __FUNCTION__);
2379 return; 2392 return;
2380 } 2393 }
2381 2394
2382 config = kmalloc (sizeof (*config), GFP_KERNEL); 2395 config = kmalloc (sizeof (*config), GFP_KERNEL);
2383 if (!config) { 2396 if (!config) {
2384 dev_err (&edge_port->port->dev, "%s - out of memory\n", __FUNCTION__); 2397 dev_err (&edge_port->port->dev, "%s - out of memory\n", __FUNCTION__);
2385 return; 2398 return;
2386 } 2399 }
2387 2400
2388 cflag = tty->termios->c_cflag; 2401 cflag = tty->termios->c_cflag;
2389 2402
2390 config->wFlags = 0; 2403 config->wFlags = 0;
2391 2404
2392 /* These flags must be set */ 2405 /* These flags must be set */
2393 config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT; 2406 config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT;
2394 config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR; 2407 config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR;
2395 config->bUartMode = (__u8)(edge_port->bUartMode); 2408 config->bUartMode = (__u8)(edge_port->bUartMode);
2396 2409
2397 switch (cflag & CSIZE) { 2410 switch (cflag & CSIZE) {
2398 case CS5: 2411 case CS5:
2399 config->bDataBits = UMP_UART_CHAR5BITS; 2412 config->bDataBits = UMP_UART_CHAR5BITS;
2400 dbg ("%s - data bits = 5", __FUNCTION__); 2413 dbg ("%s - data bits = 5", __FUNCTION__);
2401 break; 2414 break;
2402 case CS6: 2415 case CS6:
2403 config->bDataBits = UMP_UART_CHAR6BITS; 2416 config->bDataBits = UMP_UART_CHAR6BITS;
2404 dbg ("%s - data bits = 6", __FUNCTION__); 2417 dbg ("%s - data bits = 6", __FUNCTION__);
2405 break; 2418 break;
2406 case CS7: 2419 case CS7:
2407 config->bDataBits = UMP_UART_CHAR7BITS; 2420 config->bDataBits = UMP_UART_CHAR7BITS;
2408 dbg ("%s - data bits = 7", __FUNCTION__); 2421 dbg ("%s - data bits = 7", __FUNCTION__);
2409 break; 2422 break;
2410 default: 2423 default:
2411 case CS8: 2424 case CS8:
2412 config->bDataBits = UMP_UART_CHAR8BITS; 2425 config->bDataBits = UMP_UART_CHAR8BITS;
2413 dbg ("%s - data bits = 8", __FUNCTION__); 2426 dbg ("%s - data bits = 8", __FUNCTION__);
2414 break; 2427 break;
2415 } 2428 }
2416 2429
2417 if (cflag & PARENB) { 2430 if (cflag & PARENB) {
2418 if (cflag & PARODD) { 2431 if (cflag & PARODD) {
2419 config->wFlags |= UMP_MASK_UART_FLAGS_PARITY; 2432 config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
2420 config->bParity = UMP_UART_ODDPARITY; 2433 config->bParity = UMP_UART_ODDPARITY;
2421 dbg("%s - parity = odd", __FUNCTION__); 2434 dbg("%s - parity = odd", __FUNCTION__);
2422 } else { 2435 } else {
2423 config->wFlags |= UMP_MASK_UART_FLAGS_PARITY; 2436 config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
2424 config->bParity = UMP_UART_EVENPARITY; 2437 config->bParity = UMP_UART_EVENPARITY;
2425 dbg("%s - parity = even", __FUNCTION__); 2438 dbg("%s - parity = even", __FUNCTION__);
2426 } 2439 }
2427 } else { 2440 } else {
2428 config->bParity = UMP_UART_NOPARITY; 2441 config->bParity = UMP_UART_NOPARITY;
2429 dbg("%s - parity = none", __FUNCTION__); 2442 dbg("%s - parity = none", __FUNCTION__);
2430 } 2443 }
2431 2444
2432 if (cflag & CSTOPB) { 2445 if (cflag & CSTOPB) {
2433 config->bStopBits = UMP_UART_STOPBIT2; 2446 config->bStopBits = UMP_UART_STOPBIT2;
2434 dbg("%s - stop bits = 2", __FUNCTION__); 2447 dbg("%s - stop bits = 2", __FUNCTION__);
2435 } else { 2448 } else {
2436 config->bStopBits = UMP_UART_STOPBIT1; 2449 config->bStopBits = UMP_UART_STOPBIT1;
2437 dbg("%s - stop bits = 1", __FUNCTION__); 2450 dbg("%s - stop bits = 1", __FUNCTION__);
2438 } 2451 }
2439 2452
2440 /* figure out the flow control settings */ 2453 /* figure out the flow control settings */
2441 if (cflag & CRTSCTS) { 2454 if (cflag & CRTSCTS) {
2442 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW; 2455 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW;
2443 config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW; 2456 config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW;
2444 dbg("%s - RTS/CTS is enabled", __FUNCTION__); 2457 dbg("%s - RTS/CTS is enabled", __FUNCTION__);
2445 } else { 2458 } else {
2446 dbg("%s - RTS/CTS is disabled", __FUNCTION__); 2459 dbg("%s - RTS/CTS is disabled", __FUNCTION__);
2447 tty->hw_stopped = 0; 2460 tty->hw_stopped = 0;
2448 restart_read(edge_port); 2461 restart_read(edge_port);
2449 } 2462 }
2450 2463
2451 /* if we are implementing XON/XOFF, set the start and stop character in the device */ 2464 /* if we are implementing XON/XOFF, set the start and stop character in the device */
2452 if (I_IXOFF(tty) || I_IXON(tty)) { 2465 if (I_IXOFF(tty) || I_IXON(tty)) {
2453 config->cXon = START_CHAR(tty); 2466 config->cXon = START_CHAR(tty);
2454 config->cXoff = STOP_CHAR(tty); 2467 config->cXoff = STOP_CHAR(tty);
2455 2468
2456 /* if we are implementing INBOUND XON/XOFF */ 2469 /* if we are implementing INBOUND XON/XOFF */
2457 if (I_IXOFF(tty)) { 2470 if (I_IXOFF(tty)) {
2458 config->wFlags |= UMP_MASK_UART_FLAGS_IN_X; 2471 config->wFlags |= UMP_MASK_UART_FLAGS_IN_X;
2459 dbg ("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", 2472 dbg ("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2460 __FUNCTION__, config->cXon, config->cXoff); 2473 __FUNCTION__, config->cXon, config->cXoff);
2461 } else { 2474 } else {
2462 dbg ("%s - INBOUND XON/XOFF is disabled", __FUNCTION__); 2475 dbg ("%s - INBOUND XON/XOFF is disabled", __FUNCTION__);
2463 } 2476 }
2464 2477
2465 /* if we are implementing OUTBOUND XON/XOFF */ 2478 /* if we are implementing OUTBOUND XON/XOFF */
2466 if (I_IXON(tty)) { 2479 if (I_IXON(tty)) {
2467 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X; 2480 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X;
2468 dbg ("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", 2481 dbg ("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2469 __FUNCTION__, config->cXon, config->cXoff); 2482 __FUNCTION__, config->cXon, config->cXoff);
2470 } else { 2483 } else {
2471 dbg ("%s - OUTBOUND XON/XOFF is disabled", __FUNCTION__); 2484 dbg ("%s - OUTBOUND XON/XOFF is disabled", __FUNCTION__);
2472 } 2485 }
2473 } 2486 }
2474 2487
2475 /* Round the baud rate */ 2488 /* Round the baud rate */
2476 baud = tty_get_baud_rate(tty); 2489 baud = tty_get_baud_rate(tty);
2477 if (!baud) { 2490 if (!baud) {
2478 /* pick a default, any default... */ 2491 /* pick a default, any default... */
2479 baud = 9600; 2492 baud = 9600;
2480 } 2493 }
2481 edge_port->baud_rate = baud; 2494 edge_port->baud_rate = baud;
2482 config->wBaudRate = (__u16)((461550L + baud/2) / baud); 2495 config->wBaudRate = (__u16)((461550L + baud/2) / baud);
2483 2496
2484 dbg ("%s - baud rate = %d, wBaudRate = %d", __FUNCTION__, baud, config->wBaudRate); 2497 dbg ("%s - baud rate = %d, wBaudRate = %d", __FUNCTION__, baud, config->wBaudRate);
2485 2498
2486 dbg ("wBaudRate: %d", (int)(461550L / config->wBaudRate)); 2499 dbg ("wBaudRate: %d", (int)(461550L / config->wBaudRate));
2487 dbg ("wFlags: 0x%x", config->wFlags); 2500 dbg ("wFlags: 0x%x", config->wFlags);
2488 dbg ("bDataBits: %d", config->bDataBits); 2501 dbg ("bDataBits: %d", config->bDataBits);
2489 dbg ("bParity: %d", config->bParity); 2502 dbg ("bParity: %d", config->bParity);
2490 dbg ("bStopBits: %d", config->bStopBits); 2503 dbg ("bStopBits: %d", config->bStopBits);
2491 dbg ("cXon: %d", config->cXon); 2504 dbg ("cXon: %d", config->cXon);
2492 dbg ("cXoff: %d", config->cXoff); 2505 dbg ("cXoff: %d", config->cXoff);
2493 dbg ("bUartMode: %d", config->bUartMode); 2506 dbg ("bUartMode: %d", config->bUartMode);
2494 2507
2495 /* move the word values into big endian mode */ 2508 /* move the word values into big endian mode */
2496 cpu_to_be16s (&config->wFlags); 2509 cpu_to_be16s (&config->wFlags);
2497 cpu_to_be16s (&config->wBaudRate); 2510 cpu_to_be16s (&config->wBaudRate);
2498 2511
2499 status = TIWriteCommandSync (edge_port->port->serial->dev, 2512 status = TIWriteCommandSync (edge_port->port->serial->dev,
2500 UMPC_SET_CONFIG, 2513 UMPC_SET_CONFIG,
2501 (__u8)(UMPM_UART1_PORT + port_number), 2514 (__u8)(UMPM_UART1_PORT + port_number),
2502 0, 2515 0,
2503 (__u8 *)config, 2516 (__u8 *)config,
2504 sizeof(*config)); 2517 sizeof(*config));
2505 if (status) { 2518 if (status) {
2506 dbg ("%s - error %d when trying to write config to device", 2519 dbg ("%s - error %d when trying to write config to device",
2507 __FUNCTION__, status); 2520 __FUNCTION__, status);
2508 } 2521 }
2509 2522
2510 kfree (config); 2523 kfree (config);
2511 2524
2512 return; 2525 return;
2513 } 2526 }
2514 2527
2515 static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) 2528 static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios)
2516 { 2529 {
2517 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2530 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2518 struct tty_struct *tty = port->tty; 2531 struct tty_struct *tty = port->tty;
2519 unsigned int cflag; 2532 unsigned int cflag;
2520 2533
2521 if (!port->tty || !port->tty->termios) { 2534 if (!port->tty || !port->tty->termios) {
2522 dbg ("%s - no tty or termios", __FUNCTION__); 2535 dbg ("%s - no tty or termios", __FUNCTION__);
2523 return; 2536 return;
2524 } 2537 }
2525 2538
2526 cflag = tty->termios->c_cflag; 2539 cflag = tty->termios->c_cflag;
2527 /* check that they really want us to change something */ 2540 /* check that they really want us to change something */
2528 if (old_termios) { 2541 if (old_termios) {
2529 if (cflag == old_termios->c_cflag && 2542 if (cflag == old_termios->c_cflag &&
2530 tty->termios->c_iflag == old_termios->c_iflag) { 2543 tty->termios->c_iflag == old_termios->c_iflag) {
2531 dbg ("%s - nothing to change", __FUNCTION__); 2544 dbg ("%s - nothing to change", __FUNCTION__);
2532 return; 2545 return;
2533 } 2546 }
2534 } 2547 }
2535 2548
2536 dbg("%s - clfag %08x iflag %08x", __FUNCTION__, 2549 dbg("%s - clfag %08x iflag %08x", __FUNCTION__,
2537 tty->termios->c_cflag, tty->termios->c_iflag); 2550 tty->termios->c_cflag, tty->termios->c_iflag);
2538 if (old_termios) { 2551 if (old_termios) {
2539 dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__, 2552 dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__,
2540 old_termios->c_cflag, old_termios->c_iflag); 2553 old_termios->c_cflag, old_termios->c_iflag);
2541 } 2554 }
2542 2555
2543 dbg("%s - port %d", __FUNCTION__, port->number); 2556 dbg("%s - port %d", __FUNCTION__, port->number);
2544 2557
2545 if (edge_port == NULL) 2558 if (edge_port == NULL)
2546 return; 2559 return;
2547 2560
2548 /* change the port settings to the new ones specified */ 2561 /* change the port settings to the new ones specified */
2549 change_port_settings (edge_port, old_termios); 2562 change_port_settings (edge_port, old_termios);
2550 2563
2551 return; 2564 return;
2552 } 2565 }
2553 2566
2554 static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear) 2567 static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear)
2555 { 2568 {
2556 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2569 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2557 unsigned int mcr; 2570 unsigned int mcr;
2558 2571
2559 dbg("%s - port %d", __FUNCTION__, port->number); 2572 dbg("%s - port %d", __FUNCTION__, port->number);
2560 2573
2561 mcr = edge_port->shadow_mcr; 2574 mcr = edge_port->shadow_mcr;
2562 if (set & TIOCM_RTS) 2575 if (set & TIOCM_RTS)
2563 mcr |= MCR_RTS; 2576 mcr |= MCR_RTS;
2564 if (set & TIOCM_DTR) 2577 if (set & TIOCM_DTR)
2565 mcr |= MCR_DTR; 2578 mcr |= MCR_DTR;
2566 if (set & TIOCM_LOOP) 2579 if (set & TIOCM_LOOP)
2567 mcr |= MCR_LOOPBACK; 2580 mcr |= MCR_LOOPBACK;
2568 2581
2569 if (clear & TIOCM_RTS) 2582 if (clear & TIOCM_RTS)
2570 mcr &= ~MCR_RTS; 2583 mcr &= ~MCR_RTS;
2571 if (clear & TIOCM_DTR) 2584 if (clear & TIOCM_DTR)
2572 mcr &= ~MCR_DTR; 2585 mcr &= ~MCR_DTR;
2573 if (clear & TIOCM_LOOP) 2586 if (clear & TIOCM_LOOP)
2574 mcr &= ~MCR_LOOPBACK; 2587 mcr &= ~MCR_LOOPBACK;
2575 2588
2576 edge_port->shadow_mcr = mcr; 2589 edge_port->shadow_mcr = mcr;
2577 2590
2578 TIRestoreMCR (edge_port, mcr); 2591 TIRestoreMCR (edge_port, mcr);
2579 2592
2580 return 0; 2593 return 0;
2581 } 2594 }
2582 2595
2583 static int edge_tiocmget(struct usb_serial_port *port, struct file *file) 2596 static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
2584 { 2597 {
2585 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2598 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2586 unsigned int result = 0; 2599 unsigned int result = 0;
2587 unsigned int msr; 2600 unsigned int msr;
2588 unsigned int mcr; 2601 unsigned int mcr;
2589 2602
2590 dbg("%s - port %d", __FUNCTION__, port->number); 2603 dbg("%s - port %d", __FUNCTION__, port->number);
2591 2604
2592 msr = edge_port->shadow_msr; 2605 msr = edge_port->shadow_msr;
2593 mcr = edge_port->shadow_mcr; 2606 mcr = edge_port->shadow_mcr;
2594 result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */ 2607 result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */
2595 | ((mcr & MCR_RTS) ? TIOCM_RTS: 0) /* 0x004 */ 2608 | ((mcr & MCR_RTS) ? TIOCM_RTS: 0) /* 0x004 */
2596 | ((msr & EDGEPORT_MSR_CTS) ? TIOCM_CTS: 0) /* 0x020 */ 2609 | ((msr & EDGEPORT_MSR_CTS) ? TIOCM_CTS: 0) /* 0x020 */
2597 | ((msr & EDGEPORT_MSR_CD) ? TIOCM_CAR: 0) /* 0x040 */ 2610 | ((msr & EDGEPORT_MSR_CD) ? TIOCM_CAR: 0) /* 0x040 */
2598 | ((msr & EDGEPORT_MSR_RI) ? TIOCM_RI: 0) /* 0x080 */ 2611 | ((msr & EDGEPORT_MSR_RI) ? TIOCM_RI: 0) /* 0x080 */
2599 | ((msr & EDGEPORT_MSR_DSR) ? TIOCM_DSR: 0); /* 0x100 */ 2612 | ((msr & EDGEPORT_MSR_DSR) ? TIOCM_DSR: 0); /* 0x100 */
2600 2613
2601 2614
2602 dbg("%s -- %x", __FUNCTION__, result); 2615 dbg("%s -- %x", __FUNCTION__, result);
2603 2616
2604 return result; 2617 return result;
2605 } 2618 }
2606 2619
2607 static int get_serial_info (struct edgeport_port *edge_port, struct serial_struct __user *retinfo) 2620 static int get_serial_info (struct edgeport_port *edge_port, struct serial_struct __user *retinfo)
2608 { 2621 {
2609 struct serial_struct tmp; 2622 struct serial_struct tmp;
2610 2623
2611 if (!retinfo) 2624 if (!retinfo)
2612 return -EFAULT; 2625 return -EFAULT;
2613 2626
2614 memset(&tmp, 0, sizeof(tmp)); 2627 memset(&tmp, 0, sizeof(tmp));
2615 2628
2616 tmp.type = PORT_16550A; 2629 tmp.type = PORT_16550A;
2617 tmp.line = edge_port->port->serial->minor; 2630 tmp.line = edge_port->port->serial->minor;
2618 tmp.port = edge_port->port->number; 2631 tmp.port = edge_port->port->number;
2619 tmp.irq = 0; 2632 tmp.irq = 0;
2620 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; 2633 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
2621 tmp.xmit_fifo_size = edge_port->port->bulk_out_size; 2634 tmp.xmit_fifo_size = edge_port->port->bulk_out_size;
2622 tmp.baud_base = 9600; 2635 tmp.baud_base = 9600;
2623 tmp.close_delay = 5*HZ; 2636 tmp.close_delay = 5*HZ;
2624 tmp.closing_wait = closing_wait; 2637 tmp.closing_wait = closing_wait;
2625 // tmp.custom_divisor = state->custom_divisor; 2638 // tmp.custom_divisor = state->custom_divisor;
2626 // tmp.hub6 = state->hub6; 2639 // tmp.hub6 = state->hub6;
2627 // tmp.io_type = state->io_type; 2640 // tmp.io_type = state->io_type;
2628 2641
2629 2642
2630 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 2643 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
2631 return -EFAULT; 2644 return -EFAULT;
2632 return 0; 2645 return 0;
2633 } 2646 }
2634 2647
2635 static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg) 2648 static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
2636 { 2649 {
2637 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2650 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2638 struct async_icount cnow; 2651 struct async_icount cnow;
2639 struct async_icount cprev; 2652 struct async_icount cprev;
2640 2653
2641 dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd); 2654 dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd);
2642 2655
2643 switch (cmd) { 2656 switch (cmd) {
2644 case TIOCINQ: 2657 case TIOCINQ:
2645 dbg("%s - (%d) TIOCINQ", __FUNCTION__, port->number); 2658 dbg("%s - (%d) TIOCINQ", __FUNCTION__, port->number);
2646 // return get_number_bytes_avail(edge_port, (unsigned int *) arg); 2659 // return get_number_bytes_avail(edge_port, (unsigned int *) arg);
2647 break; 2660 break;
2648 2661
2649 case TIOCSERGETLSR: 2662 case TIOCSERGETLSR:
2650 dbg("%s - (%d) TIOCSERGETLSR", __FUNCTION__, port->number); 2663 dbg("%s - (%d) TIOCSERGETLSR", __FUNCTION__, port->number);
2651 // return get_lsr_info(edge_port, (unsigned int *) arg); 2664 // return get_lsr_info(edge_port, (unsigned int *) arg);
2652 break; 2665 break;
2653 2666
2654 case TIOCGSERIAL: 2667 case TIOCGSERIAL:
2655 dbg("%s - (%d) TIOCGSERIAL", __FUNCTION__, port->number); 2668 dbg("%s - (%d) TIOCGSERIAL", __FUNCTION__, port->number);
2656 return get_serial_info(edge_port, (struct serial_struct __user *) arg); 2669 return get_serial_info(edge_port, (struct serial_struct __user *) arg);
2657 break; 2670 break;
2658 2671
2659 case TIOCSSERIAL: 2672 case TIOCSSERIAL:
2660 dbg("%s - (%d) TIOCSSERIAL", __FUNCTION__, port->number); 2673 dbg("%s - (%d) TIOCSSERIAL", __FUNCTION__, port->number);
2661 break; 2674 break;
2662 2675
2663 case TIOCMIWAIT: 2676 case TIOCMIWAIT:
2664 dbg("%s - (%d) TIOCMIWAIT", __FUNCTION__, port->number); 2677 dbg("%s - (%d) TIOCMIWAIT", __FUNCTION__, port->number);
2665 cprev = edge_port->icount; 2678 cprev = edge_port->icount;
2666 while (1) { 2679 while (1) {
2667 interruptible_sleep_on(&edge_port->delta_msr_wait); 2680 interruptible_sleep_on(&edge_port->delta_msr_wait);
2668 /* see if a signal did it */ 2681 /* see if a signal did it */
2669 if (signal_pending(current)) 2682 if (signal_pending(current))
2670 return -ERESTARTSYS; 2683 return -ERESTARTSYS;
2671 cnow = edge_port->icount; 2684 cnow = edge_port->icount;
2672 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 2685 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
2673 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) 2686 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
2674 return -EIO; /* no change => error */ 2687 return -EIO; /* no change => error */
2675 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || 2688 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
2676 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || 2689 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
2677 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || 2690 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
2678 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) { 2691 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
2679 return 0; 2692 return 0;
2680 } 2693 }
2681 cprev = cnow; 2694 cprev = cnow;
2682 } 2695 }
2683 /* not reached */ 2696 /* not reached */
2684 break; 2697 break;
2685 2698
2686 case TIOCGICOUNT: 2699 case TIOCGICOUNT:
2687 dbg ("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__, 2700 dbg ("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__,
2688 port->number, edge_port->icount.rx, edge_port->icount.tx); 2701 port->number, edge_port->icount.rx, edge_port->icount.tx);
2689 if (copy_to_user((void __user *)arg, &edge_port->icount, sizeof(edge_port->icount))) 2702 if (copy_to_user((void __user *)arg, &edge_port->icount, sizeof(edge_port->icount)))
2690 return -EFAULT; 2703 return -EFAULT;
2691 return 0; 2704 return 0;
2692 } 2705 }
2693 2706
2694 return -ENOIOCTLCMD; 2707 return -ENOIOCTLCMD;
2695 } 2708 }
2696 2709
2697 static void edge_break (struct usb_serial_port *port, int break_state) 2710 static void edge_break (struct usb_serial_port *port, int break_state)
2698 { 2711 {
2699 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2712 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2700 int status; 2713 int status;
2701 2714
2702 dbg ("%s - state = %d", __FUNCTION__, break_state); 2715 dbg ("%s - state = %d", __FUNCTION__, break_state);
2703 2716
2704 /* chase the port close */ 2717 /* chase the port close */
2705 TIChasePort (edge_port, 0, 0); 2718 TIChasePort (edge_port, 0, 0);
2706 2719
2707 if (break_state == -1) { 2720 if (break_state == -1) {
2708 status = TISetBreak (edge_port); 2721 status = TISetBreak (edge_port);
2709 } else { 2722 } else {
2710 status = TIClearBreak (edge_port); 2723 status = TIClearBreak (edge_port);
2711 } 2724 }
2712 if (status) { 2725 if (status) {
2713 dbg ("%s - error %d sending break set/clear command.", 2726 dbg ("%s - error %d sending break set/clear command.",
2714 __FUNCTION__, status); 2727 __FUNCTION__, status);
2715 } 2728 }
2716 } 2729 }
2717 2730
2718 static int edge_startup (struct usb_serial *serial) 2731 static int edge_startup (struct usb_serial *serial)
2719 { 2732 {
2720 struct edgeport_serial *edge_serial; 2733 struct edgeport_serial *edge_serial;
2721 struct edgeport_port *edge_port; 2734 struct edgeport_port *edge_port;
2722 struct usb_device *dev; 2735 struct usb_device *dev;
2723 int status; 2736 int status;
2724 int i; 2737 int i;
2725 2738
2726 dev = serial->dev; 2739 dev = serial->dev;
2727 2740
2728 /* create our private serial structure */ 2741 /* create our private serial structure */
2729 edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); 2742 edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL);
2730 if (edge_serial == NULL) { 2743 if (edge_serial == NULL) {
2731 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); 2744 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
2732 return -ENOMEM; 2745 return -ENOMEM;
2733 } 2746 }
2734 sema_init(&edge_serial->es_sem, 1); 2747 sema_init(&edge_serial->es_sem, 1);
2735 edge_serial->serial = serial; 2748 edge_serial->serial = serial;
2736 usb_set_serial_data(serial, edge_serial); 2749 usb_set_serial_data(serial, edge_serial);
2737 2750
2738 status = TIDownloadFirmware (edge_serial); 2751 status = TIDownloadFirmware (edge_serial);
2739 if (status) { 2752 if (status) {
2740 kfree (edge_serial); 2753 kfree (edge_serial);
2741 return status; 2754 return status;
2742 } 2755 }
2743 2756
2744 /* set up our port private structures */ 2757 /* set up our port private structures */
2745 for (i = 0; i < serial->num_ports; ++i) { 2758 for (i = 0; i < serial->num_ports; ++i) {
2746 edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL); 2759 edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL);
2747 if (edge_port == NULL) { 2760 if (edge_port == NULL) {
2748 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); 2761 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
2749 goto cleanup; 2762 goto cleanup;
2750 } 2763 }
2751 spin_lock_init(&edge_port->ep_lock); 2764 spin_lock_init(&edge_port->ep_lock);
2752 edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE); 2765 edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE);
2753 if (edge_port->ep_out_buf == NULL) { 2766 if (edge_port->ep_out_buf == NULL) {
2754 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); 2767 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
2755 kfree(edge_port); 2768 kfree(edge_port);
2756 goto cleanup; 2769 goto cleanup;
2757 } 2770 }
2758 edge_port->port = serial->port[i]; 2771 edge_port->port = serial->port[i];
2759 edge_port->edge_serial = edge_serial; 2772 edge_port->edge_serial = edge_serial;
2760 usb_set_serial_port_data(serial->port[i], edge_port); 2773 usb_set_serial_port_data(serial->port[i], edge_port);
2761 edge_port->bUartMode = 0; /* Default is RS232 */ 2774 edge_port->bUartMode = default_uart_mode;
2762 } 2775 }
2763 2776
2764 return 0; 2777 return 0;
2765 2778
2766 cleanup: 2779 cleanup:
2767 for (--i; i>=0; --i) { 2780 for (--i; i>=0; --i) {
2768 edge_port = usb_get_serial_port_data(serial->port[i]); 2781 edge_port = usb_get_serial_port_data(serial->port[i]);
2769 edge_buf_free(edge_port->ep_out_buf); 2782 edge_buf_free(edge_port->ep_out_buf);
2770 kfree(edge_port); 2783 kfree(edge_port);
2771 usb_set_serial_port_data(serial->port[i], NULL); 2784 usb_set_serial_port_data(serial->port[i], NULL);
2772 } 2785 }
2773 kfree (edge_serial); 2786 kfree (edge_serial);
2774 usb_set_serial_data(serial, NULL); 2787 usb_set_serial_data(serial, NULL);
2775 return -ENOMEM; 2788 return -ENOMEM;
2776 } 2789 }
2777 2790
2778 static void edge_shutdown (struct usb_serial *serial) 2791 static void edge_shutdown (struct usb_serial *serial)
2779 { 2792 {
2780 int i; 2793 int i;
2781 struct edgeport_port *edge_port; 2794 struct edgeport_port *edge_port;
2782 2795
2783 dbg ("%s", __FUNCTION__); 2796 dbg ("%s", __FUNCTION__);
2784 2797
2785 for (i=0; i < serial->num_ports; ++i) { 2798 for (i=0; i < serial->num_ports; ++i) {
2786 edge_port = usb_get_serial_port_data(serial->port[i]); 2799 edge_port = usb_get_serial_port_data(serial->port[i]);
2800 edge_remove_sysfs_attrs(edge_port->port);
2787 if (edge_port) { 2801 if (edge_port) {
2788 edge_buf_free(edge_port->ep_out_buf); 2802 edge_buf_free(edge_port->ep_out_buf);
2789 kfree(edge_port); 2803 kfree(edge_port);
2790 } 2804 }
2791 usb_set_serial_port_data(serial->port[i], NULL); 2805 usb_set_serial_port_data(serial->port[i], NULL);
2792 } 2806 }
2793 kfree (usb_get_serial_data(serial)); 2807 kfree (usb_get_serial_data(serial));
2794 usb_set_serial_data(serial, NULL); 2808 usb_set_serial_data(serial, NULL);
2795 } 2809 }
2796 2810
2797 2811
2812 /* Sysfs Attributes */
2813
2814 static ssize_t show_uart_mode(struct device *dev,
2815 struct device_attribute *attr, char *buf)
2816 {
2817 struct usb_serial_port *port = to_usb_serial_port(dev);
2818 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2819
2820 return sprintf(buf, "%d\n", edge_port->bUartMode);
2821 }
2822
2823 static ssize_t store_uart_mode(struct device *dev,
2824 struct device_attribute *attr, const char *valbuf, size_t count)
2825 {
2826 struct usb_serial_port *port = to_usb_serial_port(dev);
2827 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2828 unsigned int v = simple_strtoul(valbuf, NULL, 0);
2829
2830 dbg("%s: setting uart_mode = %d", __FUNCTION__, v);
2831
2832 if (v < 256)
2833 edge_port->bUartMode = v;
2834 else
2835 dev_err(dev, "%s - uart_mode %d is invalid\n", __FUNCTION__, v);
2836
2837 return count;
2838 }
2839
2840 static DEVICE_ATTR(uart_mode, S_IWUSR | S_IRUGO, show_uart_mode, store_uart_mode);
2841
2842 static int edge_create_sysfs_attrs(struct usb_serial_port *port)
2843 {
2844 return device_create_file(&port->dev, &dev_attr_uart_mode);
2845 }
2846
2847 static int edge_remove_sysfs_attrs(struct usb_serial_port *port)
2848 {
2849 device_remove_file(&port->dev, &dev_attr_uart_mode);
2850 return 0;
2851 }
2852
2853
2798 /* Circular Buffer */ 2854 /* Circular Buffer */
2799 2855
2800 /* 2856 /*
2801 * edge_buf_alloc 2857 * edge_buf_alloc
2802 * 2858 *
2803 * Allocate a circular buffer and all associated memory. 2859 * Allocate a circular buffer and all associated memory.
2804 */ 2860 */
2805 2861
2806 static struct edge_buf *edge_buf_alloc(unsigned int size) 2862 static struct edge_buf *edge_buf_alloc(unsigned int size)
2807 { 2863 {
2808 struct edge_buf *eb; 2864 struct edge_buf *eb;
2809 2865
2810 2866
2811 if (size == 0) 2867 if (size == 0)
2812 return NULL; 2868 return NULL;
2813 2869
2814 eb = kmalloc(sizeof(struct edge_buf), GFP_KERNEL); 2870 eb = kmalloc(sizeof(struct edge_buf), GFP_KERNEL);
2815 if (eb == NULL) 2871 if (eb == NULL)
2816 return NULL; 2872 return NULL;
2817 2873
2818 eb->buf_buf = kmalloc(size, GFP_KERNEL); 2874 eb->buf_buf = kmalloc(size, GFP_KERNEL);
2819 if (eb->buf_buf == NULL) { 2875 if (eb->buf_buf == NULL) {
2820 kfree(eb); 2876 kfree(eb);
2821 return NULL; 2877 return NULL;
2822 } 2878 }
2823 2879
2824 eb->buf_size = size; 2880 eb->buf_size = size;
2825 eb->buf_get = eb->buf_put = eb->buf_buf; 2881 eb->buf_get = eb->buf_put = eb->buf_buf;
2826 2882
2827 return eb; 2883 return eb;
2828 } 2884 }
2829 2885
2830 2886
2831 /* 2887 /*
2832 * edge_buf_free 2888 * edge_buf_free
2833 * 2889 *
2834 * Free the buffer and all associated memory. 2890 * Free the buffer and all associated memory.
2835 */ 2891 */
2836 2892
2837 static void edge_buf_free(struct edge_buf *eb) 2893 static void edge_buf_free(struct edge_buf *eb)
2838 { 2894 {
2839 if (eb) { 2895 if (eb) {
2840 kfree(eb->buf_buf); 2896 kfree(eb->buf_buf);
2841 kfree(eb); 2897 kfree(eb);
2842 } 2898 }
2843 } 2899 }
2844 2900
2845 2901
2846 /* 2902 /*
2847 * edge_buf_clear 2903 * edge_buf_clear
2848 * 2904 *
2849 * Clear out all data in the circular buffer. 2905 * Clear out all data in the circular buffer.
2850 */ 2906 */
2851 2907
2852 static void edge_buf_clear(struct edge_buf *eb) 2908 static void edge_buf_clear(struct edge_buf *eb)
2853 { 2909 {
2854 if (eb != NULL) 2910 if (eb != NULL)
2855 eb->buf_get = eb->buf_put; 2911 eb->buf_get = eb->buf_put;
2856 /* equivalent to a get of all data available */ 2912 /* equivalent to a get of all data available */
2857 } 2913 }
2858 2914
2859 2915
2860 /* 2916 /*
2861 * edge_buf_data_avail 2917 * edge_buf_data_avail
2862 * 2918 *
2863 * Return the number of bytes of data available in the circular 2919 * Return the number of bytes of data available in the circular
2864 * buffer. 2920 * buffer.
2865 */ 2921 */
2866 2922
2867 static unsigned int edge_buf_data_avail(struct edge_buf *eb) 2923 static unsigned int edge_buf_data_avail(struct edge_buf *eb)
2868 { 2924 {
2869 if (eb != NULL) 2925 if (eb != NULL)
2870 return ((eb->buf_size + eb->buf_put - eb->buf_get) % eb->buf_size); 2926 return ((eb->buf_size + eb->buf_put - eb->buf_get) % eb->buf_size);
2871 else 2927 else
2872 return 0; 2928 return 0;
2873 } 2929 }
2874 2930
2875 2931
2876 /* 2932 /*
2877 * edge_buf_space_avail 2933 * edge_buf_space_avail
2878 * 2934 *
2879 * Return the number of bytes of space available in the circular 2935 * Return the number of bytes of space available in the circular
2880 * buffer. 2936 * buffer.
2881 */ 2937 */
2882 2938
2883 static unsigned int edge_buf_space_avail(struct edge_buf *eb) 2939 static unsigned int edge_buf_space_avail(struct edge_buf *eb)
2884 { 2940 {
2885 if (eb != NULL) 2941 if (eb != NULL)
2886 return ((eb->buf_size + eb->buf_get - eb->buf_put - 1) % eb->buf_size); 2942 return ((eb->buf_size + eb->buf_get - eb->buf_put - 1) % eb->buf_size);
2887 else 2943 else
2888 return 0; 2944 return 0;
2889 } 2945 }
2890 2946
2891 2947
2892 /* 2948 /*
2893 * edge_buf_put 2949 * edge_buf_put
2894 * 2950 *
2895 * Copy data data from a user buffer and put it into the circular buffer. 2951 * Copy data data from a user buffer and put it into the circular buffer.
2896 * Restrict to the amount of space available. 2952 * Restrict to the amount of space available.
2897 * 2953 *
2898 * Return the number of bytes copied. 2954 * Return the number of bytes copied.
2899 */ 2955 */
2900 2956
2901 static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf, 2957 static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf,
2902 unsigned int count) 2958 unsigned int count)
2903 { 2959 {
2904 unsigned int len; 2960 unsigned int len;
2905 2961
2906 2962
2907 if (eb == NULL) 2963 if (eb == NULL)
2908 return 0; 2964 return 0;
2909 2965
2910 len = edge_buf_space_avail(eb); 2966 len = edge_buf_space_avail(eb);
2911 if (count > len) 2967 if (count > len)
2912 count = len; 2968 count = len;
2913 2969
2914 if (count == 0) 2970 if (count == 0)
2915 return 0; 2971 return 0;
2916 2972
2917 len = eb->buf_buf + eb->buf_size - eb->buf_put; 2973 len = eb->buf_buf + eb->buf_size - eb->buf_put;
2918 if (count > len) { 2974 if (count > len) {
2919 memcpy(eb->buf_put, buf, len); 2975 memcpy(eb->buf_put, buf, len);
2920 memcpy(eb->buf_buf, buf+len, count - len); 2976 memcpy(eb->buf_buf, buf+len, count - len);
2921 eb->buf_put = eb->buf_buf + count - len; 2977 eb->buf_put = eb->buf_buf + count - len;
2922 } else { 2978 } else {
2923 memcpy(eb->buf_put, buf, count); 2979 memcpy(eb->buf_put, buf, count);
2924 if (count < len) 2980 if (count < len)
2925 eb->buf_put += count; 2981 eb->buf_put += count;
2926 else /* count == len */ 2982 else /* count == len */
2927 eb->buf_put = eb->buf_buf; 2983 eb->buf_put = eb->buf_buf;
2928 } 2984 }
2929 2985
2930 return count; 2986 return count;
2931 } 2987 }
2932 2988
2933 2989
2934 /* 2990 /*
2935 * edge_buf_get 2991 * edge_buf_get
2936 * 2992 *
2937 * Get data from the circular buffer and copy to the given buffer. 2993 * Get data from the circular buffer and copy to the given buffer.
2938 * Restrict to the amount of data available. 2994 * Restrict to the amount of data available.
2939 * 2995 *
2940 * Return the number of bytes copied. 2996 * Return the number of bytes copied.
2941 */ 2997 */
2942 2998
2943 static unsigned int edge_buf_get(struct edge_buf *eb, char *buf, 2999 static unsigned int edge_buf_get(struct edge_buf *eb, char *buf,
2944 unsigned int count) 3000 unsigned int count)
2945 { 3001 {
2946 unsigned int len; 3002 unsigned int len;
2947 3003
2948 3004
2949 if (eb == NULL) 3005 if (eb == NULL)
2950 return 0; 3006 return 0;
2951 3007
2952 len = edge_buf_data_avail(eb); 3008 len = edge_buf_data_avail(eb);
2953 if (count > len) 3009 if (count > len)
2954 count = len; 3010 count = len;
2955 3011
2956 if (count == 0) 3012 if (count == 0)
2957 return 0; 3013 return 0;
2958 3014
2959 len = eb->buf_buf + eb->buf_size - eb->buf_get; 3015 len = eb->buf_buf + eb->buf_size - eb->buf_get;
2960 if (count > len) { 3016 if (count > len) {
2961 memcpy(buf, eb->buf_get, len); 3017 memcpy(buf, eb->buf_get, len);
2962 memcpy(buf+len, eb->buf_buf, count - len); 3018 memcpy(buf+len, eb->buf_buf, count - len);
2963 eb->buf_get = eb->buf_buf + count - len; 3019 eb->buf_get = eb->buf_buf + count - len;
2964 } else { 3020 } else {
2965 memcpy(buf, eb->buf_get, count); 3021 memcpy(buf, eb->buf_get, count);
2966 if (count < len) 3022 if (count < len)
2967 eb->buf_get += count; 3023 eb->buf_get += count;
2968 else /* count == len */ 3024 else /* count == len */
2969 eb->buf_get = eb->buf_buf; 3025 eb->buf_get = eb->buf_buf;
2970 } 3026 }
2971 3027
2972 return count; 3028 return count;
2973 } 3029 }
2974 3030
2975 3031
2976 static struct usb_serial_driver edgeport_1port_device = { 3032 static struct usb_serial_driver edgeport_1port_device = {
2977 .driver = { 3033 .driver = {
2978 .owner = THIS_MODULE, 3034 .owner = THIS_MODULE,
2979 .name = "edgeport_ti_1", 3035 .name = "edgeport_ti_1",
2980 }, 3036 },
2981 .description = "Edgeport TI 1 port adapter", 3037 .description = "Edgeport TI 1 port adapter",
2982 .usb_driver = &io_driver, 3038 .usb_driver = &io_driver,
2983 .id_table = edgeport_1port_id_table, 3039 .id_table = edgeport_1port_id_table,
2984 .num_interrupt_in = 1, 3040 .num_interrupt_in = 1,
2985 .num_bulk_in = 1, 3041 .num_bulk_in = 1,
2986 .num_bulk_out = 1, 3042 .num_bulk_out = 1,
2987 .num_ports = 1, 3043 .num_ports = 1,
2988 .open = edge_open, 3044 .open = edge_open,
2989 .close = edge_close, 3045 .close = edge_close,
2990 .throttle = edge_throttle, 3046 .throttle = edge_throttle,
2991 .unthrottle = edge_unthrottle, 3047 .unthrottle = edge_unthrottle,
2992 .attach = edge_startup, 3048 .attach = edge_startup,
2993 .shutdown = edge_shutdown, 3049 .shutdown = edge_shutdown,
3050 .port_probe = edge_create_sysfs_attrs,
2994 .ioctl = edge_ioctl, 3051 .ioctl = edge_ioctl,
2995 .set_termios = edge_set_termios, 3052 .set_termios = edge_set_termios,
2996 .tiocmget = edge_tiocmget, 3053 .tiocmget = edge_tiocmget,
2997 .tiocmset = edge_tiocmset, 3054 .tiocmset = edge_tiocmset,
2998 .write = edge_write, 3055 .write = edge_write,
2999 .write_room = edge_write_room, 3056 .write_room = edge_write_room,
3000 .chars_in_buffer = edge_chars_in_buffer, 3057 .chars_in_buffer = edge_chars_in_buffer,
3001 .break_ctl = edge_break, 3058 .break_ctl = edge_break,
3002 .read_int_callback = edge_interrupt_callback, 3059 .read_int_callback = edge_interrupt_callback,
3003 .read_bulk_callback = edge_bulk_in_callback, 3060 .read_bulk_callback = edge_bulk_in_callback,
3004 .write_bulk_callback = edge_bulk_out_callback, 3061 .write_bulk_callback = edge_bulk_out_callback,
3005 }; 3062 };
3006 3063
3007 static struct usb_serial_driver edgeport_2port_device = { 3064 static struct usb_serial_driver edgeport_2port_device = {
3008 .driver = { 3065 .driver = {
3009 .owner = THIS_MODULE, 3066 .owner = THIS_MODULE,
3010 .name = "edgeport_ti_2", 3067 .name = "edgeport_ti_2",
3011 }, 3068 },
3012 .description = "Edgeport TI 2 port adapter", 3069 .description = "Edgeport TI 2 port adapter",
3013 .usb_driver = &io_driver, 3070 .usb_driver = &io_driver,
3014 .id_table = edgeport_2port_id_table, 3071 .id_table = edgeport_2port_id_table,
3015 .num_interrupt_in = 1, 3072 .num_interrupt_in = 1,
3016 .num_bulk_in = 2, 3073 .num_bulk_in = 2,
3017 .num_bulk_out = 2, 3074 .num_bulk_out = 2,
3018 .num_ports = 2, 3075 .num_ports = 2,
3019 .open = edge_open, 3076 .open = edge_open,
3020 .close = edge_close, 3077 .close = edge_close,
3021 .throttle = edge_throttle, 3078 .throttle = edge_throttle,
3022 .unthrottle = edge_unthrottle, 3079 .unthrottle = edge_unthrottle,
3023 .attach = edge_startup, 3080 .attach = edge_startup,
3024 .shutdown = edge_shutdown, 3081 .shutdown = edge_shutdown,
3082 .port_probe = edge_create_sysfs_attrs,
3025 .ioctl = edge_ioctl, 3083 .ioctl = edge_ioctl,
3026 .set_termios = edge_set_termios, 3084 .set_termios = edge_set_termios,
3027 .tiocmget = edge_tiocmget, 3085 .tiocmget = edge_tiocmget,
3028 .tiocmset = edge_tiocmset, 3086 .tiocmset = edge_tiocmset,
3029 .write = edge_write, 3087 .write = edge_write,
3030 .write_room = edge_write_room, 3088 .write_room = edge_write_room,
3031 .chars_in_buffer = edge_chars_in_buffer, 3089 .chars_in_buffer = edge_chars_in_buffer,
3032 .break_ctl = edge_break, 3090 .break_ctl = edge_break,
3033 .read_int_callback = edge_interrupt_callback, 3091 .read_int_callback = edge_interrupt_callback,
3034 .read_bulk_callback = edge_bulk_in_callback, 3092 .read_bulk_callback = edge_bulk_in_callback,
3035 .write_bulk_callback = edge_bulk_out_callback, 3093 .write_bulk_callback = edge_bulk_out_callback,
3036 }; 3094 };
3037 3095
3038 3096
3039 static int __init edgeport_init(void) 3097 static int __init edgeport_init(void)
3040 { 3098 {
3041 int retval; 3099 int retval;
3042 retval = usb_serial_register(&edgeport_1port_device); 3100 retval = usb_serial_register(&edgeport_1port_device);
3043 if (retval) 3101 if (retval)
3044 goto failed_1port_device_register; 3102 goto failed_1port_device_register;
3045 retval = usb_serial_register(&edgeport_2port_device); 3103 retval = usb_serial_register(&edgeport_2port_device);
3046 if (retval) 3104 if (retval)
3047 goto failed_2port_device_register; 3105 goto failed_2port_device_register;
3048 retval = usb_register(&io_driver); 3106 retval = usb_register(&io_driver);
3049 if (retval) 3107 if (retval)
3050 goto failed_usb_register; 3108 goto failed_usb_register;
3051 info(DRIVER_DESC " " DRIVER_VERSION); 3109 info(DRIVER_DESC " " DRIVER_VERSION);
3052 return 0; 3110 return 0;
3053 failed_usb_register: 3111 failed_usb_register:
3054 usb_serial_deregister(&edgeport_2port_device); 3112 usb_serial_deregister(&edgeport_2port_device);
3055 failed_2port_device_register: 3113 failed_2port_device_register:
3056 usb_serial_deregister(&edgeport_1port_device); 3114 usb_serial_deregister(&edgeport_1port_device);
3057 failed_1port_device_register: 3115 failed_1port_device_register:
3058 return retval; 3116 return retval;
3059 } 3117 }
3060 3118
3061 static void __exit edgeport_exit (void) 3119 static void __exit edgeport_exit (void)
3062 { 3120 {
3063 usb_deregister (&io_driver); 3121 usb_deregister (&io_driver);
3064 usb_serial_deregister (&edgeport_1port_device); 3122 usb_serial_deregister (&edgeport_1port_device);
3065 usb_serial_deregister (&edgeport_2port_device); 3123 usb_serial_deregister (&edgeport_2port_device);
3066 } 3124 }
3067 3125
3068 module_init(edgeport_init); 3126 module_init(edgeport_init);
3069 module_exit(edgeport_exit); 3127 module_exit(edgeport_exit);
3070 3128
3071 /* Module information */ 3129 /* Module information */
3072 MODULE_AUTHOR(DRIVER_AUTHOR); 3130 MODULE_AUTHOR(DRIVER_AUTHOR);
3073 MODULE_DESCRIPTION(DRIVER_DESC); 3131 MODULE_DESCRIPTION(DRIVER_DESC);
3074 MODULE_LICENSE("GPL"); 3132 MODULE_LICENSE("GPL");
3075 3133
3076 module_param(debug, bool, S_IRUGO | S_IWUSR); 3134 module_param(debug, bool, S_IRUGO | S_IWUSR);
3077 MODULE_PARM_DESC(debug, "Debug enabled or not"); 3135 MODULE_PARM_DESC(debug, "Debug enabled or not");
3078 3136
3079 module_param(low_latency, bool, S_IRUGO | S_IWUSR); 3137 module_param(low_latency, bool, S_IRUGO | S_IWUSR);
3080 MODULE_PARM_DESC(low_latency, "Low latency enabled or not"); 3138 MODULE_PARM_DESC(low_latency, "Low latency enabled or not");
3081 3139
3082 module_param(closing_wait, int, S_IRUGO | S_IWUSR); 3140 module_param(closing_wait, int, S_IRUGO | S_IWUSR);
3083 MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs"); 3141 MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs");
3084 3142
3085 module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR); 3143 module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR);
3086 MODULE_PARM_DESC(ignore_cpu_rev, "Ignore the cpu revision when connecting to a device"); 3144 MODULE_PARM_DESC(ignore_cpu_rev, "Ignore the cpu revision when connecting to a device");
3145
3146 module_param(default_uart_mode, int, S_IRUGO | S_IWUSR);
3147 MODULE_PARM_DESC(default_uart_mode, "Default uart_mode, 0=RS232, ...");
3087 3148
3088 3149
drivers/usb/serial/io_usbvend.h
1 /************************************************************************ 1 /************************************************************************
2 * 2 *
3 * USBVEND.H Vendor-specific USB definitions 3 * USBVEND.H Vendor-specific USB definitions
4 * 4 *
5 * NOTE: This must be kept in sync with the Edgeport firmware and 5 * NOTE: This must be kept in sync with the Edgeport firmware and
6 * must be kept backward-compatible with older firmware. 6 * must be kept backward-compatible with older firmware.
7 * 7 *
8 ************************************************************************ 8 ************************************************************************
9 * 9 *
10 * Copyright (C) 1998 Inside Out Networks, Inc. 10 * Copyright (C) 1998 Inside Out Networks, Inc.
11 * This program is free software; you can redistribute it and/or modify 11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by 12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or 13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version. 14 * (at your option) any later version.
15 * 15 *
16 ************************************************************************/ 16 ************************************************************************/
17 17
18 #if !defined(_USBVEND_H) 18 #if !defined(_USBVEND_H)
19 #define _USBVEND_H 19 #define _USBVEND_H
20 20
21 /************************************************************************ 21 /************************************************************************
22 * 22 *
23 * D e f i n e s / T y p e d e f s 23 * D e f i n e s / T y p e d e f s
24 * 24 *
25 ************************************************************************/ 25 ************************************************************************/
26 26
27 // 27 //
28 // Definitions of USB product IDs 28 // Definitions of USB product IDs
29 // 29 //
30 30
31 #define USB_VENDOR_ID_ION 0x1608 // Our VID 31 #define USB_VENDOR_ID_ION 0x1608 // Our VID
32 #define USB_VENDOR_ID_TI 0x0451 // TI VID 32 #define USB_VENDOR_ID_TI 0x0451 // TI VID
33 #define USB_VENDOR_ID_AXIOHM 0x05D9 /* Axiohm VID */ 33 #define USB_VENDOR_ID_AXIOHM 0x05D9 /* Axiohm VID */
34 34
35 // 35 //
36 // Definitions of USB product IDs (PID) 36 // Definitions of USB product IDs (PID)
37 // We break the USB-defined PID into an OEM Id field (upper 6 bits) 37 // We break the USB-defined PID into an OEM Id field (upper 6 bits)
38 // and a Device Id (bottom 10 bits). The Device Id defines what 38 // and a Device Id (bottom 10 bits). The Device Id defines what
39 // device this actually is regardless of what the OEM wants to 39 // device this actually is regardless of what the OEM wants to
40 // call it. 40 // call it.
41 // 41 //
42 42
43 // ION-device OEM IDs 43 // ION-device OEM IDs
44 #define ION_OEM_ID_ION 0 // 00h Inside Out Networks 44 #define ION_OEM_ID_ION 0 // 00h Inside Out Networks
45 #define ION_OEM_ID_NLYNX 1 // 01h NLynx Systems 45 #define ION_OEM_ID_NLYNX 1 // 01h NLynx Systems
46 #define ION_OEM_ID_GENERIC 2 // 02h Generic OEM 46 #define ION_OEM_ID_GENERIC 2 // 02h Generic OEM
47 #define ION_OEM_ID_MAC 3 // 03h Mac Version 47 #define ION_OEM_ID_MAC 3 // 03h Mac Version
48 #define ION_OEM_ID_MEGAWOLF 4 // 04h Lupusb OEM Mac version (MegaWolf) 48 #define ION_OEM_ID_MEGAWOLF 4 // 04h Lupusb OEM Mac version (MegaWolf)
49 #define ION_OEM_ID_MULTITECH 5 // 05h Multitech Rapidports 49 #define ION_OEM_ID_MULTITECH 5 // 05h Multitech Rapidports
50 #define ION_OEM_ID_AGILENT 6 // 06h AGILENT board 50 #define ION_OEM_ID_AGILENT 6 // 06h AGILENT board
51 51
52 52
53 // ION-device Device IDs 53 // ION-device Device IDs
54 // Product IDs - assigned to match middle digit of serial number (No longer true) 54 // Product IDs - assigned to match middle digit of serial number (No longer true)
55 55
56 #define ION_DEVICE_ID_80251_NETCHIP 0x020 // This bit is set in the PID if this edgeport hardware$ 56 #define ION_DEVICE_ID_80251_NETCHIP 0x020 // This bit is set in the PID if this edgeport hardware$
57 // is based on the 80251+Netchip. 57 // is based on the 80251+Netchip.
58 58
59 #define ION_DEVICE_ID_GENERATION_1 0x00 // Value for 930 based edgeports 59 #define ION_DEVICE_ID_GENERATION_1 0x00 // Value for 930 based edgeports
60 #define ION_DEVICE_ID_GENERATION_2 0x01 // Value for 80251+Netchip. 60 #define ION_DEVICE_ID_GENERATION_2 0x01 // Value for 80251+Netchip.
61 #define ION_DEVICE_ID_GENERATION_3 0x02 // Value for Texas Instruments TUSB5052 chip 61 #define ION_DEVICE_ID_GENERATION_3 0x02 // Value for Texas Instruments TUSB5052 chip
62 #define ION_DEVICE_ID_GENERATION_4 0x03 // Watchport Family of products 62 #define ION_DEVICE_ID_GENERATION_4 0x03 // Watchport Family of products
63 #define ION_GENERATION_MASK 0x03 63 #define ION_GENERATION_MASK 0x03
64 64
65 #define ION_DEVICE_ID_HUB_MASK 0x0080 // This bit in the PID designates a HUB device 65 #define ION_DEVICE_ID_HUB_MASK 0x0080 // This bit in the PID designates a HUB device
66 // for example 8C would be a 421 4 port hub 66 // for example 8C would be a 421 4 port hub
67 // and 8D would be a 2 port embedded hub 67 // and 8D would be a 2 port embedded hub
68 68
69 #define EDGEPORT_DEVICE_ID_MASK 0x0ff // Not including OEM or GENERATION fields 69 #define EDGEPORT_DEVICE_ID_MASK 0x0ff // Not including OEM or GENERATION fields
70 70
71 #define ION_DEVICE_ID_UNCONFIGURED_EDGE_DEVICE 0x000 // In manufacturing only 71 #define ION_DEVICE_ID_UNCONFIGURED_EDGE_DEVICE 0x000 // In manufacturing only
72 #define ION_DEVICE_ID_EDGEPORT_4 0x001 // Edgeport/4 RS232 72 #define ION_DEVICE_ID_EDGEPORT_4 0x001 // Edgeport/4 RS232
73 #define ION_DEVICE_ID_EDGEPORT_8R 0x002 // Edgeport with RJ45 no Ring 73 #define ION_DEVICE_ID_EDGEPORT_8R 0x002 // Edgeport with RJ45 no Ring
74 #define ION_DEVICE_ID_RAPIDPORT_4 0x003 // Rapidport/4 74 #define ION_DEVICE_ID_RAPIDPORT_4 0x003 // Rapidport/4
75 #define ION_DEVICE_ID_EDGEPORT_4T 0x004 // Edgeport/4 RS232 for Telxon (aka "Fleetport") 75 #define ION_DEVICE_ID_EDGEPORT_4T 0x004 // Edgeport/4 RS232 for Telxon (aka "Fleetport")
76 #define ION_DEVICE_ID_EDGEPORT_2 0x005 // Edgeport/2 RS232 76 #define ION_DEVICE_ID_EDGEPORT_2 0x005 // Edgeport/2 RS232
77 #define ION_DEVICE_ID_EDGEPORT_4I 0x006 // Edgeport/4 RS422 77 #define ION_DEVICE_ID_EDGEPORT_4I 0x006 // Edgeport/4 RS422
78 #define ION_DEVICE_ID_EDGEPORT_2I 0x007 // Edgeport/2 RS422/RS485 78 #define ION_DEVICE_ID_EDGEPORT_2I 0x007 // Edgeport/2 RS422/RS485
79 #define ION_DEVICE_ID_EDGEPORT_8RR 0x008 // Edgeport with RJ45 with Data and RTS/CTS only 79 #define ION_DEVICE_ID_EDGEPORT_8RR 0x008 // Edgeport with RJ45 with Data and RTS/CTS only
80 // ION_DEVICE_ID_EDGEPORT_8_HANDBUILT 0x009 // Hand-built Edgeport/8 (Placeholder, used in middle digit of serial number only!) 80 // ION_DEVICE_ID_EDGEPORT_8_HANDBUILT 0x009 // Hand-built Edgeport/8 (Placeholder, used in middle digit of serial number only!)
81 // ION_DEVICE_ID_MULTIMODEM_4X56 0x00A // MultiTech version of RP/4 (Placeholder, used in middle digit of serial number only!) 81 // ION_DEVICE_ID_MULTIMODEM_4X56 0x00A // MultiTech version of RP/4 (Placeholder, used in middle digit of serial number only!)
82 #define ION_DEVICE_ID_EDGEPORT_PARALLEL_PORT 0x00B // Edgeport/(4)21 Parallel port (USS720) 82 #define ION_DEVICE_ID_EDGEPORT_PARALLEL_PORT 0x00B // Edgeport/(4)21 Parallel port (USS720)
83 #define ION_DEVICE_ID_EDGEPORT_421 0x00C // Edgeport/421 Hub+RS232+Parallel 83 #define ION_DEVICE_ID_EDGEPORT_421 0x00C // Edgeport/421 Hub+RS232+Parallel
84 #define ION_DEVICE_ID_EDGEPORT_21 0x00D // Edgeport/21 RS232+Parallel 84 #define ION_DEVICE_ID_EDGEPORT_21 0x00D // Edgeport/21 RS232+Parallel
85 #define ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU 0x00E // Half of an Edgeport/8 (the kind with 2 EP/4s on 1 PCB) 85 #define ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU 0x00E // Half of an Edgeport/8 (the kind with 2 EP/4s on 1 PCB)
86 #define ION_DEVICE_ID_EDGEPORT_8 0x00F // Edgeport/8 (single-CPU) 86 #define ION_DEVICE_ID_EDGEPORT_8 0x00F // Edgeport/8 (single-CPU)
87 #define ION_DEVICE_ID_EDGEPORT_2_DIN 0x010 // Edgeport/2 RS232 with Apple DIN connector 87 #define ION_DEVICE_ID_EDGEPORT_2_DIN 0x010 // Edgeport/2 RS232 with Apple DIN connector
88 #define ION_DEVICE_ID_EDGEPORT_4_DIN 0x011 // Edgeport/4 RS232 with Apple DIN connector 88 #define ION_DEVICE_ID_EDGEPORT_4_DIN 0x011 // Edgeport/4 RS232 with Apple DIN connector
89 #define ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU 0x012 // Half of an Edgeport/16 (the kind with 2 EP/8s) 89 #define ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU 0x012 // Half of an Edgeport/16 (the kind with 2 EP/8s)
90 #define ION_DEVICE_ID_EDGEPORT_COMPATIBLE 0x013 // Edgeport Compatible, for NCR, Axiohm etc. testing 90 #define ION_DEVICE_ID_EDGEPORT_COMPATIBLE 0x013 // Edgeport Compatible, for NCR, Axiohm etc. testing
91 #define ION_DEVICE_ID_EDGEPORT_8I 0x014 // Edgeport/8 RS422 (single-CPU) 91 #define ION_DEVICE_ID_EDGEPORT_8I 0x014 // Edgeport/8 RS422 (single-CPU)
92 #define ION_DEVICE_ID_EDGEPORT_1 0x015 // Edgeport/1 RS232 92 #define ION_DEVICE_ID_EDGEPORT_1 0x015 // Edgeport/1 RS232
93 #define ION_DEVICE_ID_EPOS44 0x016 // Half of an EPOS/44 (TIUMP BASED) 93 #define ION_DEVICE_ID_EPOS44 0x016 // Half of an EPOS/44 (TIUMP BASED)
94 #define ION_DEVICE_ID_EDGEPORT_42 0x017 // Edgeport/42 94 #define ION_DEVICE_ID_EDGEPORT_42 0x017 // Edgeport/42
95 #define ION_DEVICE_ID_EDGEPORT_412_8 0x018 // Edgeport/412 8 port part 95 #define ION_DEVICE_ID_EDGEPORT_412_8 0x018 // Edgeport/412 8 port part
96 #define ION_DEVICE_ID_EDGEPORT_412_4 0x019 // Edgeport/412 4 port part 96 #define ION_DEVICE_ID_EDGEPORT_412_4 0x019 // Edgeport/412 4 port part
97 #define ION_DEVICE_ID_EDGEPORT_22I 0x01A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232 97 #define ION_DEVICE_ID_EDGEPORT_22I 0x01A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232
98 98
99 // Compact Form factor TI based devices 2c, 21c, 22c, 221c 99 // Compact Form factor TI based devices 2c, 21c, 22c, 221c
100 #define ION_DEVICE_ID_EDGEPORT_2C 0x01B // Edgeport/2c is a TI based Edgeport/2 - Small I2c 100 #define ION_DEVICE_ID_EDGEPORT_2C 0x01B // Edgeport/2c is a TI based Edgeport/2 - Small I2c
101 #define ION_DEVICE_ID_EDGEPORT_221C 0x01C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and 101 #define ION_DEVICE_ID_EDGEPORT_221C 0x01C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and
102 // 2 external hub ports - Large I2C 102 // 2 external hub ports - Large I2C
103 #define ION_DEVICE_ID_EDGEPORT_22C 0x01D // Edgeport/22c is a TI based Edgeport/2 with 103 #define ION_DEVICE_ID_EDGEPORT_22C 0x01D // Edgeport/22c is a TI based Edgeport/2 with
104 // 2 external hub ports - Large I2C 104 // 2 external hub ports - Large I2C
105 #define ION_DEVICE_ID_EDGEPORT_21C 0x01E // Edgeport/21c is a TI based Edgeport/2 with lucent chip 105 #define ION_DEVICE_ID_EDGEPORT_21C 0x01E // Edgeport/21c is a TI based Edgeport/2 with lucent chip
106 // Small I2C 106 // Small I2C
107 107
108 108
109 /* 109 /*
110 * DANGER DANGER The 0x20 bit was used to indicate a 8251/netchip GEN 2 device. 110 * DANGER DANGER The 0x20 bit was used to indicate a 8251/netchip GEN 2 device.
111 * Since the MAC, Linux, and Optimal drivers still used the old code 111 * Since the MAC, Linux, and Optimal drivers still used the old code
112 * I suggest that you skip the 0x20 bit when creating new PIDs 112 * I suggest that you skip the 0x20 bit when creating new PIDs
113 */ 113 */
114 114
115 115
116 // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C) 116 // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C)
117 #define ION_DEVICE_ID_TI3410_EDGEPORT_1 0x040 // Edgeport/1 RS232 117 #define ION_DEVICE_ID_TI3410_EDGEPORT_1 0x040 // Edgeport/1 RS232
118 #define ION_DEVICE_ID_TI3410_EDGEPORT_1I 0x041 // Edgeport/1i- RS422 model 118 #define ION_DEVICE_ID_TI3410_EDGEPORT_1I 0x041 // Edgeport/1i- RS422 model
119 119
120 // Ti based software switchable RS232/RS422/RS485 devices 120 // Ti based software switchable RS232/RS422/RS485 devices
121 #define ION_DEVICE_ID_EDGEPORT_4S 0x042 // Edgeport/4s - software switchable model 121 #define ION_DEVICE_ID_EDGEPORT_4S 0x042 // Edgeport/4s - software switchable model
122 #define ION_DEVICE_ID_EDGEPORT_8S 0x043 // Edgeport/8s - software switchable model 122 #define ION_DEVICE_ID_EDGEPORT_8S 0x043 // Edgeport/8s - software switchable model
123 123
124 // Usb to Ethernet dongle 124 // Usb to Ethernet dongle
125 #define ION_DEVICE_ID_EDGEPORT_E 0x0E0 // Edgeport/E Usb to Ethernet 125 #define ION_DEVICE_ID_EDGEPORT_E 0x0E0 // Edgeport/E Usb to Ethernet
126 126
127 // Edgeport TI based devices 127 // Edgeport TI based devices
128 #define ION_DEVICE_ID_TI_EDGEPORT_4 0x0201 // Edgeport/4 RS232 128 #define ION_DEVICE_ID_TI_EDGEPORT_4 0x0201 // Edgeport/4 RS232
129 #define ION_DEVICE_ID_TI_EDGEPORT_2 0x0205 // Edgeport/2 RS232 129 #define ION_DEVICE_ID_TI_EDGEPORT_2 0x0205 // Edgeport/2 RS232
130 #define ION_DEVICE_ID_TI_EDGEPORT_4I 0x0206 // Edgeport/4i RS422 130 #define ION_DEVICE_ID_TI_EDGEPORT_4I 0x0206 // Edgeport/4i RS422
131 #define ION_DEVICE_ID_TI_EDGEPORT_2I 0x0207 // Edgeport/2i RS422/RS485 131 #define ION_DEVICE_ID_TI_EDGEPORT_2I 0x0207 // Edgeport/2i RS422/RS485
132 #define ION_DEVICE_ID_TI_EDGEPORT_421 0x020C // Edgeport/421 4 hub 2 RS232 + Parallel (lucent on a different hub port) 132 #define ION_DEVICE_ID_TI_EDGEPORT_421 0x020C // Edgeport/421 4 hub 2 RS232 + Parallel (lucent on a different hub port)
133 #define ION_DEVICE_ID_TI_EDGEPORT_21 0x020D // Edgeport/21 2 RS232 + Parallel (lucent on a different hub port) 133 #define ION_DEVICE_ID_TI_EDGEPORT_21 0x020D // Edgeport/21 2 RS232 + Parallel (lucent on a different hub port)
134 #define ION_DEVICE_ID_TI_EDGEPORT_8 0x020F // Edgeport/8 (single-CPU) 134 #define ION_DEVICE_ID_TI_EDGEPORT_416 0x0212 // Edgeport/416
135 #define ION_DEVICE_ID_TI_EDGEPORT_1 0x0215 // Edgeport/1 RS232 135 #define ION_DEVICE_ID_TI_EDGEPORT_1 0x0215 // Edgeport/1 RS232
136 #define ION_DEVICE_ID_TI_EDGEPORT_42 0x0217 // Edgeport/42 4 hub 2 RS232 136 #define ION_DEVICE_ID_TI_EDGEPORT_42 0x0217 // Edgeport/42 4 hub 2 RS232
137 #define ION_DEVICE_ID_TI_EDGEPORT_22I 0x021A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232 137 #define ION_DEVICE_ID_TI_EDGEPORT_22I 0x021A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232
138 #define ION_DEVICE_ID_TI_EDGEPORT_2C 0x021B // Edgeport/2c RS232 138 #define ION_DEVICE_ID_TI_EDGEPORT_2C 0x021B // Edgeport/2c RS232
139 #define ION_DEVICE_ID_TI_EDGEPORT_221C 0x021C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and 139 #define ION_DEVICE_ID_TI_EDGEPORT_221C 0x021C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and
140 // 2 external hub ports - Large I2C 140 // 2 external hub ports - Large I2C
141 #define ION_DEVICE_ID_TI_EDGEPORT_22C 0x021D // Edgeport/22c is a TI based Edgeport/2 with 141 #define ION_DEVICE_ID_TI_EDGEPORT_22C 0x021D // Edgeport/22c is a TI based Edgeport/2 with
142 // 2 external hub ports - Large I2C 142 // 2 external hub ports - Large I2C
143 #define ION_DEVICE_ID_TI_EDGEPORT_21C 0x021E // Edgeport/21c is a TI based Edgeport/2 with lucent chip 143 #define ION_DEVICE_ID_TI_EDGEPORT_21C 0x021E // Edgeport/21c is a TI based Edgeport/2 with lucent chip
144 144
145 // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C) 145 // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C)
146 #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1 0x240 // Edgeport/1 RS232 146 #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1 0x0240 // Edgeport/1 RS232
147 #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I 0x241 // Edgeport/1i- RS422 model 147 #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I 0x0241 // Edgeport/1i- RS422 model
148 148
149 // Ti based software switchable RS232/RS422/RS485 devices 149 // Ti based software switchable RS232/RS422/RS485 devices
150 #define ION_DEVICE_ID_TI_EDGEPORT_4S 0x242 // Edgeport/4s - software switchable model 150 #define ION_DEVICE_ID_TI_EDGEPORT_4S 0x0242 // Edgeport/4s - software switchable model
151 #define ION_DEVICE_ID_IT_EDGEPORT_8S 0x243 // Edgeport/8s - software switchable model 151 #define ION_DEVICE_ID_TI_EDGEPORT_8S 0x0243 // Edgeport/8s - software switchable model
152 #define ION_DEVICE_ID_TI_EDGEPORT_8 0x0244 // Edgeport/8 (single-CPU)
153 #define ION_DEVICE_ID_TI_EDGEPORT_416B 0x0247 // Edgeport/416
152 154
153 155
154 /************************************************************************ 156 /************************************************************************
155 * 157 *
156 * Generation 4 devices 158 * Generation 4 devices
157 * 159 *
158 ************************************************************************/ 160 ************************************************************************/
159 161
160 // Watchport based on 3410 both 1-wire and binary products (16K I2C) 162 // Watchport based on 3410 both 1-wire and binary products (16K I2C)
161 #define ION_DEVICE_ID_WP_UNSERIALIZED 0x300 // Watchport based on 3410 both 1-wire and binary products 163 #define ION_DEVICE_ID_WP_UNSERIALIZED 0x300 // Watchport based on 3410 both 1-wire and binary products
162 #define ION_DEVICE_ID_WP_PROXIMITY 0x301 // Watchport/P Discontinued 164 #define ION_DEVICE_ID_WP_PROXIMITY 0x301 // Watchport/P Discontinued
163 #define ION_DEVICE_ID_WP_MOTION 0x302 // Watchport/M 165 #define ION_DEVICE_ID_WP_MOTION 0x302 // Watchport/M
164 #define ION_DEVICE_ID_WP_MOISTURE 0x303 // Watchport/W 166 #define ION_DEVICE_ID_WP_MOISTURE 0x303 // Watchport/W
165 #define ION_DEVICE_ID_WP_TEMPERATURE 0x304 // Watchport/T 167 #define ION_DEVICE_ID_WP_TEMPERATURE 0x304 // Watchport/T
166 #define ION_DEVICE_ID_WP_HUMIDITY 0x305 // Watchport/H 168 #define ION_DEVICE_ID_WP_HUMIDITY 0x305 // Watchport/H
167 169
168 #define ION_DEVICE_ID_WP_POWER 0x306 // Watchport 170 #define ION_DEVICE_ID_WP_POWER 0x306 // Watchport
169 #define ION_DEVICE_ID_WP_LIGHT 0x307 // Watchport 171 #define ION_DEVICE_ID_WP_LIGHT 0x307 // Watchport
170 #define ION_DEVICE_ID_WP_RADIATION 0x308 // Watchport 172 #define ION_DEVICE_ID_WP_RADIATION 0x308 // Watchport
171 #define ION_DEVICE_ID_WP_ACCELERATION 0x309 // Watchport/A 173 #define ION_DEVICE_ID_WP_ACCELERATION 0x309 // Watchport/A
172 #define ION_DEVICE_ID_WP_DISTANCE 0x30A // Watchport/D Discontinued 174 #define ION_DEVICE_ID_WP_DISTANCE 0x30A // Watchport/D Discontinued
173 #define ION_DEVICE_ID_WP_PROX_DIST 0x30B // Watchport/D uses distance sensor 175 #define ION_DEVICE_ID_WP_PROX_DIST 0x30B // Watchport/D uses distance sensor
174 // Default to /P function 176 // Default to /P function
175 177
176 #define ION_DEVICE_ID_PLUS_PWR_HP4CD 0x30C // 5052 Plus Power HubPort/4CD+ (for Dell) 178 #define ION_DEVICE_ID_PLUS_PWR_HP4CD 0x30C // 5052 Plus Power HubPort/4CD+ (for Dell)
177 #define ION_DEVICE_ID_PLUS_PWR_HP4C 0x30D // 5052 Plus Power HubPort/4C+ 179 #define ION_DEVICE_ID_PLUS_PWR_HP4C 0x30D // 5052 Plus Power HubPort/4C+
178 #define ION_DEVICE_ID_PLUS_PWR_PCI 0x30E // 3410 Plus Power PCI Host Controller 4 port 180 #define ION_DEVICE_ID_PLUS_PWR_PCI 0x30E // 3410 Plus Power PCI Host Controller 4 port
179 181
180 182
181 // 183 //
182 // Definitions for AXIOHM USB product IDs 184 // Definitions for AXIOHM USB product IDs
183 // 185 //
184 #define USB_VENDOR_ID_AXIOHM 0x05D9 // Axiohm VID 186 #define USB_VENDOR_ID_AXIOHM 0x05D9 // Axiohm VID
185 187
186 #define AXIOHM_DEVICE_ID_MASK 0xffff 188 #define AXIOHM_DEVICE_ID_MASK 0xffff
187 #define AXIOHM_DEVICE_ID_EPIC_A758 0xA758 189 #define AXIOHM_DEVICE_ID_EPIC_A758 0xA758
188 #define AXIOHM_DEVICE_ID_EPIC_A794 0xA794 190 #define AXIOHM_DEVICE_ID_EPIC_A794 0xA794
189 #define AXIOHM_DEVICE_ID_EPIC_A225 0xA225 191 #define AXIOHM_DEVICE_ID_EPIC_A225 0xA225
190 192
191 193
192 // 194 //
193 // Definitions for NCR USB product IDs 195 // Definitions for NCR USB product IDs
194 // 196 //
195 #define USB_VENDOR_ID_NCR 0x0404 // NCR VID 197 #define USB_VENDOR_ID_NCR 0x0404 // NCR VID
196 198
197 #define NCR_DEVICE_ID_MASK 0xffff 199 #define NCR_DEVICE_ID_MASK 0xffff
198 #define NCR_DEVICE_ID_EPIC_0202 0x0202 200 #define NCR_DEVICE_ID_EPIC_0202 0x0202
199 #define NCR_DEVICE_ID_EPIC_0203 0x0203 201 #define NCR_DEVICE_ID_EPIC_0203 0x0203
200 #define NCR_DEVICE_ID_EPIC_0310 0x0310 202 #define NCR_DEVICE_ID_EPIC_0310 0x0310
201 #define NCR_DEVICE_ID_EPIC_0311 0x0311 203 #define NCR_DEVICE_ID_EPIC_0311 0x0311
202 #define NCR_DEVICE_ID_EPIC_0312 0x0312 204 #define NCR_DEVICE_ID_EPIC_0312 0x0312
203 205
204 206
205 // 207 //
206 // Definitions for SYMBOL USB product IDs 208 // Definitions for SYMBOL USB product IDs
207 // 209 //
208 #define USB_VENDOR_ID_SYMBOL 0x05E0 // Symbol VID 210 #define USB_VENDOR_ID_SYMBOL 0x05E0 // Symbol VID
209 #define SYMBOL_DEVICE_ID_MASK 0xffff 211 #define SYMBOL_DEVICE_ID_MASK 0xffff
210 #define SYMBOL_DEVICE_ID_KEYFOB 0x0700 212 #define SYMBOL_DEVICE_ID_KEYFOB 0x0700
211 213
212 214
213 // 215 //
214 // Definitions for other product IDs 216 // Definitions for other product IDs
215 #define ION_DEVICE_ID_MT4X56USB 0x1403 // OEM device 217 #define ION_DEVICE_ID_MT4X56USB 0x1403 // OEM device
216 218
217 219
218 #define GENERATION_ID_FROM_USB_PRODUCT_ID( ProductId ) \ 220 #define GENERATION_ID_FROM_USB_PRODUCT_ID( ProductId ) \
219 ( (__u16) ((ProductId >> 8) & (ION_GENERATION_MASK)) ) 221 ( (__u16) ((ProductId >> 8) & (ION_GENERATION_MASK)) )
220 222
221 #define MAKE_USB_PRODUCT_ID( OemId, DeviceId ) \ 223 #define MAKE_USB_PRODUCT_ID( OemId, DeviceId ) \
222 ( (__u16) (((OemId) << 10) || (DeviceId)) ) 224 ( (__u16) (((OemId) << 10) || (DeviceId)) )
223 225
224 #define DEVICE_ID_FROM_USB_PRODUCT_ID( ProductId ) \ 226 #define DEVICE_ID_FROM_USB_PRODUCT_ID( ProductId ) \
225 ( (__u16) ((ProductId) & (EDGEPORT_DEVICE_ID_MASK)) ) 227 ( (__u16) ((ProductId) & (EDGEPORT_DEVICE_ID_MASK)) )
226 228
227 #define OEM_ID_FROM_USB_PRODUCT_ID( ProductId ) \ 229 #define OEM_ID_FROM_USB_PRODUCT_ID( ProductId ) \
228 ( (__u16) (((ProductId) >> 10) & 0x3F) ) 230 ( (__u16) (((ProductId) >> 10) & 0x3F) )
229 231
230 // 232 //
231 // Definitions of parameters for download code. Note that these are 233 // Definitions of parameters for download code. Note that these are
232 // specific to a given version of download code and must change if the 234 // specific to a given version of download code and must change if the
233 // corresponding download code changes. 235 // corresponding download code changes.
234 // 236 //
235 237
236 // TxCredits value below which driver won't bother sending (to prevent too many small writes). 238 // TxCredits value below which driver won't bother sending (to prevent too many small writes).
237 // Send only if above 25% 239 // Send only if above 25%
238 #define EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(InitialCredit, MaxPacketSize) (max( ((InitialCredit) / 4), (MaxPacketSize) )) 240 #define EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(InitialCredit, MaxPacketSize) (max( ((InitialCredit) / 4), (MaxPacketSize) ))
239 241
240 #define EDGE_FW_BULK_MAX_PACKET_SIZE 64 // Max Packet Size for Bulk In Endpoint (EP1) 242 #define EDGE_FW_BULK_MAX_PACKET_SIZE 64 // Max Packet Size for Bulk In Endpoint (EP1)
241 #define EDGE_FW_BULK_READ_BUFFER_SIZE 1024 // Size to use for Bulk reads 243 #define EDGE_FW_BULK_READ_BUFFER_SIZE 1024 // Size to use for Bulk reads
242 244
243 #define EDGE_FW_INT_MAX_PACKET_SIZE 32 // Max Packet Size for Interrupt In Endpoint 245 #define EDGE_FW_INT_MAX_PACKET_SIZE 32 // Max Packet Size for Interrupt In Endpoint
244 // Note that many units were shipped with MPS=16, we 246 // Note that many units were shipped with MPS=16, we
245 // force an upgrade to this value). 247 // force an upgrade to this value).
246 #define EDGE_FW_INT_INTERVAL 2 // 2ms polling on IntPipe 248 #define EDGE_FW_INT_INTERVAL 2 // 2ms polling on IntPipe
247 249
248 250
249 // 251 //
250 // Definitions of I/O Networks vendor-specific requests 252 // Definitions of I/O Networks vendor-specific requests
251 // for default endpoint 253 // for default endpoint
252 // 254 //
253 // bmRequestType = 01000000 Set vendor-specific, to device 255 // bmRequestType = 01000000 Set vendor-specific, to device
254 // bmRequestType = 11000000 Get vendor-specific, to device 256 // bmRequestType = 11000000 Get vendor-specific, to device
255 // 257 //
256 // These are the definitions for the bRequest field for the 258 // These are the definitions for the bRequest field for the
257 // above bmRequestTypes. 259 // above bmRequestTypes.
258 // 260 //
259 // For the read/write Edgeport memory commands, the parameters 261 // For the read/write Edgeport memory commands, the parameters
260 // are as follows: 262 // are as follows:
261 // wValue = 16-bit address 263 // wValue = 16-bit address
262 // wIndex = unused (though we could put segment 00: or FF: here) 264 // wIndex = unused (though we could put segment 00: or FF: here)
263 // wLength = # bytes to read/write (max 64) 265 // wLength = # bytes to read/write (max 64)
264 // 266 //
265 267
266 #define USB_REQUEST_ION_RESET_DEVICE 0 // Warm reboot Edgeport, retaining USB address 268 #define USB_REQUEST_ION_RESET_DEVICE 0 // Warm reboot Edgeport, retaining USB address
267 #define USB_REQUEST_ION_GET_EPIC_DESC 1 // Get Edgeport Compatibility Descriptor 269 #define USB_REQUEST_ION_GET_EPIC_DESC 1 // Get Edgeport Compatibility Descriptor
268 // unused 2 // Unused, available 270 // unused 2 // Unused, available
269 #define USB_REQUEST_ION_READ_RAM 3 // Read EdgePort RAM at specified addr 271 #define USB_REQUEST_ION_READ_RAM 3 // Read EdgePort RAM at specified addr
270 #define USB_REQUEST_ION_WRITE_RAM 4 // Write EdgePort RAM at specified addr 272 #define USB_REQUEST_ION_WRITE_RAM 4 // Write EdgePort RAM at specified addr
271 #define USB_REQUEST_ION_READ_ROM 5 // Read EdgePort ROM at specified addr 273 #define USB_REQUEST_ION_READ_ROM 5 // Read EdgePort ROM at specified addr
272 #define USB_REQUEST_ION_WRITE_ROM 6 // Write EdgePort ROM at specified addr 274 #define USB_REQUEST_ION_WRITE_ROM 6 // Write EdgePort ROM at specified addr
273 #define USB_REQUEST_ION_EXEC_DL_CODE 7 // Begin execution of RAM-based download 275 #define USB_REQUEST_ION_EXEC_DL_CODE 7 // Begin execution of RAM-based download
274 // code by jumping to address in wIndex:wValue 276 // code by jumping to address in wIndex:wValue
275 // 8 // Unused, available 277 // 8 // Unused, available
276 #define USB_REQUEST_ION_ENABLE_SUSPEND 9 // Enable/Disable suspend feature 278 #define USB_REQUEST_ION_ENABLE_SUSPEND 9 // Enable/Disable suspend feature
277 // (wValue != 0: Enable; wValue = 0: Disable) 279 // (wValue != 0: Enable; wValue = 0: Disable)
278 280
279 #define USB_REQUEST_ION_SEND_IOSP 10 // Send an IOSP command to the edgeport over the control pipe 281 #define USB_REQUEST_ION_SEND_IOSP 10 // Send an IOSP command to the edgeport over the control pipe
280 #define USB_REQUEST_ION_RECV_IOSP 11 // Receive an IOSP command from the edgeport over the control pipe 282 #define USB_REQUEST_ION_RECV_IOSP 11 // Receive an IOSP command from the edgeport over the control pipe
281 283
282 284
283 #define USB_REQUEST_ION_DIS_INT_TIMER 0x80 // Sent to Axiohm to enable/ disable 285 #define USB_REQUEST_ION_DIS_INT_TIMER 0x80 // Sent to Axiohm to enable/ disable
284 // interrupt token timer 286 // interrupt token timer
285 // wValue = 1, enable (default) 287 // wValue = 1, enable (default)
286 // wValue = 0, disable 288 // wValue = 0, disable
287 289
288 // 290 //
289 // Define parameter values for our vendor-specific commands 291 // Define parameter values for our vendor-specific commands
290 // 292 //
291 293
292 // 294 //
293 // Edgeport Compatibility Descriptor 295 // Edgeport Compatibility Descriptor
294 // 296 //
295 // This descriptor is only returned by Edgeport-compatible devices 297 // This descriptor is only returned by Edgeport-compatible devices
296 // supporting the EPiC spec. True ION devices do not return this 298 // supporting the EPiC spec. True ION devices do not return this
297 // descriptor, but instead return STALL on receipt of the 299 // descriptor, but instead return STALL on receipt of the
298 // GET_EPIC_DESC command. The driver interprets a STALL to mean that 300 // GET_EPIC_DESC command. The driver interprets a STALL to mean that
299 // this is a "real" Edgeport. 301 // this is a "real" Edgeport.
300 // 302 //
301 303
302 struct edge_compatibility_bits 304 struct edge_compatibility_bits
303 { 305 {
304 // This __u32 defines which Vendor-specific commands/functionality 306 // This __u32 defines which Vendor-specific commands/functionality
305 // the device supports on the default EP0 pipe. 307 // the device supports on the default EP0 pipe.
306 308
307 __u32 VendEnableSuspend : 1; // 0001 Set if device supports ION_ENABLE_SUSPEND 309 __u32 VendEnableSuspend : 1; // 0001 Set if device supports ION_ENABLE_SUSPEND
308 __u32 VendUnused : 31; // Available for future expansion, must be 0 310 __u32 VendUnused : 31; // Available for future expansion, must be 0
309 311
310 // This __u32 defines which IOSP commands are supported over the 312 // This __u32 defines which IOSP commands are supported over the
311 // bulk pipe EP1. 313 // bulk pipe EP1.
312 314
313 // xxxx Set if device supports: 315 // xxxx Set if device supports:
314 __u32 IOSPOpen : 1; // 0001 OPEN / OPEN_RSP (Currently must be 1) 316 __u32 IOSPOpen : 1; // 0001 OPEN / OPEN_RSP (Currently must be 1)
315 __u32 IOSPClose : 1; // 0002 CLOSE 317 __u32 IOSPClose : 1; // 0002 CLOSE
316 __u32 IOSPChase : 1; // 0004 CHASE / CHASE_RSP 318 __u32 IOSPChase : 1; // 0004 CHASE / CHASE_RSP
317 __u32 IOSPSetRxFlow : 1; // 0008 SET_RX_FLOW 319 __u32 IOSPSetRxFlow : 1; // 0008 SET_RX_FLOW
318 __u32 IOSPSetTxFlow : 1; // 0010 SET_TX_FLOW 320 __u32 IOSPSetTxFlow : 1; // 0010 SET_TX_FLOW
319 __u32 IOSPSetXChar : 1; // 0020 SET_XON_CHAR/SET_XOFF_CHAR 321 __u32 IOSPSetXChar : 1; // 0020 SET_XON_CHAR/SET_XOFF_CHAR
320 __u32 IOSPRxCheck : 1; // 0040 RX_CHECK_REQ/RX_CHECK_RSP 322 __u32 IOSPRxCheck : 1; // 0040 RX_CHECK_REQ/RX_CHECK_RSP
321 __u32 IOSPSetClrBreak : 1; // 0080 SET_BREAK/CLEAR_BREAK 323 __u32 IOSPSetClrBreak : 1; // 0080 SET_BREAK/CLEAR_BREAK
322 __u32 IOSPWriteMCR : 1; // 0100 MCR register writes (set/clr DTR/RTS) 324 __u32 IOSPWriteMCR : 1; // 0100 MCR register writes (set/clr DTR/RTS)
323 __u32 IOSPWriteLCR : 1; // 0200 LCR register writes (wordlen/stop/parity) 325 __u32 IOSPWriteLCR : 1; // 0200 LCR register writes (wordlen/stop/parity)
324 __u32 IOSPSetBaudRate : 1; // 0400 setting Baud rate (writes to LCR.80h and DLL/DLM register) 326 __u32 IOSPSetBaudRate : 1; // 0400 setting Baud rate (writes to LCR.80h and DLL/DLM register)
325 __u32 IOSPDisableIntPipe : 1; // 0800 Do not use the interrupt pipe for TxCredits or RxButesAvailable 327 __u32 IOSPDisableIntPipe : 1; // 0800 Do not use the interrupt pipe for TxCredits or RxButesAvailable
326 __u32 IOSPRxDataAvail : 1; // 1000 Return status of RX Fifo (Data available in Fifo) 328 __u32 IOSPRxDataAvail : 1; // 1000 Return status of RX Fifo (Data available in Fifo)
327 __u32 IOSPTxPurge : 1; // 2000 Purge TXBuffer and/or Fifo in Edgeport hardware 329 __u32 IOSPTxPurge : 1; // 2000 Purge TXBuffer and/or Fifo in Edgeport hardware
328 __u32 IOSPUnused : 18; // Available for future expansion, must be 0 330 __u32 IOSPUnused : 18; // Available for future expansion, must be 0
329 331
330 // This __u32 defines which 'general' features are supported 332 // This __u32 defines which 'general' features are supported
331 333
332 __u32 TrueEdgeport : 1; // 0001 Set if device is a 'real' Edgeport 334 __u32 TrueEdgeport : 1; // 0001 Set if device is a 'real' Edgeport
333 // (Used only by driver, NEVER set by an EPiC device) 335 // (Used only by driver, NEVER set by an EPiC device)
334 __u32 GenUnused : 31; // Available for future expansion, must be 0 336 __u32 GenUnused : 31; // Available for future expansion, must be 0
335 337
336 }; 338 };
337 339
338 #define EDGE_COMPATIBILITY_MASK0 0x0001 340 #define EDGE_COMPATIBILITY_MASK0 0x0001
339 #define EDGE_COMPATIBILITY_MASK1 0x3FFF 341 #define EDGE_COMPATIBILITY_MASK1 0x3FFF
340 #define EDGE_COMPATIBILITY_MASK2 0x0001 342 #define EDGE_COMPATIBILITY_MASK2 0x0001
341 343
342 struct edge_compatibility_descriptor 344 struct edge_compatibility_descriptor
343 { 345 {
344 __u8 Length; // Descriptor Length (per USB spec) 346 __u8 Length; // Descriptor Length (per USB spec)
345 __u8 DescType; // Descriptor Type (per USB spec, =DEVICE type) 347 __u8 DescType; // Descriptor Type (per USB spec, =DEVICE type)
346 __u8 EpicVer; // Version of EPiC spec supported 348 __u8 EpicVer; // Version of EPiC spec supported
347 // (Currently must be 1) 349 // (Currently must be 1)
348 __u8 NumPorts; // Number of serial ports supported 350 __u8 NumPorts; // Number of serial ports supported
349 __u8 iDownloadFile; // Index of string containing download code filename 351 __u8 iDownloadFile; // Index of string containing download code filename
350 // 0=no download, FF=download compiled into driver. 352 // 0=no download, FF=download compiled into driver.
351 __u8 Unused[ 3 ]; // Available for future expansion, must be 0 353 __u8 Unused[ 3 ]; // Available for future expansion, must be 0
352 // (Currently must be 0). 354 // (Currently must be 0).
353 __u8 MajorVersion; // Firmware version: xx. 355 __u8 MajorVersion; // Firmware version: xx.
354 __u8 MinorVersion; // yy. 356 __u8 MinorVersion; // yy.
355 __le16 BuildNumber; // zzzz (LE format) 357 __le16 BuildNumber; // zzzz (LE format)
356 358
357 // The following structure contains __u32s, with each bit 359 // The following structure contains __u32s, with each bit
358 // specifying whether the EPiC device supports the given 360 // specifying whether the EPiC device supports the given
359 // command or functionality. 361 // command or functionality.
360 362
361 struct edge_compatibility_bits Supports; 363 struct edge_compatibility_bits Supports;
362 364
363 }; 365 };
364 366
365 // Values for iDownloadFile 367 // Values for iDownloadFile
366 #define EDGE_DOWNLOAD_FILE_NONE 0 // No download requested 368 #define EDGE_DOWNLOAD_FILE_NONE 0 // No download requested
367 #define EDGE_DOWNLOAD_FILE_INTERNAL 0xFF // Download the file compiled into driver (930 version) 369 #define EDGE_DOWNLOAD_FILE_INTERNAL 0xFF // Download the file compiled into driver (930 version)
368 #define EDGE_DOWNLOAD_FILE_I930 0xFF // Download the file compiled into driver (930 version) 370 #define EDGE_DOWNLOAD_FILE_I930 0xFF // Download the file compiled into driver (930 version)
369 #define EDGE_DOWNLOAD_FILE_80251 0xFE // Download the file compiled into driver (80251 version) 371 #define EDGE_DOWNLOAD_FILE_80251 0xFE // Download the file compiled into driver (80251 version)
370 372
371 373
372 374
373 /* 375 /*
374 * Special addresses for READ/WRITE_RAM/ROM 376 * Special addresses for READ/WRITE_RAM/ROM
375 */ 377 */
376 378
377 // Version 1 (original) format of DeviceParams 379 // Version 1 (original) format of DeviceParams
378 #define EDGE_MANUF_DESC_ADDR_V1 0x00FF7F00 380 #define EDGE_MANUF_DESC_ADDR_V1 0x00FF7F00
379 #define EDGE_MANUF_DESC_LEN_V1 sizeof(EDGE_MANUF_DESCRIPTOR_V1) 381 #define EDGE_MANUF_DESC_LEN_V1 sizeof(EDGE_MANUF_DESCRIPTOR_V1)
380 382
381 // Version 2 format of DeviceParams. This format is longer (3C0h) 383 // Version 2 format of DeviceParams. This format is longer (3C0h)
382 // and starts lower in memory, at the uppermost 1K in ROM. 384 // and starts lower in memory, at the uppermost 1K in ROM.
383 #define EDGE_MANUF_DESC_ADDR 0x00FF7C00 385 #define EDGE_MANUF_DESC_ADDR 0x00FF7C00
384 #define EDGE_MANUF_DESC_LEN sizeof(struct edge_manuf_descriptor) 386 #define EDGE_MANUF_DESC_LEN sizeof(struct edge_manuf_descriptor)
385 387
386 // Boot params descriptor 388 // Boot params descriptor
387 #define EDGE_BOOT_DESC_ADDR 0x00FF7FC0 389 #define EDGE_BOOT_DESC_ADDR 0x00FF7FC0
388 #define EDGE_BOOT_DESC_LEN sizeof(struct edge_boot_descriptor) 390 #define EDGE_BOOT_DESC_LEN sizeof(struct edge_boot_descriptor)
389 391
390 // Define the max block size that may be read or written 392 // Define the max block size that may be read or written
391 // in a read/write RAM/ROM command. 393 // in a read/write RAM/ROM command.
392 #define MAX_SIZE_REQ_ION_READ_MEM ( (__u16) 64 ) 394 #define MAX_SIZE_REQ_ION_READ_MEM ( (__u16) 64 )
393 #define MAX_SIZE_REQ_ION_WRITE_MEM ( (__u16) 64 ) 395 #define MAX_SIZE_REQ_ION_WRITE_MEM ( (__u16) 64 )
394 396
395 397
396 // 398 //
397 // Notes for the following two ION vendor-specific param descriptors: 399 // Notes for the following two ION vendor-specific param descriptors:
398 // 400 //
399 // 1. These have a standard USB descriptor header so they look like a 401 // 1. These have a standard USB descriptor header so they look like a
400 // normal descriptor. 402 // normal descriptor.
401 // 2. Any strings in the structures are in USB-defined string 403 // 2. Any strings in the structures are in USB-defined string
402 // descriptor format, so that they may be separately retrieved, 404 // descriptor format, so that they may be separately retrieved,
403 // if necessary, with a minimum of work on the 930. This also 405 // if necessary, with a minimum of work on the 930. This also
404 // requires them to be in UNICODE format, which, for English at 406 // requires them to be in UNICODE format, which, for English at
405 // least, simply means extending each __u8 into a __u16. 407 // least, simply means extending each __u8 into a __u16.
406 // 3. For all fields, 00 means 'uninitialized'. 408 // 3. For all fields, 00 means 'uninitialized'.
407 // 4. All unused areas should be set to 00 for future expansion. 409 // 4. All unused areas should be set to 00 for future expansion.
408 // 410 //
409 411
410 // This structure is ver 2 format. It contains ALL USB descriptors as 412 // This structure is ver 2 format. It contains ALL USB descriptors as
411 // well as the configuration parameters that were in the original V1 413 // well as the configuration parameters that were in the original V1
412 // structure. It is NOT modified when new boot code is downloaded; rather, 414 // structure. It is NOT modified when new boot code is downloaded; rather,
413 // these values are set or modified by manufacturing. It is located at 415 // these values are set or modified by manufacturing. It is located at
414 // xC00-xFBF (length 3C0h) in the ROM. 416 // xC00-xFBF (length 3C0h) in the ROM.
415 // This structure is a superset of the v1 structure and is arranged so 417 // This structure is a superset of the v1 structure and is arranged so
416 // that all of the v1 fields remain at the same address. We are just 418 // that all of the v1 fields remain at the same address. We are just
417 // adding more room to the front of the structure to hold the descriptors. 419 // adding more room to the front of the structure to hold the descriptors.
418 // 420 //
419 // The actual contents of this structure are defined in a 930 assembly 421 // The actual contents of this structure are defined in a 930 assembly
420 // file, converted to a binary image, and then written by the serialization 422 // file, converted to a binary image, and then written by the serialization
421 // program. The C definition of this structure just defines a dummy 423 // program. The C definition of this structure just defines a dummy
422 // area for general USB descriptors and the descriptor tables (the root 424 // area for general USB descriptors and the descriptor tables (the root
423 // descriptor starts at xC00). At the bottom of the structure are the 425 // descriptor starts at xC00). At the bottom of the structure are the
424 // fields inherited from the v1 structure. 426 // fields inherited from the v1 structure.
425 427
426 #define MAX_SERIALNUMBER_LEN 12 428 #define MAX_SERIALNUMBER_LEN 12
427 #define MAX_ASSEMBLYNUMBER_LEN 14 429 #define MAX_ASSEMBLYNUMBER_LEN 14
428 430
429 struct edge_manuf_descriptor { 431 struct edge_manuf_descriptor {
430 432
431 __u16 RootDescTable[0x10]; // C00 Root of descriptor tables (just a placeholder) 433 __u16 RootDescTable[0x10]; // C00 Root of descriptor tables (just a placeholder)
432 __u8 DescriptorArea[0x2E0]; // C20 Descriptors go here, up to 2E0h (just a placeholder) 434 __u8 DescriptorArea[0x2E0]; // C20 Descriptors go here, up to 2E0h (just a placeholder)
433 435
434 // Start of v1-compatible section 436 // Start of v1-compatible section
435 __u8 Length; // F00 Desc length for what follows, per USB (= C0h ) 437 __u8 Length; // F00 Desc length for what follows, per USB (= C0h )
436 __u8 DescType; // F01 Desc type, per USB (=DEVICE type) 438 __u8 DescType; // F01 Desc type, per USB (=DEVICE type)
437 __u8 DescVer; // F02 Desc version/format (currently 2) 439 __u8 DescVer; // F02 Desc version/format (currently 2)
438 __u8 NumRootDescEntries; // F03 # entries in RootDescTable 440 __u8 NumRootDescEntries; // F03 # entries in RootDescTable
439 441
440 __u8 RomSize; // F04 Size of ROM/E2PROM in K 442 __u8 RomSize; // F04 Size of ROM/E2PROM in K
441 __u8 RamSize; // F05 Size of external RAM in K 443 __u8 RamSize; // F05 Size of external RAM in K
442 __u8 CpuRev; // F06 CPU revision level (chg only if s/w visible) 444 __u8 CpuRev; // F06 CPU revision level (chg only if s/w visible)
443 __u8 BoardRev; // F07 PCB revision level (chg only if s/w visible) 445 __u8 BoardRev; // F07 PCB revision level (chg only if s/w visible)
444 446
445 __u8 NumPorts; // F08 Number of ports 447 __u8 NumPorts; // F08 Number of ports
446 __u8 DescDate[3]; // F09 MM/DD/YY when descriptor template was compiler, 448 __u8 DescDate[3]; // F09 MM/DD/YY when descriptor template was compiler,
447 // so host can track changes to USB-only descriptors. 449 // so host can track changes to USB-only descriptors.
448 450
449 __u8 SerNumLength; // F0C USB string descriptor len 451 __u8 SerNumLength; // F0C USB string descriptor len
450 __u8 SerNumDescType; // F0D USB descriptor type (=STRING type) 452 __u8 SerNumDescType; // F0D USB descriptor type (=STRING type)
451 __le16 SerialNumber[MAX_SERIALNUMBER_LEN]; // F0E "01-01-000100" Unicode Serial Number 453 __le16 SerialNumber[MAX_SERIALNUMBER_LEN]; // F0E "01-01-000100" Unicode Serial Number
452 454
453 __u8 AssemblyNumLength; // F26 USB string descriptor len 455 __u8 AssemblyNumLength; // F26 USB string descriptor len
454 __u8 AssemblyNumDescType; // F27 USB descriptor type (=STRING type) 456 __u8 AssemblyNumDescType; // F27 USB descriptor type (=STRING type)
455 __le16 AssemblyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F28 "350-1000-01-A " assembly number 457 __le16 AssemblyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F28 "350-1000-01-A " assembly number
456 458
457 __u8 OemAssyNumLength; // F44 USB string descriptor len 459 __u8 OemAssyNumLength; // F44 USB string descriptor len
458 __u8 OemAssyNumDescType; // F45 USB descriptor type (=STRING type) 460 __u8 OemAssyNumDescType; // F45 USB descriptor type (=STRING type)
459 __le16 OemAssyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F46 "xxxxxxxxxxxxxx" OEM assembly number 461 __le16 OemAssyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F46 "xxxxxxxxxxxxxx" OEM assembly number
460 462
461 __u8 ManufDateLength; // F62 USB string descriptor len 463 __u8 ManufDateLength; // F62 USB string descriptor len
462 __u8 ManufDateDescType; // F63 USB descriptor type (=STRING type) 464 __u8 ManufDateDescType; // F63 USB descriptor type (=STRING type)
463 __le16 ManufDate[6]; // F64 "MMDDYY" manufacturing date 465 __le16 ManufDate[6]; // F64 "MMDDYY" manufacturing date
464 466
465 __u8 Reserved3[0x4D]; // F70 -- unused, set to 0 -- 467 __u8 Reserved3[0x4D]; // F70 -- unused, set to 0 --
466 468
467 __u8 UartType; // FBD Uart Type 469 __u8 UartType; // FBD Uart Type
468 __u8 IonPid; // FBE Product ID, == LSB of USB DevDesc.PID 470 __u8 IonPid; // FBE Product ID, == LSB of USB DevDesc.PID
469 // (Note: Edgeport/4s before 11/98 will have 471 // (Note: Edgeport/4s before 11/98 will have
470 // 00 here instead of 01) 472 // 00 here instead of 01)
471 __u8 IonConfig; // FBF Config byte for ION manufacturing use 473 __u8 IonConfig; // FBF Config byte for ION manufacturing use
472 // FBF end of structure, total len = 3C0h 474 // FBF end of structure, total len = 3C0h
473 475
474 }; 476 };
475 477
476 478
477 #define MANUF_DESC_VER_1 1 // Original definition of MANUF_DESC 479 #define MANUF_DESC_VER_1 1 // Original definition of MANUF_DESC
478 #define MANUF_DESC_VER_2 2 // Ver 2, starts at xC00h len 3C0h 480 #define MANUF_DESC_VER_2 2 // Ver 2, starts at xC00h len 3C0h
479 481
480 482
481 // Uart Types 483 // Uart Types
482 // Note: Since this field was added only recently, all Edgeport/4 units 484 // Note: Since this field was added only recently, all Edgeport/4 units
483 // shipped before 11/98 will have 00 in this field. Therefore, 485 // shipped before 11/98 will have 00 in this field. Therefore,
484 // both 00 and 01 values mean '654. 486 // both 00 and 01 values mean '654.
485 #define MANUF_UART_EXAR_654_EARLY 0 // Exar 16C654 in Edgeport/4s before 11/98 487 #define MANUF_UART_EXAR_654_EARLY 0 // Exar 16C654 in Edgeport/4s before 11/98
486 #define MANUF_UART_EXAR_654 1 // Exar 16C654 488 #define MANUF_UART_EXAR_654 1 // Exar 16C654
487 #define MANUF_UART_EXAR_2852 2 // Exar 16C2852 489 #define MANUF_UART_EXAR_2852 2 // Exar 16C2852
488 490
489 // 491 //
490 // Note: The CpuRev and BoardRev values do not conform to manufacturing 492 // Note: The CpuRev and BoardRev values do not conform to manufacturing
491 // revisions; they are to be incremented only when the CPU or hardware 493 // revisions; they are to be incremented only when the CPU or hardware
492 // changes in a software-visible way, such that the 930 software or 494 // changes in a software-visible way, such that the 930 software or
493 // the host driver needs to handle the hardware differently. 495 // the host driver needs to handle the hardware differently.
494 // 496 //
495 497
496 // Values of bottom 5 bits of CpuRev & BoardRev for 498 // Values of bottom 5 bits of CpuRev & BoardRev for
497 // Implementation 0 (ie, 930-based) 499 // Implementation 0 (ie, 930-based)
498 #define MANUF_CPU_REV_AD4 1 // 930 AD4, with EP1 Rx bug (needs RXSPM) 500 #define MANUF_CPU_REV_AD4 1 // 930 AD4, with EP1 Rx bug (needs RXSPM)
499 #define MANUF_CPU_REV_AD5 2 // 930 AD5, with above bug (supposedly) fixed 501 #define MANUF_CPU_REV_AD5 2 // 930 AD5, with above bug (supposedly) fixed
500 #define MANUF_CPU_80251 0x20 // Intel 80251 502 #define MANUF_CPU_80251 0x20 // Intel 80251
501 503
502 504
503 #define MANUF_BOARD_REV_A 1 // Original version, == Manuf Rev A 505 #define MANUF_BOARD_REV_A 1 // Original version, == Manuf Rev A
504 #define MANUF_BOARD_REV_B 2 // Manuf Rev B, wakeup interrupt works 506 #define MANUF_BOARD_REV_B 2 // Manuf Rev B, wakeup interrupt works
505 #define MANUF_BOARD_REV_C 3 // Manuf Rev C, 2/4 ports, rs232/rs422 507 #define MANUF_BOARD_REV_C 3 // Manuf Rev C, 2/4 ports, rs232/rs422
506 #define MANUF_BOARD_REV_GENERATION_2 0x20 // Second generaiton edgeport 508 #define MANUF_BOARD_REV_GENERATION_2 0x20 // Second generaiton edgeport
507 509
508 510
509 // Values of bottom 5 bits of CpuRev & BoardRev for 511 // Values of bottom 5 bits of CpuRev & BoardRev for
510 // Implementation 1 (ie, 251+Netchip-based) 512 // Implementation 1 (ie, 251+Netchip-based)
511 #define MANUF_CPU_REV_1 1 // C251TB Rev 1 (Need actual Intel rev here) 513 #define MANUF_CPU_REV_1 1 // C251TB Rev 1 (Need actual Intel rev here)
512 514
513 #define MANUF_BOARD_REV_A 1 // First rev of 251+Netchip design 515 #define MANUF_BOARD_REV_A 1 // First rev of 251+Netchip design
514 516
515 #define MANUF_SERNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->SerialNumber) 517 #define MANUF_SERNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->SerialNumber)
516 #define MANUF_ASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->AssemblyNumber) 518 #define MANUF_ASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->AssemblyNumber)
517 #define MANUF_OEMASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->OemAssyNumber) 519 #define MANUF_OEMASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->OemAssyNumber)
518 #define MANUF_MANUFDATE_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->ManufDate) 520 #define MANUF_MANUFDATE_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->ManufDate)
519 521
520 #define MANUF_ION_CONFIG_DIAG_NO_LOOP 0x20 // As below but no ext loopback test 522 #define MANUF_ION_CONFIG_DIAG_NO_LOOP 0x20 // As below but no ext loopback test
521 #define MANUF_ION_CONFIG_DIAG 0x40 // 930 based device: 1=Run h/w diags, 0=norm 523 #define MANUF_ION_CONFIG_DIAG 0x40 // 930 based device: 1=Run h/w diags, 0=norm
522 // TIUMP Device : 1=IONSERIAL needs to run Final Test 524 // TIUMP Device : 1=IONSERIAL needs to run Final Test
523 #define MANUF_ION_CONFIG_MASTER 0x80 // 930 based device: 1=Master mode, 0=Normal 525 #define MANUF_ION_CONFIG_MASTER 0x80 // 930 based device: 1=Master mode, 0=Normal
524 // TIUMP Device : 1=First device on a multi TIUMP Device 526 // TIUMP Device : 1=First device on a multi TIUMP Device
525 527
526 // 528 //
527 // This structure describes parameters for the boot code, and 529 // This structure describes parameters for the boot code, and
528 // is programmed along with new boot code. These are values 530 // is programmed along with new boot code. These are values
529 // which are specific to a given build of the boot code. It 531 // which are specific to a given build of the boot code. It
530 // is exactly 64 bytes long and is fixed at address FF:xFC0 532 // is exactly 64 bytes long and is fixed at address FF:xFC0
531 // - FF:xFFF. Note that the 930-mandated UCONFIG bytes are 533 // - FF:xFFF. Note that the 930-mandated UCONFIG bytes are
532 // included in this structure. 534 // included in this structure.
533 // 535 //
534 struct edge_boot_descriptor { 536 struct edge_boot_descriptor {
535 __u8 Length; // C0 Desc length, per USB (= 40h) 537 __u8 Length; // C0 Desc length, per USB (= 40h)
536 __u8 DescType; // C1 Desc type, per USB (= DEVICE type) 538 __u8 DescType; // C1 Desc type, per USB (= DEVICE type)
537 __u8 DescVer; // C2 Desc version/format 539 __u8 DescVer; // C2 Desc version/format
538 __u8 Reserved1; // C3 -- unused, set to 0 -- 540 __u8 Reserved1; // C3 -- unused, set to 0 --
539 541
540 __le16 BootCodeLength; // C4 Boot code goes from FF:0000 to FF:(len-1) 542 __le16 BootCodeLength; // C4 Boot code goes from FF:0000 to FF:(len-1)
541 // (LE format) 543 // (LE format)
542 544
543 __u8 MajorVersion; // C6 Firmware version: xx. 545 __u8 MajorVersion; // C6 Firmware version: xx.
544 __u8 MinorVersion; // C7 yy. 546 __u8 MinorVersion; // C7 yy.
545 __le16 BuildNumber; // C8 zzzz (LE format) 547 __le16 BuildNumber; // C8 zzzz (LE format)
546 548
547 __u16 EnumRootDescTable; // CA Root of ROM-based descriptor table 549 __u16 EnumRootDescTable; // CA Root of ROM-based descriptor table
548 __u8 NumDescTypes; // CC Number of supported descriptor types 550 __u8 NumDescTypes; // CC Number of supported descriptor types
549 551
550 __u8 Reserved4; // CD Fix Compiler Packing 552 __u8 Reserved4; // CD Fix Compiler Packing
551 553
552 __le16 Capabilities; // CE-CF Capabilities flags (LE format) 554 __le16 Capabilities; // CE-CF Capabilities flags (LE format)
553 __u8 Reserved2[0x28]; // D0 -- unused, set to 0 -- 555 __u8 Reserved2[0x28]; // D0 -- unused, set to 0 --
554 __u8 UConfig0; // F8 930-defined CPU configuration byte 0 556 __u8 UConfig0; // F8 930-defined CPU configuration byte 0
555 __u8 UConfig1; // F9 930-defined CPU configuration byte 1 557 __u8 UConfig1; // F9 930-defined CPU configuration byte 1
556 __u8 Reserved3[6]; // FA -- unused, set to 0 -- 558 __u8 Reserved3[6]; // FA -- unused, set to 0 --
557 // FF end of structure, total len = 80 559 // FF end of structure, total len = 80
558 }; 560 };
559 561
560 562
561 #define BOOT_DESC_VER_1 1 // Original definition of BOOT_PARAMS 563 #define BOOT_DESC_VER_1 1 // Original definition of BOOT_PARAMS
562 #define BOOT_DESC_VER_2 2 // 2nd definition, descriptors not included in boot 564 #define BOOT_DESC_VER_2 2 // 2nd definition, descriptors not included in boot
563 565
564 566
565 // Capabilities flags 567 // Capabilities flags
566 568
567 #define BOOT_CAP_RESET_CMD 0x0001 // If set, boot correctly supports ION_RESET_DEVICE 569 #define BOOT_CAP_RESET_CMD 0x0001 // If set, boot correctly supports ION_RESET_DEVICE
568 570
569 571
570 /************************************************************************ 572 /************************************************************************
571 T I U M P D E F I N I T I O N S 573 T I U M P D E F I N I T I O N S
572 ***********************************************************************/ 574 ***********************************************************************/
573 575
574 // Chip definitions in I2C 576 // Chip definitions in I2C
575 #define UMP5152 0x52 577 #define UMP5152 0x52
576 #define UMP3410 0x10 578 #define UMP3410 0x10
577 579
578 580
579 //************************************************************************ 581 //************************************************************************
580 // TI I2C Format Definitions 582 // TI I2C Format Definitions
581 //************************************************************************ 583 //************************************************************************
582 #define I2C_DESC_TYPE_INFO_BASIC 0x01 584 #define I2C_DESC_TYPE_INFO_BASIC 0x01
583 #define I2C_DESC_TYPE_FIRMWARE_BASIC 0x02 585 #define I2C_DESC_TYPE_FIRMWARE_BASIC 0x02
584 #define I2C_DESC_TYPE_DEVICE 0x03 586 #define I2C_DESC_TYPE_DEVICE 0x03
585 #define I2C_DESC_TYPE_CONFIG 0x04 587 #define I2C_DESC_TYPE_CONFIG 0x04
586 #define I2C_DESC_TYPE_STRING 0x05 588 #define I2C_DESC_TYPE_STRING 0x05
587 #define I2C_DESC_TYPE_FIRMWARE_AUTO 0x07 // for 3410 download 589 #define I2C_DESC_TYPE_FIRMWARE_AUTO 0x07 // for 3410 download
588 #define I2C_DESC_TYPE_CONFIG_KLUDGE 0x14 // for 3410 590 #define I2C_DESC_TYPE_CONFIG_KLUDGE 0x14 // for 3410
589 #define I2C_DESC_TYPE_WATCHPORT_VERSION 0x15 // firmware version number for watchport 591 #define I2C_DESC_TYPE_WATCHPORT_VERSION 0x15 // firmware version number for watchport
590 #define I2C_DESC_TYPE_WATCHPORT_CALIBRATION_DATA 0x16 // Watchport Calibration Data 592 #define I2C_DESC_TYPE_WATCHPORT_CALIBRATION_DATA 0x16 // Watchport Calibration Data
591 593
592 #define I2C_DESC_TYPE_FIRMWARE_BLANK 0xf2 594 #define I2C_DESC_TYPE_FIRMWARE_BLANK 0xf2
593 595
594 // Special section defined by ION 596 // Special section defined by ION
595 #define I2C_DESC_TYPE_ION 0 // Not defined by TI 597 #define I2C_DESC_TYPE_ION 0 // Not defined by TI
596 598
597 599
598 struct ti_i2c_desc 600 struct ti_i2c_desc
599 { 601 {
600 __u8 Type; // Type of descriptor 602 __u8 Type; // Type of descriptor
601 __u16 Size; // Size of data only not including header 603 __u16 Size; // Size of data only not including header
602 __u8 CheckSum; // Checksum (8 bit sum of data only) 604 __u8 CheckSum; // Checksum (8 bit sum of data only)
603 __u8 Data[0]; // Data starts here 605 __u8 Data[0]; // Data starts here
604 }__attribute__((packed)); 606 }__attribute__((packed));
605 607
606 // for 5152 devices only (type 2 record) 608 // for 5152 devices only (type 2 record)
607 // for 3410 the version is stored in the WATCHPORT_FIRMWARE_VERSION descriptor 609 // for 3410 the version is stored in the WATCHPORT_FIRMWARE_VERSION descriptor
608 struct ti_i2c_firmware_rec 610 struct ti_i2c_firmware_rec
609 { 611 {
610 __u8 Ver_Major; // Firmware Major version number 612 __u8 Ver_Major; // Firmware Major version number
611 __u8 Ver_Minor; // Firmware Minor version number 613 __u8 Ver_Minor; // Firmware Minor version number
612 __u8 Data[0]; // Download starts here 614 __u8 Data[0]; // Download starts here
613 }__attribute__((packed)); 615 }__attribute__((packed));
614 616
615 617
616 struct watchport_firmware_version 618 struct watchport_firmware_version
617 { 619 {
618 // Added 2 bytes for version number 620 // Added 2 bytes for version number
619 __u8 Version_Major; // Download Version (for Watchport) 621 __u8 Version_Major; // Download Version (for Watchport)
620 __u8 Version_Minor; 622 __u8 Version_Minor;
621 }__attribute__((packed)); 623 }__attribute__((packed));
622 624
623 625
624 // Structure of header of download image in fw_down.h 626 // Structure of header of download image in fw_down.h
625 struct ti_i2c_image_header 627 struct ti_i2c_image_header
626 { 628 {
627 __le16 Length; 629 __le16 Length;
628 __u8 CheckSum; 630 __u8 CheckSum;
629 }__attribute__((packed)); 631 }__attribute__((packed));
630 632
631 struct ti_basic_descriptor 633 struct ti_basic_descriptor
632 { 634 {
633 __u8 Power; // Self powered 635 __u8 Power; // Self powered
634 // bit 7: 1 - power switching supported 636 // bit 7: 1 - power switching supported
635 // 0 - power switching not supported 637 // 0 - power switching not supported
636 // 638 //
637 // bit 0: 1 - self powered 639 // bit 0: 1 - self powered
638 // 0 - bus powered 640 // 0 - bus powered
639 // 641 //
640 // 642 //
641 __u16 HubVid; // VID HUB 643 __u16 HubVid; // VID HUB
642 __u16 HubPid; // PID HUB 644 __u16 HubPid; // PID HUB
643 __u16 DevPid; // PID Edgeport 645 __u16 DevPid; // PID Edgeport
644 __u8 HubTime; // Time for power on to power good 646 __u8 HubTime; // Time for power on to power good
645 __u8 HubCurrent; // HUB Current = 100ma 647 __u8 HubCurrent; // HUB Current = 100ma
646 } __attribute__((packed)); 648 } __attribute__((packed));
647 649
648 650
649 // CPU / Board Rev Definitions 651 // CPU / Board Rev Definitions
650 #define TI_CPU_REV_5052 2 // 5052 based edgeports 652 #define TI_CPU_REV_5052 2 // 5052 based edgeports
651 #define TI_CPU_REV_3410 3 // 3410 based edgeports 653 #define TI_CPU_REV_3410 3 // 3410 based edgeports
652 654
653 #define TI_BOARD_REV_TI_EP 0 // Basic ti based edgeport 655 #define TI_BOARD_REV_TI_EP 0 // Basic ti based edgeport
654 #define TI_BOARD_REV_COMPACT 1 // Compact board 656 #define TI_BOARD_REV_COMPACT 1 // Compact board
655 #define TI_BOARD_REV_WATCHPORT 2 // Watchport 657 #define TI_BOARD_REV_WATCHPORT 2 // Watchport
656 658
657 659
658 #define TI_GET_CPU_REVISION(x) (__u8)((((x)>>4)&0x0f)) 660 #define TI_GET_CPU_REVISION(x) (__u8)((((x)>>4)&0x0f))
659 #define TI_GET_BOARD_REVISION(x) (__u8)(((x)&0x0f)) 661 #define TI_GET_BOARD_REVISION(x) (__u8)(((x)&0x0f))
660 662
661 #define TI_I2C_SIZE_MASK 0x1f // 5 bits 663 #define TI_I2C_SIZE_MASK 0x1f // 5 bits
662 #define TI_GET_I2C_SIZE(x) ((((x) & TI_I2C_SIZE_MASK)+1)*256) 664 #define TI_GET_I2C_SIZE(x) ((((x) & TI_I2C_SIZE_MASK)+1)*256)
663 665
664 #define TI_MAX_I2C_SIZE ( 16 * 1024 ) 666 #define TI_MAX_I2C_SIZE ( 16 * 1024 )
665 667
666 #define TI_MANUF_VERSION_0 0 668 #define TI_MANUF_VERSION_0 0
667 669
668 // IonConig2 flags 670 // IonConig2 flags
669 #define TI_CONFIG2_RS232 0x01 671 #define TI_CONFIG2_RS232 0x01
670 #define TI_CONFIG2_RS422 0x02 672 #define TI_CONFIG2_RS422 0x02
671 #define TI_CONFIG2_RS485 0x04 673 #define TI_CONFIG2_RS485 0x04
672 #define TI_CONFIG2_SWITCHABLE 0x08 674 #define TI_CONFIG2_SWITCHABLE 0x08
673 675
674 #define TI_CONFIG2_WATCHPORT 0x10 676 #define TI_CONFIG2_WATCHPORT 0x10
675 677
676 678
677 struct edge_ti_manuf_descriptor 679 struct edge_ti_manuf_descriptor
678 { 680 {
679 __u8 IonConfig; // Config byte for ION manufacturing use 681 __u8 IonConfig; // Config byte for ION manufacturing use
680 __u8 IonConfig2; // Expansion 682 __u8 IonConfig2; // Expansion
681 __u8 Version; // Version 683 __u8 Version; // Version
682 __u8 CpuRev_BoardRev; // CPU revision level (0xF0) and Board Rev Level (0x0F) 684 __u8 CpuRev_BoardRev; // CPU revision level (0xF0) and Board Rev Level (0x0F)
683 __u8 NumPorts; // Number of ports for this UMP 685 __u8 NumPorts; // Number of ports for this UMP
684 __u8 NumVirtualPorts; // Number of Virtual ports 686 __u8 NumVirtualPorts; // Number of Virtual ports
685 __u8 HubConfig1; // Used to configure the Hub 687 __u8 HubConfig1; // Used to configure the Hub
686 __u8 HubConfig2; // Used to configure the Hub 688 __u8 HubConfig2; // Used to configure the Hub
687 __u8 TotalPorts; // Total Number of Com Ports for the entire device (All UMPs) 689 __u8 TotalPorts; // Total Number of Com Ports for the entire device (All UMPs)
688 __u8 Reserved; // Reserved 690 __u8 Reserved; // Reserved
689 }__attribute__((packed)); 691 }__attribute__((packed));
690 692
691 693
692 #endif // if !defined(_USBVEND_H) 694 #endif // if !defined(_USBVEND_H)
693 695