#include "lin-city.h"Go to the source code of this file.
Data Structures | |
| struct | _disp |
Defines | |
| #define | TRUE 1 |
| #define | FALSE 0 |
| #define | WINWIDTH 640 |
| #define | WINHEIGHT 480 |
Typedefs | |
| typedef _disp | disp |
Functions | |
| void | parse_xargs (int, char **, char **) |
| void | set_pointer_confinement (void) |
| void | do_setcustompalette (XColor *) |
| void | Create_Window (char *) |
| void | HandleError (char *, int) |
| void | HandleEvent (XEvent *) |
| void | refresh_screen (int, int, int, int) |
| void | my_x_putchar (int, int, unsigned char) |
| void | open_x_putchar (int, int, unsigned char) |
| void | do_call_event (int) |
| void | call_event (void) |
| void | call_wait_event (void) |
| void | open_setcustompalette (XColor *) |
| void | drag_screen (void) |
| void | draw_border (void) |
| void | init_x_mouse (void) |
| int | lc_get_keystroke (void) |
Variables | |
| int | winX |
| int | winY |
| int | mouse_button |
| int | cs_mouse_shifted |
| disp | display |
| char * | bg_color |
| int | verbose |
| int | pix_double |
| int | text_bg |
| int | text_fg |
| int | x_key_value |
| int | x_key_shifted |
| int | borderx |
| int | bordery |
| long unsigned int | colour_table [256] |
| int | xclip_x1 |
| int | xclip_y1 |
| int | xclip_x2 |
| int | xclip_y2 |
| int | clipping_flag |
| unsigned char * | open_font |
| int | open_font_height |
| int | suppress_next_expose |
| int | cs_mouse_x |
| int | cs_mouse_y |
| float | gamma_correct_red |
| float | gamma_correct_green |
| float | gamma_correct_blue |
| Cursor | pirate_cursor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 598 of file lcwin32.c. 00599 {
00600 do_call_event (0);
00601 }
|
|
|
Definition at line 604 of file lcwin32.c. 00605 {
00606 do_call_event (1);
00607 }
|
|
|
Definition at line 333 of file lcx11.c. 00334 {
00335 short q;
00336 Visual *vid;
00337 XSetWindowAttributes xswa;
00338 XSizeHints sizehint;
00339 XWMHints wmhints;
00340 int depth;
00341 unsigned char wname[256]; /* Window Name */
00342 unsigned long vmask = CWEventMask | CWBackPixel | CWBackingStore;
00343
00344 depth = DefaultDepth (display.dpy, display.screen);
00345 xswa.event_mask = 0;
00346 xswa.background_pixel = display.bg;
00347 xswa.backing_store = Always;
00348 debug_printf ("DefaultVisual id=%d bp-rgb=%d map-entries=%d\n",
00349 (int) (*DefaultVisual (display.dpy, display.screen)).visualid,
00350 (*DefaultVisual (display.dpy, display.screen)).bits_per_rgb,
00351 (*DefaultVisual (display.dpy, display.screen)).map_entries);
00352 vid = DefaultVisual (display.dpy, display.screen);
00353 display.cmap
00354 = XDefaultColormap (display.dpy, display.screen);
00355 display.win = XCreateWindow (display.dpy, display.root,
00356 winX, winY,
00357 display.winW, display.winH, 0, depth,
00358 InputOutput, /* vid , */
00359 DefaultVisual (display.dpy, display.screen),
00360 /* PseudoColor, */
00361 vmask, &xswa);
00362
00363 sizehint.x = winX - 100;
00364 sizehint.y = winY;
00365 sizehint.width = display.winW;
00366 sizehint.height = display.winH;
00367 sizehint.min_width = display.winW;
00368 sizehint.min_height = display.winH;
00369 sizehint.max_width = display.winW;
00370 sizehint.max_height = display.winH;
00371 /* GCS FIX: Be careful about resizing the opening screen */
00372 /* WCK: Fixed. We lock it now, and unlock it after the opening screen.
00373 not gorgeous, but it works for now. Still need to clean up.*/
00374 #define NO_RESIZABLE_WINDOWS 1
00375 if (geometry != NULL) {
00376 #if defined (NO_RESIZABLE_WINDOWS)
00377 sizehint.flags = USPosition | USSize | PMinSize | PMaxSize;
00378 #else
00379 sizehint.flags = USPosition | USSize | PMinSize;
00380 #endif
00381 } else {
00382 #if defined (NO_RESIZABLE_WINDOWS)
00383 sizehint.flags = PPosition | PSize | PMinSize | PMaxSize;
00384 #else
00385 sizehint.flags = PPosition | PSize | PMinSize;
00386 #endif
00387 }
00388 XSetNormalHints (display.dpy, display.win, &sizehint);
00389
00390 display.protocol_atom = XInternAtom (display.dpy, "WM_PROTOCOLS",
00391 False);
00392 display.kill_atom = XInternAtom (display.dpy, "WM_DELETE_WINDOW",
00393 False);
00394
00395 /* Title */
00396 sprintf ((char *) wname,
00397 _("xlincity, Version %s, "
00398 "(Copyright) IJ Peters - copying policy GNU GPL"),
00399 VERSION);
00400 XChangeProperty (display.dpy, display.win,
00401 XA_WM_NAME, XA_STRING, 8, PropModeReplace, wname,
00402 strlen ((char *) wname));
00403
00404 /* Window Manager Hints (This is supposed to make input work.) */
00405 wmhints.flags = InputHint;
00406 wmhints.input = True;
00407 XSetWMHints (display.dpy, display.win, &wmhints);
00408
00409 /* GCS - 2003/08/15 - Cygwin doesn't generate the MapEvent unless
00410 the mask enabled before XMapWindow is called. Therefore,
00411 XSelectInput needs to be called before XMapWindow */
00412 XSelectInput (display.dpy, display.win,
00413 KeyPressMask | ButtonPressMask | ButtonReleaseMask
00414 | ExposureMask | StructureNotifyMask);
00415
00416 XMapWindow (display.dpy, display.win);
00417
00418 for (q = 0; q < 256; q++)
00419 {
00420 display.pixcolour_gc[q] = XCreateGC (display.dpy
00421 ,display.win, 0, NULL);
00422 XSetForeground (display.dpy, display.pixcolour_gc[q], q);
00423 XSetBackground (display.dpy, display.pixcolour_gc[q],
00424 display.bg);
00425 XSetGraphicsExposures (display.dpy, display.pixcolour_gc[q],
00426 False);
00427 }
00428 }
|
|
|
Definition at line 590 of file lcwin32.c. 00591 {
00592 if (wait)
00593 lc_usleep (1000);
00594 HandleMouse ();
00595 }
|
|
|
Definition at line 144 of file lcx11.c. 00145 {
00146 int i, n, me = 0, flag[256], vid;
00147 int depth;
00148 long unsigned int plane_masks[3];
00149 XColor pal[256];
00150 int writeable_p;
00151
00152 display.cmap = XDefaultColormap (display.dpy, display.screen);
00153 depth = DefaultDepth (display.dpy, display.screen);
00154
00155 /* Decide, if the colormap is writable */
00156 {
00157 Visual *visual = DefaultVisual (display.dpy, display.screen);
00158 #if defined(__cplusplus) || defined(c_plusplus)
00159 int visual_class = visual->c_class;
00160 #else
00161 int visual_class = visual->class;
00162 #endif
00163 writeable_p = (visual_class == PseudoColor || visual_class == GrayScale);
00164 }
00165
00166 if (writeable_p)
00167 {
00168 if (XAllocColorCells (display.dpy, display.cmap, 0
00169 ,plane_masks, 0, colour_table, 256) == 0)
00170 {
00171 me = (*DefaultVisual (display.dpy, display.screen)).map_entries;
00172 vid = (*DefaultVisual (display.dpy, display.screen)).visualid;
00173 display.cmap = XCreateColormap (display.dpy, display.win
00174 ,DefaultVisual (display.dpy, display.screen)
00175 /* ,PseudoColor */
00176 ,AllocNone);
00177 if (me == 256 && depth != 24)
00178 {
00179 if (XAllocColorCells (display.dpy, display.cmap, 0
00180 ,plane_masks, 0, colour_table, 256) != 0) {
00181 /* printf ("Allocated 256 cells\n"); */
00182 }
00183 else {
00184 printf ("Couldn't allocate 256 cells\n");
00185 }
00186 }
00187 else
00188 for (i = 0; i < 256; i++)
00189 colour_table[i] = i;
00190 }
00191 if (!display.cmap)
00192 HandleError ("No default colour map", FATAL);
00193 }
00194
00195 for (i = 0; i < 256; i++)
00196 flag[i] = 0;
00197
00198 for (n = 0; n < 256; n++)
00199 {
00200 pal[n].red = inpal[n].red << 10;
00201 pal[n].green = inpal[n].green << 10;
00202 pal[n].blue = inpal[n].blue << 10;
00203 pal[n].flags = DoRed | DoGreen | DoBlue;
00204 if (writeable_p)
00205 pal[n].pixel = colour_table[n];
00206 else
00207 {
00208 if (XAllocColor (display.dpy
00209 ,display.cmap, &(pal[n])) == 0)
00210 HandleError ("alloc colour failed"
00211 ,FATAL);
00212 colour_table[n] = pal[n].pixel;
00213 XSetForeground (display.dpy
00214 ,display.pixcolour_gc[n]
00215 ,colour_table[n]);
00216 }
00217 flag[n] = 1;
00218 }
00219
00220 if (writeable_p)
00221 {
00222 XStoreColors (display.dpy, display.cmap, pal, 256);
00223 XFlush (display.dpy);
00224 }
00225 XSetWindowColormap (display.dpy, display.win, display.cmap);
00226 }
|
|
|
Definition at line 809 of file mouse.c. 00810 {
00811 Rect* mw = &scr.main_win;
00812 int cur_mappoint_x = 0;
00813 int cur_mappoint_y = 0;
00814
00815 int cur_winpoint_x = 0;
00816 int cur_winpoint_y = 0;
00817
00818 int origin_x = 0;
00819 int origin_y = 0;
00820
00821 int in_main_window;
00822
00823 if (buttons[LC_MOUSE_MIDDLEBUTTON-1].mappoint_x == 0)
00824 return; /* Not pressed in main window */
00825
00826 in_main_window = pixel_to_mappoint(cs_mouse_x, cs_mouse_y,
00827 &cur_mappoint_x, &cur_mappoint_y);
00828
00829 pixel_to_winpoint(cs_mouse_x, cs_mouse_y, &cur_winpoint_x, &cur_winpoint_y);
00830
00831 origin_x =
00832 buttons[LC_MOUSE_MIDDLEBUTTON-1].mappoint_x - cur_winpoint_x;
00833 origin_y =
00834 buttons[LC_MOUSE_MIDDLEBUTTON-1].mappoint_y - cur_winpoint_y;
00835
00836 adjust_main_origin (origin_x, origin_y, 1);
00837 }
|
|
|
Definition at line 661 of file lcwin32.c. 00662 {
00663 }
|
|
||||||||||||
|
Definition at line 240 of file lcsvga.c. 00241 {
00242 fprintf (stderr,
00243 _("An error has occurred. The description is below...\n"));
00244 fprintf (stderr, "%s\n", description);
00245
00246 if (degree == FATAL) {
00247 fprintf (stderr, _("Program aborting...\n"));
00248 exit (-1);
00249 }
00250 }
|
|
|
Definition at line 742 of file lcx11.c. 00743 {
00744 XEvent loop_ev; /* for clearing the queue of events */
00745
00746 switch (event->type)
00747 {
00748 case KeyPress:
00749 {
00750 XKeyEvent *key_event = (XKeyEvent *) event;
00751 char buf[128];
00752 KeySym ks;
00753 XComposeStatus status;
00754 XLookupString (key_event, buf, 128, &ks, &status);
00755 x_key_shifted = ShiftMask & key_event->state;
00756 x_key_value = buf[0];
00757 switch (ks) {
00758 case XK_Left:
00759 x_key_value = 1;
00760 break;
00761 case XK_Down:
00762 x_key_value = 2;
00763 break;
00764 case XK_Up:
00765 x_key_value = 3;
00766 break;
00767 case XK_Right:
00768 x_key_value = 4;
00769 break;
00770 #if defined (commentout)
00771 /* GCS: What the hell is this??? */
00772 case 'C':
00773 if (!confine_pointer(-10,-10,200,200))
00774 unconfine_pointer();
00775 break;
00776 #endif
00777 case XK_BackSpace:
00778 case XK_Delete:
00779 x_key_value = 127;
00780 break;
00781 }
00782 }
00783 break;
00784
00785 case MotionNotify:
00786 {
00787 XMotionEvent *ev = (XMotionEvent *) event;
00788
00789 while (XCheckMaskEvent(display.dpy,PointerMotionMask,&loop_ev)) {
00790 ev = (XMotionEvent *) &loop_ev;
00791 }
00792 #ifdef DEBUG_X11_MOUSE
00793 printf("pointer motion event\n");
00794 #endif
00795 if (ev->state & Button2Mask)
00796 drag_screen();
00797
00798 }
00799 break;
00800
00801 case ButtonPress:
00802 {
00803 XButtonEvent *ev = (XButtonEvent *) event;
00804 if ((ev->state & ShiftMask) != 0)
00805 cs_mouse_shifted = 1;
00806 else
00807 cs_mouse_shifted = 0;
00808 #ifdef DEBUG_X11_MOUSE
00809 printf("button press: ev->button = %d\n",ev->button);
00810 #endif
00811 #if defined (commentout)
00812 mouse_button = ev->button;
00813 #endif
00814 switch (ev->button) {
00815 case Button1:
00816 mouse_button = LC_MOUSE_LEFTBUTTON | LC_MOUSE_PRESS;
00817 break;
00818 case Button2:
00819 mouse_button = LC_MOUSE_MIDDLEBUTTON | LC_MOUSE_PRESS;
00820 break;
00821 case Button3:
00822 mouse_button = LC_MOUSE_RIGHTBUTTON | LC_MOUSE_PRESS;
00823 break;
00824
00825 /* Wheel mouse support
00826 Move further for Shift (in main.c: process_keystrokes() ),
00827 left to right instead of up and down for Control */
00828
00829 case Button4: /* Up (3); Left (1) if Control */
00830 x_key_shifted = ShiftMask & ev->state;
00831 x_key_value = (ControlMask & ev->state) ? 1 : 3;
00832 break;
00833 case Button5: /* Down (4); Right (2) if control */
00834 x_key_shifted = ShiftMask & ev->state;
00835 x_key_value = (ControlMask & ev->state) ? 4 : 2;
00836 break;
00837
00838 /* XFree86-3 only supports 5 buttons, no Button6 or higher */
00839
00840 }
00841 cs_mouse_handler (mouse_button, 0, 0);
00842 mouse_button = 0;
00843 }
00844 break;
00845
00846 case ButtonRelease:
00847 {
00848 XButtonEvent *ev = (XButtonEvent *) event;
00849 mouse_button = ev->button;
00850 #ifdef DEBUG_X11_MOUSE
00851 printf("button release: ev->button = %d\n",ev->button);
00852 #endif
00853 switch (ev->button) {
00854 case Button1:
00855 mouse_button = LC_MOUSE_LEFTBUTTON | LC_MOUSE_RELEASE;
00856 break;
00857 case Button2:
00858 mouse_button = LC_MOUSE_MIDDLEBUTTON | LC_MOUSE_RELEASE;
00859 break;
00860 case Button3:
00861 mouse_button = LC_MOUSE_RIGHTBUTTON | LC_MOUSE_RELEASE;
00862 break;
00863 }
00864 cs_mouse_handler (mouse_button, 0, 0);
00865 mouse_button = 0;
00866 }
00867 break;
00868
00869 case Expose:
00870 {
00871 XExposeEvent *ev = (XExposeEvent *) event;
00872 int gx1,gy1,gx2,gy2;
00873 gx1 = ev->x;
00874 gy1 = ev->y;
00875 gx2 = ev->x + ev->width;
00876 gy2 = ev->y + ev->height;
00877
00878 /* Coalesce waiting exposes into single redraw */
00879 while (XCheckMaskEvent(display.dpy,ExposureMask,&loop_ev)) {
00880 ev = (XExposeEvent *) &loop_ev;
00881 gx1 = min_int (gx1,ev->x);
00882 gy1 = min_int (gy1,ev->y);
00883 gx2 = max_int (gx2,ev->x + ev->width);
00884 gy2 = max_int (gy2,ev->y + ev->height);
00885 }
00886 if (suppress_next_expose) {
00887 suppress_next_expose = 0;
00888 break;
00889 }
00890 refresh_screen (gx1,gy1,gx2,gy2);
00891 }
00892 break;
00893
00894 case ConfigureNotify:
00895 {
00896 XConfigureEvent *ev = (XConfigureEvent *) event;
00897
00898 while (XCheckTypedEvent(display.dpy, ConfigureNotify, &loop_ev)) {
00899 ev = (XConfigureEvent *) &loop_ev;
00900 }
00901 resize_geometry (ev->width, ev->height);
00902 }
00903 break;
00904 }
00905 //fprintf(stderr,"Handler fell through, event->type = %d\n",event->type);
00906 }
|
|
|
Definition at line 1037 of file lcx11.c. 01038 {
01039 XSelectInput (display.dpy, display.win,
01040 KeyPressMask | ButtonPressMask | ButtonReleaseMask
01041 | ExposureMask | StructureNotifyMask | ButtonMotionMask);
01042 }
|
|
|
Definition at line 196 of file lcsvga.c. 00197 {
00198 return vga_getkey ();
00199 }
|
|
||||||||||||||||
|
Definition at line 429 of file lcwin32.c. 00430 {
00431 int x, y, b;
00432 for (y = 0; y < 8; y++) {
00433 b = main_font[c * 8 + y];
00434 for (x = 0; x < 8; x++) {
00435 if ((b & 0x80) == 0) {
00436 #if defined (USE_WINDOWS_FONT)
00437 pixmap_setpixel (xx + x, yy + y, text_bg);
00438 #else
00439 Fgl_setpixel (xx + x, yy + y, text_bg);
00440 #endif
00441 } else {
00442 #if defined (USE_WINDOWS_FONT)
00443 pixmap_setpixel (xx + x, yy + y, text_fg);
00444 #else
00445 Fgl_setpixel (xx + x, yy + y, text_fg);
00446 #endif
00447 }
00448 b = b << 1;
00449 }
00450 }
00451 }
|
|
|
Definition at line 138 of file lcx11.c. 00139 {
00140 do_setcustompalette (inpal);
00141 }
|
|
||||||||||||||||
|
Definition at line 455 of file lcwin32.c. 00456 {
00457 int x, y, b;
00458 for (y = 0; y < open_font_height; y++) {
00459 b = open_font[c * open_font_height + y];
00460 for (x = 0; x < 8; x++) {
00461 if ((b & 0x80) == 0)
00462 Fgl_setpixel (xx + x, yy + y, text_bg);
00463 else
00464 Fgl_setpixel (xx + x, yy + y, text_fg);
00465 b = b << 1;
00466 }
00467 }
00468 }
|
|
||||||||||||||||
|
Definition at line 257 of file lcx11.c. 00258 {
00259 int option;
00260 extern char *optarg;
00261
00262 #ifdef ALLOW_PIX_DOUBLING
00263 char* option_string = "vbrndg:wR:G:B:D";
00264 #else
00265 char* option_string = "vbrng:wR:G:B:D";
00266 #endif
00267 while ((option = getopt (argc, argv, option_string)) != EOF) {
00268 switch (option)
00269 {
00270 case 'v':
00271 verbose = TRUE;
00272 break;
00273 case 'g':
00274 *geometry = optarg;
00275 break;
00276 #ifdef ALLOW_PIX_DOUBLING
00277 case 'd':
00278 pix_double = 1;
00279 /* Fall through. We are not allowed a border with pix doubling */
00280 #endif
00281 case 'b':
00282 borderx = 0;
00283 bordery = 0;
00284 break;
00285 case 'r':
00286 borderx = BORDERX;
00287 bordery = BORDERY;
00288 break;
00289 case 'n':
00290 no_init_help = TRUE;
00291 break;
00292 case 'w':
00293 gamma_correct_red = GAMMA_CORRECT_RED;
00294 gamma_correct_green = GAMMA_CORRECT_GREEN;
00295 gamma_correct_blue = GAMMA_CORRECT_BLUE;
00296 break;
00297 case 'R':
00298 sscanf (optarg, "%f", &gamma_correct_red);
00299 break;
00300 case 'G':
00301 sscanf (optarg, "%f", &gamma_correct_green);
00302 break;
00303 case 'B':
00304 sscanf (optarg, "%f", &gamma_correct_blue);
00305 break;
00306 case 'D':
00307 command_line_debug = 1;
00308 break;
00309 }
00310 }
00311 if (verbose)
00312 printf (_("Version %s\n"), VERSION);
00313 if (!(display.dpy = XOpenDisplay (display.dname)))
00314 {
00315 printf (" Can't open the dispay!\n");
00316 HandleError ("Cannot open display.\n", FATAL);
00317 exit (-1);
00318 }
00319 /* Record the screen number and root window. */
00320 display.screen = DefaultScreen (display.dpy);
00321 display.root = RootWindow (display.dpy, display.screen);
00322
00323 display.winW = WINWIDTH + borderx * 2 + pix_double * WINWIDTH;
00324 display.winH = WINHEIGHT + bordery * 2 + pix_double * WINHEIGHT;
00325 winX = (DisplayWidth (display.dpy, display.screen) - display.winW) / 2;
00326 winY = (DisplayHeight (display.dpy, display.screen) - display.winH) / 2;
00327 if (*geometry != NULL)
00328 XParseGeometry (*geometry, &winX, &winY, &display.winW, &display.winH);
00329 }
|
|
||||||||||||||||||||
|
Definition at line 911 of file lcx11.c. 00912 {
00913 #ifdef USE_IMAGES
00914 int wx1 = x1-borderx < 0 ? 0 : x1-borderx;
00915 int wy1 = y1-bordery < 0 ? 0 : y1-bordery;
00916 int wx2 = x2-borderx > pixmap_width ? pixmap_width : x2-borderx;
00917 int wy2 = y2-bordery > pixmap_height ? pixmap_height : y2-bordery;
00918 if (wx2-wx1 <= 0 || wy2-wy1 <= 0) {
00919 /* Note: the "< 0" part can happen for when x1 is in the right border,
00920 or when y1 is in the left border. */
00921 return;
00922 }
00923 Fgl_putbox_low (display.win, borderx, bordery, wx1, wy1,
00924 wx2 - wx1, wy2 - wy1, (unsigned char*) pixmap,
00925 pixmap_width, wx1, wy1);
00926 #else
00927 int x, y;
00928 #ifdef ALLOW_PIX_DOUBLING
00929 if (pix_double)
00930 {
00931 for (y = y1; y < y2; y++)
00932 for (x = x1; x < x2; x++)
00933 XFillRectangle (display.dpy, display.win
00934 ,display.pixcolour_gc[*(pixmap + x + y
00935 * (640 + BORDERX)) & 0xff], x * 2, y * 2, 2, 2);
00936 }
00937 else
00938 {
00939 #endif
00940 for (y = y1; y < y2; y++)
00941 for (x = x1; x < x2; x++)
00942 XDrawPoint (display.dpy, display.win
00943 ,display.pixcolour_gc[*(pixmap
00944 + x + y * (640 + BORDERX)) & 0xff], x, y);
00945 #ifdef ALLOW_PIX_DOUBLING
00946 }
00947 #endif /* ALLOW_PIX_DOUBLING */
00948 #endif /* USE_IMAGES */
00949 }
|
|
|
Definition at line 39 of file lcx11.c. 00040 {
00041 if (confine_flag) {
00042 XGrabPointer (display.dpy, display.win, 0,
00043 ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
00044 GrabModeAsync, GrabModeAsync,
00045 display.win, None, CurrentTime);
00046 } else {
00047 XUngrabPointer (display.dpy, CurrentTime);
00048 }
00049 }
|
|
|
|
|
|
Definition at line 123 of file cliglobs.c. |
|
|
Definition at line 123 of file cliglobs.c. |
|
|
|
|
|
|
|
|
Definition at line 37 of file cliglobs.c. |
|
|
Definition at line 36 of file cliglobs.c. |
|
|
Definition at line 36 of file cliglobs.c. |
|
|
Definition at line 122 of file cliglobs.c. |
|
|
|
|
|
|
|
|
Definition at line 33 of file cliglobs.c. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 19 of file shrglobs.c. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.3.9.1