Fossil

Hex Artifact Content
Login

Artifact 7d5dad76ade46f214a6db4c3c7b47dc42cd061c0107f7b1360da9216a2c309f8:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 36 2c 32 30 30 37 20 44 2e  (c) 2006,2007 D.
0020: 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a 2a   Richard Hipp.**
0030: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0040: 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72   is free softwar
0050: 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73  e; you can redis
0060: 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f  tribute it and/o
0070: 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20 75  r.** modify it u
0080: 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  nder the terms o
0090: 66 20 74 68 65 20 53 69 6d 70 6c 69 66 69 65 64  f the Simplified
00a0: 20 42 53 44 20 4c 69 63 65 6e 73 65 20 28 61 6c   BSD License (al
00b0: 73 6f 0a 2a 2a 20 6b 6e 6f 77 6e 20 61 73 20 74  so.** known as t
00c0: 68 65 20 22 32 2d 43 6c 61 75 73 65 20 4c 69 63  he "2-Clause Lic
00d0: 65 6e 73 65 22 20 6f 72 20 22 46 72 65 65 42 53  ense" or "FreeBS
00e0: 44 20 4c 69 63 65 6e 73 65 22 2e 29 0a 0a 2a 2a  D License".)..**
00f0: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0100: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
0110: 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74  the hope that it
0120: 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c   will be useful,
0130: 0a 2a 2a 20 62 75 74 20 77 69 74 68 6f 75 74 20  .** but without 
0140: 61 6e 79 20 77 61 72 72 61 6e 74 79 3b 20 77 69  any warranty; wi
0150: 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69  thout even the i
0160: 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20  mplied warranty 
0170: 6f 66 0a 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62  of.** merchantab
0180: 69 6c 69 74 79 20 6f 72 20 66 69 74 6e 65 73 73  ility or fitness
0190: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
01a0: 72 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  r purpose..**.**
01b0: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
01c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
01d0: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
01e0: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
01f0: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0200: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0250: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  *.**.** This fil
0260: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
0270: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
0280: 20 62 61 73 69 63 20 77 65 62 20 70 61 67 65 20   basic web page 
0290: 6c 6f 6f 6b 20 61 6e 64 20 66 65 65 6c 2e 0a 2a  look and feel..*
02a0: 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 56  *.*/.#include "V
02b0: 45 52 53 49 4f 4e 2e 68 22 0a 23 69 6e 63 6c 75  ERSION.h".#inclu
02c0: 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69  de "config.h".#i
02d0: 6e 63 6c 75 64 65 20 22 73 74 79 6c 65 2e 68 22  nclude "style.h"
02e0: 0a 0a 2f 2a 0a 2a 2a 20 45 6c 65 6d 65 6e 74 73  ../*.** Elements
02f0: 20 6f 66 20 74 68 65 20 73 75 62 6d 65 6e 75 20   of the submenu 
0300: 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  are collected in
0310: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
0320: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6e  .** structure an
0330: 64 20 64 69 73 70 6c 61 79 65 64 20 62 65 6c 6f  d displayed belo
0340: 77 20 74 68 65 20 6d 61 69 6e 20 6d 65 6e 75 2e  w the main menu.
0350: 0a 2a 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  .**.** Populate 
0360: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 20  these structure 
0370: 77 69 74 68 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  with calls to.**
0380: 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  .**      style_s
0390: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 29  ubmenu_element()
03a0: 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  .**      style_s
03b0: 75 62 6d 65 6e 75 5f 65 6e 74 72 79 28 29 0a 2a  ubmenu_entry().*
03c0: 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  *      style_sub
03d0: 6d 65 6e 75 5f 63 68 65 63 6b 62 6f 78 28 29 0a  menu_checkbox().
03e0: 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75  **      style_su
03f0: 62 6d 65 6e 75 5f 62 69 6e 61 72 79 28 29 0a 2a  bmenu_binary().*
0400: 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  *      style_sub
0410: 6d 65 6e 75 5f 6d 75 6c 74 69 63 68 6f 69 63 65  menu_multichoice
0420: 28 29 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65  ().**      style
0430: 5f 73 75 62 6d 65 6e 75 5f 73 71 6c 28 29 0a 2a  _submenu_sql().*
0440: 2a 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  *.** prior to ca
0450: 6c 6c 69 6e 67 20 73 74 79 6c 65 5f 66 69 6e 69  lling style_fini
0460: 73 68 5f 70 61 67 65 28 29 2e 20 20 54 68 65 20  sh_page().  The 
0470: 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61 67  style_finish_pag
0480: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  e() routine.** w
0490: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ill generate the
04a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 48 54 4d   appropriate HTM
04b0: 4c 20 74 65 78 74 20 6a 75 73 74 20 62 65 6c 6f  L text just belo
04c0: 77 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6d 65  w the main.** me
04d0: 6e 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  nu..*/.static st
04e0: 72 75 63 74 20 53 75 62 6d 65 6e 75 20 7b 0a 20  ruct Submenu {. 
04f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61   const char *zLa
0500: 62 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  bel;        /* B
0510: 75 74 74 6f 6e 20 6c 61 62 65 6c 20 2a 2f 0a 20  utton label */. 
0520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
0530: 6e 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  nk;         /* J
0540: 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 69 6e 6b  ump to this link
0550: 20 77 68 65 6e 20 62 75 74 74 6f 6e 20 69 73 20   when button is 
0560: 70 72 65 73 73 65 64 20 2a 2f 0a 7d 20 61 53 75  pressed */.} aSu
0570: 62 6d 65 6e 75 5b 33 30 5d 3b 0a 73 74 61 74 69  bmenu[30];.stati
0580: 63 20 69 6e 74 20 6e 53 75 62 6d 65 6e 75 20 3d  c int nSubmenu =
0590: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
05a0: 72 20 6f 66 20 62 75 74 74 6f 6e 73 20 2a 2f 0a  r of buttons */.
05b0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 75  static struct Su
05c0: 62 6d 65 6e 75 43 74 72 6c 20 7b 0a 20 20 63 6f  bmenuCtrl {.  co
05d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
05e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
05f0: 72 6d 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  rm query paramet
0600: 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
0610: 61 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 20 20  ar *zLabel;     
0620: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 2e 20 20       /* Label.  
0630: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  Might be NULL fo
0640: 72 20 46 46 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20  r FF_MULTI */.  
0650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 54  unsigned char eT
0660: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ype;         /* 
0670: 46 46 5f 45 4e 54 52 59 2c 20 46 46 5f 4d 55 4c  FF_ENTRY, FF_MUL
0680: 54 49 2c 20 46 46 5f 43 48 45 43 4b 42 4f 58 20  TI, FF_CHECKBOX 
0690: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
06a0: 61 72 20 65 56 69 73 69 62 6c 65 3b 20 20 20 20  ar eVisible;    
06b0: 20 20 2f 2a 20 53 54 59 4c 45 5f 4e 4f 52 4d 41    /* STYLE_NORMA
06c0: 4c 20 6f 72 20 53 54 59 4c 45 5f 44 49 53 41 42  L or STYLE_DISAB
06d0: 4c 45 44 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  LED */.  short i
06e0: 6e 74 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20  nt iSize;       
06f0: 20 20 20 20 20 20 2f 2a 20 57 69 64 74 68 20 66        /* Width f
0700: 6f 72 20 46 46 5f 45 4e 54 52 59 2e 20 20 43 6f  or FF_ENTRY.  Co
0710: 75 6e 74 20 66 6f 72 20 46 46 5f 4d 55 4c 54 49  unt for FF_MULTI
0720: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0730: 20 2a 63 6f 6e 73 74 20 2a 61 7a 43 68 6f 69 63   *const *azChoic
0740: 65 3b 20 2f 2a 20 76 61 6c 75 65 2f 64 69 73 70  e; /* value/disp
0750: 6c 61 79 20 70 61 69 72 73 20 66 6f 72 20 46 46  lay pairs for FF
0760: 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 63 6f 6e 73  _MULTI */.  cons
0770: 74 20 63 68 61 72 20 2a 7a 46 61 6c 73 65 3b 20  t char *zFalse; 
0780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 46 5f 42           /* FF_B
0790: 49 4e 41 52 59 20 6c 61 62 65 6c 20 77 68 65 6e  INARY label when
07a0: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 63 6f 6e 73   false */.  cons
07b0: 74 20 63 68 61 72 20 2a 7a 4a 53 3b 20 20 20 20  t char *zJS;    
07c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 61 76 61           /* Java
07d0: 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20 6f 6e  script to run on
07e0: 20 74 6f 67 67 6c 65 20 2a 2f 0a 7d 20 61 53 75   toggle */.} aSu
07f0: 62 6d 65 6e 75 43 74 72 6c 5b 32 30 5d 3b 0a 73  bmenuCtrl[20];.s
0800: 74 61 74 69 63 20 69 6e 74 20 6e 53 75 62 6d 65  tatic int nSubme
0810: 6e 75 43 74 72 6c 20 3d 20 30 3b 0a 23 64 65 66  nuCtrl = 0;.#def
0820: 69 6e 65 20 46 46 5f 45 4e 54 52 59 20 20 20 20  ine FF_ENTRY    
0830: 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  1          /* Te
0840: 78 74 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f 0a  xt entry box */.
0850: 23 64 65 66 69 6e 65 20 46 46 5f 4d 55 4c 54 49  #define FF_MULTI
0860: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f      2          /
0870: 2a 20 43 6f 6d 62 6f 62 6f 78 2e 20 20 4d 75 6c  * Combobox.  Mul
0880: 74 69 70 6c 65 20 63 68 6f 69 63 65 73 2e 20 2a  tiple choices. *
0890: 2f 0a 23 64 65 66 69 6e 65 20 46 46 5f 42 49 4e  /.#define FF_BIN
08a0: 41 52 59 20 20 20 33 20 20 20 20 20 20 20 20 20  ARY   3         
08b0: 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 66 6f 72 20   /* Control for 
08c0: 62 69 6e 61 72 79 20 71 75 65 72 79 20 70 61 72  binary query par
08d0: 61 6d 65 74 65 72 20 2a 2f 0a 23 64 65 66 69 6e  ameter */.#defin
08e0: 65 20 46 46 5f 43 48 45 43 4b 42 4f 58 20 34 20  e FF_CHECKBOX 4 
08f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
0900: 6b 2d 62 6f 78 20 2a 2f 0a 0a 23 69 66 20 49 4e  k-box */..#if IN
0910: 54 45 52 46 41 43 45 0a 23 64 65 66 69 6e 65 20  TERFACE.#define 
0920: 53 54 59 4c 45 5f 4e 4f 52 4d 41 4c 20 20 20 30  STYLE_NORMAL   0
0930: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c         /* Normal
0940: 20 64 69 73 70 6c 61 79 20 6f 66 20 63 6f 6e 74   display of cont
0950: 72 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  rol */.#define S
0960: 54 59 4c 45 5f 44 49 53 41 42 4c 45 44 20 31 20  TYLE_DISABLED 1 
0970: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
0980: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
0990: 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46  #endif /* INTERF
09a0: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
09b0: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 20  member that the 
09c0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
09d0: 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20  generated.  The 
09e0: 66 6f 6f 74 65 72 20 69 73 20 6f 6d 69 74 74 65  footer is omitte
09f0: 64 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72  d.** if an error
0a00: 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74   occurs before t
0a10: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 73 74  he header..*/.st
0a20: 61 74 69 63 20 69 6e 74 20 68 65 61 64 65 72 48  atic int headerH
0a30: 61 73 42 65 65 6e 47 65 6e 65 72 61 74 65 64 20  asBeenGenerated 
0a40: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 72 65 6d 65  = 0;../*.** reme
0a50: 6d 62 65 72 2c 20 69 66 20 61 20 73 69 64 65 62  mber, if a sideb
0a60: 6f 78 20 77 61 73 20 75 73 65 64 0a 2a 2f 0a 73  ox was used.*/.s
0a70: 74 61 74 69 63 20 69 6e 74 20 73 69 64 65 62 6f  tatic int sidebo
0a80: 78 55 73 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  xUsed = 0;../*.*
0a90: 2a 20 41 64 2d 75 6e 69 74 20 73 74 79 6c 65 73  * Ad-unit styles
0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  ..*/.static unsi
0ab0: 67 6e 65 64 20 61 64 55 6e 69 74 46 6c 61 67 73  gned adUnitFlags
0ac0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   = 0;../*.** Sub
0ad0: 6d 65 6e 75 20 64 69 73 61 62 6c 65 20 66 6c 61  menu disable fla
0ae0: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  g.*/.static int 
0af0: 73 75 62 6d 65 6e 75 45 6e 61 62 6c 65 20 3d 20  submenuEnable = 
0b00: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 61 67 73 20  1;../*.** Flags 
0b10: 66 6f 72 20 76 61 72 69 6f 75 73 20 6a 61 76 61  for various java
0b20: 73 63 72 69 70 74 20 66 69 6c 65 73 20 6e 65 65  script files nee
0b30: 64 65 64 20 70 72 69 6f 72 20 74 6f 20 3c 2f 62  ded prior to </b
0b40: 6f 64 79 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ody>.*/.static i
0b50: 6e 74 20 6e 65 65 64 48 72 65 66 4a 73 20 3d 20  nt needHrefJs = 
0b60: 30 3b 20 20 20 20 20 20 2f 2a 20 68 72 65 66 2e  0;      /* href.
0b70: 6a 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74  js */../*.** Ext
0b80: 72 61 20 4a 53 20 61 64 64 65 64 20 74 6f 20 74  ra JS added to t
0b90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
0ba0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 6c  le..*/.static Bl
0bb0: 6f 62 20 62 6c 6f 62 4f 6e 4c 6f 61 64 20 3d 20  ob blobOnLoad = 
0bc0: 42 4c 4f 42 5f 49 4e 49 54 49 41 4c 49 5a 45 52  BLOB_INITIALIZER
0bd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
0be0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
0bf0: 61 6e 63 68 6f 72 20 74 61 67 20 6c 69 6b 65 20  anchor tag like 
0c00: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
0c10: 20 20 20 3c 61 20 68 72 65 66 3d 22 55 52 4c 22     <a href="URL"
0c20: 3e 0a 2a 2a 20 20 6f 72 20 20 20 20 3c 61 20 69  >.**  or    <a i
0c30: 64 3d 22 49 44 22 3e 0a 2a 2a 0a 2a 2a 20 54 68  d="ID">.**.** Th
0c40: 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 61 6e  e form of the an
0c50: 63 68 6f 72 20 74 61 67 20 69 73 20 64 65 74 65  chor tag is dete
0c60: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 67 2e  rmined by the g.
0c70: 6a 73 48 72 65 66 0a 2a 2a 20 61 6e 64 20 67 2e  jsHref.** and g.
0c80: 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 76  perm.Hyperlink v
0c90: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
0ca0: 20 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69    g.perm.Hyperli
0cb0: 6e 6b 20 20 67 2e 6a 73 48 72 65 66 20 20 20 20  nk  g.jsHref    
0cc0: 20 20 20 20 52 65 74 75 72 6e 65 64 20 61 6e 63      Returned anc
0cd0: 68 6f 72 20 66 6f 72 6d 61 74 0a 2a 2a 20 20 20  hor format.**   
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20    --------      
0d00: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
0d20: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
0d30: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
0d40: 20 20 20 20 28 65 6d 70 74 79 20 73 74 72 69 6e      (empty strin
0d50: 67 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 30  g).**          0
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 28 65 6d 70              (emp
0d80: 74 79 20 73 74 72 69 6e 67 29 0a 2a 2a 20 20 20  ty string).**   
0d90: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
0da0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
0db0: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 55 52 4c      <a href="URL
0dc0: 22 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 31  ">.**          1
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 61 20 64              <a d
0df0: 61 74 61 2d 68 72 65 66 3d 22 55 52 4c 22 3e 0a  ata-href="URL">.
0e00: 2a 2a 0a 2a 2a 20 4e 6f 20 61 6e 63 68 6f 72 20  **.** No anchor 
0e10: 74 61 67 20 69 73 20 67 65 6e 65 72 61 74 65 64  tag is generated
0e20: 20 69 66 20 67 2e 70 65 72 6d 2e 48 79 70 65 72   if g.perm.Hyper
0e30: 6c 69 6e 6b 20 69 73 20 66 61 6c 73 65 2e 0a 2a  link is false..*
0e40: 2a 20 54 68 65 20 68 72 65 66 3d 22 55 52 4c 22  * The href="URL"
0e50: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66   form is used if
0e60: 20 67 2e 6a 73 48 72 65 66 20 69 73 20 66 61 6c   g.jsHref is fal
0e70: 73 65 2e 0a 2a 2a 20 49 66 20 67 2e 6a 73 48 72  se..** If g.jsHr
0e80: 65 66 20 69 73 20 74 72 75 65 20 74 68 65 6e 20  ef is true then 
0e90: 74 68 65 20 64 61 74 61 2d 68 72 65 66 3d 22 55  the data-href="U
0ea0: 52 4c 22 20 61 6e 64 0a 2a 2a 20 68 72 65 66 3d  RL" and.** href=
0eb0: 22 2f 68 6f 6e 65 79 70 6f 74 22 20 69 73 20 67  "/honeypot" is g
0ec0: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 6a 61 76  enerated and jav
0ed0: 61 73 63 72 69 70 74 20 69 73 20 61 64 64 65 64  ascript is added
0ee0: 20 74 6f 20 74 68 65 20 66 6f 6f 74 65 72 0a 2a   to the footer.*
0ef0: 2a 20 74 6f 20 63 61 75 73 65 20 64 61 74 61 2d  * to cause data-
0f00: 68 72 65 66 20 76 61 6c 75 65 73 20 74 6f 20 62  href values to b
0f10: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
0f20: 68 72 65 66 0a 2a 2a 20 61 66 74 65 72 20 74 68  href.** after th
0f30: 65 20 70 61 67 65 20 68 61 73 20 6c 6f 61 64 65  e page has loade
0f40: 64 2e 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  d. The use of th
0f50: 65 20 64 61 74 61 2d 68 72 65 66 3d 22 55 52 4c  e data-href="URL
0f60: 22 20 66 6f 72 6d 0a 2a 2a 20 69 6e 73 74 65 61  " form.** instea
0f70: 64 20 6f 66 20 68 72 65 66 3d 22 55 52 4c 22 20  d of href="URL" 
0f80: 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67 61  is a defense aga
0f90: 69 6e 73 74 20 62 6f 74 73 2e 0a 2a 2a 0a 2a 2a  inst bots..**.**
0fa0: 20 49 66 20 74 68 65 20 75 73 65 72 20 6c 61 63   If the user lac
0fb0: 6b 73 20 74 68 65 20 48 79 70 65 72 6c 69 6e 6b  ks the Hyperlink
0fc0: 20 28 68 29 20 70 72 6f 70 65 72 74 79 20 61 6e   (h) property an
0fd0: 64 20 74 68 65 20 22 61 75 74 6f 2d 68 79 70 65  d the "auto-hype
0fe0: 72 6c 69 6e 6b 22 0a 2a 2a 20 73 65 74 74 69 6e  rlink".** settin
0ff0: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
1000: 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b  g.perm.Hyperlink
1010: 20 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   is changed from
1020: 20 30 20 74 6f 20 31 20 61 6e 64 0a 2a 2a 20 67   0 to 1 and.** g
1030: 2e 6a 73 48 72 65 66 20 69 73 20 73 65 74 20 74  .jsHref is set t
1040: 6f 20 31 20 62 79 20 6c 6f 67 69 6e 5f 63 68 65  o 1 by login_che
1050: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
1060: 2e 20 20 54 68 75 73 0a 2a 2a 20 74 68 65 20 67  .  Thus.** the g
1070: 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20  .perm.Hyperlink 
1080: 70 72 6f 70 65 72 74 79 20 77 69 6c 6c 20 62 65  property will be
1090: 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68   true even if th
10a0: 65 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 0a  e user does not.
10b0: 2a 2a 20 68 61 76 65 20 74 68 65 20 22 68 22 20  ** have the "h" 
10c0: 70 72 69 76 69 6c 65 67 65 20 69 66 20 74 68 65  privilege if the
10d0: 20 22 61 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b   "auto-hyperlink
10e0: 22 20 73 65 74 74 69 6e 67 20 69 73 20 74 72 75  " setting is tru
10f0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 55 73 65 72 20 68  e..**.**  User h
1100: 61 73 20 22 68 22 20 20 61 75 74 6f 2d 68 79 70  as "h"  auto-hyp
1110: 65 72 6c 69 6e 6b 20 20 20 20 20 20 67 2e 70 65  erlink      g.pe
1120: 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 20 67 2e  rm.Hyperlink  g.
1130: 6a 73 48 72 65 66 0a 2a 2a 20 20 2d 2d 2d 2d 2d  jsHref.**  -----
1140: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
1150: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d  -------      ---
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 20 20 30  ----.**        0
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
11c0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 20 20         0.**     
11d0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
11e0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
11f0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1200: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
1210: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
1220: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1230: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 31 20 20 20 20  .**        1    
1260: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 30 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 69     0.**.** So, i
12a0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
12b0: 72 61 63 69 6e 67 20 69 6e 70 75 74 20 63 6f 6e  racing input con
12c0: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 66 69  figuration to fi
12d0: 6e 61 6c 20 61 63 74 69 6f 6e 73 20 77 65 20 68  nal actions we h
12e0: 61 76 65 3a 0a 2a 2a 0a 2a 2a 20 20 55 73 65 72  ave:.**.**  User
12f0: 20 68 61 73 20 22 68 22 20 20 61 75 74 6f 2d 68   has "h"  auto-h
1300: 79 70 65 72 6c 69 6e 6b 20 20 20 20 20 20 52 65  yperlink      Re
1310: 74 75 72 6e 65 64 20 61 6e 63 68 6f 72 20 66 6f  turned anchor fo
1320: 72 6d 61 74 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d  rmat.**  -------
1330: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1340: 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d 2d 2d  -----      -----
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 0a 2a 2a 20 20 20 20 20 20 20 20 30 20 20 20  -.**        0   
1370: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
1380: 20 20 20 20 20 20 20 20 28 65 6d 70 74 79 20 73          (empty s
1390: 74 72 69 6e 67 29 0a 2a 2a 20 20 20 20 20 20 20  tring).**       
13a0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 30   1             0
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 61 20               <a 
13c0: 68 72 65 66 3d 22 55 52 4c 22 3e 0a 2a 2a 20 20  href="URL">.**  
13d0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13e0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13f0: 20 20 3c 61 20 64 61 74 61 2d 68 72 65 66 3d 22    <a data-href="
1400: 55 52 4c 22 3e 0a 2a 2a 20 20 20 20 20 20 20 20  URL">.**        
1410: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20  1             1 
1420: 20 20 20 20 20 20 20 20 20 20 20 20 3c 61 20 68              <a h
1430: 72 65 66 3d 22 55 52 4c 22 3e 0a 2a 2a 0a 2a 2a  ref="URL">.**.**
1440: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
1450: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
1460: 64 65 6c 69 62 65 72 61 74 65 6c 79 20 6b 65 70  deliberately kep
1470: 74 20 73 68 6f 72 74 20 73 6f 20 74 68 61 74 20  t short so that 
1480: 63 61 6e 20 62 65 0a 2a 2a 20 65 61 73 69 6c 79  can be.** easily
1490: 20 75 73 65 64 20 77 69 74 68 69 6e 20 40 2d 6c   used within @-l
14a0: 69 6e 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  ines.  Example:.
14b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 40 20 25 7a 28  **.**      @ %z(
14c0: 68 72 65 66 28 22 25 52 2f 61 72 74 69 66 61 63  href("%R/artifac
14d0: 74 2f 25 73 22 2c 7a 55 75 69 64 29 29 25 68 28  t/%s",zUuid))%h(
14e0: 7a 46 4e 29 3c 2f 61 3e 0a 2a 2a 0a 2a 2a 20 4e  zFN)</a>.**.** N
14f0: 6f 74 65 20 25 7a 20 66 6f 72 6d 61 74 2e 20 20  ote %z format.  
1500: 54 68 65 20 73 74 72 69 6e 67 20 72 65 74 75 72  The string retur
1510: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
1520: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a  tion is always.*
1530: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
1540: 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 29 20  fossil_malloc() 
1550: 73 6f 20 72 65 6e 64 65 72 69 6e 67 20 69 74 20  so rendering it 
1560: 77 69 74 68 20 25 7a 20 77 69 6c 6c 20 72 65 63  with %z will rec
1570: 6c 61 69 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d  laim.** that mem
1580: 6f 72 79 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ory space..**.**
1590: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
15a0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
15b0: 73 20 72 6f 75 74 69 6e 65 3a 0a 2a 2a 0a 2a 2a  s routine:.**.**
15c0: 20 20 20 20 28 31 29 20 20 20 68 72 65 66 28 29      (1)   href()
15d0: 20 64 6f 65 73 20 61 20 70 6c 61 69 6e 20 68 79   does a plain hy
15e0: 70 65 72 6c 69 6e 6b 0a 2a 2a 20 20 20 20 28 32  perlink.**    (2
15f0: 29 20 20 20 78 68 72 65 66 28 29 20 61 64 64 73  )   xhref() adds
1600: 20 65 78 74 72 61 20 61 74 74 72 69 62 75 74 65   extra attribute
1610: 20 74 65 78 74 0a 2a 2a 20 20 20 20 28 33 29 20   text.**    (3) 
1620: 20 20 63 68 72 65 66 28 29 20 61 64 64 73 20 61    chref() adds a
1630: 20 63 6c 61 73 73 20 6e 61 6d 65 0a 2a 2a 0a 2a   class name.**.*
1640: 2a 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69  * g.perm.Hyperli
1650: 6e 6b 20 69 73 20 74 72 75 65 20 69 66 20 74 68  nk is true if th
1660: 65 20 75 73 65 72 20 68 61 73 20 74 68 65 20 48  e user has the H
1670: 79 70 65 72 6c 69 6e 6b 20 28 68 29 20 70 72 6f  yperlink (h) pro
1680: 70 65 72 74 79 2e 0a 2a 2a 20 4d 6f 73 74 20 6c  perty..** Most l
1690: 6f 67 67 65 64 20 69 6e 20 75 73 65 72 73 20 73  ogged in users s
16a0: 68 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20  hould have this 
16b0: 70 72 6f 70 65 72 74 79 2c 20 73 69 6e 63 65 20  property, since 
16c0: 77 65 20 63 61 6e 20 61 73 73 75 6d 65 0a 2a 2a  we can assume.**
16d0: 20 74 68 61 74 20 61 20 6c 6f 67 67 65 64 20 69   that a logged i
16e0: 6e 20 75 73 65 72 20 69 73 20 6e 6f 74 20 61 20  n user is not a 
16f0: 62 6f 74 2e 20 20 4f 6e 6c 79 20 22 6e 6f 62 6f  bot.  Only "nobo
1700: 64 79 22 20 6c 61 63 6b 73 20 67 2e 70 65 72 6d  dy" lacks g.perm
1710: 2e 48 79 70 65 72 6c 69 6e 6b 2c 0a 2a 2a 20 74  .Hyperlink,.** t
1720: 79 70 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 63 68 61  ypically..*/.cha
1730: 72 20 2a 78 68 72 65 66 28 63 6f 6e 73 74 20 63  r *xhref(const c
1740: 68 61 72 20 2a 7a 45 78 74 72 61 2c 20 63 6f 6e  har *zExtra, con
1750: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1760: 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
1770: 7a 55 72 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 20  zUrl;.  va_list 
1780: 61 70 3b 0a 20 20 69 66 28 20 21 67 2e 70 65 72  ap;.  if( !g.per
1790: 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 29 20 72 65  m.Hyperlink ) re
17a0: 74 75 72 6e 20 66 6f 73 73 69 6c 5f 73 74 72 64  turn fossil_strd
17b0: 75 70 28 22 22 29 3b 0a 20 20 76 61 5f 73 74 61  up("");.  va_sta
17c0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
17d0: 0a 20 20 7a 55 72 6c 20 3d 20 76 6d 70 72 69 6e  .  zUrl = vmprin
17e0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
17f0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1800: 20 69 66 28 20 21 67 2e 6a 73 48 72 65 66 20 29   if( !g.jsHref )
1810: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 48 55 72  {.    char *zHUr
1820: 6c 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 74 72  l;.    if( zExtr
1830: 61 20 29 7b 0a 20 20 20 20 20 20 7a 48 55 72 6c  a ){.      zHUrl
1840: 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c 61 20 25   = mprintf("<a %
1850: 73 20 68 72 65 66 3d 5c 22 25 68 5c 22 3e 22 2c  s href=\"%h\">",
1860: 20 7a 45 78 74 72 61 2c 20 7a 55 72 6c 29 3b 0a   zExtra, zUrl);.
1870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1880: 20 7a 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74 66   zHUrl = mprintf
1890: 28 22 3c 61 20 68 72 65 66 3d 5c 22 25 68 5c 22  ("<a href=\"%h\"
18a0: 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 20 20 7d  >", zUrl);.    }
18b0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  .    fossil_free
18c0: 28 7a 55 72 6c 29 3b 0a 20 20 20 20 72 65 74 75  (zUrl);.    retu
18d0: 72 6e 20 7a 48 55 72 6c 3b 0a 20 20 7d 0a 20 20  rn zHUrl;.  }.  
18e0: 6e 65 65 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a  needHrefJs = 1;.
18f0: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20    if( zExtra==0 
1900: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 70  ){.    return mp
1910: 72 69 6e 74 66 28 22 3c 61 20 64 61 74 61 2d 68  rintf("<a data-h
1920: 72 65 66 3d 27 25 7a 27 20 68 72 65 66 3d 27 25  ref='%z' href='%
1930: 52 2f 68 6f 6e 65 79 70 6f 74 27 3e 22 2c 20 7a  R/honeypot'>", z
1940: 55 72 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Url);.  }else{. 
1950: 20 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74     return mprint
1960: 66 28 22 3c 61 20 25 73 20 64 61 74 61 2d 68 72  f("<a %s data-hr
1970: 65 66 3d 27 25 7a 27 20 68 72 65 66 3d 27 25 52  ef='%z' href='%R
1980: 2f 68 6f 6e 65 79 70 6f 74 27 3e 22 2c 0a 20 20  /honeypot'>",.  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 7a 45 78 74 72 61 2c 20 7a 55 72 6c 29 3b 0a   zExtra, zUrl);.
19b0: 20 20 7d 0a 7d 0a 63 68 61 72 20 2a 63 68 72 65    }.}.char *chre
19c0: 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45  f(const char *zE
19d0: 78 74 72 61 2c 20 63 6f 6e 73 74 20 63 68 61 72  xtra, const char
19e0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
19f0: 0a 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20  .  char *zUrl;. 
1a00: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
1a10: 66 28 20 21 67 2e 70 65 72 6d 2e 48 79 70 65 72  f( !g.perm.Hyper
1a20: 6c 69 6e 6b 20 29 20 72 65 74 75 72 6e 20 66 6f  link ) return fo
1a30: 73 73 69 6c 5f 73 74 72 64 75 70 28 22 22 29 3b  ssil_strdup("");
1a40: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1a50: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 55 72 6c  zFormat);.  zUrl
1a60: 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72   = vmprintf(zFor
1a70: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1a80: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 21 67  nd(ap);.  if( !g
1a90: 2e 6a 73 48 72 65 66 20 29 7b 0a 20 20 20 20 63  .jsHref ){.    c
1aa0: 68 61 72 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72  har *zHUrl = mpr
1ab0: 69 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d 5c  intf("<a class=\
1ac0: 22 25 73 5c 22 20 68 72 65 66 3d 5c 22 25 68 5c  "%s\" href=\"%h\
1ad0: 22 3e 22 2c 20 7a 45 78 74 72 61 2c 20 7a 55 72  ">", zExtra, zUr
1ae0: 6c 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66  l);.    fossil_f
1af0: 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20 20 20 72  ree(zUrl);.    r
1b00: 65 74 75 72 6e 20 7a 48 55 72 6c 3b 0a 20 20 7d  eturn zHUrl;.  }
1b10: 0a 20 20 6e 65 65 64 48 72 65 66 4a 73 20 3d 20  .  needHrefJs = 
1b20: 31 3b 0a 20 20 72 65 74 75 72 6e 20 6d 70 72 69  1;.  return mpri
1b30: 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d 27 25  ntf("<a class='%
1b40: 73 27 20 64 61 74 61 2d 68 72 65 66 3d 27 25 7a  s' data-href='%z
1b50: 27 20 68 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79  ' href='%R/honey
1b60: 70 6f 74 27 3e 22 2c 0a 20 20 20 20 20 20 20 20  pot'>",.        
1b70: 20 20 20 20 20 20 20 20 20 7a 45 78 74 72 61 2c           zExtra,
1b80: 20 7a 55 72 6c 29 3b 0a 7d 0a 63 68 61 72 20 2a   zUrl);.}.char *
1b90: 68 72 65 66 28 63 6f 6e 73 74 20 63 68 61 72 20  href(const char 
1ba0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1bb0: 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 20    char *zUrl;.  
1bc0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
1bd0: 28 20 21 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c  ( !g.perm.Hyperl
1be0: 69 6e 6b 20 29 20 72 65 74 75 72 6e 20 66 6f 73  ink ) return fos
1bf0: 73 69 6c 5f 73 74 72 64 75 70 28 22 22 29 3b 0a  sil_strdup("");.
1c00: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1c10: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 55 72 6c 20  Format);.  zUrl 
1c20: 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  = vmprintf(zForm
1c30: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1c40: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 21 67 2e  d(ap);.  if( !g.
1c50: 6a 73 48 72 65 66 20 29 7b 0a 20 20 20 20 63 68  jsHref ){.    ch
1c60: 61 72 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72 69  ar *zHUrl = mpri
1c70: 6e 74 66 28 22 3c 61 20 68 72 65 66 3d 5c 22 25  ntf("<a href=\"%
1c80: 68 5c 22 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 20  h\">", zUrl);.  
1c90: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 55    fossil_free(zU
1ca0: 72 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rl);.    return 
1cb0: 7a 48 55 72 6c 3b 0a 20 20 7d 0a 20 20 6e 65 65  zHUrl;.  }.  nee
1cc0: 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20 72  dHrefJs = 1;.  r
1cd0: 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 3c  eturn mprintf("<
1ce0: 61 20 64 61 74 61 2d 68 72 65 66 3d 27 25 73 27  a data-href='%s'
1cf0: 20 68 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79 70   href='%R/honeyp
1d00: 6f 74 27 3e 22 2c 0a 20 20 20 20 20 20 20 20 20  ot'>",.         
1d10: 20 20 20 20 20 20 20 20 20 7a 55 72 6c 29 3b 0a           zUrl);.
1d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1d30: 65 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22  e <form method="
1d40: 70 6f 73 74 22 20 61 63 74 69 6f 6e 3d 41 52 47  post" action=ARG
1d50: 3e 2e 20 20 54 68 65 20 41 52 47 20 76 61 6c 75  >.  The ARG valu
1d60: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  e is determined.
1d70: 2a 2a 20 62 79 20 74 68 65 20 61 72 67 75 6d 65  ** by the argume
1d80: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 61 20  nts..**.** As a 
1d90: 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20  defense against 
1da0: 72 6f 62 6f 74 73 2c 20 74 68 65 20 61 63 74 69  robots, the acti
1db0: 6f 6e 3d 41 52 47 20 6d 69 67 68 74 20 69 6e 73  on=ARG might ins
1dc0: 74 65 61 64 20 62 79 20 64 61 74 61 2d 61 63 74  tead by data-act
1dd0: 69 6f 6e 3d 41 52 47 0a 2a 2a 20 61 6e 64 20 6a  ion=ARG.** and j
1de0: 61 76 61 73 63 72 69 70 74 20 28 68 72 65 66 2e  avascript (href.
1df0: 6a 73 29 20 61 64 64 65 64 20 74 6f 20 74 68 65  js) added to the
1e00: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
1e10: 65 20 64 61 74 61 2d 61 63 74 69 6f 6e 3d 20 69  e data-action= i
1e20: 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 69 6e 74  s.** changed int
1e30: 6f 20 61 63 74 69 6f 6e 3d 20 61 66 74 65 72 20  o action= after 
1e40: 74 68 65 20 70 61 67 65 20 6c 6f 61 64 73 2e 20  the page loads. 
1e50: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
1e60: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
1e70: 64 65 70 65 6e 64 73 20 6f 6e 20 69 66 20 74 68  depends on if th
1e80: 65 20 75 73 65 72 20 68 61 73 20 74 68 65 20 22  e user has the "
1e90: 68 22 20 70 72 69 76 69 6c 65 67 65 20 61 6e 64  h" privilege and
1ea0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1eb0: 74 68 65 0a 2a 2a 20 61 75 74 6f 2d 68 79 70 65  the.** auto-hype
1ec0: 72 6c 69 6e 6b 20 73 65 74 74 69 6e 67 20 69 73  rlink setting is
1ed0: 20 6f 6e 2e 20 20 54 68 65 73 65 20 73 65 74 69   on.  These seti
1ee0: 6e 67 73 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ngs determine th
1ef0: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
1f00: 61 72 69 61 62 6c 65 73 20 67 2e 70 65 72 6d 2e  ariables g.perm.
1f10: 48 79 70 65 72 6c 69 6e 6b 20 61 6e 64 20 67 2e  Hyperlink and g.
1f20: 6a 73 48 72 65 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  jsHref..**.**   
1f30: 20 55 73 65 72 20 68 61 73 20 22 68 22 20 20 61   User has "h"  a
1f40: 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 20 20 20  uto-hyperlink   
1f50: 20 20 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c     g.perm.Hyperl
1f60: 69 6e 6b 20 20 67 2e 6a 73 48 72 65 66 0a 2a 2a  ink  g.jsHref.**
1f70: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1f80: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1f90: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1fa0: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1fb0: 0a 2a 2a 20 20 31 3a 20 20 20 20 20 20 30 20 20  .**  1:      0  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a  0             0.
1ff0: 2a 2a 20 20 32 3a 20 20 20 20 20 20 31 20 20 20  **  2:      1   
2000: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
2030: 2a 20 20 33 3a 20 20 20 20 20 20 30 20 20 20 20  *  3:      0    
2040: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
2060: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 2a 2a              1.**
2070: 20 20 34 3a 20 20 20 20 20 20 31 20 20 20 20 20    4:      1     
2080: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
20a0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 0a             0.**.
20b0: 2a 2a 20 54 68 65 20 64 61 74 61 2d 61 63 74 69  ** The data-acti
20c0: 6f 6e 3d 41 52 47 20 66 6f 72 6d 20 69 73 20 75  on=ARG form is u
20d0: 73 65 64 20 66 6f 72 20 63 61 73 65 73 20 31 20  sed for cases 1 
20e0: 61 6e 64 20 33 2e 20 20 49 6e 20 63 61 73 65 20  and 3.  In case 
20f0: 31 2c 20 74 68 65 20 68 72 65 66 2e 6a 73 0a 2a  1, the href.js.*
2100: 2a 20 6a 61 76 61 73 63 72 69 70 74 20 69 73 20  * javascript is 
2110: 6f 6d 69 74 74 65 64 20 61 6e 64 20 73 6f 20 74  omitted and so t
2120: 68 65 20 66 6f 72 6d 20 69 73 20 65 66 66 65 63  he form is effec
2130: 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65 64 2e  tively disabled.
2140: 0a 2a 2f 0a 76 6f 69 64 20 66 6f 72 6d 5f 62 65  .*/.void form_be
2150: 67 69 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gin(const char *
2160: 7a 4f 74 68 65 72 41 72 67 73 2c 20 63 6f 6e 73  zOtherArgs, cons
2170: 74 20 63 68 61 72 20 2a 7a 41 63 74 69 6f 6e 2c  t char *zAction,
2180: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
2190: 4c 69 6e 6b 3b 0a 20 20 76 61 5f 6c 69 73 74 20  Link;.  va_list 
21a0: 61 70 3b 0a 20 20 69 66 28 20 7a 4f 74 68 65 72  ap;.  if( zOther
21b0: 41 72 67 73 3d 3d 30 20 29 20 7a 4f 74 68 65 72  Args==0 ) zOther
21c0: 41 72 67 73 20 3d 20 22 22 3b 0a 20 20 76 61 5f  Args = "";.  va_
21d0: 73 74 61 72 74 28 61 70 2c 20 7a 41 63 74 69 6f  start(ap, zActio
21e0: 6e 29 3b 0a 20 20 7a 4c 69 6e 6b 20 3d 20 76 6d  n);.  zLink = vm
21f0: 70 72 69 6e 74 66 28 7a 41 63 74 69 6f 6e 2c 20  printf(zAction, 
2200: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
2210: 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  );.  if( g.perm.
2220: 48 79 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20  Hyperlink ){.   
2230: 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d   @ <form method=
2240: 22 50 4f 53 54 22 20 61 63 74 69 6f 6e 3d 22 25  "POST" action="%
2250: 7a 28 7a 4c 69 6e 6b 29 22 20 25 73 28 7a 4f 74  z(zLink)" %s(zOt
2260: 68 65 72 41 72 67 73 29 3e 0a 20 20 7d 65 6c 73  herArgs)>.  }els
2270: 65 7b 0a 20 20 20 20 6e 65 65 64 48 72 65 66 4a  e{.    needHrefJ
2280: 73 20 3d 20 31 3b 0a 20 20 20 20 40 20 3c 66 6f  s = 1;.    @ <fo
2290: 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22  rm method="POST"
22a0: 20 64 61 74 61 2d 61 63 74 69 6f 6e 3d 27 25 73   data-action='%s
22b0: 28 7a 4c 69 6e 6b 29 27 20 61 63 74 69 6f 6e 3d  (zLink)' action=
22c0: 27 25 52 2f 6c 6f 67 69 6e 27 20 5c 0a 20 20 20  '%R/login' \.   
22d0: 20 40 20 25 73 28 7a 4f 74 68 65 72 41 72 67 73   @ %s(zOtherArgs
22e0: 29 3e 0a 20 20 7d 0a 20 20 6c 6f 67 69 6e 5f 69  )>.  }.  login_i
22f0: 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65  nsert_csrf_secre
2300: 74 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  t();.}../*.** Ad
2310: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2320: 74 6f 20 74 68 65 20 73 75 62 6d 65 6e 75 0a 2a  to the submenu.*
2330: 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 75 62  /.void style_sub
2340: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 0a 20 20  menu_element(.  
2350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62  const char *zLab
2360: 65 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  el,.  const char
2370: 20 2a 7a 4c 69 6e 6b 2c 0a 20 20 2e 2e 2e 0a 29   *zLink,.  ....)
2380: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2390: 20 20 61 73 73 65 72 74 28 20 6e 53 75 62 6d 65    assert( nSubme
23a0: 6e 75 20 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d  nu < count(aSubm
23b0: 65 6e 75 29 20 29 3b 0a 20 20 61 53 75 62 6d 65  enu) );.  aSubme
23c0: 6e 75 5b 6e 53 75 62 6d 65 6e 75 5d 2e 7a 4c 61  nu[nSubmenu].zLa
23d0: 62 65 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20  bel = zLabel;.  
23e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 4c 69  va_start(ap, zLi
23f0: 6e 6b 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75 5b  nk);.  aSubmenu[
2400: 6e 53 75 62 6d 65 6e 75 5d 2e 7a 4c 69 6e 6b 20  nSubmenu].zLink 
2410: 3d 20 76 6d 70 72 69 6e 74 66 28 7a 4c 69 6e 6b  = vmprintf(zLink
2420: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2430: 61 70 29 3b 0a 20 20 6e 53 75 62 6d 65 6e 75 2b  ap);.  nSubmenu+
2440: 2b 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f  +;.}.void style_
2450: 73 75 62 6d 65 6e 75 5f 65 6e 74 72 79 28 0a 20  submenu_entry(. 
2460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2470: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65  me,       /* Que
2480: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ry parameter nam
2490: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
24a0: 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20  r *zLabel,      
24b0: 2f 2a 20 4c 61 62 65 6c 20 62 65 66 6f 72 65 20  /* Label before 
24c0: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f  the entry box */
24d0: 0a 20 20 69 6e 74 20 69 53 69 7a 65 2c 20 20 20  .  int iSize,   
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24f0: 69 7a 65 20 6f 66 20 74 68 65 20 65 6e 74 72 79  ize of the entry
2500: 20 62 6f 78 20 2a 2f 0a 20 20 69 6e 74 20 65 56   box */.  int eV
2510: 69 73 69 62 6c 65 20 20 20 20 20 20 20 20 20 20  isible          
2520: 20 20 20 2f 2a 20 56 69 73 69 62 6c 65 20 6f 72     /* Visible or
2530: 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 29 7b 0a   disabled */.){.
2540: 20 20 61 73 73 65 72 74 28 20 6e 53 75 62 6d 65    assert( nSubme
2550: 6e 75 43 74 72 6c 20 3c 20 63 6f 75 6e 74 28 61  nuCtrl < count(a
2560: 53 75 62 6d 65 6e 75 43 74 72 6c 29 20 29 3b 0a  SubmenuCtrl) );.
2570: 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e    aSubmenuCtrl[n
2580: 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e 61  SubmenuCtrl].zNa
2590: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61 53  me = zName;.  aS
25a0: 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d  ubmenuCtrl[nSubm
25b0: 65 6e 75 43 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20  enuCtrl].zLabel 
25c0: 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 61 53 75 62  = zLabel;.  aSub
25d0: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
25e0: 75 43 74 72 6c 5d 2e 69 53 69 7a 65 20 3d 20 69  uCtrl].iSize = i
25f0: 53 69 7a 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75  Size;.  aSubmenu
2600: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72  Ctrl[nSubmenuCtr
2610: 6c 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56  l].eVisible = eV
2620: 69 73 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65  isible;.  aSubme
2630: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43  nuCtrl[nSubmenuC
2640: 74 72 6c 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f  trl].eType = FF_
2650: 45 4e 54 52 59 3b 0a 20 20 6e 53 75 62 6d 65 6e  ENTRY;.  nSubmen
2660: 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 64 20  uCtrl++;.}.void 
2670: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 63 68  style_submenu_ch
2680: 65 63 6b 62 6f 78 28 0a 20 20 63 6f 6e 73 74 20  eckbox(.  const 
2690: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
26a0: 20 20 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61     /* Query para
26b0: 6d 65 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20  meter name */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62  const char *zLab
26d0: 65 6c 2c 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  el,      /* Labe
26e0: 6c 20 74 6f 20 64 69 73 70 6c 61 79 20 61 66 74  l to display aft
26f0: 65 72 20 74 68 65 20 63 68 65 63 6b 62 6f 78 20  er the checkbox 
2700: 2a 2f 0a 20 20 69 6e 74 20 65 56 69 73 69 62 6c  */.  int eVisibl
2710: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
2720: 20 56 69 73 69 62 6c 65 20 6f 72 20 64 69 73 61   Visible or disa
2730: 62 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  bled */.  const 
2740: 63 68 61 72 20 2a 7a 4a 53 20 20 20 20 20 20 20  char *zJS       
2750: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6a     /* Optional j
2760: 61 76 61 73 63 72 69 70 74 20 74 6f 20 72 75 6e  avascript to run
2770: 20 6f 6e 20 74 6f 67 67 6c 65 20 2a 2f 0a 29 7b   on toggle */.){
2780: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75 62 6d  .  assert( nSubm
2790: 65 6e 75 43 74 72 6c 20 3c 20 63 6f 75 6e 74 28  enuCtrl < count(
27a0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 29 20 29 3b  aSubmenuCtrl) );
27b0: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
27c0: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e  nSubmenuCtrl].zN
27d0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61  ame = zName;.  a
27e0: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62  SubmenuCtrl[nSub
27f0: 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4c 61 62 65 6c  menuCtrl].zLabel
2800: 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 61 53 75   = zLabel;.  aSu
2810: 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65  bmenuCtrl[nSubme
2820: 6e 75 43 74 72 6c 5d 2e 65 56 69 73 69 62 6c 65  nuCtrl].eVisible
2830: 20 3d 20 65 56 69 73 69 62 6c 65 3b 0a 20 20 61   = eVisible;.  a
2840: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62  SubmenuCtrl[nSub
2850: 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4a 53 20 3d 20  menuCtrl].zJS = 
2860: 7a 4a 53 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  zJS;.  aSubmenuC
2870: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
2880: 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f 43 48 45  ].eType = FF_CHE
2890: 43 4b 42 4f 58 3b 0a 20 20 6e 53 75 62 6d 65 6e  CKBOX;.  nSubmen
28a0: 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 64 20  uCtrl++;.}.void 
28b0: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 62 69  style_submenu_bi
28c0: 6e 61 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68  nary(.  const ch
28d0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
28e0: 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61 6d 65   /* Query parame
28f0: 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ter name */.  co
2900: 6e 73 74 20 63 68 61 72 20 2a 7a 54 72 75 65 2c  nst char *zTrue,
2910: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
2920: 74 6f 20 73 68 6f 77 20 77 68 65 6e 20 70 61 72  to show when par
2930: 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 20 2a  ameter is true *
2940: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2950: 7a 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  zFalse,      /* 
2960: 4c 61 62 65 6c 20 74 6f 20 73 68 6f 77 20 77 68  Label to show wh
2970: 65 6e 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  en the parameter
2980: 20 69 73 20 66 61 6c 73 65 20 2a 2f 0a 20 20 69   is false */.  i
2990: 6e 74 20 65 56 69 73 69 62 6c 65 20 20 20 20 20  nt eVisible     
29a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62          /* Visib
29b0: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a  le or disabled *
29c0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e  /.){.  assert( n
29d0: 53 75 62 6d 65 6e 75 43 74 72 6c 20 3c 20 63 6f  SubmenuCtrl < co
29e0: 75 6e 74 28 61 53 75 62 6d 65 6e 75 43 74 72 6c  unt(aSubmenuCtrl
29f0: 29 20 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  ) );.  aSubmenuC
2a00: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
2a10: 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
2a20: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
2a30: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4c  nSubmenuCtrl].zL
2a40: 61 62 65 6c 20 3d 20 7a 54 72 75 65 3b 0a 20 20  abel = zTrue;.  
2a50: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75  aSubmenuCtrl[nSu
2a60: 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 46 61 6c 73  bmenuCtrl].zFals
2a70: 65 20 3d 20 7a 46 61 6c 73 65 3b 0a 20 20 61 53  e = zFalse;.  aS
2a80: 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d  ubmenuCtrl[nSubm
2a90: 65 6e 75 43 74 72 6c 5d 2e 65 56 69 73 69 62 6c  enuCtrl].eVisibl
2aa0: 65 20 3d 20 65 56 69 73 69 62 6c 65 3b 0a 20 20  e = eVisible;.  
2ab0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75  aSubmenuCtrl[nSu
2ac0: 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70 65  bmenuCtrl].eType
2ad0: 20 3d 20 46 46 5f 42 49 4e 41 52 59 3b 0a 20 20   = FF_BINARY;.  
2ae0: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b 3b 0a  nSubmenuCtrl++;.
2af0: 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 75 62  }.void style_sub
2b00: 6d 65 6e 75 5f 6d 75 6c 74 69 63 68 6f 69 63 65  menu_multichoice
2b10: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2b20: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
2b30: 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61 6d 65   /* Query parame
2b40: 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  ter name */.  in
2b50: 74 20 6e 43 68 6f 69 63 65 2c 20 20 20 20 20 20  t nChoice,      
2b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2b70: 6d 62 65 72 20 6f 66 20 6f 70 74 69 6f 6e 73 20  mber of options 
2b80: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2b90: 2a 63 6f 6e 73 74 20 2a 61 7a 43 68 6f 69 63 65  *const *azChoice
2ba0: 2c 20 2f 2a 20 76 61 6c 75 65 2f 64 69 73 70 6c  , /* value/displ
2bb0: 61 79 20 70 61 69 72 73 2e 20 20 32 2a 6e 43 68  ay pairs.  2*nCh
2bc0: 6f 69 63 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a  oice entries */.
2bd0: 20 20 69 6e 74 20 65 56 69 73 69 62 6c 65 20 20    int eVisible  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 56 69 73 69 62 6c 65 20 6f 72 20 64 69 73  * Visible or dis
2c00: 61 62 6c 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  abled */.){.  as
2c10: 73 65 72 74 28 20 6e 53 75 62 6d 65 6e 75 43 74  sert( nSubmenuCt
2c20: 72 6c 20 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d  rl < count(aSubm
2c30: 65 6e 75 43 74 72 6c 29 20 29 3b 0a 20 20 61 53  enuCtrl) );.  aS
2c40: 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d  ubmenuCtrl[nSubm
2c50: 65 6e 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d  enuCtrl].zName =
2c60: 20 7a 4e 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65   zName;.  aSubme
2c70: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43  nuCtrl[nSubmenuC
2c80: 74 72 6c 5d 2e 69 53 69 7a 65 20 3d 20 6e 43 68  trl].iSize = nCh
2c90: 6f 69 63 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75  oice;.  aSubmenu
2ca0: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72  Ctrl[nSubmenuCtr
2cb0: 6c 5d 2e 61 7a 43 68 6f 69 63 65 20 3d 20 61 7a  l].azChoice = az
2cc0: 43 68 6f 69 63 65 3b 0a 20 20 61 53 75 62 6d 65  Choice;.  aSubme
2cd0: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43  nuCtrl[nSubmenuC
2ce0: 74 72 6c 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20  trl].eVisible = 
2cf0: 65 56 69 73 69 62 6c 65 3b 0a 20 20 61 53 75 62  eVisible;.  aSub
2d00: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
2d10: 75 43 74 72 6c 5d 2e 65 54 79 70 65 20 3d 20 46  uCtrl].eType = F
2d20: 46 5f 4d 55 4c 54 49 3b 0a 20 20 6e 53 75 62 6d  F_MULTI;.  nSubm
2d30: 65 6e 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69  enuCtrl++;.}.voi
2d40: 64 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f  d style_submenu_
2d50: 73 71 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  sql(.  const cha
2d60: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
2d70: 2f 2a 20 51 75 65 72 79 20 70 61 72 61 6d 65 74  /* Query paramet
2d80: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e  er name */.  con
2d90: 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c  st char *zLabel,
2da0: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 6f        /* Label o
2db0: 6e 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 2a 2f  n the control */
2dc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2dd0: 46 6f 72 6d 61 74 2c 20 20 20 20 20 2f 2a 20 46  Format,     /* F
2de0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72  ormat string for
2df0: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72   SQL command for
2e00: 20 63 68 6f 69 63 65 73 20 2a 2f 0a 20 20 2e 2e   choices */.  ..
2e10: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e20: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
2e30: 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61  nts to the forma
2e40: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  t string */.){. 
2e50: 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 6e   Stmt q;.  int n
2e60: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c   = 0;.  int nAll
2e70: 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  oc = 0;.  char *
2e80: 2a 61 7a 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69  *az = 0;.  va_li
2e90: 73 74 20 61 70 3b 0a 0a 20 20 76 61 5f 73 74 61  st ap;..  va_sta
2ea0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2eb0: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
2ec0: 71 2c 20 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  q, 0, zFormat, a
2ed0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2ee0: 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ;.  while( SQLIT
2ef0: 45 5f 52 4f 57 3d 3d 64 62 5f 73 74 65 70 28 26  E_ROW==db_step(&
2f00: 71 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b  q) ){.    if( n+
2f10: 32 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  2>=nAlloc ){.   
2f20: 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 6e 41 6c     nAlloc += nAl
2f30: 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20 20 20  loc + 20;.      
2f40: 61 7a 20 3d 20 66 6f 73 73 69 6c 5f 72 65 61 6c  az = fossil_real
2f50: 6c 6f 63 28 61 7a 2c 20 73 69 7a 65 6f 66 28 63  loc(az, sizeof(c
2f60: 68 61 72 2a 29 2a 6e 41 6c 6c 6f 63 29 3b 0a 20  har*)*nAlloc);. 
2f70: 20 20 20 7d 0a 20 20 20 20 61 7a 5b 6e 2b 2b 5d     }.    az[n++]
2f80: 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70   = fossil_strdup
2f90: 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  (db_column_text(
2fa0: 26 71 2c 30 29 29 3b 0a 20 20 20 20 61 7a 5b 6e  &q,0));.    az[n
2fb0: 2b 2b 5d 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72  ++] = fossil_str
2fc0: 64 75 70 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  dup(db_column_te
2fd0: 78 74 28 26 71 2c 31 29 29 3b 0a 20 20 7d 0a 20  xt(&q,1));.  }. 
2fe0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
2ff0: 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
3000: 20 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b     aSubmenuCtrl[
3010: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e  nSubmenuCtrl].zN
3020: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
3030: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
3040: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4c 61 62  ubmenuCtrl].zLab
3050: 65 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20  el = zLabel;.   
3060: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
3070: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 69 53 69 7a  ubmenuCtrl].iSiz
3080: 65 20 3d 20 6e 2f 32 3b 0a 20 20 20 20 61 53 75  e = n/2;.    aSu
3090: 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65  bmenuCtrl[nSubme
30a0: 6e 75 43 74 72 6c 5d 2e 61 7a 43 68 6f 69 63 65  nuCtrl].azChoice
30b0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
30c0: 63 6f 6e 73 74 20 2a 29 61 7a 3b 0a 20 20 20 20  const *)az;.    
30d0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75  aSubmenuCtrl[nSu
30e0: 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56 69 73 69  bmenuCtrl].eVisi
30f0: 62 6c 65 20 3d 20 53 54 59 4c 45 5f 4e 4f 52 4d  ble = STYLE_NORM
3100: 41 4c 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e 75  AL;.    aSubmenu
3110: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72  Ctrl[nSubmenuCtr
3120: 6c 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f 4d 55  l].eType = FF_MU
3130: 4c 54 49 3b 0a 20 20 20 20 6e 53 75 62 6d 65 6e  LTI;.    nSubmen
3140: 75 43 74 72 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  uCtrl++;.  }.}..
3150: 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 6f 72  /*.** Disable or
3160: 20 65 6e 61 62 6c 65 20 74 68 65 20 73 75 62 6d   enable the subm
3170: 65 6e 75 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c  enu.*/.void styl
3180: 65 5f 73 75 62 6d 65 6e 75 5f 65 6e 61 62 6c 65  e_submenu_enable
3190: 28 69 6e 74 20 6f 6e 4f 66 66 29 7b 0a 20 20 73  (int onOff){.  s
31a0: 75 62 6d 65 6e 75 45 6e 61 62 6c 65 20 3d 20 6f  ubmenuEnable = o
31b0: 6e 4f 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOff;.}.../*.** 
31c0: 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 75 62 6d  Compare two subm
31d0: 65 6e 75 20 69 74 65 6d 73 20 66 6f 72 20 73 6f  enu items for so
31e0: 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  rting purposes.*
31f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
3200: 6d 65 6e 75 43 6f 6d 70 61 72 65 28 63 6f 6e 73  menuCompare(cons
3210: 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
3220: 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e   void *b){.  con
3230: 73 74 20 73 74 72 75 63 74 20 53 75 62 6d 65 6e  st struct Submen
3240: 75 20 2a 41 20 3d 20 28 63 6f 6e 73 74 20 73 74  u *A = (const st
3250: 72 75 63 74 20 53 75 62 6d 65 6e 75 2a 29 61 3b  ruct Submenu*)a;
3260: 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
3270: 53 75 62 6d 65 6e 75 20 2a 42 20 3d 20 28 63 6f  Submenu *B = (co
3280: 6e 73 74 20 73 74 72 75 63 74 20 53 75 62 6d 65  nst struct Subme
3290: 6e 75 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20  nu*)b;.  return 
32a0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 41 2d  fossil_strcmp(A-
32b0: 3e 7a 4c 61 62 65 6c 2c 20 42 2d 3e 7a 4c 61 62  >zLabel, B->zLab
32c0: 65 6c 29 3b 0a 7d 0a 0a 2f 2a 20 55 73 65 20 74  el);.}../* Use t
32d0: 68 69 73 20 66 6f 72 20 74 68 65 20 24 63 75 72  his for the $cur
32e0: 72 65 6e 74 5f 70 61 67 65 20 76 61 72 69 61 62  rent_page variab
32f0: 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
3300: 4e 55 4c 4c 2e 20 20 49 66 20 69 74 0a 2a 2a 20  NULL.  If it.** 
3310: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 75 73 65  is NULL then use
3320: 20 67 2e 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61   g.zPath..*/.sta
3330: 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f  tic char *local_
3340: 7a 43 75 72 72 65 6e 74 50 61 67 65 20 3d 20 30  zCurrentPage = 0
3350: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  ;../*.** Set the
3360: 20 64 65 73 69 72 65 64 20 24 63 75 72 72 65 6e   desired $curren
3370: 74 5f 70 61 67 65 20 74 6f 20 73 6f 6d 65 74 68  t_page to someth
3380: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 67  ing other than g
3390: 2e 7a 50 61 74 68 0a 2a 2f 0a 76 6f 69 64 20 73  .zPath.*/.void s
33a0: 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 65 6e 74  tyle_set_current
33b0: 5f 70 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72  _page(const char
33c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
33d0: 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 6c  .  fossil_free(l
33e0: 6f 63 61 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67  ocal_zCurrentPag
33f0: 65 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61  e);.  if( zForma
3400: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 6f 63 61  t==0 ){.    loca
3410: 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 20 3d  l_zCurrentPage =
3420: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
3430: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
3440: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
3450: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 6c 6f 63 61  ormat);.    loca
3460: 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 20 3d  l_zCurrentPage =
3470: 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61   vmprintf(zForma
3480: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
3490: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nd(ap);.  }.}../
34a0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 54 48  *.** Create a TH
34b0: 31 20 76 61 72 69 61 62 6c 65 20 63 6f 6e 74 61  1 variable conta
34c0: 69 6e 69 6e 67 20 74 68 65 20 55 52 4c 20 66 6f  ining the URL fo
34d0: 72 20 74 68 65 20 73 74 79 6c 65 73 68 65 65 74  r the stylesheet
34e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65  ..**.** The name
34f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 76 61 72 69   of the new vari
3500: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 22 73 74  able will be "st
3510: 79 6c 65 73 68 65 65 74 5f 75 72 6c 22 2e 0a 2a  ylesheet_url"..*
3520: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 77  *.** The value w
3530: 69 6c 6c 20 62 65 20 61 20 55 52 4c 20 66 6f 72  ill be a URL for
3540: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 61   accessing the a
3550: 70 70 72 6f 70 72 69 61 74 65 20 73 74 79 6c 65  ppropriate style
3560: 73 68 65 65 74 2e 0a 2a 2a 20 54 68 69 73 20 55  sheet..** This U
3570: 52 4c 20 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20  RL will include 
3580: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
3590: 20 73 75 63 68 20 61 73 20 22 69 64 3d 22 20 61   such as "id=" a
35a0: 6e 64 20 22 6f 6e 63 65 26 73 6b 69 6e 3d 22 0a  nd "once&skin=".
35b0: 2a 2a 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ** to cause the 
35c0: 63 6f 72 72 65 63 74 20 73 74 79 6c 65 73 68 65  correct styleshe
35d0: 65 74 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  et to be loaded 
35e0: 61 66 74 65 72 20 61 20 73 6b 69 6e 20 63 68 61  after a skin cha
35f0: 6e 67 65 0a 2a 2a 20 6f 72 20 61 66 74 65 72 20  nge.** or after 
3600: 61 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20  a change to the 
3610: 73 74 79 6c 65 73 68 65 65 74 2e 0a 2a 2f 0a 73  stylesheet..*/.s
3620: 74 61 74 69 63 20 76 6f 69 64 20 73 74 79 6c 65  tatic void style
3630: 73 68 65 65 74 5f 75 72 6c 5f 76 61 72 28 76 6f  sheet_url_var(vo
3640: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 42 75  id){.  char *zBu
3650: 69 6c 74 69 6e 3b 20 20 20 20 20 20 20 20 20 20  iltin;          
3660: 20 20 20 20 2f 2a 20 41 75 78 69 6c 69 61 72 79      /* Auxiliary
3670: 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20 43   page-specific C
3680: 53 53 20 70 61 67 65 20 2a 2f 0a 20 20 42 6c 6f  SS page */.  Blo
3690: 62 20 75 72 6c 3b 20 20 20 20 20 20 20 20 20 20  b url;          
36a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
36b0: 20 55 52 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   URL */.  const 
36c0: 63 68 61 72 20 2a 20 7a 50 61 67 65 20 3d 20 6c  char * zPage = l
36d0: 6f 63 61 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67  ocal_zCurrentPag
36e0: 65 20 3f 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 65  e ? local_zCurre
36f0: 6e 74 50 61 67 65 20 3a 20 67 2e 7a 50 61 74 68  ntPage : g.zPath
3700: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
3710: 7a 65 20 74 68 65 20 55 52 4c 20 74 6f 20 69 74  ze the URL to it
3720: 73 20 62 61 73 65 6c 69 6e 65 20 2a 2f 0a 20 20  s baseline */.  
3730: 75 72 6c 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62  url = empty_blob
3740: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
3750: 28 26 75 72 6c 2c 20 22 25 52 2f 73 74 79 6c 65  (&url, "%R/style
3760: 2e 63 73 73 22 29 3b 0a 0a 20 20 2f 2a 20 49 66  .css");..  /* If
3770: 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20 43   page-specific C
3780: 53 53 20 65 78 69 73 74 73 20 66 6f 72 20 74 68  SS exists for th
3790: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2c 20  e current page, 
37a0: 74 68 65 6e 20 61 70 70 65 6e 64 0a 20 20 2a 2a  then append.  **
37b0: 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 66 6f   the pathname fo
37c0: 72 20 74 68 65 20 70 61 67 65 2d 73 70 65 63 69  r the page-speci
37d0: 66 69 63 20 43 53 53 2e 20 20 54 68 65 20 64 65  fic CSS.  The de
37e0: 66 61 75 6c 74 20 43 53 53 20 69 73 0a 20 20 2a  fault CSS is.  *
37f0: 2a 0a 20 20 2a 2a 20 20 20 20 20 2f 73 74 79 6c  *.  **     /styl
3800: 65 2e 63 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e.css.  **.  ** 
3810: 42 75 74 20 66 6f 72 20 74 68 65 20 22 2f 77 69  But for the "/wi
3820: 6b 69 65 64 69 74 22 20 70 61 67 65 20 28 74 6f  kiedit" page (to
3830: 20 6e 61 6d 65 20 62 75 74 20 6f 6e 65 20 65 78   name but one ex
3840: 61 6d 70 6c 65 29 2c 20 77 65 0a 20 20 2a 2a 20  ample), we.  ** 
3850: 61 70 70 65 6e 64 20 61 20 70 61 74 68 20 61 73  append a path as
3860: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
3870: 20 2a 2a 20 20 20 20 20 2f 73 74 79 6c 65 2e 63   **     /style.c
3880: 73 73 2f 77 69 6b 69 65 64 69 74 0a 20 20 2a 2a  ss/wikiedit.  **
3890: 0a 20 20 2a 2a 20 54 68 65 20 2f 73 74 79 6c 65  .  ** The /style
38a0: 2e 63 73 73 20 70 61 67 65 20 28 69 6d 70 6c 65  .css page (imple
38b0: 6d 65 6e 74 65 64 20 62 65 6c 6f 77 29 20 77 69  mented below) wi
38c0: 6c 6c 20 64 65 74 65 63 74 20 74 68 69 73 20 65  ll detect this e
38d0: 78 74 72 61 20 22 77 69 6b 69 65 64 69 74 22 0a  xtra "wikiedit".
38e0: 20 20 2a 2a 20 70 61 74 68 20 69 6e 66 6f 72 6d    ** path inform
38f0: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 63 6c 75 64  ation and includ
3900: 65 20 74 68 65 20 70 61 67 65 2d 73 70 65 63 69  e the page-speci
3910: 66 69 63 20 43 53 53 20 61 6c 6f 6e 67 20 77 69  fic CSS along wi
3920: 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61  th the.  ** defa
3930: 75 6c 74 20 43 53 53 20 77 68 65 6e 20 69 74 20  ult CSS when it 
3940: 64 65 6c 69 76 65 72 73 20 74 68 65 20 70 61 67  delivers the pag
3950: 65 2e 0a 20 20 2a 2f 0a 20 20 7a 42 75 69 6c 74  e..  */.  zBuilt
3960: 69 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 74  in = mprintf("st
3970: 79 6c 65 2e 25 73 2e 63 73 73 22 2c 20 7a 50 61  yle.%s.css", zPa
3980: 67 65 29 3b 0a 20 20 69 66 28 20 62 75 69 6c 74  ge);.  if( built
3990: 69 6e 5f 66 69 6c 65 28 7a 42 75 69 6c 74 69 6e  in_file(zBuiltin
39a0: 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 62 6c  ,0)!=0 ){.    bl
39b0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 75 72 6c 2c  ob_appendf(&url,
39c0: 20 22 2f 25 73 22 2c 20 7a 50 61 67 65 29 3b 0a   "/%s", zPage);.
39d0: 20 20 7d 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65    }.  fossil_fre
39e0: 65 28 7a 42 75 69 6c 74 69 6e 29 3b 0a 0a 20 20  e(zBuiltin);..  
39f0: 2f 2a 20 41 64 64 20 71 75 65 72 79 20 70 61 72  /* Add query par
3a00: 61 6d 65 74 65 72 73 20 74 68 61 74 20 77 69 6c  ameters that wil
3a10: 6c 20 63 68 61 6e 67 65 20 77 68 65 6e 65 76 65  l change wheneve
3a20: 72 20 74 68 65 20 73 6b 69 6e 20 63 68 61 6e 67  r the skin chang
3a30: 65 73 0a 20 20 2a 2a 20 6f 72 20 61 66 74 65 72  es.  ** or after
3a40: 20 61 6e 79 20 75 70 64 61 74 65 73 20 74 6f 20   any updates to 
3a50: 74 68 65 20 43 53 53 20 66 69 6c 65 73 0a 20 20  the CSS files.  
3a60: 2a 2f 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  */.  blob_append
3a70: 66 28 26 75 72 6c 2c 20 22 3f 69 64 3d 25 78 22  f(&url, "?id=%x"
3a80: 2c 20 73 6b 69 6e 5f 69 64 28 22 63 73 73 22 29  , skin_id("css")
3a90: 29 3b 0a 20 20 69 66 28 20 50 28 22 6f 6e 63 65  );.  if( P("once
3aa0: 22 29 21 3d 30 20 26 26 20 50 28 22 73 6b 69 6e  ")!=0 && P("skin
3ab0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 62 6c 6f  ")!=0 ){.    blo
3ac0: 62 5f 61 70 70 65 6e 64 66 28 26 75 72 6c 2c 20  b_appendf(&url, 
3ad0: 22 26 73 6b 69 6e 3d 25 73 26 6f 6e 63 65 22 2c  "&skin=%s&once",
3ae0: 20 73 6b 69 6e 5f 69 6e 5f 75 73 65 28 29 29 3b   skin_in_use());
3af0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
3b00: 61 74 65 20 74 68 65 20 43 53 53 20 55 52 4c 20  ate the CSS URL 
3b10: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 68  variable */.  Th
3b20: 5f 53 74 6f 72 65 28 22 73 74 79 6c 65 73 68 65  _Store("styleshe
3b30: 65 74 5f 75 72 6c 22 2c 20 62 6c 6f 62 5f 73 74  et_url", blob_st
3b40: 72 28 26 75 72 6c 29 29 3b 0a 20 20 62 6c 6f 62  r(&url));.  blob
3b50: 5f 72 65 73 65 74 28 26 75 72 6c 29 3b 0a 7d 0a  _reset(&url);.}.
3b60: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3b70: 54 48 31 20 76 61 72 69 61 62 6c 65 20 63 6f 6e  TH1 variable con
3b80: 74 61 69 6e 69 6e 67 20 74 68 65 20 55 52 4c 20  taining the URL 
3b90: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
3ba0: 64 20 69 6d 61 67 65 2e 0a 2a 2a 20 54 68 65 20  d image..** The 
3bb0: 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61 62  resulting variab
3bc0: 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  le name will be 
3bd0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 24 5b 7a 49  of the form $[zI
3be0: 6d 61 67 65 4e 61 6d 65 5d 5f 69 6d 61 67 65 5f  mageName]_image_
3bf0: 75 72 6c 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  url..** The valu
3c00: 65 20 77 69 6c 6c 20 62 65 20 61 20 55 52 4c 20  e will be a URL 
3c10: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 61 6e  that includes an
3c20: 20 69 64 3d 20 71 75 65 72 79 20 70 61 72 61 6d   id= query param
3c30: 65 74 65 72 20 74 68 61 74 0a 2a 2a 20 63 68 61  eter that.** cha
3c40: 6e 67 65 73 20 69 66 20 74 68 65 20 75 6e 64 65  nges if the unde
3c50: 72 6c 79 69 6e 67 20 72 65 73 6f 75 72 63 65 20  rlying resource 
3c60: 63 68 61 6e 67 65 73 20 6f 72 20 69 66 20 61 20  changes or if a 
3c70: 64 69 66 66 65 72 65 6e 74 20 73 6b 69 6e 0a 2a  different skin.*
3c80: 2a 20 69 73 20 73 65 6c 65 63 74 65 64 2e 0a 2a  * is selected..*
3c90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6d  /.static void im
3ca0: 61 67 65 5f 75 72 6c 5f 76 61 72 28 63 6f 6e 73  age_url_var(cons
3cb0: 74 20 63 68 61 72 20 2a 7a 49 6d 61 67 65 4e 61  t char *zImageNa
3cc0: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61  me){.  char *zVa
3cd0: 72 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  rName;   /* Name
3ce0: 20 6f 66 20 74 68 65 20 6e 65 77 20 54 48 31 20   of the new TH1 
3cf0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63 68  variable */.  ch
3d00: 61 72 20 2a 7a 52 65 73 6f 75 72 63 65 3b 20 20  ar *zResource;  
3d10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 43 4f 4e 46 49  /* Name of CONFI
3d20: 47 20 65 6e 74 72 79 20 68 6f 6c 64 69 6e 67 20  G entry holding 
3d30: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 68 61  content */.  cha
3d40: 72 20 2a 7a 55 72 6c 3b 20 20 20 20 20 20 20 2f  r *zUrl;       /
3d50: 2a 20 54 68 65 20 55 52 4c 20 2a 2f 0a 0a 20 20  * The URL */..  
3d60: 7a 52 65 73 6f 75 72 63 65 20 3d 20 6d 70 72 69  zResource = mpri
3d70: 6e 74 66 28 22 25 73 2d 69 6d 61 67 65 22 2c 20  ntf("%s-image", 
3d80: 7a 49 6d 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7a  zImageName);.  z
3d90: 55 72 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  Url = mprintf("%
3da0: 52 2f 25 73 3f 69 64 3d 25 78 22 2c 20 7a 49 6d  R/%s?id=%x", zIm
3db0: 61 67 65 4e 61 6d 65 2c 20 73 6b 69 6e 5f 69 64  ageName, skin_id
3dc0: 28 7a 52 65 73 6f 75 72 63 65 29 29 3b 0a 20 20  (zResource));.  
3dd0: 66 72 65 65 28 7a 52 65 73 6f 75 72 63 65 29 3b  free(zResource);
3de0: 0a 20 20 7a 56 61 72 4e 61 6d 65 20 3d 20 6d 70  .  zVarName = mp
3df0: 72 69 6e 74 66 28 22 25 73 5f 69 6d 61 67 65 5f  rintf("%s_image_
3e00: 75 72 6c 22 2c 20 7a 49 6d 61 67 65 4e 61 6d 65  url", zImageName
3e10: 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 7a 56  );.  Th_Store(zV
3e20: 61 72 4e 61 6d 65 2c 20 7a 55 72 6c 29 3b 0a 20  arName, zUrl);. 
3e30: 20 66 72 65 65 28 7a 56 61 72 4e 61 6d 65 29 3b   free(zVarName);
3e40: 0a 20 20 66 72 65 65 28 7a 55 72 6c 29 3b 0a 7d  .  free(zUrl);.}
3e50: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 54  ../*.** Output T
3e60: 45 58 54 20 77 69 74 68 20 61 20 63 6c 69 63 6b  EXT with a click
3e70: 2d 74 6f 2d 63 6f 70 79 20 62 75 74 74 6f 6e 20  -to-copy button 
3e80: 6e 65 78 74 20 74 6f 20 69 74 2e 20 4c 6f 61 64  next to it. Load
3e90: 73 20 74 68 65 20 63 6f 70 79 62 74 6e 2e 6a 73  s the copybtn.js
3ea0: 0a 2a 2a 20 4a 61 76 61 73 63 72 69 70 74 20 6d  .** Javascript m
3eb0: 6f 64 75 6c 65 2c 20 61 6e 64 20 67 65 6e 65 72  odule, and gener
3ec0: 61 74 65 73 20 48 54 4d 4c 20 65 6c 65 6d 65 6e  ates HTML elemen
3ed0: 74 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ts with the foll
3ee0: 6f 77 69 6e 67 20 49 44 73 3a 0a 2a 2a 0a 2a 2a  owing IDs:.**.**
3ef0: 20 20 20 20 54 41 52 47 45 54 49 44 3a 20 20 20      TARGETID:   
3f00: 20 20 20 20 54 68 65 20 3c 73 70 61 6e 3e 20 77      The <span> w
3f10: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 54 45  rapper around TE
3f20: 58 54 2e 0a 2a 2a 20 20 20 20 63 6f 70 79 2d 54  XT..**    copy-T
3f30: 41 52 47 45 54 49 44 3a 20 20 54 68 65 20 3c 73  ARGETID:  The <s
3f40: 70 61 6e 3e 20 66 6f 72 20 74 68 65 20 63 6f 70  pan> for the cop
3f50: 79 20 62 75 74 74 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  y button..**.** 
3f60: 49 66 20 74 68 65 20 46 4c 49 50 50 45 44 20 61  If the FLIPPED a
3f70: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
3f80: 65 72 6f 2c 20 74 68 65 20 63 6f 70 79 20 62 75  ero, the copy bu
3f90: 74 74 6f 6e 20 69 73 20 64 69 73 70 6c 61 79 65  tton is displaye
3fa0: 64 20 61 66 74 65 72 20 54 45 58 54 2e 0a 2a 2a  d after TEXT..**
3fb0: 0a 2a 2a 20 54 68 65 20 43 4f 50 59 4c 45 4e 47  .** The COPYLENG
3fc0: 54 48 20 61 72 67 75 6d 65 6e 74 20 64 65 66 69  TH argument defi
3fd0: 6e 65 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  nes the length o
3fe0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 20  f the substring 
3ff0: 6f 66 20 54 45 58 54 20 63 6f 70 69 65 64 20 74  of TEXT copied t
4000: 6f 0a 2a 2a 20 63 6c 69 70 62 6f 61 72 64 3a 0a  o.** clipboard:.
4010: 2a 2a 0a 2a 2a 20 20 20 20 3c 3d 20 30 3a 20 20  **.**    <= 0:  
4020: 20 4e 6f 20 6c 69 6d 69 74 20 28 64 65 66 61 75   No limit (defau
4030: 6c 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  lt if the argume
4040: 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 29 2e 0a  nt is omitted)..
4050: 2a 2a 20 20 20 20 3e 3d 20 33 3a 20 20 20 54 72  **    >= 3:   Tr
4060: 75 6e 63 61 74 65 20 54 45 58 54 20 61 66 74 65  uncate TEXT afte
4070: 72 20 43 4f 50 59 4c 45 4e 47 54 48 20 28 73 69  r COPYLENGTH (si
4080: 6e 67 6c 65 2d 62 79 74 65 29 20 63 68 61 72 61  ngle-byte) chara
4090: 63 74 65 72 73 2e 0a 2a 2a 20 20 20 20 20 20 20  cters..**       
40a0: 31 3a 20 20 20 55 73 65 20 74 68 65 20 22 68 61  1:   Use the "ha
40b0: 73 68 2d 64 69 67 69 74 73 22 20 73 65 74 74 69  sh-digits" setti
40c0: 6e 67 20 61 73 20 74 68 65 20 6c 69 6d 69 74 2e  ng as the limit.
40d0: 0a 2a 2a 20 20 20 20 20 20 20 32 3a 20 20 20 55  .**       2:   U
40e0: 73 65 20 74 68 65 20 6c 65 6e 67 74 68 20 61 70  se the length ap
40f0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 55 52  propriate for UR
4100: 4c 73 20 61 73 20 74 68 65 20 6c 69 6d 69 74 20  Ls as the limit 
4110: 28 64 65 66 69 6e 65 64 20 61 74 0a 2a 2a 20 20  (defined at.**  
4120: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c            compil
4130: 65 2d 74 69 6d 65 20 62 79 20 46 4f 53 53 49 4c  e-time by FOSSIL
4140: 5f 48 41 53 48 5f 44 49 47 49 54 53 5f 55 52 4c  _HASH_DIGITS_URL
4150: 2c 20 64 65 66 61 75 6c 74 73 20 74 6f 20 31 36  , defaults to 16
4160: 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 74 79 6c  )..*/.char *styl
4170: 65 5f 63 6f 70 79 5f 62 75 74 74 6f 6e 28 0a 20  e_copy_button(. 
4180: 20 69 6e 74 20 62 4f 75 74 70 75 74 43 47 49 2c   int bOutputCGI,
4190: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 6e 27           /* Don'
41a0: 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2c  t return result,
41b0: 20 62 75 74 20 73 65 6e 64 20 74 6f 20 63 67 69   but send to cgi
41c0: 5f 70 72 69 6e 74 66 28 29 2e 20 2a 2f 0a 20 20  _printf(). */.  
41d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
41e0: 67 65 74 49 64 2c 20 20 2f 2a 20 54 68 65 20 54  getId,  /* The T
41f0: 41 52 47 45 54 49 44 20 61 72 67 75 6d 65 6e 74  ARGETID argument
4200: 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c 69 70  . */.  int bFlip
4210: 70 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ped,           /
4220: 2a 20 54 68 65 20 46 4c 49 50 50 45 44 20 61 72  * The FLIPPED ar
4230: 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74  gument. */.  int
4240: 20 63 63 68 4c 65 6e 67 74 68 2c 20 20 20 20 20   cchLength,     
4250: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f 50 59       /* The COPY
4260: 4c 45 4e 47 54 48 20 61 72 67 75 6d 65 6e 74 2e  LENGTH argument.
4270: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4280: 20 2a 7a 54 65 78 74 46 6d 74 2c 20 20 20 2f 2a   *zTextFmt,   /*
4290: 20 46 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 74   Formatting of t
42a0: 68 65 20 54 45 58 54 20 61 72 67 75 6d 65 6e 74  he TEXT argument
42b0: 20 28 68 74 6d 6c 69 7a 65 64 29 2e 20 2a 2f 0a   (htmlized). */.
42c0: 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20    ...           
42d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
42e0: 6d 61 74 74 69 6e 67 20 70 61 72 61 6d 65 74 65  matting paramete
42f0: 72 73 20 6f 66 20 74 68 65 20 54 45 58 54 20 61  rs of the TEXT a
4300: 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 29 7b 0a 20  rgument. */.){. 
4310: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
4320: 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20 63 68  har *zText;.  ch
4330: 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b  ar *zResult = 0;
4340: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 7a  .  va_start(ap,z
4350: 54 65 78 74 46 6d 74 29 3b 0a 20 20 7a 54 65 78  TextFmt);.  zTex
4360: 74 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 54 65  t = vmprintf(zTe
4370: 78 74 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b  xtFmt/*works-lik
4380: 65 3a 3f 2a 2f 2c 61 70 29 3b 0a 20 20 76 61 5f  e:?*/,ap);.  va_
4390: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 63  end(ap);.  if( c
43a0: 63 68 4c 65 6e 67 74 68 3d 3d 31 20 29 20 63 63  chLength==1 ) cc
43b0: 68 4c 65 6e 67 74 68 20 3d 20 68 61 73 68 5f 64  hLength = hash_d
43c0: 69 67 69 74 73 28 30 29 3b 0a 20 20 65 6c 73 65  igits(0);.  else
43d0: 20 69 66 28 20 63 63 68 4c 65 6e 67 74 68 3d 3d   if( cchLength==
43e0: 32 20 29 20 63 63 68 4c 65 6e 67 74 68 20 3d 20  2 ) cchLength = 
43f0: 68 61 73 68 5f 64 69 67 69 74 73 28 31 29 3b 0a  hash_digits(1);.
4400: 20 20 69 66 28 20 21 62 46 6c 69 70 70 65 64 20    if( !bFlipped 
4410: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
4420: 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 20 20  r *zBtnFmt =.   
4430: 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d     "<span class=
4440: 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 20 20  \"nobr\">".     
4450: 20 22 3c 73 70 61 6e 20 22 0a 20 20 20 20 20 20   "<span ".      
4460: 22 63 6c 61 73 73 3d 5c 22 63 6f 70 79 2d 62 75  "class=\"copy-bu
4470: 74 74 6f 6e 5c 22 20 22 0a 20 20 20 20 20 20 22  tton\" ".      "
4480: 69 64 3d 5c 22 63 6f 70 79 2d 25 68 5c 22 20 22  id=\"copy-%h\" "
4490: 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63 6f 70  .      "data-cop
44a0: 79 74 61 72 67 65 74 3d 5c 22 25 68 5c 22 20 22  ytarget=\"%h\" "
44b0: 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63 6f 70  .      "data-cop
44c0: 79 6c 65 6e 67 74 68 3d 5c 22 25 64 5c 22 3e 22  ylength=\"%d\">"
44d0: 0a 20 20 20 20 20 20 22 3c 2f 73 70 61 6e 3e 22  .      "</span>"
44e0: 0a 20 20 20 20 20 20 22 3c 73 70 61 6e 20 69 64  .      "<span id
44f0: 3d 5c 22 25 68 5c 22 3e 22 0a 20 20 20 20 20 20  =\"%h\">".      
4500: 22 25 73 22 0a 20 20 20 20 20 20 22 3c 2f 73 70  "%s".      "</sp
4510: 61 6e 3e 22 0a 20 20 20 20 20 20 22 3c 2f 73 70  an>".      "</sp
4520: 61 6e 3e 22 3b 0a 20 20 20 20 69 66 28 20 62 4f  an>";.    if( bO
4530: 75 74 70 75 74 43 47 49 20 29 7b 0a 20 20 20 20  utputCGI ){.    
4540: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 0a 20 20    cgi_printf(.  
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c  zBtnFmt/*works-l
4570: 69 6b 65 3a 22 25 68 25 68 25 64 25 68 25 73 22  ike:"%h%h%d%h%s"
4580: 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  */,.            
4590: 20 20 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c        zTargetId,
45a0: 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e  zTargetId,cchLen
45b0: 67 74 68 2c 7a 54 61 72 67 65 74 49 64 2c 7a 54  gth,zTargetId,zT
45c0: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ext);.    }else{
45d0: 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  .      zResult =
45e0: 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20   mprintf(.      
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 74 6e              zBtn
4600: 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a  Fmt/*works-like:
4610: 22 25 68 25 68 25 64 25 68 25 73 22 2a 2f 2c 0a  "%h%h%d%h%s"*/,.
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 7a 54 61 72 67 65 74 49 64 2c 7a 54 61 72    zTargetId,zTar
4640: 67 65 74 49 64 2c 63 63 68 4c 65 6e 67 74 68 2c  getId,cchLength,
4650: 7a 54 61 72 67 65 74 49 64 2c 7a 54 65 78 74 29  zTargetId,zText)
4660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
4670: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4680: 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 20 20 20 20  *zBtnFmt =.     
4690: 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d 5c 22   "<span class=\"
46a0: 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 20 20 20 22  nobr\">".      "
46b0: 3c 73 70 61 6e 20 69 64 3d 5c 22 25 68 5c 22 3e  <span id=\"%h\">
46c0: 22 0a 20 20 20 20 20 20 22 25 73 22 0a 20 20 20  ".      "%s".   
46d0: 20 20 20 22 3c 2f 73 70 61 6e 3e 22 0a 20 20 20     "</span>".   
46e0: 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20 20 20     "<span ".    
46f0: 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70 79 2d    "class=\"copy-
4700: 62 75 74 74 6f 6e 20 63 6f 70 79 2d 62 75 74 74  button copy-butt
4710: 6f 6e 2d 66 6c 69 70 70 65 64 5c 22 20 22 0a 20  on-flipped\" ". 
4720: 20 20 20 20 20 22 69 64 3d 5c 22 63 6f 70 79 2d       "id=\"copy-
4730: 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22 64 61  %h\" ".      "da
4740: 74 61 2d 63 6f 70 79 74 61 72 67 65 74 3d 5c 22  ta-copytarget=\"
4750: 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22 64 61  %h\" ".      "da
4760: 74 61 2d 63 6f 70 79 6c 65 6e 67 74 68 3d 5c 22  ta-copylength=\"
4770: 25 64 5c 22 3e 22 0a 20 20 20 20 20 20 22 3c 2f  %d\">".      "</
4780: 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22 3c 2f  span>".      "</
4790: 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66 28 20  span>";.    if( 
47a0: 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a 20 20  bOutputCGI ){.  
47b0: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 0a      cgi_printf(.
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73    zBtnFmt/*works
47e0: 2d 6c 69 6b 65 3a 22 25 68 25 73 25 68 25 68 25  -like:"%h%s%h%h%
47f0: 64 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20  d"*/,.          
4800: 20 20 20 20 20 20 20 20 7a 54 61 72 67 65 74 49          zTargetI
4810: 64 2c 7a 54 65 78 74 2c 7a 54 61 72 67 65 74 49  d,zText,zTargetI
4820: 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c  d,zTargetId,cchL
4830: 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73  ength);.    }els
4840: 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  e{.      zResult
4850: 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20   = mprintf(.    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 42                zB
4870: 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b  tnFmt/*works-lik
4880: 65 3a 22 25 68 25 73 25 68 25 68 25 64 22 2a 2f  e:"%h%s%h%h%d"*/
4890: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
48a0: 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c 7a 54      zTargetId,zT
48b0: 65 78 74 2c 7a 54 61 72 67 65 74 49 64 2c 7a 54  ext,zTargetId,zT
48c0: 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e 67 74  argetId,cchLengt
48d0: 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
48e0: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 62  free(zText);.  b
48f0: 75 69 6c 74 69 6e 5f 72 65 71 75 65 73 74 5f 6a  uiltin_request_j
4900: 73 28 22 63 6f 70 79 62 74 6e 2e 6a 73 22 29 3b  s("copybtn.js");
4910: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c  .  return zResul
4920: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
4930: 72 6e 20 61 20 72 61 6e 64 6f 6d 20 6e 6f 6e 63  rn a random nonc
4940: 65 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64  e that is stored
4950: 20 69 6e 20 73 74 61 74 69 63 20 73 70 61 63 65   in static space
4960: 2e 20 20 46 6f 72 20 61 20 70 61 72 74 69 63 75  .  For a particu
4970: 6c 61 72 0a 2a 2a 20 72 75 6e 2c 20 74 68 65 20  lar.** run, the 
4980: 73 61 6d 65 20 6e 6f 6e 63 65 20 69 73 20 61 6c  same nonce is al
4990: 77 61 79 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  ways returned..*
49a0: 2f 0a 63 68 61 72 20 2a 73 74 79 6c 65 5f 6e 6f  /.char *style_no
49b0: 6e 63 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nce(void){.  sta
49c0: 74 69 63 20 63 68 61 72 20 7a 4e 6f 6e 63 65 5b  tic char zNonce[
49d0: 35 32 5d 3b 0a 20 20 69 66 28 20 7a 4e 6f 6e 63  52];.  if( zNonc
49e0: 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 75  e[0]==0 ){.    u
49f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 53 65  nsigned char zSe
4a00: 65 64 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ed[24];.    sqli
4a10: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 32  te3_randomness(2
4a20: 34 2c 20 7a 53 65 65 64 29 3b 0a 20 20 20 20 65  4, zSeed);.    e
4a30: 6e 63 6f 64 65 31 36 28 7a 53 65 65 64 2c 28 75  ncode16(zSeed,(u
4a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 4e  nsigned char*)zN
4a50: 6f 6e 63 65 2c 32 34 29 3b 0a 20 20 7d 0a 20 20  once,24);.  }.  
4a60: 72 65 74 75 72 6e 20 7a 4e 6f 6e 63 65 3b 0a 7d  return zNonce;.}
4a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4a80: 68 65 20 64 65 66 61 75 6c 74 20 43 6f 6e 74 65  he default Conte
4a90: 6e 74 20 53 65 63 75 72 69 74 79 20 50 6f 6c 69  nt Security Poli
4aa0: 63 79 20 28 43 53 50 29 20 73 74 72 69 6e 67 2e  cy (CSP) string.
4ab0: 0a 2a 2a 20 49 66 20 74 68 65 20 74 6f 48 65 61  .** If the toHea
4ac0: 64 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  der argument is 
4ad0: 74 72 75 65 2c 20 74 68 65 6e 20 61 6c 73 6f 20  true, then also 
4ae0: 61 64 64 20 74 68 65 0a 2a 2a 20 43 53 50 20 74  add the.** CSP t
4af0: 6f 20 74 68 65 20 48 54 54 50 20 72 65 70 6c 79  o the HTTP reply
4b00: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   header..**.** T
4b10: 68 65 20 43 53 50 20 63 6f 6d 65 73 20 66 72 6f  he CSP comes fro
4b20: 6d 20 74 68 65 20 22 64 65 66 61 75 6c 74 2d 63  m the "default-c
4b30: 73 70 22 20 73 65 74 74 69 6e 67 20 69 66 20 69  sp" setting if i
4b40: 74 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20  t exists and.** 
4b50: 69 73 20 6e 6f 6e 2d 65 6d 70 74 79 2e 20 20 49  is non-empty.  I
4b60: 66 20 74 68 61 74 20 73 65 74 74 69 6e 67 20 69  f that setting i
4b70: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
4b80: 67 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  g, then the foll
4b90: 6f 77 69 6e 67 0a 2a 2a 20 64 65 66 61 75 6c 74  owing.** default
4ba0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4bb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 65 66 61  :.**.**     defa
4bc0: 75 6c 74 2d 73 72 63 20 27 73 65 6c 66 27 20 64  ult-src 'self' d
4bd0: 61 74 61 3a 3b 0a 2a 2a 20 20 20 20 20 73 63 72  ata:;.**     scr
4be0: 69 70 74 2d 73 72 63 20 27 73 65 6c 66 27 20 27  ipt-src 'self' '
4bf0: 6e 6f 6e 63 65 2d 24 6e 6f 6e 63 65 27 3b 0a 2a  nonce-$nonce';.*
4c00: 2a 20 20 20 20 20 73 74 79 6c 65 2d 73 72 63 20  *     style-src 
4c10: 27 73 65 6c 66 27 20 27 75 6e 73 61 66 65 2d 69  'self' 'unsafe-i
4c20: 6e 6c 69 6e 65 27 3b 0a 2a 2a 20 20 20 20 20 69  nline';.**     i
4c30: 6d 67 2d 73 72 63 20 2a 20 64 61 74 61 3a 3b 0a  mg-src * data:;.
4c40: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 27  **.** The text '
4c50: 24 6e 6f 6e 63 65 27 20 69 73 20 72 65 70 6c 61  $nonce' is repla
4c60: 63 65 64 20 62 79 20 73 74 79 6c 65 5f 6e 6f 6e  ced by style_non
4c70: 63 65 28 29 20 69 66 20 61 6e 64 20 77 68 65 72  ce() if and wher
4c80: 65 65 76 65 72 20 69 74 0a 2a 2a 20 6f 63 63 75  eever it.** occu
4c90: 72 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  rs in the input 
4ca0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
4cb0: 65 20 73 74 72 69 6e 67 20 72 65 74 75 72 6e 65  e string returne
4cc0: 64 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  d is obtained fr
4cd0: 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63  om fossil_malloc
4ce0: 28 29 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64  () and.** should
4cf0: 20 62 65 20 72 65 6c 65 61 73 65 64 20 62 79 20   be released by 
4d00: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63  the caller..*/.c
4d10: 68 61 72 20 2a 73 74 79 6c 65 5f 63 73 70 28 69  har *style_csp(i
4d20: 6e 74 20 74 6f 48 65 61 64 65 72 29 7b 0a 20 20  nt toHeader){.  
4d30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4d40: 72 20 7a 42 61 63 6b 75 70 43 53 50 5b 5d 20 3d  r zBackupCSP[] =
4d50: 0a 20 20 20 22 64 65 66 61 75 6c 74 2d 73 72 63  .   "default-src
4d60: 20 27 73 65 6c 66 27 20 64 61 74 61 3a 3b 20 22   'self' data:; "
4d70: 0a 20 20 20 22 73 63 72 69 70 74 2d 73 72 63 20  .   "script-src 
4d80: 27 73 65 6c 66 27 20 27 6e 6f 6e 63 65 2d 24 6e  'self' 'nonce-$n
4d90: 6f 6e 63 65 27 3b 20 22 0a 20 20 20 22 73 74 79  once'; ".   "sty
4da0: 6c 65 2d 73 72 63 20 27 73 65 6c 66 27 20 27 75  le-src 'self' 'u
4db0: 6e 73 61 66 65 2d 69 6e 6c 69 6e 65 27 3b 20 22  nsafe-inline'; "
4dc0: 0a 20 20 20 22 69 6d 67 2d 73 72 63 20 2a 20 64  .   "img-src * d
4dd0: 61 74 61 3a 22 3b 0a 20 20 63 6f 6e 73 74 20 63  ata:";.  const c
4de0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 3b 0a 20 20  har *zFormat;.  
4df0: 42 6c 6f 62 20 63 73 70 3b 0a 20 20 63 68 61 72  Blob csp;.  char
4e00: 20 2a 7a 4e 6f 6e 63 65 3b 0a 20 20 63 68 61 72   *zNonce;.  char
4e10: 20 2a 7a 43 73 70 3b 0a 20 20 69 6e 74 20 69 3b   *zCsp;.  int i;
4e20: 0a 20 20 7a 46 6f 72 6d 61 74 20 3d 20 64 62 5f  .  zFormat = db_
4e30: 67 65 74 28 22 64 65 66 61 75 6c 74 2d 63 73 70  get("default-csp
4e40: 22 2c 30 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72  ",0);.  if( zFor
4e50: 6d 61 74 3d 3d 30 20 7c 7c 20 7a 46 6f 72 6d 61  mat==0 || zForma
4e60: 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  t[0]==0 ){.    z
4e70: 46 6f 72 6d 61 74 20 3d 20 7a 42 61 63 6b 75 70  Format = zBackup
4e80: 43 53 50 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  CSP;.  }.  blob_
4e90: 69 6e 69 74 28 26 63 73 70 2c 20 30 2c 20 30 29  init(&csp, 0, 0)
4ea0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 6f 72 6d  ;.  while( zForm
4eb0: 61 74 5b 30 5d 20 26 26 20 28 7a 4e 6f 6e 63 65  at[0] && (zNonce
4ec0: 20 3d 20 73 74 72 73 74 72 28 7a 46 6f 72 6d 61   = strstr(zForma
4ed0: 74 2c 22 24 6e 6f 6e 63 65 22 29 29 21 3d 30 20  t,"$nonce"))!=0 
4ee0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
4ef0: 6e 64 28 26 63 73 70 2c 20 7a 46 6f 72 6d 61 74  nd(&csp, zFormat
4f00: 2c 20 28 69 6e 74 29 28 7a 4e 6f 6e 63 65 20 2d  , (int)(zNonce -
4f10: 20 7a 46 6f 72 6d 61 74 29 29 3b 0a 20 20 20 20   zFormat));.    
4f20: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 73 70  blob_append(&csp
4f30: 2c 20 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 2c  , style_nonce(),
4f40: 20 2d 31 29 3b 0a 20 20 20 20 7a 46 6f 72 6d 61   -1);.    zForma
4f50: 74 20 3d 20 7a 4e 6f 6e 63 65 20 2b 20 36 3b 0a  t = zNonce + 6;.
4f60: 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e    }.  blob_appen
4f70: 64 28 26 63 73 70 2c 20 7a 46 6f 72 6d 61 74 2c  d(&csp, zFormat,
4f80: 20 2d 31 29 3b 0a 20 20 7a 43 73 70 20 3d 20 62   -1);.  zCsp = b
4f90: 6c 6f 62 5f 73 74 72 28 26 63 73 70 29 3b 0a 20  lob_str(&csp);. 
4fa0: 20 2f 2a 20 4e 6f 20 77 68 69 74 65 73 70 61 63   /* No whitespac
4fb0: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 63 74  e other than act
4fc0: 75 61 6c 20 73 70 61 63 65 20 63 68 61 72 61 63  ual space charac
4fd0: 74 65 72 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ters allowed in 
4fe0: 74 68 65 20 43 53 50 0a 20 20 2a 2a 20 73 74 72  the CSP.  ** str
4ff0: 69 6e 67 2e 20 20 53 65 65 20 68 74 74 70 73 3a  ing.  See https:
5000: 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67  //fossil-scm.org
5010: 2f 66 6f 72 75 6d 2f 66 6f 72 75 6d 70 6f 73 74  /forum/forumpost
5020: 2f 64 32 39 65 33 61 66 34 33 63 20 2a 2f 0a 20  /d29e3af43c */. 
5030: 20 66 6f 72 28 69 3d 30 3b 20 7a 43 73 70 5b 69   for(i=0; zCsp[i
5040: 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 66 6f 73  ]; i++){ if( fos
5050: 73 69 6c 5f 69 73 73 70 61 63 65 28 7a 43 73 70  sil_isspace(zCsp
5060: 5b 69 5d 29 20 29 20 7a 43 73 70 5b 69 5d 20 3d  [i]) ) zCsp[i] =
5070: 20 27 20 27 3b 20 7d 0a 20 20 69 66 28 20 74 6f   ' '; }.  if( to
5080: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 63 67  Header ){.    cg
5090: 69 5f 70 72 69 6e 74 66 5f 68 65 61 64 65 72 28  i_printf_header(
50a0: 22 43 6f 6e 74 65 6e 74 2d 53 65 63 75 72 69 74  "Content-Securit
50b0: 79 2d 50 6f 6c 69 63 79 3a 20 25 73 5c 72 5c 6e  y-Policy: %s\r\n
50c0: 22 2c 20 7a 43 73 70 29 3b 0a 20 20 7d 0a 20 20  ", zCsp);.  }.  
50d0: 72 65 74 75 72 6e 20 7a 43 73 70 3b 0a 7d 0a 0a  return zCsp;.}..
50e0: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 48 54  /*.** Default HT
50f0: 4d 4c 20 70 61 67 65 20 68 65 61 64 65 72 20 74  ML page header t
5100: 65 78 74 20 74 68 72 6f 75 67 68 20 3c 62 6f 64  ext through <bod
5110: 79 3e 2e 20 20 49 66 20 74 68 65 20 72 65 70 6f  y>.  If the repo
5120: 73 69 74 6f 72 79 2d 73 70 65 63 69 66 69 63 0a  sitory-specific.
5130: 2a 2a 20 68 65 61 64 65 72 20 74 65 6d 70 6c 61  ** header templa
5140: 74 65 20 6c 61 63 6b 73 20 61 20 3c 62 6f 64 79  te lacks a <body
5150: 3e 20 74 61 67 2c 20 74 68 65 6e 20 61 6c 6c 20  > tag, then all 
5160: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5170: 20 69 73 0a 2a 2a 20 70 72 65 70 65 6e 64 65 64   is.** prepended
5180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
5190: 74 20 63 68 61 72 20 7a 44 66 6c 74 48 65 61 64  t char zDfltHead
51a0: 65 72 5b 5d 20 3d 0a 40 20 3c 68 74 6d 6c 3e 0a  er[] =.@ <html>.
51b0: 40 20 3c 68 65 61 64 3e 0a 40 20 3c 6d 65 74 61  @ <head>.@ <meta
51c0: 20 63 68 61 72 73 65 74 3d 22 55 54 46 2d 38 22   charset="UTF-8"
51d0: 3e 0a 40 20 3c 62 61 73 65 20 68 72 65 66 3d 22  >.@ <base href="
51e0: 24 62 61 73 65 75 72 6c 2f 24 63 75 72 72 65 6e  $baseurl/$curren
51f0: 74 5f 70 61 67 65 22 3e 0a 40 20 3c 6d 65 74 61  t_page">.@ <meta
5200: 20 68 74 74 70 2d 65 71 75 69 76 3d 22 43 6f 6e   http-equiv="Con
5210: 74 65 6e 74 2d 53 65 63 75 72 69 74 79 2d 50 6f  tent-Security-Po
5220: 6c 69 63 79 22 20 63 6f 6e 74 65 6e 74 3d 22 24  licy" content="$
5230: 64 65 66 61 75 6c 74 5f 63 73 70 22 3e 0a 40 20  default_csp">.@ 
5240: 3c 6d 65 74 61 20 6e 61 6d 65 3d 22 76 69 65 77  <meta name="view
5250: 70 6f 72 74 22 20 63 6f 6e 74 65 6e 74 3d 22 77  port" content="w
5260: 69 64 74 68 3d 64 65 76 69 63 65 2d 77 69 64 74  idth=device-widt
5270: 68 2c 20 69 6e 69 74 69 61 6c 2d 73 63 61 6c 65  h, initial-scale
5280: 3d 31 2e 30 22 3e 0a 40 20 3c 74 69 74 6c 65 3e  =1.0">.@ <title>
5290: 24 3c 70 72 6f 6a 65 63 74 5f 6e 61 6d 65 3e 3a  $<project_name>:
52a0: 20 24 3c 74 69 74 6c 65 3e 3c 2f 74 69 74 6c 65   $<title></title
52b0: 3e 0a 40 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 61  >.@ <link rel="a
52c0: 6c 74 65 72 6e 61 74 65 22 20 74 79 70 65 3d 22  lternate" type="
52d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 73 73 2b  application/rss+
52e0: 78 6d 6c 22 20 74 69 74 6c 65 3d 22 52 53 53 20  xml" title="RSS 
52f0: 46 65 65 64 22 20 5c 0a 40 20 20 68 72 65 66 3d  Feed" \.@  href=
5300: 22 24 68 6f 6d 65 2f 74 69 6d 65 6c 69 6e 65 2e  "$home/timeline.
5310: 72 73 73 22 3e 0a 40 20 3c 6c 69 6e 6b 20 72 65  rss">.@ <link re
5320: 6c 3d 22 73 74 79 6c 65 73 68 65 65 74 22 20 68  l="stylesheet" h
5330: 72 65 66 3d 22 24 73 74 79 6c 65 73 68 65 65 74  ref="$stylesheet
5340: 5f 75 72 6c 22 20 74 79 70 65 3d 22 74 65 78 74  _url" type="text
5350: 2f 63 73 73 22 3e 0a 40 20 3c 2f 68 65 61 64 3e  /css">.@ </head>
5360: 0a 40 20 3c 62 6f 64 79 20 63 6c 61 73 73 3d 22  .@ <body class="
5370: 24 63 75 72 72 65 6e 74 5f 66 65 61 74 75 72 65  $current_feature
5380: 20 72 70 61 67 65 2d 24 72 65 71 75 65 73 74 65   rpage-$requeste
5390: 64 5f 70 61 67 65 20 63 70 61 67 65 2d 24 63 61  d_page cpage-$ca
53a0: 6e 6f 6e 69 63 61 6c 5f 70 61 67 65 22 3e 0a 3b  nonical_page">.;
53b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
53c0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
53d0: 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 63 6f 6e 73   header..*/.cons
53e0: 74 20 63 68 61 72 20 2a 67 65 74 5f 64 65 66 61  t char *get_defa
53f0: 75 6c 74 5f 68 65 61 64 65 72 28 29 7b 0a 20 20  ult_header(){.  
5400: 72 65 74 75 72 6e 20 7a 44 66 6c 74 48 65 61 64  return zDfltHead
5410: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  er;.}../*.** The
5420: 20 64 65 66 61 75 6c 74 20 54 43 4c 20 6c 69 73   default TCL lis
5430: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
5440: 68 65 20 6d 61 69 6e 20 6d 65 6e 75 2e 0a 2a 2f  he main menu..*/
5450: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
5460: 61 72 20 7a 44 66 6c 74 4d 61 69 6e 4d 65 6e 75  ar zDfltMainMenu
5470: 5b 5d 20 3d 0a 40 20 48 6f 6d 65 20 20 20 20 20  [] =.@ Home     
5480: 20 2f 68 6f 6d 65 20 20 20 20 20 20 20 20 2a 20   /home        * 
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a               {}.
54a0: 40 20 54 69 6d 65 6c 69 6e 65 20 20 2f 74 69 6d  @ Timeline  /tim
54b0: 65 6c 69 6e 65 20 20 20 20 7b 6f 20 72 20 6a 7d  eline    {o r j}
54c0: 20 20 20 20 20 20 20 20 7b 7d 0a 40 20 46 69 6c          {}.@ Fil
54d0: 65 73 20 20 20 20 20 2f 64 69 72 3f 63 69 3d 74  es     /dir?ci=t
54e0: 69 70 20 20 6f 68 20 20 20 20 20 20 20 20 20 20  ip  oh          
54f0: 20 20 20 64 65 73 6b 74 6f 70 6f 6e 6c 79 0a 40     desktoponly.@
5500: 20 42 72 61 6e 63 68 65 73 20 20 2f 62 72 6c 69   Branches  /brli
5510: 73 74 20 20 20 20 20 20 6f 20 20 20 20 20 20 20  st      o       
5520: 20 20 20 20 20 20 20 77 69 64 65 6f 6e 6c 79 0a         wideonly.
5530: 40 20 54 61 67 73 20 20 20 20 20 20 2f 74 61 67  @ Tags      /tag
5540: 6c 69 73 74 20 20 20 20 20 6f 20 20 20 20 20 20  list     o      
5550: 20 20 20 20 20 20 20 20 77 69 64 65 6f 6e 6c 79          wideonly
5560: 0a 40 20 46 6f 72 75 6d 20 20 20 20 20 2f 66 6f  .@ Forum     /fo
5570: 72 75 6d 20 20 20 20 20 20 20 7b 40 32 20 33 20  rum       {@2 3 
5580: 34 20 35 20 36 7d 20 20 20 77 69 64 65 6f 6e 6c  4 5 6}   wideonl
5590: 79 0a 40 20 43 68 61 74 20 20 20 20 20 20 2f 63  y.@ Chat      /c
55a0: 68 61 74 20 20 20 20 20 20 20 20 43 20 20 20 20  hat        C    
55b0: 20 20 20 20 20 20 20 20 20 20 77 69 64 65 6f 6e            wideon
55c0: 6c 79 0a 40 20 54 69 63 6b 65 74 73 20 20 20 2f  ly.@ Tickets   /
55d0: 74 69 63 6b 65 74 20 20 20 20 20 20 72 20 20 20  ticket      r   
55e0: 20 20 20 20 20 20 20 20 20 20 20 77 69 64 65 6f             wideo
55f0: 6e 6c 79 0a 40 20 57 69 6b 69 20 20 20 20 20 20  nly.@ Wiki      
5600: 2f 77 69 6b 69 20 20 20 20 20 20 20 20 6a 20 20  /wiki        j  
5610: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 64 65              wide
5620: 6f 6e 6c 79 0a 40 20 41 64 6d 69 6e 20 20 20 20  only.@ Admin    
5630: 20 2f 73 65 74 75 70 20 20 20 20 20 20 20 7b 61   /setup       {a
5640: 20 73 7d 20 20 20 20 20 20 20 20 20 20 64 65 73   s}          des
5650: 6b 74 6f 70 6f 6e 6c 79 0a 40 20 4c 6f 67 6f 75  ktoponly.@ Logou
5660: 74 20 20 20 20 2f 6c 6f 67 6f 75 74 20 20 20 20  t    /logout    
5670: 20 20 4c 20 20 20 20 20 20 20 20 20 20 20 20 20    L             
5680: 20 77 69 64 65 6f 6e 6c 79 0a 40 20 4c 6f 67 69   wideonly.@ Logi
5690: 6e 20 20 20 20 20 2f 6c 6f 67 69 6e 20 20 20 20  n     /login    
56a0: 20 20 20 21 4c 20 20 20 20 20 20 20 20 20 20 20     !L           
56b0: 20 20 77 69 64 65 6f 6e 6c 79 0a 3b 0a 0a 2f 2a    wideonly.;../*
56c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
56d0: 65 66 61 75 6c 74 20 6d 65 6e 75 0a 2a 2f 0a 63  efault menu.*/.c
56e0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79 6c 65  onst char *style
56f0: 5f 64 65 66 61 75 6c 74 5f 6d 61 69 6e 6d 65 6e  _default_mainmen
5700: 75 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  u(void){.  retur
5710: 6e 20 7a 44 66 6c 74 4d 61 69 6e 4d 65 6e 75 3b  n zDfltMainMenu;
5720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5730: 61 20 55 52 4c 20 70 61 74 68 2c 20 65 78 74 72  a URL path, extr
5740: 61 63 74 20 74 68 65 20 66 69 72 73 74 20 65 6c  act the first el
5750: 65 6d 65 6e 74 20 61 73 20 61 20 22 66 65 61 74  ement as a "feat
5760: 75 72 65 22 20 6e 61 6d 65 2c 0a 2a 2a 20 75 73  ure" name,.** us
5770: 65 64 20 61 73 20 74 68 65 20 3c 62 6f 64 79 20  ed as the <body 
5780: 63 6c 61 73 73 3d 22 46 45 41 54 55 52 45 22 3e  class="FEATURE">
5790: 20 76 61 6c 75 65 20 62 79 20 64 65 66 61 75 6c   value by defaul
57a0: 74 2c 20 74 68 6f 75 67 68 0a 2a 2a 20 6c 61 74  t, though.** lat
57b0: 65 72 2d 72 75 6e 6e 69 6e 67 20 63 6f 64 65 20  er-running code 
57c0: 6d 61 79 20 6f 76 65 72 72 69 64 65 20 74 68 69  may override thi
57d0: 73 2c 20 74 79 70 69 63 61 6c 6c 79 20 74 6f 20  s, typically to 
57e0: 67 72 6f 75 70 20 6d 75 6c 74 69 70 6c 65 0a 2a  group multiple.*
57f0: 2a 20 46 6f 73 73 69 6c 20 55 49 20 55 52 4c 73  * Fossil UI URLs
5800: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 22   into a single "
5810: 66 65 61 74 75 72 65 22 20 73 6f 20 79 6f 75 20  feature" so you 
5820: 63 61 6e 20 68 61 76 65 20 70 65 72 2d 66 65 61  can have per-fea
5830: 74 75 72 65 0a 2a 2a 20 43 53 53 20 72 75 6c 65  ture.** CSS rule
5840: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  s..**.** For exa
5850: 6d 70 6c 65 2c 20 22 62 6f 64 79 2e 66 6f 72 75  mple, "body.foru
5860: 6d 20 64 69 76 2e 6d 61 72 6b 64 6f 77 6e 20 62  m div.markdown b
5870: 6c 6f 63 6b 71 75 6f 74 65 22 20 74 61 72 67 65  lockquote" targe
5880: 74 73 20 6f 6e 6c 79 0a 2a 2a 20 62 6c 6f 63 6b  ts only.** block
5890: 20 71 75 6f 74 65 73 20 6d 61 64 65 20 69 6e 20   quotes made in 
58a0: 66 6f 72 75 6d 20 70 6f 73 74 73 2c 20 6c 65 61  forum posts, lea
58b0: 76 69 6e 67 20 6f 74 68 65 72 20 4d 61 72 6b 64  ving other Markd
58c0: 6f 77 6e 20 71 75 6f 74 65 73 0a 2a 2a 20 61 6c  own quotes.** al
58d0: 6f 6e 65 2e 20 20 42 65 63 61 75 73 65 20 66 65  one.  Because fe
58e0: 61 74 75 72 65 20 63 6c 61 73 73 20 22 66 6f 72  ature class "for
58f0: 75 6d 22 20 67 72 6f 75 70 73 20 2f 66 6f 72 75  um" groups /foru
5900: 6d 6d 61 69 6e 2c 20 2f 66 6f 72 75 6d 70 6f 73  mmain, /forumpos
5910: 74 2c 0a 2a 2a 20 61 6e 64 20 2f 66 6f 72 75 6d  t,.** and /forum
5920: 65 32 2c 20 69 74 20 77 6f 72 6b 73 20 61 63 72  e2, it works acr
5930: 6f 73 73 20 61 6c 6c 20 72 65 6e 64 65 72 69 6e  oss all renderin
5940: 67 73 20 6f 66 20 4d 61 72 6b 64 6f 77 6e 20 74  gs of Markdown t
5950: 6f 20 48 54 4d 4c 0a 2a 2a 20 77 69 74 68 69 6e  o HTML.** within
5960: 20 74 68 65 20 46 6f 73 73 69 6c 20 66 6f 72 75   the Fossil foru
5970: 6d 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 73 74  m feature..*/.st
5980: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
5990: 20 66 65 61 74 75 72 65 5f 66 72 6f 6d 5f 70 61   feature_from_pa
59a0: 67 65 5f 70 61 74 68 28 63 6f 6e 73 74 20 63 68  ge_path(const ch
59b0: 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 63 6f  ar *zPath){.  co
59c0: 6e 73 74 20 63 68 61 72 2a 20 7a 53 6c 61 73 68  nst char* zSlash
59d0: 20 3d 20 73 74 72 63 68 72 28 7a 50 61 74 68 2c   = strchr(zPath,
59e0: 20 27 2f 27 29 3b 0a 20 20 69 66 20 28 7a 53 6c   '/');.  if (zSl
59f0: 61 73 68 29 20 7b 0a 20 20 20 20 72 65 74 75 72  ash) {.    retur
5a00: 6e 20 66 6f 73 73 69 6c 5f 73 74 72 6e 64 75 70  n fossil_strndup
5a10: 28 7a 50 61 74 68 2c 20 7a 53 6c 61 73 68 20 2d  (zPath, zSlash -
5a20: 20 7a 50 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73   zPath);.  } els
5a30: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a  e {.    return z
5a40: 50 61 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Path;.  }.}../*.
5a50: 2a 2a 20 4f 76 65 72 72 69 64 65 20 74 68 65 20  ** Override the 
5a60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 54 48 31  value of the TH1
5a70: 20 76 61 72 69 61 62 6c 65 20 63 75 72 72 65 6e   variable curren
5a80: 74 5f 66 65 61 74 75 72 65 2c 20 69 74 73 20 64  t_feature, its d
5a90: 65 66 61 75 6c 74 0a 2a 2a 20 73 65 74 20 62 79  efault.** set by
5aa0: 20 66 65 61 74 75 72 65 5f 66 72 6f 6d 5f 70 61   feature_from_pa
5ab0: 67 65 5f 70 61 74 68 28 29 2e 20 20 57 65 20 64  ge_path().  We d
5ac0: 6f 20 6e 6f 74 20 63 61 6c 6c 20 74 68 69 73 20  o not call this 
5ad0: 66 72 6f 6d 0a 2a 2a 20 73 74 79 6c 65 5f 69 6e  from.** style_in
5ae0: 69 74 5f 74 68 31 5f 76 61 72 73 28 29 20 62 65  it_th1_vars() be
5af0: 63 61 75 73 65 20 74 68 61 74 20 75 73 65 73 20  cause that uses 
5b00: 54 68 5f 4d 61 79 62 65 53 74 6f 72 65 28 29 20  Th_MaybeStore() 
5b10: 69 6e 73 74 65 61 64 20 74 6f 0a 2a 2a 20 61 6c  instead to.** al
5b20: 6c 6f 77 20 77 65 62 70 61 67 65 20 69 6d 70 6c  low webpage impl
5b30: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 74 6f 20 63  ementations to c
5b40: 61 6c 6c 20 74 68 69 73 20 62 65 66 6f 72 65 20  all this before 
5b50: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 29 0a 2a  style_header().*
5b60: 2a 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  * to override th
5b70: 61 74 20 22 6d 61 79 62 65 22 20 64 65 66 61 75  at "maybe" defau
5b80: 6c 74 20 77 69 74 68 20 73 6f 6d 65 74 68 69 6e  lt with somethin
5b90: 67 20 62 65 74 74 65 72 2e 0a 2a 2f 0a 76 6f 69  g better..*/.voi
5ba0: 64 20 73 74 79 6c 65 5f 73 65 74 5f 63 75 72 72  d style_set_curr
5bb0: 65 6e 74 5f 66 65 61 74 75 72 65 28 63 6f 6e 73  ent_feature(cons
5bc0: 74 20 63 68 61 72 2a 20 7a 46 65 61 74 75 72 65  t char* zFeature
5bd0: 29 7b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 63  ){.  Th_Store("c
5be0: 75 72 72 65 6e 74 5f 66 65 61 74 75 72 65 22 2c  urrent_feature",
5bf0: 20 7a 46 65 61 74 75 72 65 29 3b 0a 7d 0a 0a 2f   zFeature);.}../
5c00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
5c10: 20 63 75 72 72 65 6e 74 20 6d 61 69 6e 6d 65 6e   current mainmen
5c20: 75 20 76 61 6c 75 65 20 66 72 6f 6d 20 65 69 74  u value from eit
5c30: 68 65 72 20 74 68 65 20 2d 2d 6d 61 69 6e 6d 65  her the --mainme
5c40: 6e 75 20 66 6c 61 67 0a 2a 2a 20 28 68 61 6e 64  nu flag.** (hand
5c50: 6c 65 64 20 62 79 20 74 68 65 20 73 65 72 76 65  led by the serve
5c60: 72 2f 75 69 2f 63 67 69 20 63 6f 6d 6d 61 6e 64  r/ui/cgi command
5c70: 73 29 2c 20 74 68 65 20 22 6d 61 69 6e 6d 65 6e  s), the "mainmen
5c80: 75 22 20 63 6f 6e 66 69 67 0a 2a 2a 20 73 65 74  u" config.** set
5c90: 74 69 6e 67 2c 20 6f 72 20 73 74 79 6c 65 5f 64  ting, or style_d
5ca0: 65 66 61 75 6c 74 5f 6d 61 69 6e 6d 65 6e 75 28  efault_mainmenu(
5cb0: 29 2c 20 69 6e 20 74 68 61 74 20 6f 72 64 65 72  ), in that order
5cc0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 0a  , returning the.
5cd0: 2a 2a 20 66 69 72 73 74 20 6f 66 20 74 68 6f 73  ** first of thos
5ce0: 65 20 77 68 69 63 68 20 69 73 20 64 65 66 69 6e  e which is defin
5cf0: 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ed..*/.const cha
5d00: 72 20 2a 73 74 79 6c 65 5f 67 65 74 5f 6d 61 69  r *style_get_mai
5d10: 6e 6d 65 6e 75 28 29 7b 0a 20 20 73 74 61 74 69  nmenu(){.  stati
5d20: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  c const char *zM
5d30: 65 6e 75 20 3d 20 30 3b 0a 20 20 69 66 28 21 7a  enu = 0;.  if(!z
5d40: 4d 65 6e 75 29 7b 0a 20 20 20 20 69 66 28 67 2e  Menu){.    if(g.
5d50: 7a 4d 61 69 6e 4d 65 6e 75 46 69 6c 65 29 7b 0a  zMainMenuFile){.
5d60: 20 20 20 20 20 20 42 6c 6f 62 20 62 20 3d 20 65        Blob b = e
5d70: 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 20 20 20  mpty_blob;.     
5d80: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f   blob_read_from_
5d90: 66 69 6c 65 28 26 62 2c 20 67 2e 7a 4d 61 69 6e  file(&b, g.zMain
5da0: 4d 65 6e 75 46 69 6c 65 2c 20 45 78 74 46 49 4c  MenuFile, ExtFIL
5db0: 45 29 3b 0a 20 20 20 20 20 20 7a 4d 65 6e 75 20  E);.      zMenu 
5dc0: 3d 20 62 6c 6f 62 5f 73 74 72 28 26 62 29 3b 0a  = blob_str(&b);.
5dd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5de0: 20 7a 4d 65 6e 75 20 3d 20 64 62 5f 67 65 74 28   zMenu = db_get(
5df0: 22 6d 61 69 6e 6d 65 6e 75 22 2c 20 73 74 79 6c  "mainmenu", styl
5e00: 65 5f 64 65 66 61 75 6c 74 5f 6d 61 69 6e 6d 65  e_default_mainme
5e10: 6e 75 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nu());.    }.  }
5e20: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 65 6e 75 3b  .  return zMenu;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
5e40: 6c 69 7a 65 20 61 6c 6c 20 74 68 65 20 64 65 66  lize all the def
5e50: 61 75 6c 74 20 54 48 31 20 76 61 72 69 61 62 6c  ault TH1 variabl
5e60: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
5e70: 64 20 73 74 79 6c 65 5f 69 6e 69 74 5f 74 68 31  d style_init_th1
5e80: 5f 76 61 72 73 28 63 6f 6e 73 74 20 63 68 61 72  _vars(const char
5e90: 20 2a 7a 54 69 74 6c 65 29 7b 0a 20 20 63 6f 6e   *zTitle){.  con
5ea0: 73 74 20 63 68 61 72 20 2a 7a 4e 6f 6e 63 65 20  st char *zNonce 
5eb0: 3d 20 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 3b  = style_nonce();
5ec0: 0a 20 20 63 68 61 72 20 2a 7a 44 66 6c 74 43 73  .  char *zDfltCs
5ed0: 70 3b 0a 0a 20 20 7a 44 66 6c 74 43 73 70 20 3d  p;..  zDfltCsp =
5ee0: 20 73 74 79 6c 65 5f 63 73 70 28 31 29 3b 0a 20   style_csp(1);. 
5ef0: 20 2f 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20   /*.  ** Do not 
5f00: 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 54 48  overwrite the TH
5f10: 31 20 76 61 72 69 61 62 6c 65 20 22 64 65 66 61  1 variable "defa
5f20: 75 6c 74 5f 63 73 70 22 20 69 66 20 69 74 20 65  ult_csp" if it e
5f30: 78 69 73 74 73 2c 20 61 73 20 74 68 69 73 0a 20  xists, as this. 
5f40: 20 2a 2a 20 61 6c 6c 6f 77 73 20 69 74 20 74 6f   ** allows it to
5f50: 20 62 65 20 70 72 6f 70 65 72 6c 79 20 6f 76 65   be properly ove
5f60: 72 72 69 64 64 65 6e 20 76 69 61 20 74 68 65 20  rridden via the 
5f70: 54 48 31 20 73 65 74 75 70 20 73 63 72 69 70 74  TH1 setup script
5f80: 20 28 69 2e 65 2e 20 69 74 0a 20 20 2a 2a 20 69   (i.e. it.  ** i
5f90: 73 20 65 76 61 6c 75 61 74 65 64 20 62 65 66 6f  s evaluated befo
5fa0: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  re the header is
5fb0: 20 72 65 6e 64 65 72 65 64 29 2e 0a 20 20 2a 2f   rendered)..  */
5fc0: 0a 20 20 54 68 5f 4d 61 79 62 65 53 74 6f 72 65  .  Th_MaybeStore
5fd0: 28 22 64 65 66 61 75 6c 74 5f 63 73 70 22 2c 20  ("default_csp", 
5fe0: 7a 44 66 6c 74 43 73 70 29 3b 0a 20 20 66 6f 73  zDfltCsp);.  fos
5ff0: 73 69 6c 5f 66 72 65 65 28 7a 44 66 6c 74 43 73  sil_free(zDfltCs
6000: 70 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22  p);.  Th_Store("
6010: 6e 6f 6e 63 65 22 2c 20 7a 4e 6f 6e 63 65 29 3b  nonce", zNonce);
6020: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 70 72 6f  .  Th_Store("pro
6030: 6a 65 63 74 5f 6e 61 6d 65 22 2c 20 64 62 5f 67  ject_name", db_g
6040: 65 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65  et("project-name
6050: 22 2c 22 55 6e 6e 61 6d 65 64 20 46 6f 73 73 69  ","Unnamed Fossi
6060: 6c 20 50 72 6f 6a 65 63 74 22 29 29 3b 0a 20 20  l Project"));.  
6070: 54 68 5f 53 74 6f 72 65 28 22 70 72 6f 6a 65 63  Th_Store("projec
6080: 74 5f 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20  t_description", 
6090: 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d  db_get("project-
60a0: 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 22 22 29  description","")
60b0: 29 3b 0a 20 20 69 66 28 20 7a 54 69 74 6c 65 20  );.  if( zTitle 
60c0: 29 20 54 68 5f 53 74 6f 72 65 28 22 74 69 74 6c  ) Th_Store("titl
60d0: 65 22 2c 20 7a 54 69 74 6c 65 29 3b 0a 20 20 54  e", zTitle);.  T
60e0: 68 5f 53 74 6f 72 65 28 22 62 61 73 65 75 72 6c  h_Store("baseurl
60f0: 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a  ", g.zBaseURL);.
6100: 20 20 54 68 5f 53 74 6f 72 65 28 22 73 65 63 75    Th_Store("secu
6110: 72 65 75 72 6c 22 2c 20 66 6f 73 73 69 6c 5f 77  reurl", fossil_w
6120: 61 6e 74 73 5f 68 74 74 70 73 28 31 29 3f 20 67  ants_https(1)? g
6130: 2e 7a 48 74 74 70 73 55 52 4c 3a 20 67 2e 7a 42  .zHttpsURL: g.zB
6140: 61 73 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74  aseURL);.  Th_St
6150: 6f 72 65 28 22 68 6f 6d 65 22 2c 20 67 2e 7a 54  ore("home", g.zT
6160: 6f 70 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28  op);.  Th_Store(
6170: 22 69 6e 64 65 78 5f 70 61 67 65 22 2c 20 64 62  "index_page", db
6180: 5f 67 65 74 28 22 69 6e 64 65 78 2d 70 61 67 65  _get("index-page
6190: 22 2c 22 2f 68 6f 6d 65 22 29 29 3b 0a 20 20 69  ","/home"));.  i
61a0: 66 28 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 65 6e  f( local_zCurren
61b0: 74 50 61 67 65 3d 3d 30 20 29 20 73 74 79 6c 65  tPage==0 ) style
61c0: 5f 73 65 74 5f 63 75 72 72 65 6e 74 5f 70 61 67  _set_current_pag
61d0: 65 28 22 25 54 22 2c 20 67 2e 7a 50 61 74 68 29  e("%T", g.zPath)
61e0: 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 63 75  ;.  Th_Store("cu
61f0: 72 72 65 6e 74 5f 70 61 67 65 22 2c 20 6c 6f 63  rrent_page", loc
6200: 61 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 29  al_zCurrentPage)
6210: 3b 0a 20 20 69 66 28 20 67 2e 7a 50 61 74 68 20  ;.  if( g.zPath 
6220: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
6230: 20 20 2f 2a 20 73 74 6f 72 65 20 74 68 65 20 66    /* store the f
6240: 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
6250: 61 20 70 61 74 68 3b 20 2a 2f 0a 20 20 20 20 63  a path; */.    c
6260: 68 61 72 20 2a 70 53 6c 61 73 68 20 3d 20 73 74  har *pSlash = st
6270: 72 63 68 72 28 67 2e 7a 50 61 74 68 2c 27 2f 27  rchr(g.zPath,'/'
6280: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6c 61 73  );.    if( pSlas
6290: 68 20 29 20 2a 70 53 6c 61 73 68 20 3d 20 30 3b  h ) *pSlash = 0;
62a0: 20 20 20 2f 2a 20 6d 61 6b 65 20 61 20 74 65 6d     /* make a tem
62b0: 70 6f 72 61 72 79 20 63 75 74 20 69 66 20 6e 65  porary cut if ne
62c0: 63 65 73 73 61 72 79 20 20 2a 2f 0a 20 20 20 20  cessary  */.    
62d0: 54 68 5f 53 74 6f 72 65 28 22 72 65 71 75 65 73  Th_Store("reques
62e0: 74 65 64 5f 70 61 67 65 22 2c 20 65 73 63 61 70  ted_page", escap
62f0: 65 5f 71 75 6f 74 65 73 28 67 2e 7a 50 61 74 68  e_quotes(g.zPath
6300: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6c 61  ));.    if( pSla
6310: 73 68 20 29 20 2a 70 53 6c 61 73 68 20 3d 20 27  sh ) *pSlash = '
6320: 2f 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /';.  }else{.   
6330: 20 54 68 5f 53 74 6f 72 65 28 22 72 65 71 75 65   Th_Store("reque
6340: 73 74 65 64 5f 70 61 67 65 22 2c 20 22 22 29 3b  sted_page", "");
6350: 0a 20 20 7d 0a 20 20 54 68 5f 53 74 6f 72 65 28  .  }.  Th_Store(
6360: 22 63 61 6e 6f 6e 69 63 61 6c 5f 70 61 67 65 22  "canonical_page"
6370: 2c 20 65 73 63 61 70 65 5f 71 75 6f 74 65 73 28  , escape_quotes(
6380: 67 2e 7a 50 68 61 73 65 2b 31 29 29 3b 0a 20 20  g.zPhase+1));.  
6390: 54 68 5f 53 74 6f 72 65 28 22 63 73 72 66 5f 74  Th_Store("csrf_t
63a0: 6f 6b 65 6e 22 2c 20 67 2e 7a 43 73 72 66 54 6f  oken", g.zCsrfTo
63b0: 6b 65 6e 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65  ken);.  Th_Store
63c0: 28 22 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ("release_versio
63d0: 6e 22 2c 20 52 45 4c 45 41 53 45 5f 56 45 52 53  n", RELEASE_VERS
63e0: 49 4f 4e 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65  ION);.  Th_Store
63f0: 28 22 6d 61 6e 69 66 65 73 74 5f 76 65 72 73 69  ("manifest_versi
6400: 6f 6e 22 2c 20 4d 41 4e 49 46 45 53 54 5f 56 45  on", MANIFEST_VE
6410: 52 53 49 4f 4e 29 3b 0a 20 20 54 68 5f 53 74 6f  RSION);.  Th_Sto
6420: 72 65 28 22 6d 61 6e 69 66 65 73 74 5f 64 61 74  re("manifest_dat
6430: 65 22 2c 20 4d 41 4e 49 46 45 53 54 5f 44 41 54  e", MANIFEST_DAT
6440: 45 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22  E);.  Th_Store("
6450: 63 6f 6d 70 69 6c 65 72 5f 6e 61 6d 65 22 2c 20  compiler_name", 
6460: 43 4f 4d 50 49 4c 45 52 5f 4e 41 4d 45 29 3b 0a  COMPILER_NAME);.
6470: 20 20 54 68 5f 53 74 6f 72 65 28 22 6d 61 69 6e    Th_Store("main
6480: 6d 65 6e 75 22 2c 20 73 74 79 6c 65 5f 67 65 74  menu", style_get
6490: 5f 6d 61 69 6e 6d 65 6e 75 28 29 29 3b 0a 20 20  _mainmenu());.  
64a0: 73 74 79 6c 65 73 68 65 65 74 5f 75 72 6c 5f 76  stylesheet_url_v
64b0: 61 72 28 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72  ar();.  image_ur
64c0: 6c 5f 76 61 72 28 22 6c 6f 67 6f 22 29 3b 0a 20  l_var("logo");. 
64d0: 20 69 6d 61 67 65 5f 75 72 6c 5f 76 61 72 28 22   image_url_var("
64e0: 62 61 63 6b 67 72 6f 75 6e 64 22 29 3b 0a 20 20  background");.  
64f0: 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f 6e 6f  if( !login_is_no
6500: 62 6f 64 79 28 29 20 29 7b 0a 20 20 20 20 54 68  body() ){.    Th
6510: 5f 53 74 6f 72 65 28 22 6c 6f 67 69 6e 22 2c 20  _Store("login", 
6520: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 7d 0a 20  g.zLogin);.  }. 
6530: 20 54 68 5f 4d 61 79 62 65 53 74 6f 72 65 28 22   Th_MaybeStore("
6540: 63 75 72 72 65 6e 74 5f 66 65 61 74 75 72 65 22  current_feature"
6550: 2c 20 66 65 61 74 75 72 65 5f 66 72 6f 6d 5f 70  , feature_from_p
6560: 61 67 65 5f 70 61 74 68 28 6c 6f 63 61 6c 5f 7a  age_path(local_z
6570: 43 75 72 72 65 6e 74 50 61 67 65 29 20 29 3b 0a  CurrentPage) );.
6580: 20 20 69 66 28 20 67 2e 66 74 6e 74 73 49 73 73    if( g.ftntsIss
6590: 75 65 73 5b 30 5d 20 7c 7c 20 67 2e 66 74 6e 74  ues[0] || g.ftnt
65a0: 73 49 73 73 75 65 73 5b 31 5d 20 7c 7c 0a 20 20  sIssues[1] ||.  
65b0: 20 20 20 20 67 2e 66 74 6e 74 73 49 73 73 75 65      g.ftntsIssue
65c0: 73 5b 32 5d 20 7c 7c 20 67 2e 66 74 6e 74 73 49  s[2] || g.ftntsI
65d0: 73 73 75 65 73 5b 33 5d 20 29 7b 0a 20 20 20 20  ssues[3] ){.    
65e0: 63 68 61 72 20 62 75 66 5b 38 30 5d 3b 0a 20 20  char buf[80];.  
65f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6600: 74 66 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  tf(sizeof(buf), 
6610: 62 75 66 2c 20 22 25 69 20 25 69 20 25 69 20 25  buf, "%i %i %i %
6620: 69 22 2c 20 67 2e 66 74 6e 74 73 49 73 73 75 65  i", g.ftntsIssue
6630: 73 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  s[0],.          
6640: 20 20 20 20 20 20 20 20 20 20 20 67 2e 66 74 6e             g.ftn
6650: 74 73 49 73 73 75 65 73 5b 31 5d 2c 20 67 2e 66  tsIssues[1], g.f
6660: 74 6e 74 73 49 73 73 75 65 73 5b 32 5d 2c 20 67  tntsIssues[2], g
6670: 2e 66 74 6e 74 73 49 73 73 75 65 73 5b 33 5d 29  .ftntsIssues[3])
6680: 3b 0a 20 20 20 20 54 68 5f 53 74 6f 72 65 28 22  ;.    Th_Store("
6690: 66 6f 6f 74 6e 6f 74 65 73 5f 69 73 73 75 65 73  footnotes_issues
66a0: 5f 63 6f 75 6e 74 65 72 73 22 2c 20 62 75 66 29  _counters", buf)
66b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
66c0: 72 61 77 20 74 68 65 20 68 65 61 64 65 72 2e 0a  raw the header..
66d0: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 68 65  */.void style_he
66e0: 61 64 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ader(const char 
66f0: 2a 7a 54 69 74 6c 65 46 6f 72 6d 61 74 2c 20 2e  *zTitleFormat, .
6700: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
6710: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 69 74 6c  p;.  char *zTitl
6720: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
6730: 2a 7a 48 65 61 64 65 72 20 3d 20 73 6b 69 6e 5f  *zHeader = skin_
6740: 67 65 74 28 22 68 65 61 64 65 72 22 29 3b 0a 20  get("header");. 
6750: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
6760: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 0a 20 20 76  dentials();..  v
6770: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 69 74  a_start(ap, zTit
6780: 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 54 69  leFormat);.  zTi
6790: 74 6c 65 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a  tle = vmprintf(z
67a0: 54 69 74 6c 65 46 6f 72 6d 61 74 2c 20 61 70 29  TitleFormat, ap)
67b0: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
67c0: 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69  .  cgi_destinati
67d0: 6f 6e 28 43 47 49 5f 48 45 41 44 45 52 29 3b 0a  on(CGI_HEADER);.
67e0: 0a 20 20 40 20 3c 21 44 4f 43 54 59 50 45 20 68  .  @ <!DOCTYPE h
67f0: 74 6d 6c 3e 0a 0a 20 20 69 66 28 20 67 2e 74 68  tml>..  if( g.th
6800: 54 72 61 63 65 20 29 20 54 68 5f 54 72 61 63 65  Trace ) Th_Trace
6810: 28 22 42 45 47 49 4e 5f 48 45 41 44 45 52 3c 62  ("BEGIN_HEADER<b
6820: 72 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 0a 20 20 2f  r>\n", -1);..  /
6830: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 68  * Generate the h
6840: 65 61 64 65 72 20 75 70 20 74 68 72 6f 75 67 68  eader up through
6850: 20 74 68 65 20 6d 61 69 6e 20 6d 65 6e 75 20 2a   the main menu *
6860: 2f 0a 20 20 73 74 79 6c 65 5f 69 6e 69 74 5f 74  /.  style_init_t
6870: 68 31 5f 76 61 72 73 28 7a 54 69 74 6c 65 29 3b  h1_vars(zTitle);
6880: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
6890: 74 72 6c 69 6b 65 28 22 25 3c 62 6f 64 79 25 22  trlike("%<body%"
68a0: 2c 20 7a 48 65 61 64 65 72 2c 20 30 29 21 3d 30  , zHeader, 0)!=0
68b0: 20 29 7b 0a 20 20 20 20 54 68 5f 52 65 6e 64 65   ){.    Th_Rende
68c0: 72 28 7a 44 66 6c 74 48 65 61 64 65 72 29 3b 0a  r(zDfltHeader);.
68d0: 20 20 7d 0a 20 20 69 66 28 20 67 2e 74 68 54 72    }.  if( g.thTr
68e0: 61 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22  ace ) Th_Trace("
68f0: 42 45 47 49 4e 5f 48 45 41 44 45 52 5f 53 43 52  BEGIN_HEADER_SCR
6900: 49 50 54 3c 62 72 3e 5c 6e 22 2c 20 2d 31 29 3b  IPT<br>\n", -1);
6910: 0a 20 20 54 68 5f 52 65 6e 64 65 72 28 7a 48 65  .  Th_Render(zHe
6920: 61 64 65 72 29 3b 0a 20 20 69 66 28 20 67 2e 74  ader);.  if( g.t
6930: 68 54 72 61 63 65 20 29 20 54 68 5f 54 72 61 63  hTrace ) Th_Trac
6940: 65 28 22 45 4e 44 5f 48 45 41 44 45 52 3c 62 72  e("END_HEADER<br
6950: 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68 5f  >\n", -1);.  Th_
6960: 55 6e 73 74 6f 72 65 28 22 74 69 74 6c 65 22 29  Unstore("title")
6970: 3b 20 20 20 2f 2a 20 41 76 6f 69 64 20 63 6f 6c  ;   /* Avoid col
6980: 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74 69 63  lisions with tic
6990: 6b 65 74 20 66 69 65 6c 64 20 6e 61 6d 65 73 20  ket field names 
69a0: 2a 2f 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61  */.  cgi_destina
69b0: 74 69 6f 6e 28 43 47 49 5f 42 4f 44 59 29 3b 0a  tion(CGI_BODY);.
69c0: 20 20 67 2e 63 67 69 4f 75 74 70 75 74 20 3d 20    g.cgiOutput = 
69d0: 31 3b 0a 20 20 68 65 61 64 65 72 48 61 73 42 65  1;.  headerHasBe
69e0: 65 6e 47 65 6e 65 72 61 74 65 64 20 3d 20 31 3b  enGenerated = 1;
69f0: 0a 20 20 73 69 64 65 62 6f 78 55 73 65 64 20 3d  .  sideboxUsed =
6a00: 20 30 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d   0;.  if( g.perm
6a10: 2e 44 65 62 75 67 20 26 26 20 50 28 22 73 68 6f  .Debug && P("sho
6a20: 77 71 70 22 29 20 29 7b 0a 20 20 20 20 40 20 3c  wqp") ){.    @ <
6a30: 64 69 76 20 63 6c 61 73 73 3d 22 64 65 62 75 67  div class="debug
6a40: 22 3e 0a 20 20 20 20 63 67 69 5f 70 72 69 6e 74  ">.    cgi_print
6a50: 5f 61 6c 6c 28 30 2c 20 30 2c 20 30 29 3b 0a 20  _all(0, 0, 0);. 
6a60: 20 20 20 40 20 3c 2f 64 69 76 3e 0a 20 20 7d 0a     @ </div>.  }.
6a70: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 54    fossil_free(zT
6a80: 69 74 6c 65 29 3b 0a 7d 0a 0a 23 69 66 20 49 4e  itle);.}..#if IN
6a90: 54 45 52 46 41 43 45 0a 2f 2a 20 41 6c 6c 6f 77  TERFACE./* Allow
6aa0: 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ed parameters fo
6ab0: 72 20 73 74 79 6c 65 5f 61 64 75 6e 69 74 28 29  r style_adunit()
6ac0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 44 55 4e   */.#define ADUN
6ad0: 49 54 5f 4f 46 46 20 20 20 20 20 20 20 20 30 78  IT_OFF        0x
6ae0: 30 30 30 31 20 20 20 20 20 20 20 2f 2a 20 44 6f  0001       /* Do
6af0: 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 64 73 20 6f   not allow ads o
6b00: 6e 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 23  n this page */.#
6b10: 64 65 66 69 6e 65 20 41 44 55 4e 49 54 5f 52 49  define ADUNIT_RI
6b20: 47 48 54 5f 4f 4b 20 20 20 30 78 30 30 30 32 20  GHT_OK   0x0002 
6b30: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 73        /* Right-s
6b40: 69 64 65 20 76 65 72 74 69 63 61 6c 20 61 64 73  ide vertical ads
6b50: 20 6f 6b 20 68 65 72 65 20 2a 2f 0a 23 65 6e 64   ok here */.#end
6b60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 61 72 69 6f 75  if../*.** Variou
6b70: 73 20 70 61 67 65 20 69 6d 70 6c 65 6d 65 6e 74  s page implement
6b80: 61 74 69 6f 6e 73 20 63 61 6e 20 69 6e 76 6f 6b  ations can invok
6b90: 65 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65  e this interface
6ba0: 20 74 6f 20 6c 65 74 20 74 68 65 0a 2a 2a 20 73   to let the.** s
6bb0: 74 79 6c 65 20 6d 61 6e 61 67 65 72 20 6b 6e 6f  tyle manager kno
6bc0: 77 20 77 68 61 74 20 6b 69 6e 64 73 20 6f 66 20  w what kinds of 
6bd0: 61 64 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ads are appropri
6be0: 61 74 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ate for this pag
6bf0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65  e..*/.void style
6c00: 5f 61 64 75 6e 69 74 5f 63 6f 6e 66 69 67 28 75  _adunit_config(u
6c10: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 46 6c 61  nsigned int mFla
6c20: 67 73 29 7b 0a 20 20 61 64 55 6e 69 74 46 6c 61  gs){.  adUnitFla
6c30: 67 73 20 3d 20 6d 46 6c 61 67 73 3b 0a 7d 0a 0a  gs = mFlags;.}..
6c40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6c50: 20 74 65 78 74 20 6f 66 20 61 6e 20 61 64 2d 75   text of an ad-u
6c60: 6e 69 74 2c 20 69 66 20 6f 6e 65 20 73 68 6f 75  nit, if one shou
6c70: 6c 64 20 62 65 20 72 65 6e 64 65 72 65 64 2e 20  ld be rendered. 
6c80: 20 52 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20   Return.** NULL 
6c90: 69 66 20 6e 6f 20 61 64 2d 75 6e 69 74 20 69 73  if no ad-unit is
6ca0: 20 64 65 73 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   desired..**.** 
6cb0: 54 68 65 20 2a 70 41 64 46 6c 61 67 20 76 61 6c  The *pAdFlag val
6cc0: 75 65 20 6d 69 67 68 74 20 62 65 20 73 65 74 20  ue might be set 
6cd0: 74 6f 20 41 44 55 4e 49 54 5f 52 49 47 48 54 5f  to ADUNIT_RIGHT_
6ce0: 4f 4b 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a  OK if this is.**
6cf0: 20 61 20 72 69 67 68 74 2d 68 61 6e 64 20 76 65   a right-hand ve
6d00: 72 74 69 63 61 6c 20 61 64 2e 0a 2a 2f 0a 73 74  rtical ad..*/.st
6d10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6d20: 2a 73 74 79 6c 65 5f 61 64 75 6e 69 74 5f 74 65  *style_adunit_te
6d30: 78 74 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  xt(unsigned int 
6d40: 2a 70 41 64 46 6c 61 67 29 7b 0a 20 20 63 6f 6e  *pAdFlag){.  con
6d50: 73 74 20 63 68 61 72 20 2a 7a 41 64 20 3d 20 30  st char *zAd = 0
6d60: 3b 0a 20 20 2a 70 41 64 46 6c 61 67 20 3d 20 30  ;.  *pAdFlag = 0
6d70: 3b 0a 20 20 69 66 28 20 61 64 55 6e 69 74 46 6c  ;.  if( adUnitFl
6d80: 61 67 73 20 26 20 41 44 55 4e 49 54 5f 4f 46 46  ags & ADUNIT_OFF
6d90: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
6da0: 20 44 69 73 61 6c 6c 6f 77 20 61 64 73 20 6f 6e   Disallow ads on
6db0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
6dc0: 69 66 28 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65  if( db_get_boole
6dd0: 61 6e 28 22 61 64 75 6e 69 74 2d 64 69 73 61 62  an("adunit-disab
6de0: 6c 65 22 2c 30 29 20 29 20 72 65 74 75 72 6e 20  le",0) ) return 
6df0: 30 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  0;.  if( g.perm.
6e00: 41 64 6d 69 6e 20 26 26 20 64 62 5f 67 65 74 5f  Admin && db_get_
6e10: 62 6f 6f 6c 65 61 6e 28 22 61 64 75 6e 69 74 2d  boolean("adunit-
6e20: 6f 6d 69 74 2d 69 66 2d 61 64 6d 69 6e 22 2c 30  omit-if-admin",0
6e30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
6e40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 6c 6f  0;.  }.  if( !lo
6e50: 67 69 6e 5f 69 73 5f 6e 6f 62 6f 64 79 28 29 0a  gin_is_nobody().
6e60: 20 20 20 26 26 20 66 6f 73 73 69 6c 5f 73 74 72     && fossil_str
6e70: 63 6d 70 28 67 2e 7a 4c 6f 67 69 6e 2c 22 61 6e  cmp(g.zLogin,"an
6e80: 6f 6e 79 6d 6f 75 73 22 29 21 3d 30 0a 20 20 20  onymous")!=0.   
6e90: 26 26 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61  && db_get_boolea
6ea0: 6e 28 22 61 64 75 6e 69 74 2d 6f 6d 69 74 2d 69  n("adunit-omit-i
6eb0: 66 2d 75 73 65 72 22 2c 30 29 0a 20 20 29 7b 0a  f-user",0).  ){.
6ec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6ed0: 7d 0a 20 20 69 66 28 20 28 61 64 55 6e 69 74 46  }.  if( (adUnitF
6ee0: 6c 61 67 73 20 26 20 41 44 55 4e 49 54 5f 52 49  lags & ADUNIT_RI
6ef0: 47 48 54 5f 4f 4b 29 21 3d 30 0a 20 20 20 26 26  GHT_OK)!=0.   &&
6f00: 20 21 66 6f 73 73 69 6c 5f 61 6c 6c 5f 77 68 69   !fossil_all_whi
6f10: 74 65 73 70 61 63 65 28 7a 41 64 20 3d 20 64 62  tespace(zAd = db
6f20: 5f 67 65 74 28 22 61 64 75 6e 69 74 2d 72 69 67  _get("adunit-rig
6f30: 68 74 22 2c 20 30 29 29 0a 20 20 20 26 26 20 21  ht", 0)).   && !
6f40: 63 67 69 5f 62 6f 64 79 5f 63 6f 6e 74 61 69 6e  cgi_body_contain
6f50: 73 28 22 3c 74 61 62 6c 65 22 29 0a 20 20 29 7b  s("<table").  ){
6f60: 0a 20 20 20 20 2a 70 41 64 46 6c 61 67 20 3d 20  .    *pAdFlag = 
6f70: 41 44 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 3b  ADUNIT_RIGHT_OK;
6f80: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 41 64 3b  .    return zAd;
6f90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66 6f  .  }else if( !fo
6fa0: 73 73 69 6c 5f 61 6c 6c 5f 77 68 69 74 65 73 70  ssil_all_whitesp
6fb0: 61 63 65 28 7a 41 64 20 3d 20 64 62 5f 67 65 74  ace(zAd = db_get
6fc0: 28 22 61 64 75 6e 69 74 22 2c 30 29 29 20 29 7b  ("adunit",0)) ){
6fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 41 64 3b  .    return zAd;
6fe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
7000: 74 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  te that the tabl
7010: 65 2d 73 6f 72 74 69 6e 67 20 6a 61 76 61 73 63  e-sorting javasc
7020: 72 69 70 74 20 69 73 20 6e 65 65 64 65 64 2e 0a  ript is needed..
7030: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 74 61  */.void style_ta
7040: 62 6c 65 5f 73 6f 72 74 65 72 28 76 6f 69 64 29  ble_sorter(void)
7050: 7b 0a 20 20 62 75 69 6c 74 69 6e 5f 72 65 71 75  {.  builtin_requ
7060: 65 73 74 5f 6a 73 28 22 73 6f 72 74 74 61 62 6c  est_js("sorttabl
7070: 65 2e 6a 73 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e.js");.}../*.**
7080: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
7090: 68 65 20 71 75 69 63 6b 66 69 6c 74 65 72 20 6a  he quickfilter j
70a0: 61 76 61 73 63 72 69 70 74 20 69 73 20 6e 65 65  avascript is nee
70b0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79  ded..*/.void sty
70c0: 6c 65 5f 71 75 69 63 6b 66 69 6c 74 65 72 28 76  le_quickfilter(v
70d0: 6f 69 64 29 7b 0a 20 20 62 75 69 6c 74 69 6e 5f  oid){.  builtin_
70e0: 72 65 71 75 65 73 74 5f 6a 73 28 22 71 75 69 63  request_js("quic
70f0: 6b 66 69 6c 74 65 72 2e 6a 73 22 29 3b 0a 7d 0a  kfilter.js");.}.
7100: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7110: 63 6f 64 65 20 74 6f 20 6c 6f 61 64 20 61 6c 6c  code to load all
7120: 20 72 65 71 75 69 72 65 64 20 6a 61 76 61 73 63   required javasc
7130: 72 69 70 74 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  ript files..*/.s
7140: 74 61 74 69 63 20 76 6f 69 64 20 73 74 79 6c 65  tatic void style
7150: 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f 66 69 6c  _load_all_js_fil
7160: 65 73 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  es(void){.  if( 
7170: 6e 65 65 64 48 72 65 66 4a 73 20 26 26 20 67 2e  needHrefJs && g.
7180: 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 29  perm.Hyperlink )
7190: 7b 0a 20 20 20 20 69 6e 74 20 6e 44 65 6c 61 79  {.    int nDelay
71a0: 20 3d 20 64 62 5f 67 65 74 5f 69 6e 74 28 22 61   = db_get_int("a
71b0: 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 2d 64 65  uto-hyperlink-de
71c0: 6c 61 79 22 2c 30 29 3b 0a 20 20 20 20 69 6e 74  lay",0);.    int
71d0: 20 62 4d 6f 75 73 65 6f 76 65 72 20 3d 20 64 62   bMouseover = db
71e0: 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 75  _get_boolean("au
71f0: 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 2d 6d 6f 75  to-hyperlink-mou
7200: 73 65 6f 76 65 72 22 2c 30 29 0a 20 20 20 20 20  seover",0).     
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
7220: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
7230: 28 22 2a 41 6e 64 72 6f 69 64 2a 22 2c 50 44 28  ("*Android*",PD(
7240: 22 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e 54  "HTTP_USER_AGENT
7250: 22 2c 22 22 29 29 3b 0a 20 20 20 20 40 20 3c 73  ",""));.    @ <s
7260: 63 72 69 70 74 20 69 64 3d 27 68 72 65 66 2d 64  cript id='href-d
7270: 61 74 61 27 20 74 79 70 65 3d 27 74 65 78 74 2f  ata' type='text/
7280: 6a 73 6f 6e 27 3e 5c 0a 20 20 20 20 40 20 7b 22  json'>\.    @ {"
7290: 64 65 6c 61 79 22 3a 25 64 28 6e 44 65 6c 61 79  delay":%d(nDelay
72a0: 29 2c 22 6d 6f 75 73 65 6f 76 65 72 22 3a 25 64  ),"mouseover":%d
72b0: 28 62 4d 6f 75 73 65 6f 76 65 72 29 7d 3c 2f 73  (bMouseover)}</s
72c0: 63 72 69 70 74 3e 0a 20 20 7d 0a 20 20 40 20 3c  cript>.  }.  @ <
72d0: 73 63 72 69 70 74 20 6e 6f 6e 63 65 3d 22 25 68  script nonce="%h
72e0: 28 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 29 22  (style_nonce())"
72f0: 3e 2f 2a 20 73 74 79 6c 65 2e 63 3a 25 64 28 5f  >/* style.c:%d(_
7300: 5f 4c 49 4e 45 5f 5f 29 20 2a 2f 0a 20 20 40 20  _LINE__) */.  @ 
7310: 66 75 6e 63 74 69 6f 6e 20 64 65 62 75 67 4d 73  function debugMs
7320: 67 28 6d 73 67 29 7b 0a 20 20 40 20 76 61 72 20  g(msg){.  @ var 
7330: 6e 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74  n = document.get
7340: 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 64 65 62  ElementById("deb
7350: 75 67 4d 73 67 22 29 3b 0a 20 20 40 20 69 66 28  ugMsg");.  @ if(
7360: 6e 29 7b 6e 2e 74 65 78 74 43 6f 6e 74 65 6e 74  n){n.textContent
7370: 3d 6d 73 67 3b 7d 0a 20 20 40 20 7d 0a 20 20 69  =msg;}.  @ }.  i
7380: 66 28 20 6e 65 65 64 48 72 65 66 4a 73 20 26 26  f( needHrefJs &&
7390: 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e   g.perm.Hyperlin
73a0: 6b 20 29 7b 0a 20 20 20 20 40 20 2f 2a 20 68 72  k ){.    @ /* hr
73b0: 65 66 2e 6a 73 20 2a 2f 0a 20 20 20 20 63 67 69  ef.js */.    cgi
73c0: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28  _append_content(
73d0: 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 22 68 72  builtin_text("hr
73e0: 65 66 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 7d  ef.js"),-1);.  }
73f0: 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65  .  if( blob_size
7400: 28 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 3e 30 20  (&blobOnLoad)>0 
7410: 29 7b 0a 20 20 20 20 40 20 77 69 6e 64 6f 77 2e  ){.    @ window.
7420: 6f 6e 6c 6f 61 64 20 3d 20 66 75 6e 63 74 69 6f  onload = functio
7430: 6e 28 29 7b 0a 20 20 20 20 63 67 69 5f 61 70 70  n(){.    cgi_app
7440: 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f 62  end_content(blob
7450: 5f 62 75 66 66 65 72 28 26 62 6c 6f 62 4f 6e 4c  _buffer(&blobOnL
7460: 6f 61 64 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  oad), blob_size(
7470: 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 29 3b 0a 20  &blobOnLoad));. 
7480: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f     cgi_append_co
7490: 6e 74 65 6e 74 28 22 5c 6e 7d 5c 6e 22 2c 20 2d  ntent("\n}\n", -
74a0: 31 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 2f 73 63  1);.  }.  @ </sc
74b0: 72 69 70 74 3e 0a 20 20 62 75 69 6c 74 69 6e 5f  ript>.  builtin_
74c0: 66 75 6c 66 69 6c 6c 5f 6a 73 5f 72 65 71 75 65  fulfill_js_reque
74d0: 73 74 73 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sts();.}../*.** 
74e0: 54 72 61 6e 73 6f 72 6d 20 69 6e 70 75 74 20 73  Transorm input s
74f0: 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 74 6f 6b  tring into a tok
7500: 65 6e 20 74 68 61 74 20 69 73 20 73 61 66 65 20  en that is safe 
7510: 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 69 6e  for inclusion in
7520: 74 6f 0a 2a 2a 20 63 6c 61 73 73 20 61 74 74 72  to.** class attr
7530: 69 62 75 74 65 2e 20 44 69 67 69 74 73 20 61 6e  ibute. Digits an
7540: 64 20 6c 6f 77 2d 63 61 73 65 20 6c 65 74 74 65  d low-case lette
7550: 72 20 61 72 65 20 70 61 73 73 65 64 20 75 6e 63  r are passed unc
7560: 68 61 6e 67 65 64 2c 0a 2a 2a 20 75 70 70 65 72  hanged,.** upper
7570: 2d 63 61 73 65 20 6c 65 74 74 65 72 73 20 61 72  -case letters ar
7580: 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  e transformed to
7590: 20 6c 6f 77 2d 63 61 73 65 2c 20 65 76 65 72 79   low-case, every
75a0: 74 68 69 6e 67 20 65 6c 73 65 20 69 73 0a 2a 2a  thing else is.**
75b0: 20 74 72 61 6e 66 6f 72 6d 65 64 20 69 6e 74 6f   tranformed into
75c0: 20 68 79 70 68 65 6e 73 3b 20 63 6f 6e 73 65 71   hyphens; conseq
75d0: 75 74 69 76 65 20 61 6e 64 20 70 65 6e 64 69 6e  utive and pendin
75e0: 67 20 68 79 70 68 65 6e 73 20 61 72 65 20 73 71  g hyphens are sq
75f0: 75 65 65 7a 65 64 2e 0a 2a 2a 20 49 66 20 72 65  ueezed..** If re
7600: 73 75 6c 74 20 64 6f 65 73 20 6e 6f 74 20 66 69  sult does not fi
7610: 74 20 69 6e 74 6f 20 73 7a 4f 75 74 20 63 68 61  t into szOut cha
7620: 72 73 20 74 68 65 6e 20 69 74 20 69 73 20 74 72  rs then it is tr
7630: 75 6e 63 61 74 65 64 2e 0a 2a 2a 20 52 65 73 75  uncated..** Resu
7640: 6c 74 20 69 73 20 61 6c 77 61 79 73 20 74 65 72  lt is always ter
7650: 6d 69 6e 61 74 65 64 20 77 69 74 68 20 6e 75 6c  minated with nul
7660: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65  l..*/.void style
7670: 5f 64 65 72 69 76 65 5f 63 6c 61 73 73 6e 61 6d  _derive_classnam
7680: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  e(const char *zI
7690: 6e 2c 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 69  n, char *zOut, i
76a0: 6e 74 20 73 7a 4f 75 74 29 7b 0a 20 20 61 73 73  nt szOut){.  ass
76b0: 65 72 74 28 20 20 7a 4f 75 74 20 29 3b 0a 20 20  ert(  zOut );.  
76c0: 61 73 73 65 72 74 28 20 73 7a 4f 75 74 3e 30 20  assert( szOut>0 
76d0: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b 0a  );.  if( zIn ){.
76e0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 20 20      int n = 0;  
76f0: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* number of cha
7700: 72 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 4f  rs written to zO
7710: 75 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  ut */.    char c
7720: 3b 0a 20 20 20 20 66 6f 72 28 2d 2d 73 7a 4f 75  ;.    for(--szOu
7730: 74 3b 20 28 63 3d 2a 7a 49 6e 29 20 26 26 20 6e  t; (c=*zIn) && n
7740: 3c 73 7a 4f 75 74 3b 20 7a 49 6e 2b 2b 29 20 7b  <szOut; zIn++) {
7750: 0a 20 20 20 20 20 20 69 66 28 20 28 27 61 27 3c  .      if( ('a'<
7760: 3d 63 20 26 26 20 63 3c 3d 27 7a 27 29 20 7c 7c  =c && c<='z') ||
7770: 20 28 27 30 27 3c 3d 63 20 26 26 20 63 3c 3d 27   ('0'<=c && c<='
7780: 39 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  9') ){.        *
7790: 7a 4f 75 74 20 3d 20 63 3b 0a 20 20 20 20 20 20  zOut = c;.      
77a0: 7d 65 6c 73 65 20 69 66 28 20 27 41 27 3c 3d 63  }else if( 'A'<=c
77b0: 20 26 26 20 63 3c 3d 27 5a 27 20 29 7b 0a 20 20   && c<='Z' ){.  
77c0: 20 20 20 20 20 20 2a 7a 4f 75 74 20 3d 20 63 20        *zOut = c 
77d0: 2d 20 27 41 27 20 2b 20 27 61 27 3b 0a 20 20 20  - 'A' + 'a';.   
77e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77f0: 20 20 69 66 28 20 6e 3d 3d 30 20 7c 7c 20 7a 4f    if( n==0 || zO
7800: 75 74 5b 2d 31 5d 3d 3d 27 2d 27 20 29 20 63 6f  ut[-1]=='-' ) co
7810: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7820: 2a 7a 4f 75 74 20 3d 20 27 2d 27 3b 0a 20 20 20  *zOut = '-';.   
7830: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f 75 74 2b     }.      zOut+
7840: 2b 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  +;.      n++;.  
7850: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 20 26 26    }.    if( n &&
7860: 20 7a 4f 75 74 5b 2d 31 5d 3d 3d 27 2d 27 20 29   zOut[-1]=='-' )
7870: 20 7a 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 2a   zOut--;.  }.  *
7880: 7a 4f 75 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  zOut = 0;.}../*.
7890: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 69 73 20 72  ** Invoke this r
78a0: 6f 75 74 69 6e 65 20 61 66 74 65 72 20 61 6c 6c  outine after all
78b0: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
78c0: 66 6f 72 20 61 20 77 65 62 70 61 67 65 20 68 61  for a webpage ha
78d0: 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
78e0: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
78f0: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
7900: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 76 65  led once for eve
7910: 72 79 20 77 65 62 70 61 67 65 2c 20 61 74 0a 2a  ry webpage, at.*
7920: 2a 20 6f 72 20 6e 65 61 72 20 74 68 65 20 65 6e  * or near the en
7930: 64 20 6f 66 20 70 61 67 65 20 67 65 6e 65 72 61  d of page genera
7940: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
7950: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 6f 6c  ine does the fol
7960: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
7970: 2a 20 20 50 6f 70 75 6c 61 74 65 73 20 74 68 65  *  Populates the
7980: 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 70   header of the p
7990: 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 73  age, including s
79a0: 65 74 74 69 6e 67 20 75 70 20 61 70 70 72 6f 70  etting up approp
79b0: 72 69 61 74 65 0a 2a 2a 20 20 20 20 20 20 73 75  riate.**      su
79c0: 62 6d 65 6e 75 20 65 6c 65 6d 65 6e 74 73 2e 20  bmenu elements. 
79d0: 20 54 68 65 20 68 65 61 64 65 72 20 67 65 6e 65   The header gene
79e0: 72 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72  ration is deferr
79f0: 65 64 20 75 6e 74 69 6c 20 74 68 69 73 20 70 6f  ed until this po
7a00: 69 6e 74 0a 2a 2a 20 20 20 20 20 20 73 6f 20 74  int.**      so t
7a10: 68 61 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hat we know that
7a20: 20 61 6c 6c 20 73 74 79 6c 65 5f 73 75 62 6d 65   all style_subme
7a30: 6e 75 5f 65 6c 65 6d 65 6e 74 28 29 20 61 6e 64  nu_element() and
7a40: 20 73 69 6d 69 6c 61 72 20 68 61 76 65 0a 2a 2a   similar have.**
7a50: 20 20 20 20 20 20 62 65 65 6e 20 72 65 63 65 69        been recei
7a60: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ved..**.**   *  
7a70: 46 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 70 61  Finalizes the pa
7a80: 67 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ge content..**.*
7a90: 2a 20 20 20 2a 20 20 41 70 70 65 6e 64 73 20 74  *   *  Appends t
7aa0: 68 65 20 66 6f 6f 74 65 72 2e 0a 2a 2f 0a 76 6f  he footer..*/.vo
7ab0: 69 64 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f  id style_finish_
7ac0: 70 61 67 65 28 29 7b 0a 20 20 63 6f 6e 73 74 20  page(){.  const 
7ad0: 63 68 61 72 20 2a 7a 46 6f 6f 74 65 72 3b 0a 20  char *zFooter;. 
7ae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 64   const char *zAd
7af0: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
7b00: 20 69 6e 74 20 6d 41 64 46 6c 61 67 73 20 3d 20   int mAdFlags = 
7b10: 30 3b 0a 0a 20 20 69 66 28 20 21 68 65 61 64 65  0;..  if( !heade
7b20: 72 48 61 73 42 65 65 6e 47 65 6e 65 72 61 74 65  rHasBeenGenerate
7b30: 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  d ) return;..  /
7b40: 2a 20 47 6f 20 62 61 63 6b 20 61 6e 64 20 70 75  * Go back and pu
7b50: 74 20 74 68 65 20 73 75 62 6d 65 6e 75 20 61 74  t the submenu at
7b60: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
7b70: 70 61 67 65 2e 20 20 57 65 20 64 65 6c 61 79 20  page.  We delay 
7b80: 74 68 65 0a 20 20 2a 2a 20 63 72 65 61 74 69 6f  the.  ** creatio
7b90: 6e 20 6f 66 20 74 68 65 20 73 75 62 6d 65 6e 75  n of the submenu
7ba0: 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 20 73   until the end s
7bb0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 61 64  o that we can ad
7bc0: 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  d elements.  ** 
7bd0: 74 6f 20 74 68 65 20 73 75 62 6d 65 6e 75 20 77  to the submenu w
7be0: 68 69 6c 65 20 67 65 6e 65 72 61 74 69 6e 67 20  hile generating 
7bf0: 70 61 67 65 20 74 65 78 74 2e 0a 20 20 2a 2f 0a  page text..  */.
7c00: 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69 6f    cgi_destinatio
7c10: 6e 28 43 47 49 5f 48 45 41 44 45 52 29 3b 0a 20  n(CGI_HEADER);. 
7c20: 20 69 66 28 20 73 75 62 6d 65 6e 75 45 6e 61 62   if( submenuEnab
7c30: 6c 65 20 26 26 20 6e 53 75 62 6d 65 6e 75 2b 6e  le && nSubmenu+n
7c40: 53 75 62 6d 65 6e 75 43 74 72 6c 3e 30 20 29 7b  SubmenuCtrl>0 ){
7c50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7c60: 63 68 61 72 20 7a 43 6c 61 73 73 5b 33 32 5d 3b  char zClass[32];
7c70: 20 2f 2a 20 72 65 64 75 63 65 64 20 66 6f 72 6d   /* reduced form
7c80: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 61 74 74   of the main att
7c90: 72 69 62 75 74 65 20 2a 2f 0a 20 20 20 20 69 66  ribute */.    if
7ca0: 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 20 29  ( nSubmenuCtrl )
7cb0: 7b 0a 20 20 20 20 20 20 40 20 3c 66 6f 72 6d 20  {.      @ <form 
7cc0: 69 64 3d 27 66 30 31 27 20 6d 65 74 68 6f 64 3d  id='f01' method=
7cd0: 27 47 45 54 27 20 61 63 74 69 6f 6e 3d 27 25 52  'GET' action='%R
7ce0: 2f 25 73 28 67 2e 7a 50 61 74 68 29 27 3e 0a 20  /%s(g.zPath)'>. 
7cf0: 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79       @ <input ty
7d00: 70 65 3d 27 68 69 64 64 65 6e 27 20 6e 61 6d 65  pe='hidden' name
7d10: 3d 27 75 64 63 27 20 76 61 6c 75 65 3d 27 31 27  ='udc' value='1'
7d20: 3e 0a 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f  >.      cgi_tag_
7d30: 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28  query_parameter(
7d40: 22 75 64 63 22 29 3b 0a 20 20 20 20 7d 0a 20 20  "udc");.    }.  
7d50: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
7d60: 73 75 62 6d 65 6e 75 22 3e 0a 20 20 20 20 69 66  submenu">.    if
7d70: 28 20 6e 53 75 62 6d 65 6e 75 3e 30 20 29 7b 0a  ( nSubmenu>0 ){.
7d80: 20 20 20 20 20 20 71 73 6f 72 74 28 61 53 75 62        qsort(aSub
7d90: 6d 65 6e 75 2c 20 6e 53 75 62 6d 65 6e 75 2c 20  menu, nSubmenu, 
7da0: 73 69 7a 65 6f 66 28 61 53 75 62 6d 65 6e 75 5b  sizeof(aSubmenu[
7db0: 30 5d 29 2c 20 73 75 62 6d 65 6e 75 43 6f 6d 70  0]), submenuComp
7dc0: 61 72 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  are);.      for(
7dd0: 69 3d 30 3b 20 69 3c 6e 53 75 62 6d 65 6e 75 3b  i=0; i<nSubmenu;
7de0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
7df0: 74 72 75 63 74 20 53 75 62 6d 65 6e 75 20 2a 70  truct Submenu *p
7e00: 20 3d 20 26 61 53 75 62 6d 65 6e 75 5b 69 5d 3b   = &aSubmenu[i];
7e10: 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f 64  .        style_d
7e20: 65 72 69 76 65 5f 63 6c 61 73 73 6e 61 6d 65 28  erive_classname(
7e30: 70 2d 3e 7a 4c 61 62 65 6c 2c 20 7a 43 6c 61 73  p->zLabel, zClas
7e40: 73 2c 20 73 69 7a 65 6f 66 20 7a 43 6c 61 73 73  s, sizeof zClass
7e50: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 77  );.        /* sw
7e60: 69 74 63 68 69 6e 67 20 61 77 61 79 20 66 72 6f  itching away fro
7e70: 6d 20 74 68 65 20 25 68 20 66 6f 72 6d 61 74 74  m the %h formatt
7e80: 69 6e 67 20 62 65 6c 6f 77 20 6d 69 67 68 74 20  ing below might 
7e90: 62 65 20 64 61 6e 67 65 72 6f 75 73 0a 20 20 20  be dangerous.   
7ea0: 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
7eb0: 73 6f 6d 65 20 70 6c 61 63 65 73 20 75 73 65 20  some places use 
7ec0: 25 73 20 74 6f 20 63 6f 6d 70 6f 73 65 20 7a 4c  %s to compose zL
7ed0: 61 62 65 6c 20 61 6e 64 20 7a 4c 69 6e 6b 3b 0a  abel and zLink;.
7ee0: 20 20 20 20 20 20 20 20 2a 2a 20 65 2e 67 2e 20          ** e.g. 
7ef0: 2f 72 70 74 76 69 65 77 20 70 61 67 65 20 61 6e  /rptview page an
7f00: 64 20 74 68 65 20 73 75 62 6d 65 6e 75 43 6d 64  d the submenuCmd
7f10: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  () function..   
7f20: 20 20 20 20 20 2a 2a 20 22 73 6d 6c 22 20 73 74       ** "sml" st
7f30: 61 6e 64 73 20 66 6f 72 20 73 75 62 6d 65 6e 75  ands for submenu
7f40: 20 6c 69 6e 6b 2e 0a 20 20 20 20 20 20 20 20 2a   link..        *
7f50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
7f60: 3e 7a 4c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  >zLink==0 ){.   
7f70: 20 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20 63         @ <span c
7f80: 6c 61 73 73 3d 22 6c 61 62 65 6c 20 73 6d 6c 2d  lass="label sml-
7f90: 25 73 28 7a 43 6c 61 73 73 29 22 3e 25 68 28 70  %s(zClass)">%h(p
7fa0: 2d 3e 7a 4c 61 62 65 6c 29 3c 2f 73 70 61 6e 3e  ->zLabel)</span>
7fb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7fc0: 20 20 20 20 20 20 20 20 20 20 40 20 3c 61 20 63            @ <a c
7fd0: 6c 61 73 73 3d 22 6c 61 62 65 6c 20 73 6d 6c 2d  lass="label sml-
7fe0: 25 73 28 7a 43 6c 61 73 73 29 22 20 68 72 65 66  %s(zClass)" href
7ff0: 3d 22 25 68 28 70 2d 3e 7a 4c 69 6e 6b 29 22 3e  ="%h(p->zLink)">
8000: 25 68 28 70 2d 3e 7a 4c 61 62 65 6c 29 3c 2f 61  %h(p->zLabel)</a
8010: 3e 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  >.        }.    
8020: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
8030: 73 73 69 6c 5f 73 74 72 63 70 79 28 7a 43 6c 61  ssil_strcpy(zCla
8040: 73 73 2c 22 73 6d 63 2d 22 29 3b 20 20 20 2f 2a  ss,"smc-");   /*
8050: 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 66   common prefix f
8060: 6f 72 20 73 75 62 6d 65 6e 75 20 63 6f 6e 74 72  or submenu contr
8070: 6f 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ols */.    for(i
8080: 3d 30 3b 20 69 3c 6e 53 75 62 6d 65 6e 75 43 74  =0; i<nSubmenuCt
8090: 72 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rl; i++){.      
80a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 4e  const char *zQPN
80b0: 20 3d 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b   = aSubmenuCtrl[
80c0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
80d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 73  const char *zDis
80e0: 61 62 6c 65 64 20 3d 20 22 22 3b 0a 20 20 20 20  abled = "";.    
80f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58    const char *zX
8100: 74 72 61 43 6c 61 73 73 20 3d 20 22 22 3b 0a 20  traClass = "";. 
8110: 20 20 20 20 20 69 66 28 20 61 53 75 62 6d 65 6e       if( aSubmen
8120: 75 43 74 72 6c 5b 69 5d 2e 65 56 69 73 69 62 6c  uCtrl[i].eVisibl
8130: 65 20 26 20 53 54 59 4c 45 5f 44 49 53 41 42 4c  e & STYLE_DISABL
8140: 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  ED ){.        zD
8150: 69 73 61 62 6c 65 64 20 3d 20 22 20 64 69 73 61  isabled = " disa
8160: 62 6c 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  bled";.      }el
8170: 73 65 20 69 66 28 20 7a 51 50 4e 20 29 7b 0a 20  se if( zQPN ){. 
8180: 20 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f 71         cgi_tag_q
8190: 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 7a  uery_parameter(z
81a0: 51 50 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  QPN);.      }.  
81b0: 20 20 20 20 73 74 79 6c 65 5f 64 65 72 69 76 65      style_derive
81c0: 5f 63 6c 61 73 73 6e 61 6d 65 28 7a 51 50 4e 2c  _classname(zQPN,
81d0: 20 7a 43 6c 61 73 73 2b 34 2c 20 73 69 7a 65 6f   zClass+4, sizeo
81e0: 66 28 7a 43 6c 61 73 73 29 2d 34 29 3b 0a 20 20  f(zClass)-4);.  
81f0: 20 20 20 20 73 77 69 74 63 68 28 20 61 53 75 62      switch( aSub
8200: 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 65 54 79 70  menuCtrl[i].eTyp
8210: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
8220: 65 20 46 46 5f 45 4e 54 52 59 3a 0a 20 20 20 20  e FF_ENTRY:.    
8230: 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20 63 6c        @ <span cl
8240: 61 73 73 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c  ass='submenuctrl
8250: 25 73 28 7a 58 74 72 61 43 6c 61 73 73 29 20 25  %s(zXtraClass) %
8260: 73 28 7a 43 6c 61 73 73 29 27 3e 5c 0a 20 20 20  s(zClass)'>\.   
8270: 20 20 20 20 20 20 20 40 20 26 6e 62 73 70 3b 25         @ &nbsp;%
8280: 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69  h(aSubmenuCtrl[i
8290: 5d 2e 7a 4c 61 62 65 6c 29 5c 0a 20 20 20 20 20  ].zLabel)\.     
82a0: 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79       @ <input ty
82b0: 70 65 3d 27 74 65 78 74 27 20 6e 61 6d 65 3d 27  pe='text' name='
82c0: 25 73 28 7a 51 50 4e 29 27 20 76 61 6c 75 65 3d  %s(zQPN)' value=
82d0: 27 25 68 28 50 44 28 7a 51 50 4e 2c 20 22 22 29  '%h(PD(zQPN, "")
82e0: 29 27 20 5c 0a 20 20 20 20 20 20 20 20 20 20 69  )' \.          i
82f0: 66 28 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  f( aSubmenuCtrl[
8300: 69 5d 2e 69 53 69 7a 65 3c 30 20 29 7b 0a 20 20  i].iSize<0 ){.  
8310: 20 20 20 20 20 20 20 20 20 20 40 20 73 69 7a 65            @ size
8320: 3d 27 25 64 28 2d 61 53 75 62 6d 65 6e 75 43 74  ='%d(-aSubmenuCt
8330: 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27 20 5c 0a  rl[i].iSize)' \.
8340: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
8350: 69 66 28 20 61 53 75 62 6d 65 6e 75 43 74 72 6c  if( aSubmenuCtrl
8360: 5b 69 5d 2e 69 53 69 7a 65 3e 30 20 29 7b 0a 20  [i].iSize>0 ){. 
8370: 20 20 20 20 20 20 20 20 20 20 20 40 20 73 69 7a             @ siz
8380: 65 3d 27 25 64 28 61 53 75 62 6d 65 6e 75 43 74  e='%d(aSubmenuCt
8390: 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27 20 5c 0a  rl[i].iSize)' \.
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 40 20 6d 61              @ ma
83b0: 78 6c 65 6e 67 74 68 3d 27 25 64 28 61 53 75 62  xlength='%d(aSub
83c0: 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 69 53 69 7a  menuCtrl[i].iSiz
83d0: 65 29 27 20 5c 0a 20 20 20 20 20 20 20 20 20 20  e)' \.          
83e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 69 64  }.          @ id
83f0: 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 2d 25 64  ='submenuctrl-%d
8400: 28 69 29 27 25 73 28 7a 44 69 73 61 62 6c 65 64  (i)'%s(zDisabled
8410: 29 3e 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20 20  )></span>.      
8420: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8430: 20 20 20 63 61 73 65 20 46 46 5f 4d 55 4c 54 49     case FF_MULTI
8440: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
8450: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 63  t j;.          c
8460: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20  onst char *zVal 
8470: 3d 20 50 28 7a 51 50 4e 29 3b 0a 20 20 20 20 20  = P(zQPN);.     
8480: 20 20 20 20 20 69 66 28 20 7a 58 74 72 61 43 6c       if( zXtraCl
8490: 61 73 73 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ass[0] ){.      
84a0: 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20 63 6c        @ <span cl
84b0: 61 73 73 3d 27 25 73 28 7a 58 74 72 61 43 6c 61  ass='%s(zXtraCla
84c0: 73 73 2b 31 29 20 25 73 28 7a 43 6c 61 73 73 29  ss+1) %s(zClass)
84d0: 27 3e 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  '>.          }. 
84e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 75           if( aSu
84f0: 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c 61  bmenuCtrl[i].zLa
8500: 62 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bel ){.         
8510: 20 20 20 40 20 26 6e 62 73 70 3b 25 68 28 61 53     @ &nbsp;%h(aS
8520: 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c  ubmenuCtrl[i].zL
8530: 61 62 65 6c 29 5c 0a 20 20 20 20 20 20 20 20 20  abel)\.         
8540: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c   }.          @ <
8550: 73 65 6c 65 63 74 20 63 6c 61 73 73 3d 27 73 75  select class='su
8560: 62 6d 65 6e 75 63 74 72 6c 20 25 73 28 7a 43 6c  bmenuctrl %s(zCl
8570: 61 73 73 29 27 20 73 69 7a 65 3d 27 31 27 20 6e  ass)' size='1' n
8580: 61 6d 65 3d 27 25 73 28 7a 51 50 4e 29 27 20 5c  ame='%s(zQPN)' \
8590: 0a 20 20 20 20 20 20 20 20 20 20 40 20 69 64 3d  .          @ id=
85a0: 27 73 75 62 6d 65 6e 75 63 74 72 6c 2d 25 64 28  'submenuctrl-%d(
85b0: 69 29 27 25 73 28 7a 44 69 73 61 62 6c 65 64 29  i)'%s(zDisabled)
85c0: 3e 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  >.          for(
85d0: 6a 3d 30 3b 20 6a 3c 61 53 75 62 6d 65 6e 75 43  j=0; j<aSubmenuC
85e0: 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 2a 32 3b 20  trl[i].iSize*2; 
85f0: 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  j+=2){.         
8600: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8610: 51 50 56 20 3d 20 61 53 75 62 6d 65 6e 75 43 74  QPV = aSubmenuCt
8620: 72 6c 5b 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a  rl[i].azChoice[j
8630: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40  ];.            @
8640: 20 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27   <option value='
8650: 25 68 28 7a 51 50 56 29 27 5c 0a 20 20 20 20 20  %h(zQPV)'\.     
8660: 20 20 20 20 20 20 20 69 66 28 20 66 6f 73 73 69         if( fossi
8670: 6c 5f 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a  l_strcmp(zVal, z
8680: 51 50 56 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  QPV)==0 ){.     
8690: 20 20 20 20 20 20 20 20 20 40 20 20 73 65 6c 65           @  sele
86a0: 63 74 65 64 5c 0a 20 20 20 20 20 20 20 20 20 20  cted\.          
86b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
86c0: 40 20 3e 25 68 28 61 53 75 62 6d 65 6e 75 43 74  @ >%h(aSubmenuCt
86d0: 72 6c 5b 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a  rl[i].azChoice[j
86e0: 2b 31 5d 29 3c 2f 6f 70 74 69 6f 6e 3e 0a 20 20  +1])</option>.  
86f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8700: 20 20 20 20 40 20 3c 2f 73 65 6c 65 63 74 3e 0a      @ </select>.
8710: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 58            if( zX
8720: 74 72 61 43 6c 61 73 73 5b 30 5d 20 29 7b 0a 20  traClass[0] ){. 
8730: 20 20 20 20 20 20 20 20 20 20 20 40 20 3c 2f 73             @ </s
8740: 70 61 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 7d  pan>.          }
8750: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
8760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8770: 20 20 20 20 63 61 73 65 20 46 46 5f 42 49 4e 41      case FF_BINA
8780: 52 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  RY: {.          
8790: 69 6e 74 20 69 73 54 72 75 65 20 3d 20 50 42 28  int isTrue = PB(
87a0: 7a 51 50 4e 29 3b 0a 20 20 20 20 20 20 20 20 20  zQPN);.         
87b0: 20 40 20 3c 73 65 6c 65 63 74 20 63 6c 61 73 73   @ <select class
87c0: 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 25 73 28  ='submenuctrl%s(
87d0: 7a 58 74 72 61 43 6c 61 73 73 29 27 20 73 69 7a  zXtraClass)' siz
87e0: 65 3d 27 31 27 20 5c 0a 20 20 20 20 20 20 20 20  e='1' \.        
87f0: 20 20 40 20 6e 61 6d 65 3d 27 25 73 28 7a 51 50    @ name='%s(zQP
8800: 4e 29 27 20 69 64 3d 27 73 75 62 6d 65 6e 75 63  N)' id='submenuc
8810: 74 72 6c 2d 25 64 28 69 29 27 25 73 28 7a 44 69  trl-%d(i)'%s(zDi
8820: 73 61 62 6c 65 64 29 3e 0a 20 20 20 20 20 20 20  sabled)>.       
8830: 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c     @ <option val
8840: 75 65 3d 27 31 27 5c 0a 20 20 20 20 20 20 20 20  ue='1'\.        
8850: 20 20 69 66 28 20 69 73 54 72 75 65 20 29 7b 0a    if( isTrue ){.
8860: 20 20 20 20 20 20 20 20 20 20 20 20 40 20 20 73              @  s
8870: 65 6c 65 63 74 65 64 5c 0a 20 20 20 20 20 20 20  elected\.       
8880: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40     }.          @
8890: 20 3e 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72   >%h(aSubmenuCtr
88a0: 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 29 3c 2f 6f 70  l[i].zLabel)</op
88b0: 74 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20  tion>.          
88c0: 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d  @ <option value=
88d0: 27 30 27 5c 0a 20 20 20 20 20 20 20 20 20 20 69  '0'\.          i
88e0: 66 28 20 21 69 73 54 72 75 65 20 29 7b 0a 20 20  f( !isTrue ){.  
88f0: 20 20 20 20 20 20 20 20 20 20 40 20 20 73 65 6c            @  sel
8900: 65 63 74 65 64 5c 0a 20 20 20 20 20 20 20 20 20  ected\.         
8910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 3e   }.          @ >
8920: 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  %h(aSubmenuCtrl[
8930: 69 5d 2e 7a 46 61 6c 73 65 29 3c 2f 6f 70 74 69  i].zFalse)</opti
8940: 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 40 20  on>.          @ 
8950: 3c 2f 73 65 6c 65 63 74 3e 0a 20 20 20 20 20 20  </select>.      
8960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8970: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
8980: 65 20 46 46 5f 43 48 45 43 4b 42 4f 58 3a 20 7b  e FF_CHECKBOX: {
8990: 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 6c 61  .          @ <la
89a0: 62 65 6c 20 63 6c 61 73 73 3d 27 73 75 62 6d 65  bel class='subme
89b0: 6e 75 63 74 72 6c 20 73 75 62 6d 65 6e 75 63 6b  nuctrl submenuck
89c0: 62 6f 78 25 73 28 7a 58 74 72 61 43 6c 61 73 73  box%s(zXtraClass
89d0: 29 20 25 73 28 7a 43 6c 61 73 73 29 27 3e 5c 0a  ) %s(zClass)'>\.
89e0: 20 20 20 20 20 20 20 20 20 20 40 20 3c 69 6e 70            @ <inp
89f0: 75 74 20 74 79 70 65 3d 27 63 68 65 63 6b 62 6f  ut type='checkbo
8a00: 78 27 20 6e 61 6d 65 3d 27 25 73 28 7a 51 50 4e  x' name='%s(zQPN
8a10: 29 27 20 69 64 3d 27 73 75 62 6d 65 6e 75 63 74  )' id='submenuct
8a20: 72 6c 2d 25 64 28 69 29 27 20 5c 0a 20 20 20 20  rl-%d(i)' \.    
8a30: 20 20 20 20 20 20 69 66 28 20 50 42 28 7a 51 50        if( PB(zQP
8a40: 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
8a50: 20 20 40 20 63 68 65 63 6b 65 64 20 5c 0a 20 20    @ checked \.  
8a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a70: 20 20 20 20 69 66 28 20 61 53 75 62 6d 65 6e 75      if( aSubmenu
8a80: 43 74 72 6c 5b 69 5d 2e 7a 4a 53 20 29 7b 0a 20  Ctrl[i].zJS ){. 
8a90: 20 20 20 20 20 20 20 20 20 20 20 40 20 64 61 74             @ dat
8aa0: 61 2d 63 74 72 6c 3d 27 25 73 28 61 53 75 62 6d  a-ctrl='%s(aSubm
8ab0: 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4a 53 29 27  enuCtrl[i].zJS)'
8ac0: 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 5c 0a  %s(zDisabled)>\.
8ad0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 25  .            @ %
8af0: 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 5c 0a 20  s(zDisabled)>\. 
8b00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8b10: 20 20 20 20 20 40 20 25 68 28 61 53 75 62 6d 65       @ %h(aSubme
8b20: 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c 61 62 65 6c  nuCtrl[i].zLabel
8b30: 29 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20  )</label>.      
8b40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8b50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8b60: 20 7d 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 0a   }.    @ </div>.
8b70: 20 20 20 20 69 66 28 20 6e 53 75 62 6d 65 6e 75      if( nSubmenu
8b80: 43 74 72 6c 20 29 7b 0a 20 20 20 20 20 20 63 67  Ctrl ){.      cg
8b90: 69 5f 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65  i_query_paramete
8ba0: 72 73 5f 74 6f 5f 68 69 64 64 65 6e 28 29 3b 0a  rs_to_hidden();.
8bb0: 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f 71 75        cgi_tag_qu
8bc0: 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 30 29  ery_parameter(0)
8bd0: 3b 0a 20 20 20 20 20 20 40 20 3c 2f 66 6f 72 6d  ;.      @ </form
8be0: 3e 0a 20 20 20 20 20 20 62 75 69 6c 74 69 6e 5f  >.      builtin_
8bf0: 72 65 71 75 65 73 74 5f 6a 73 28 22 6d 65 6e 75  request_js("menu
8c00: 2e 6a 73 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .js");.    }.  }
8c10: 0a 0a 20 20 7a 41 64 20 3d 20 73 74 79 6c 65 5f  ..  zAd = style_
8c20: 61 64 75 6e 69 74 5f 74 65 78 74 28 26 6d 41 64  adunit_text(&mAd
8c30: 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 28 6d  Flags);.  if( (m
8c40: 41 64 46 6c 61 67 73 20 26 20 41 44 55 4e 49 54  AdFlags & ADUNIT
8c50: 5f 52 49 47 48 54 5f 4f 4b 29 21 3d 30 20 20 29  _RIGHT_OK)!=0  )
8c60: 7b 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61  {.    @ <div cla
8c70: 73 73 3d 22 63 6f 6e 74 65 6e 74 20 61 64 75 6e  ss="content adun
8c80: 69 74 5f 72 69 67 68 74 5f 63 6f 6e 74 61 69 6e  it_right_contain
8c90: 65 72 22 3e 0a 20 20 20 20 40 20 3c 64 69 76 20  er">.    @ <div 
8ca0: 63 6c 61 73 73 3d 22 61 64 75 6e 69 74 5f 72 69  class="adunit_ri
8cb0: 67 68 74 22 3e 0a 20 20 20 20 63 67 69 5f 61 70  ght">.    cgi_ap
8cc0: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a 41 64  pend_content(zAd
8cd0: 2c 20 2d 31 29 3b 0a 20 20 20 20 40 20 3c 2f 64  , -1);.    @ </d
8ce0: 69 76 3e 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  iv>.  }else if( 
8cf0: 7a 41 64 20 29 7b 0a 20 20 20 20 40 20 3c 64 69  zAd ){.    @ <di
8d00: 76 20 63 6c 61 73 73 3d 22 61 64 75 6e 69 74 5f  v class="adunit_
8d10: 62 61 6e 6e 65 72 22 3e 0a 20 20 20 20 63 67 69  banner">.    cgi
8d20: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28  _append_content(
8d30: 7a 41 64 2c 20 2d 31 29 3b 0a 20 20 20 20 40 20  zAd, -1);.    @ 
8d40: 3c 2f 64 69 76 3e 0a 20 20 7d 0a 0a 20 20 40 20  </div>.  }..  @ 
8d50: 3c 64 69 76 20 63 6c 61 73 73 3d 22 63 6f 6e 74  <div class="cont
8d60: 65 6e 74 22 3e 3c 73 70 61 6e 20 69 64 3d 22 64  ent"><span id="d
8d70: 65 62 75 67 4d 73 67 22 3e 3c 2f 73 70 61 6e 3e  ebugMsg"></span>
8d80: 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69  .  cgi_destinati
8d90: 6f 6e 28 43 47 49 5f 42 4f 44 59 29 3b 0a 0a 20  on(CGI_BODY);.. 
8da0: 20 69 66 28 20 73 69 64 65 62 6f 78 55 73 65 64   if( sideboxUsed
8db0: 20 29 7b 0a 20 20 20 20 40 20 3c 64 69 76 20 63   ){.    @ <div c
8dc0: 6c 61 73 73 3d 22 65 6e 64 43 6f 6e 74 65 6e 74  lass="endContent
8dd0: 22 3e 3c 2f 64 69 76 3e 0a 20 20 7d 0a 20 20 40  "></div>.  }.  @
8de0: 20 3c 2f 64 69 76 3e 0a 0a 20 20 2f 2a 20 50 75   </div>..  /* Pu
8df0: 74 20 74 68 65 20 66 6f 6f 74 65 72 20 61 74 20  t the footer at 
8e00: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
8e10: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 7a 46 6f  e page. */.  zFo
8e20: 6f 74 65 72 20 3d 20 73 6b 69 6e 5f 67 65 74 28  oter = skin_get(
8e30: 22 66 6f 6f 74 65 72 22 29 3b 0a 20 20 69 66 28  "footer");.  if(
8e40: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
8e50: 28 22 25 3c 2f 62 6f 64 79 3e 25 22 2c 20 7a 46  ("%</body>%", zF
8e60: 6f 6f 74 65 72 2c 20 30 29 3d 3d 30 20 29 7b 0a  ooter, 0)==0 ){.
8e70: 20 20 20 20 73 74 79 6c 65 5f 6c 6f 61 64 5f 61      style_load_a
8e80: 6c 6c 5f 6a 73 5f 66 69 6c 65 73 28 29 3b 0a 20  ll_js_files();. 
8e90: 20 7d 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61   }.  if( g.thTra
8ea0: 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22 42  ce ) Th_Trace("B
8eb0: 45 47 49 4e 5f 46 4f 4f 54 45 52 3c 62 72 3e 5c  EGIN_FOOTER<br>\
8ec0: 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68 5f 52 65  n", -1);.  Th_Re
8ed0: 6e 64 65 72 28 7a 46 6f 6f 74 65 72 29 3b 0a 20  nder(zFooter);. 
8ee0: 20 69 66 28 20 67 2e 74 68 54 72 61 63 65 20 29   if( g.thTrace )
8ef0: 20 54 68 5f 54 72 61 63 65 28 22 45 4e 44 5f 46   Th_Trace("END_F
8f00: 4f 4f 54 45 52 3c 62 72 3e 5c 6e 22 2c 20 2d 31  OOTER<br>\n", -1
8f10: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6e 64 65 72 20  );..  /* Render 
8f20: 74 72 61 63 65 20 6c 6f 67 20 69 66 20 54 48 31  trace log if TH1
8f30: 20 74 72 61 63 69 6e 67 20 69 73 20 65 6e 61 62   tracing is enab
8f40: 6c 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 67 2e  led. */.  if( g.
8f50: 74 68 54 72 61 63 65 20 29 7b 0a 20 20 20 20 63  thTrace ){.    c
8f60: 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e  gi_append_conten
8f70: 74 28 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d 5c  t("<span class=\
8f80: 22 74 68 54 72 61 63 65 5c 22 3e 3c 68 72 3e 5c  "thTrace\"><hr>\
8f90: 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 63 67 69  n", -1);.    cgi
8fa0: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28  _append_content(
8fb0: 62 6c 6f 62 5f 73 74 72 28 26 67 2e 74 68 4c 6f  blob_str(&g.thLo
8fc0: 67 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 67  g), blob_size(&g
8fd0: 2e 74 68 4c 6f 67 29 29 3b 0a 20 20 20 20 63 67  .thLog));.    cg
8fe0: 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74  i_append_content
8ff0: 28 22 3c 2f 73 70 61 6e 3e 5c 6e 22 2c 20 2d 31  ("</span>\n", -1
9000: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
9010: 20 64 6f 63 75 6d 65 6e 74 20 65 6e 64 20 6d 61   document end ma
9020: 72 6b 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  rk if it was not
9030: 20 69 6e 20 74 68 65 20 66 6f 6f 74 65 72 20 2a   in the footer *
9040: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
9050: 73 74 72 6c 69 6b 65 28 22 25 3c 2f 62 6f 64 79  strlike("%</body
9060: 3e 25 22 2c 20 7a 46 6f 6f 74 65 72 2c 20 30 29  >%", zFooter, 0)
9070: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65  !=0 ){.    style
9080: 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f 66 69 6c  _load_all_js_fil
9090: 65 73 28 29 3b 0a 20 20 20 20 40 20 3c 2f 62 6f  es();.    @ </bo
90a0: 64 79 3e 0a 20 20 20 20 40 20 3c 2f 68 74 6d 6c  dy>.    @ </html
90b0: 3e 0a 20 20 7d 0a 20 20 2f 2a 20 55 70 64 61 74  >.  }.  /* Updat
90c0: 65 20 74 68 65 20 75 73 65 72 20 64 69 73 70 6c  e the user displ
90d0: 61 79 20 70 72 65 66 73 20 63 6f 6f 6b 69 65 20  ay prefs cookie 
90e0: 69 66 20 69 74 20 77 61 73 20 6d 6f 64 69 66 69  if it was modifi
90f0: 65 64 20 2a 2f 0a 20 20 63 6f 6f 6b 69 65 5f 72  ed */.  cookie_r
9100: 65 6e 64 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ender();.}../*.*
9110: 2a 20 42 65 67 69 6e 20 61 20 73 69 64 65 2d 62  * Begin a side-b
9120: 6f 78 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  ox on the right-
9130: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 70  hand side of a p
9140: 61 67 65 2e 20 20 54 68 65 20 74 69 74 6c 65 20  age.  The title 
9150: 61 6e 64 0a 2a 2a 20 74 68 65 20 77 69 64 74 68  and.** the width
9160: 20 6f 66 20 74 68 65 20 62 6f 78 20 61 72 65 20   of the box are 
9170: 67 69 76 65 6e 20 61 73 20 61 72 67 75 6d 65 6e  given as argumen
9180: 74 73 2e 20 20 54 68 65 20 77 69 64 74 68 20 69  ts.  The width i
9190: 73 20 75 73 75 61 6c 6c 79 0a 2a 2a 20 61 20 70  s usually.** a p
91a0: 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74 6f 74  ercentage of tot
91b0: 61 6c 20 73 63 72 65 65 6e 20 77 69 64 74 68 2e  al screen width.
91c0: 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73  .*/.void style_s
91d0: 69 64 65 62 6f 78 5f 62 65 67 69 6e 28 63 6f 6e  idebox_begin(con
91e0: 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 2c  st char *zTitle,
91f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 69   const char *zWi
9200: 64 74 68 29 7b 0a 20 20 73 69 64 65 62 6f 78 55  dth){.  sideboxU
9210: 73 65 64 20 3d 20 31 3b 0a 20 20 40 20 3c 64 69  sed = 1;.  @ <di
9220: 76 20 63 6c 61 73 73 3d 22 73 69 64 65 62 6f 78  v class="sidebox
9230: 22 20 73 74 79 6c 65 3d 22 77 69 64 74 68 3a 25  " style="width:%
9240: 73 28 7a 57 69 64 74 68 29 22 3e 0a 20 20 40 20  s(zWidth)">.  @ 
9250: 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 69 64 65  <div class="side
9260: 62 6f 78 54 69 74 6c 65 22 3e 25 68 28 7a 54 69  boxTitle">%h(zTi
9270: 74 6c 65 29 3c 2f 64 69 76 3e 0a 7d 0a 0a 2f 2a  tle)</div>.}../*
9280: 20 45 6e 64 20 74 68 65 20 73 69 64 65 2d 62 6f   End the side-bo
9290: 78 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f  x.*/.void style_
92a0: 73 69 64 65 62 6f 78 5f 65 6e 64 28 76 6f 69 64  sidebox_end(void
92b0: 29 7b 0a 20 20 40 20 3c 2f 64 69 76 3e 0a 7d 0a  ){.  @ </div>.}.
92c0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 73 74  ./*.** Search st
92d0: 72 69 6e 67 20 7a 43 73 73 20 66 6f 72 20 7a 53  ring zCss for zS
92e0: 65 6c 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 52  elector..**.** R
92f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 6f  eturn true if fo
9300: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  und.  Return fal
9310: 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 0a  se if not found.
9320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
9330: 6e 74 61 69 6e 73 53 65 6c 65 63 74 6f 72 28 63  ntainsSelector(c
9340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 73 73 2c  onst char *zCss,
9350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
9360: 6c 65 63 74 6f 72 29 7b 0a 20 20 63 6f 6e 73 74  lector){.  const
9370: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
9380: 6e 3b 0a 20 20 69 6e 74 20 73 65 6c 65 63 74 6f  n;.  int selecto
9390: 72 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  rLen = (int)strl
93a0: 65 6e 28 7a 53 65 6c 65 63 74 6f 72 29 3b 0a 0a  en(zSelector);..
93b0: 20 20 66 6f 72 28 7a 3d 7a 43 73 73 3b 20 2a 7a    for(z=zCss; *z
93c0: 3b 20 7a 2b 3d 73 65 6c 65 63 74 6f 72 4c 65 6e  ; z+=selectorLen
93d0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 74 72 73 74  ){.    z = strst
93e0: 72 28 7a 2c 20 7a 53 65 6c 65 63 74 6f 72 29 3b  r(z, zSelector);
93f0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
9400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
9410: 28 20 7a 21 3d 7a 43 73 73 20 29 7b 0a 20 20 20  ( z!=zCss ){.   
9420: 20 20 20 66 6f 72 28 20 6e 3d 2d 31 3b 20 7a 2b     for( n=-1; z+
9430: 6e 21 3d 7a 43 73 73 20 26 26 20 66 6f 73 73 69  n!=zCss && fossi
9440: 6c 5f 69 73 73 70 61 63 65 28 7a 5b 6e 5d 29 3b  l_isspace(z[n]);
9450: 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20 69 66 28   n--);.      if(
9460: 20 7a 2b 6e 21 3d 7a 43 73 73 20 26 26 20 7a 5b   z+n!=zCss && z[
9470: 6e 5d 21 3d 27 2c 27 20 26 26 20 7a 5b 6e 5d 21  n]!=',' && z[n]!
9480: 3d 20 27 7d 27 20 26 26 20 7a 5b 6e 5d 21 3d 27  = '}' && z[n]!='
9490: 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  /' ) continue;. 
94a0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 20 6e 3d     }.    for( n=
94b0: 73 65 6c 65 63 74 6f 72 4c 65 6e 3b 20 7a 5b 6e  selectorLen; z[n
94c0: 5d 20 26 26 20 66 6f 73 73 69 6c 5f 69 73 73 70  ] && fossil_issp
94d0: 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2b 2b 20 29  ace(z[n]); n++ )
94e0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d  ;.    if( z[n]==
94f0: 27 2c 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 7b 27  ',' || z[n]=='{'
9500: 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29 20   || z[n]=='/' ) 
9510: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
9520: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9530: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74  ** COMMAND: test
9540: 2d 63 6f 6e 74 61 69 6e 73 2d 73 65 6c 65 63 74  -contains-select
9550: 6f 72 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  or.**.** Usage: 
9560: 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 63 6f 6e  %fossil test-con
9570: 74 61 69 6e 73 2d 73 65 6c 65 63 74 6f 72 20 46  tains-selector F
9580: 49 4c 45 4e 41 4d 45 20 53 45 4c 45 43 54 4f 52  ILENAME SELECTOR
9590: 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  .**.** Determine
95a0: 20 69 66 20 74 68 65 20 43 53 53 20 73 74 79 6c   if the CSS styl
95b0: 65 73 68 65 65 74 20 46 49 4c 45 4e 41 4d 45 20  esheet FILENAME 
95c0: 63 6f 6e 74 61 69 6e 73 20 53 45 4c 45 43 54 4f  contains SELECTO
95d0: 52 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  R..**.** Note th
95e0: 61 74 20 61 73 20 6f 66 20 32 30 32 30 2d 30 35  at as of 2020-05
95f0: 2d 32 38 2c 20 74 68 65 20 64 65 66 61 75 6c 74  -28, the default
9600: 20 72 75 6c 65 73 20 61 72 65 20 61 6c 77 61 79   rules are alway
9610: 73 20 65 6d 69 74 74 65 64 2c 0a 2a 2a 20 73 6f  s emitted,.** so
9620: 20 74 68 65 20 63 6f 6e 74 61 69 6e 73 53 65 6c   the containsSel
9630: 65 63 74 6f 72 28 29 20 6c 6f 67 69 63 20 69 73  ector() logic is
9640: 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 70 70 6c 69   no longer appli
9650: 65 64 20 77 68 65 6e 20 65 6d 69 74 74 69 6e 67  ed when emitting
9660: 0a 2a 2a 20 73 74 79 6c 65 2e 63 73 73 2e 20 49  .** style.css. I
9670: 74 20 69 73 20 75 6e 63 6c 65 61 72 20 77 68 65  t is unclear whe
9680: 74 68 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ther this test c
9690: 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 77 20 6f 62  ommand is now ob
96a0: 73 6f 6c 65 74 65 0a 2a 2a 20 6f 72 20 77 68 65  solete.** or whe
96b0: 74 68 65 72 20 69 74 20 6d 61 79 20 73 74 69 6c  ther it may stil
96c0: 6c 20 73 65 72 76 65 20 61 20 70 75 72 70 6f 73  l serve a purpos
96d0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6f 6e 74 61  e..*/.void conta
96e0: 69 6e 73 5f 73 65 6c 65 63 74 6f 72 5f 63 6d 64  ins_selector_cmd
96f0: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 66 6f  (void){.  int fo
9700: 75 6e 64 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  und;.  char *zSe
9710: 6c 65 63 74 6f 72 3b 0a 20 20 42 6c 6f 62 20 63  lector;.  Blob c
9720: 73 73 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63  ss;.  if( g.argc
9730: 21 3d 34 20 29 20 75 73 61 67 65 28 22 46 49 4c  !=4 ) usage("FIL
9740: 45 4e 41 4d 45 20 53 45 4c 45 43 54 4f 52 22 29  ENAME SELECTOR")
9750: 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72  ;.  blob_read_fr
9760: 6f 6d 5f 66 69 6c 65 28 26 63 73 73 2c 20 67 2e  om_file(&css, g.
9770: 61 72 67 76 5b 32 5d 2c 20 45 78 74 46 49 4c 45  argv[2], ExtFILE
9780: 29 3b 0a 20 20 7a 53 65 6c 65 63 74 6f 72 20 3d  );.  zSelector =
9790: 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 20 20 66 6f   g.argv[3];.  fo
97a0: 75 6e 64 20 3d 20 63 6f 6e 74 61 69 6e 73 53 65  und = containsSe
97b0: 6c 65 63 74 6f 72 28 62 6c 6f 62 5f 73 74 72 28  lector(blob_str(
97c0: 26 63 73 73 29 2c 20 7a 53 65 6c 65 63 74 6f 72  &css), zSelector
97d0: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  );.  fossil_prin
97e0: 74 28 22 25 73 20 25 73 5c 6e 22 2c 20 7a 53 65  t("%s %s\n", zSe
97f0: 6c 65 63 74 6f 72 2c 20 66 6f 75 6e 64 20 3f 20  lector, found ? 
9800: 22 66 6f 75 6e 64 22 20 3a 20 22 6e 6f 74 20 66  "found" : "not f
9810: 6f 75 6e 64 22 29 3b 0a 20 20 62 6c 6f 62 5f 72  ound");.  blob_r
9820: 65 73 65 74 28 26 63 73 73 29 3b 0a 7d 0a 0a 2f  eset(&css);.}../
9830: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 73 63  *.** WEBPAGE: sc
9840: 72 69 70 74 2e 6a 73 0a 2a 2a 0a 2a 2a 20 52 65  ript.js.**.** Re
9850: 74 75 72 6e 20 74 68 65 20 22 4a 61 76 61 73 63  turn the "Javasc
9860: 72 69 70 74 22 20 63 6f 6e 74 65 6e 74 20 66 6f  ript" content fo
9870: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 6b  r the current sk
9880: 69 6e 20 28 69 66 20 74 68 65 72 65 20 69 73 20  in (if there is 
9890: 61 6e 79 29 0a 2a 2f 0a 76 6f 69 64 20 70 61 67  any).*/.void pag
98a0: 65 5f 73 63 72 69 70 74 5f 6a 73 28 76 6f 69 64  e_script_js(void
98b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
98c0: 2a 7a 53 63 72 69 70 74 20 3d 20 73 6b 69 6e 5f  *zScript = skin_
98d0: 67 65 74 28 22 6a 73 22 29 3b 0a 20 20 69 66 28  get("js");.  if(
98e0: 20 50 28 22 74 65 73 74 22 29 20 29 7b 0a 20 20   P("test") ){.  
98f0: 20 20 2f 2a 20 52 65 6e 64 65 72 20 74 68 65 20    /* Render the 
9900: 73 63 72 69 70 74 20 61 73 20 70 6c 61 69 6e 2d  script as plain-
9910: 74 65 78 74 20 66 6f 72 20 74 65 73 74 69 6e 67  text for testing
9920: 20 70 75 72 70 6f 73 65 73 2c 20 69 66 20 74 68   purposes, if th
9930: 65 20 22 74 65 73 74 22 0a 20 20 20 20 2a 2a 20  e "test".    ** 
9940: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
9950: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
9960: 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e    cgi_set_conten
9970: 74 5f 74 79 70 65 28 22 74 65 78 74 2f 70 6c 61  t_type("text/pla
9980: 69 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  in");.  }else{. 
9990: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 62 65     /* Default be
99a0: 68 61 76 69 6f 72 20 69 73 20 74 6f 20 72 65 74  havior is to ret
99b0: 75 72 6e 20 6a 61 76 61 73 63 72 69 70 74 20 2a  urn javascript *
99c0: 2f 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f  /.    cgi_set_co
99d0: 6e 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74  ntent_type("text
99e0: 2f 6a 61 76 61 73 63 72 69 70 74 22 29 3b 0a 20  /javascript");. 
99f0: 20 7d 0a 20 20 73 74 79 6c 65 5f 69 6e 69 74 5f   }.  style_init_
9a00: 74 68 31 5f 76 61 72 73 28 30 29 3b 0a 20 20 54  th1_vars(0);.  T
9a10: 68 5f 52 65 6e 64 65 72 28 7a 53 63 72 69 70 74  h_Render(zScript
9a20: 3f 7a 53 63 72 69 70 74 3a 22 22 29 3b 0a 7d 0a  ?zScript:"");.}.
9a30: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 66 6f 72  ./*.** Check for
9a40: 20 22 6e 61 6d 65 22 20 6f 72 20 22 70 61 67 65   "name" or "page
9a50: 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
9a60: 72 73 20 6f 6e 20 61 6e 20 2f 73 74 79 6c 65 2e  rs on an /style.
9a70: 63 73 73 0a 2a 2a 20 70 61 67 65 20 72 65 71 75  css.** page requ
9a80: 65 73 74 2e 20 20 49 66 20 70 72 65 73 65 6e 74  est.  If present
9a90: 2c 20 74 68 65 6e 20 70 61 67 65 2d 73 70 65 63  , then page-spec
9aa0: 69 66 69 63 20 43 53 53 20 69 73 20 72 65 71 75  ific CSS is requ
9ab0: 65 73 74 65 64 2c 0a 2a 2a 20 73 6f 20 61 64 64  ested,.** so add
9ac0: 20 74 68 61 74 20 43 53 53 20 74 6f 20 70 4f 75   that CSS to pOu
9ad0: 74 2e 20 20 49 66 20 74 68 65 20 22 6e 61 6d 65  t.  If the "name
9ae0: 22 20 61 6e 64 20 22 70 61 67 65 22 20 71 75 65  " and "page" que
9af0: 72 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a  ry parameters.**
9b00: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
9b10: 65 6e 20 70 4f 75 74 20 69 73 20 75 6e 63 68 6e  en pOut is unchn
9b20: 61 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aged..*/.static 
9b30: 76 6f 69 64 20 70 61 67 65 5f 73 74 79 6c 65 5f  void page_style_
9b40: 63 73 73 5f 61 70 70 65 6e 64 5f 70 61 67 65 5f  css_append_page_
9b50: 73 74 79 6c 65 28 42 6c 6f 62 20 2a 70 4f 75 74  style(Blob *pOut
9b60: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
9b70: 2a 7a 50 61 67 65 20 3d 20 50 44 28 22 6e 61 6d  *zPage = PD("nam
9b80: 65 22 2c 50 28 22 70 61 67 65 22 29 29 3b 0a 20  e",P("page"));. 
9b90: 20 63 68 61 72 20 2a 20 7a 46 69 6c 65 3b 0a 20   char * zFile;. 
9ba0: 20 69 6e 74 20 6e 46 69 6c 65 20 3d 20 30 3b 0a   int nFile = 0;.
9bb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
9bc0: 75 69 6c 74 69 6e 3b 0a 0a 20 20 69 66 28 7a 50  uiltin;..  if(zP
9bd0: 61 67 65 3d 3d 30 20 7c 7c 20 7a 50 61 67 65 5b  age==0 || zPage[
9be0: 30 5d 3d 3d 30 29 7b 0a 20 20 20 20 72 65 74 75  0]==0){.    retu
9bf0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20  rn;.  }.  zFile 
9c00: 3d 20 6d 70 72 69 6e 74 66 28 22 73 74 79 6c 65  = mprintf("style
9c10: 2e 25 73 2e 63 73 73 22 2c 20 7a 50 61 67 65 29  .%s.css", zPage)
9c20: 3b 0a 20 20 7a 42 75 69 6c 74 69 6e 20 3d 20 28  ;.  zBuiltin = (
9c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 62 75 69  const char *)bui
9c40: 6c 74 69 6e 5f 66 69 6c 65 28 7a 46 69 6c 65 2c  ltin_file(zFile,
9c50: 20 26 6e 46 69 6c 65 29 3b 0a 20 20 69 66 28 6e   &nFile);.  if(n
9c60: 46 69 6c 65 3e 30 29 7b 0a 20 20 20 20 62 6c 6f  File>0){.    blo
9c70: 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 0a  b_appendf(pOut,.
9c80: 20 20 20 20 20 20 22 5c 6e 2f 2a 2a 2a 2a 2a 2a        "\n/******
9c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9cc0: 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20 20 20 20 22  *****\n".      "
9cd0: 2a 2a 20 50 61 67 65 2d 73 70 65 63 69 66 69 63  ** Page-specific
9ce0: 20 43 53 53 20 66 6f 72 20 5c 22 25 73 5c 22 5c   CSS for \"%s\"\
9cf0: 6e 22 0a 20 20 20 20 20 20 22 2a 2a 2a 2a 2a 2a  n".      "******
9d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d30: 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20  *****/\n",.     
9d40: 20 7a 50 61 67 65 29 3b 0a 20 20 20 20 62 6c 6f   zPage);.    blo
9d50: 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 7a  b_append(pOut, z
9d60: 42 75 69 6c 74 69 6e 2c 20 6e 46 69 6c 65 29 3b  Builtin, nFile);
9d70: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  .    fossil_free
9d80: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 74  (zFile);.    ret
9d90: 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a 20 50 6f  urn;.  }.  /* Po
9da0: 74 65 6e 74 69 61 6c 20 54 4f 44 4f 3a 20 63 68  tential TODO: ch
9db0: 65 63 6b 20 66 6f 72 20 61 6c 69 61 73 65 73 2f  eck for aliases/
9dc0: 70 61 67 65 20 67 72 6f 75 70 73 2e 20 65 2e 67  page groups. e.g
9dd0: 2e 20 67 72 6f 75 70 20 61 6c 6c 0a 20 20 2a 2a  . group all.  **
9de0: 20 2f 66 6f 72 75 6d 58 59 5a 20 43 53 53 20 69   /forumXYZ CSS i
9df0: 6e 74 6f 20 6f 6e 65 20 66 69 6c 65 2c 20 61 6c  nto one file, al
9e00: 6c 20 2f 73 65 74 75 70 58 59 5a 20 69 6e 74 6f  l /setupXYZ into
9e10: 20 61 6e 6f 74 68 65 72 2c 20 65 74 63 2e 20 41   another, etc. A
9e20: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 77  s.  ** of this w
9e30: 72 69 74 69 6e 67 2c 20 64 6f 69 6e 67 20 73 6f  riting, doing so
9e40: 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 73 68 61 76   would only shav
9e50: 65 20 61 20 66 65 77 20 6b 62 20 66 72 6f 6d 0a  e a few kb from.
9e60: 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 63 73 73    ** default.css
9e70: 2e 20 2a 2f 0a 20 20 66 6f 73 73 69 6c 5f 66 72  . */.  fossil_fr
9e80: 65 65 28 7a 46 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a  ee(zFile);.}../*
9e90: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 73 74 79  .** WEBPAGE: sty
9ea0: 6c 65 2e 63 73 73 20 6c 6f 61 64 61 76 67 2d 65  le.css loadavg-e
9eb0: 78 65 6d 70 74 0a 2a 2a 0a 2a 2a 20 52 65 74 75  xempt.**.** Retu
9ec0: 72 6e 20 74 68 65 20 73 74 79 6c 65 20 73 68 65  rn the style she
9ed0: 65 74 2e 20 20 20 54 68 65 20 73 74 79 6c 65 20  et.   The style 
9ee0: 73 68 65 65 74 20 69 73 20 61 73 73 65 6d 62 6c  sheet is assembl
9ef0: 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 75 6c 74  ied from.** mult
9f00: 69 70 6c 65 20 73 6f 75 72 63 65 73 2c 20 69 6e  iple sources, in
9f10: 20 6f 72 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20   order:.**.**   
9f20: 20 28 31 29 20 20 20 54 68 65 20 62 75 69 6c 74   (1)   The built
9f30: 2d 69 6e 20 22 64 65 66 61 75 6c 74 2e 63 73 73  -in "default.css
9f40: 22 20 73 74 79 6c 65 20 73 68 65 65 74 20 63 6f  " style sheet co
9f50: 6e 74 61 69 6e 69 6e 67 20 62 61 73 69 63 20 64  ntaining basic d
9f60: 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 20  efaults..**.**  
9f70: 20 20 28 32 29 20 20 20 54 68 65 20 70 61 67 65    (2)   The page
9f80: 2d 73 70 65 63 69 66 69 63 20 73 74 79 6c 65 20  -specific style 
9f90: 73 68 65 65 74 20 74 61 6b 65 6e 20 66 72 6f 6d  sheet taken from
9fa0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a   the built-in.**
9fb0: 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 65 64            called
9fc0: 20 22 50 41 47 45 4e 41 4d 45 2e 63 73 73 22 20   "PAGENAME.css" 
9fd0: 77 68 65 72 65 20 50 41 47 45 4e 41 4d 45 20 69  where PAGENAME i
9fe0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
9ff0: 68 65 20 6e 61 6d 65 3d 0a 2a 2a 20 20 20 20 20  he name=.**     
a000: 20 20 20 20 20 6f 72 20 70 61 67 65 3d 20 71 75       or page= qu
a010: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ery parameters. 
a020: 20 49 66 20 6e 65 69 74 68 65 72 20 6e 61 6d 65   If neither name
a030: 3d 20 6e 6f 72 20 70 61 67 65 3d 20 65 78 69 73  = nor page= exis
a040: 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  t,.**          t
a050: 68 65 6e 20 74 68 69 73 20 73 65 63 74 69 6f 6e  hen this section
a060: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
a070: 2a 2a 20 20 20 20 28 33 29 20 20 20 54 68 65 20  **    (3)   The 
a080: 73 6b 69 6e 2d 73 70 65 63 69 66 69 63 20 22 63  skin-specific "c
a090: 73 73 2e 74 78 74 22 20 66 69 6c 65 2c 20 69 66  ss.txt" file, if
a0a0: 20 74 68 65 72 65 20 6f 6e 65 2e 0a 2a 2a 0a 2a   there one..**.*
a0b0: 2a 20 41 6c 6c 20 6f 66 20 28 31 29 2c 20 28 32  * All of (1), (2
a0c0: 29 2c 20 61 6e 64 20 28 33 29 20 61 62 6f 76 65  ), and (3) above
a0d0: 20 28 6f 72 20 61 73 20 6d 61 6e 79 20 61 73 20   (or as many as 
a0e0: 65 78 69 73 74 29 20 61 72 65 20 63 6f 6e 63 61  exist) are conca
a0f0: 74 65 6e 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20  tenated..** The 
a100: 72 65 73 75 6c 74 20 69 73 20 74 68 65 6e 20 72  result is then r
a110: 75 6e 20 74 68 72 6f 75 67 68 20 54 48 31 20 77  un through TH1 w
a120: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
a130: 67 20 76 61 72 69 61 62 6c 65 73 20 73 65 74 3a  g variables set:
a140: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 24 62  .**.**    *   $b
a150: 61 73 65 6e 61 6d 65 0a 2a 2a 20 20 20 20 2a 20  asename.**    * 
a160: 20 20 24 73 65 63 75 72 65 75 72 6c 0a 2a 2a 20    $secureurl.** 
a170: 20 20 20 2a 20 20 20 24 68 6f 6d 65 0a 2a 2a 20     *   $home.** 
a180: 20 20 20 2a 20 20 20 24 6c 6f 67 6f 0a 2a 2a 20     *   $logo.** 
a190: 20 20 20 2a 20 20 20 24 62 61 63 6b 67 72 6f 75     *   $backgrou
a1a0: 6e 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74  nd.**.** The out
a1b0: 70 75 74 20 66 72 6f 6d 20 54 48 31 20 62 65 63  put from TH1 bec
a1c0: 6f 6d 65 73 20 74 68 65 20 73 74 79 6c 65 20 73  omes the style s
a1d0: 68 65 65 74 2e 20 20 46 6f 73 73 69 6c 20 61 6c  heet.  Fossil al
a1e0: 77 61 79 73 20 72 65 70 6f 72 74 73 0a 2a 2a 20  ways reports.** 
a1f0: 74 68 61 74 20 74 68 65 20 73 74 79 6c 65 20 73  that the style s
a200: 68 65 65 74 20 69 73 20 63 61 63 68 65 61 62 6c  heet is cacheabl
a210: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f  e..*/.void page_
a220: 73 74 79 6c 65 5f 63 73 73 28 76 6f 69 64 29 7b  style_css(void){
a230: 0a 20 20 42 6c 6f 62 20 63 73 73 20 3d 20 65 6d  .  Blob css = em
a240: 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 69 6e 74 20  pty_blob;.  int 
a250: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
a260: 2a 20 7a 44 65 66 61 75 6c 74 73 3b 0a 20 20 63  * zDefaults;.  c
a270: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 6e  onst char *zSkin
a280: 3b 0a 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e  ;..  cgi_set_con
a290: 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74 2f  tent_type("text/
a2a0: 63 73 73 22 29 3b 0a 20 20 65 74 61 67 5f 63 68  css");.  etag_ch
a2b0: 65 63 6b 28 30 2c 20 30 29 3b 0a 20 20 2f 2a 20  eck(0, 0);.  /* 
a2c0: 45 6d 69 74 20 61 6c 6c 20 64 65 66 61 75 6c 74  Emit all default
a2d0: 20 72 75 6c 65 73 2e 2e 2e 20 2a 2f 0a 20 20 7a   rules... */.  z
a2e0: 44 65 66 61 75 6c 74 73 20 3d 20 28 63 6f 6e 73  Defaults = (cons
a2f0: 74 20 63 68 61 72 2a 29 62 75 69 6c 74 69 6e 5f  t char*)builtin_
a300: 66 69 6c 65 28 22 64 65 66 61 75 6c 74 2e 63 73  file("default.cs
a310: 73 22 2c 20 26 69 29 3b 0a 20 20 62 6c 6f 62 5f  s", &i);.  blob_
a320: 61 70 70 65 6e 64 28 26 63 73 73 2c 20 7a 44 65  append(&css, zDe
a330: 66 61 75 6c 74 73 2c 20 69 29 3b 0a 20 20 2f 2a  faults, i);.  /*
a340: 20 50 61 67 65 2d 73 70 65 63 69 66 69 63 20 43   Page-specific C
a350: 53 53 2c 20 69 66 20 61 6e 79 2e 2e 2e 20 2a 2f  SS, if any... */
a360: 0a 20 20 70 61 67 65 5f 73 74 79 6c 65 5f 63 73  .  page_style_cs
a370: 73 5f 61 70 70 65 6e 64 5f 70 61 67 65 5f 73 74  s_append_page_st
a380: 79 6c 65 28 26 63 73 73 29 3b 0a 20 20 7a 53 6b  yle(&css);.  zSk
a390: 69 6e 20 3d 20 73 6b 69 6e 5f 69 6e 5f 75 73 65  in = skin_in_use
a3a0: 28 29 3b 0a 20 20 69 66 28 20 7a 53 6b 69 6e 3d  ();.  if( zSkin=
a3b0: 3d 30 20 29 20 7a 53 6b 69 6e 20 3d 20 22 74 68  =0 ) zSkin = "th
a3c0: 69 73 20 72 65 70 6f 73 69 74 6f 72 79 22 3b 0a  is repository";.
a3d0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
a3e0: 63 73 73 2c 0a 20 20 20 20 20 22 5c 6e 2f 2a 2a  css,.     "\n/**
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20  *********\n".   
a430: 20 20 22 2a 2a 20 53 6b 69 6e 2d 73 70 65 63 69    "** Skin-speci
a440: 66 69 63 20 43 53 53 20 66 6f 72 20 25 73 5c 6e  fic CSS for %s\n
a450: 22 0a 20 20 20 20 20 22 2a 2a 2a 2a 2a 2a 2a 2a  ".     "********
a460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a490: 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 7a 53  ***/\n",.     zS
a4a0: 6b 69 6e 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70  kin);.  blob_app
a4b0: 65 6e 64 28 26 63 73 73 2c 73 6b 69 6e 5f 67 65  end(&css,skin_ge
a4c0: 74 28 22 63 73 73 22 29 2c 2d 31 29 3b 0a 20 20  t("css"),-1);.  
a4d0: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 72 6f 75  /* Process throu
a4e0: 67 68 20 54 48 31 20 69 6e 20 6f 72 64 65 72 20  gh TH1 in order 
a4f0: 74 6f 20 67 69 76 65 20 61 6e 20 6f 70 70 6f 72  to give an oppor
a500: 74 75 6e 69 74 79 20 74 6f 20 73 75 62 73 74 69  tunity to substi
a510: 74 75 74 65 0a 20 20 2a 2a 20 76 61 72 69 61 62  tute.  ** variab
a520: 6c 65 73 20 73 75 63 68 20 61 73 20 24 62 61 73  les such as $bas
a530: 65 75 72 6c 2e 0a 20 20 2a 2f 0a 20 20 54 68 5f  eurl..  */.  Th_
a540: 53 74 6f 72 65 28 22 62 61 73 65 75 72 6c 22 2c  Store("baseurl",
a550: 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a 20 20   g.zBaseURL);.  
a560: 54 68 5f 53 74 6f 72 65 28 22 73 65 63 75 72 65  Th_Store("secure
a570: 75 72 6c 22 2c 20 66 6f 73 73 69 6c 5f 77 61 6e  url", fossil_wan
a580: 74 73 5f 68 74 74 70 73 28 31 29 3f 20 67 2e 7a  ts_https(1)? g.z
a590: 48 74 74 70 73 55 52 4c 3a 20 67 2e 7a 42 61 73  HttpsURL: g.zBas
a5a0: 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74 6f 72  eURL);.  Th_Stor
a5b0: 65 28 22 68 6f 6d 65 22 2c 20 67 2e 7a 54 6f 70  e("home", g.zTop
a5c0: 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72 6c 5f 76  );.  image_url_v
a5d0: 61 72 28 22 6c 6f 67 6f 22 29 3b 0a 20 20 69 6d  ar("logo");.  im
a5e0: 61 67 65 5f 75 72 6c 5f 76 61 72 28 22 62 61 63  age_url_var("bac
a5f0: 6b 67 72 6f 75 6e 64 22 29 3b 0a 20 20 54 68 5f  kground");.  Th_
a600: 52 65 6e 64 65 72 28 62 6c 6f 62 5f 73 74 72 28  Render(blob_str(
a610: 26 63 73 73 29 29 3b 0a 20 20 62 6c 6f 62 5f 72  &css));.  blob_r
a620: 65 73 65 74 28 26 63 73 73 29 3b 0a 0a 20 20 2f  eset(&css);..  /
a630: 2a 20 54 65 6c 6c 20 43 47 49 20 74 68 61 74 20  * Tell CGI that 
a640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 72 65 74 75  the content retu
a650: 72 6e 65 64 20 62 79 20 74 68 69 73 20 70 61 67  rned by this pag
a660: 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  e is considered 
a670: 63 61 63 68 65 61 62 6c 65 20 2a 2f 0a 20 20 67  cacheable */.  g
a680: 2e 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 7d 0a  .isConst = 1;.}.
a690: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69  ./*.** All possi
a6a0: 62 6c 65 20 63 61 70 61 62 69 6c 69 74 69 65 73  ble capabilities
a6b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
a6c0: 20 63 68 61 72 20 61 6c 6c 43 61 70 5b 5d 20 3d   char allCap[] =
a6d0: 0a 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c  .  "abcdefghijkl
a6e0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
a6f0: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48  23456789ABCDEFGH
a700: 49 4a 4b 4c 22 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  IJKL";../*.** Co
a710: 6d 70 75 74 65 20 74 68 65 20 63 75 72 72 65 6e  mpute the curren
a720: 74 20 6c 6f 67 69 6e 20 63 61 70 61 62 69 6c 69  t login capabili
a730: 74 69 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ties.*/.static c
a740: 68 61 72 20 2a 66 69 6e 64 5f 63 61 70 61 62 69  har *find_capabi
a750: 6c 69 74 69 65 73 28 63 68 61 72 20 2a 7a 43 61  lities(char *zCa
a760: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  p){.  int i, j;.
a770: 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 28    char c;.  for(
a780: 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 61 6c 6c 43  i=j=0; (c = allC
a790: 61 70 5b 6a 5d 29 21 3d 30 3b 20 6a 2b 2b 29 7b  ap[j])!=0; j++){
a7a0: 0a 20 20 20 20 69 66 28 20 6c 6f 67 69 6e 5f 68  .    if( login_h
a7b0: 61 73 5f 63 61 70 61 62 69 6c 69 74 79 28 26 63  as_capability(&c
a7c0: 2c 20 31 2c 20 30 29 20 29 20 7a 43 61 70 5b 69  , 1, 0) ) zCap[i
a7d0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
a7e0: 43 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  Cap[i] = 0;.  re
a7f0: 74 75 72 6e 20 7a 43 61 70 3b 0a 7d 0a 0a 2f 2a  turn zCap;.}../*
a800: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a810: 63 75 72 72 65 6e 74 20 6c 6f 67 69 6e 20 63 61  current login ca
a820: 70 61 62 69 6c 69 74 69 65 73 20 74 68 61 74 20  pabilities that 
a830: 77 65 72 65 0a 2a 2a 20 63 6f 6e 74 72 69 62 75  were.** contribu
a840: 74 65 64 20 62 79 20 41 6e 6f 6e 79 6d 6f 75 73  ted by Anonymous
a850: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a860: 2a 66 69 6e 64 5f 61 6e 6f 6e 5f 63 61 70 61 62  *find_anon_capab
a870: 69 6c 69 74 69 65 73 28 63 68 61 72 20 2a 7a 43  ilities(char *zC
a880: 61 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ap){.  int i, j;
a890: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72  .  char c;.  for
a8a0: 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 61 6c 6c  (i=j=0; (c = all
a8b0: 43 61 70 5b 6a 5d 29 21 3d 30 3b 20 6a 2b 2b 29  Cap[j])!=0; j++)
a8c0: 7b 0a 20 20 20 20 69 66 28 20 6c 6f 67 69 6e 5f  {.    if( login_
a8d0: 68 61 73 5f 63 61 70 61 62 69 6c 69 74 79 28 26  has_capability(&
a8e0: 63 2c 20 31 2c 20 4c 4f 47 49 4e 5f 41 4e 4f 4e  c, 1, LOGIN_ANON
a8f0: 29 0a 20 20 20 20 20 20 26 26 20 21 6c 6f 67 69  ).      && !logi
a900: 6e 5f 68 61 73 5f 63 61 70 61 62 69 6c 69 74 79  n_has_capability
a910: 28 26 63 2c 20 31 2c 20 30 29 20 29 20 7a 43 61  (&c, 1, 0) ) zCa
a920: 70 5b 69 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  p[i++] = c;.  }.
a930: 20 20 7a 43 61 70 5b 69 5d 20 3d 20 30 3b 0a 20    zCap[i] = 0;. 
a940: 20 72 65 74 75 72 6e 20 7a 43 61 70 3b 0a 7d 0a   return zCap;.}.
a950: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
a960: 74 65 73 74 2d 74 69 74 6c 65 0a 2a 2a 0a 2a 2a  test-title.**.**
a970: 20 52 65 6e 64 65 72 20 61 20 74 65 73 74 20 70   Render a test p
a980: 61 67 65 20 69 6e 20 77 68 69 63 68 20 74 68 65  age in which the
a990: 20 70 61 67 65 20 74 69 74 6c 65 20 69 73 20 73   page title is s
a9a0: 65 74 20 62 79 20 74 68 65 20 22 74 69 74 6c 65  et by the "title
a9b0: 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d  ".** query param
a9c0: 65 74 65 72 2e 20 20 54 68 69 73 20 63 61 6e 20  eter.  This can 
a9d0: 62 65 20 75 73 65 64 20 74 6f 20 73 68 6f 77 20  be used to show 
a9e0: 74 68 61 74 20 48 54 4d 4c 20 6f 72 20 4a 61 76  that HTML or Jav
a9f0: 61 73 63 72 69 70 74 0a 2a 2a 20 63 6f 6e 74 65  ascript.** conte
aa00: 6e 74 20 69 6e 20 74 68 65 20 74 69 74 6c 65 20  nt in the title 
aa10: 64 6f 65 73 20 6e 6f 74 20 6c 65 61 6b 20 74 68  does not leak th
aa20: 72 6f 75 67 68 20 69 6e 74 6f 20 67 65 6e 65 72  rough into gener
aa30: 61 74 65 64 20 70 61 67 65 2c 20 72 65 73 75 6c  ated page, resul
aa40: 74 69 6e 67 0a 2a 2a 20 69 6e 20 61 6e 20 58 53  ting.** in an XS
aa50: 53 20 69 73 73 75 65 2e 0a 2a 2a 0a 2a 2a 20 44  S issue..**.** D
aa60: 75 65 20 74 6f 20 74 68 65 20 70 6f 74 65 6e 74  ue to the potent
aa70: 69 61 6c 20 66 6f 72 20 61 62 75 73 65 2c 20 74  ial for abuse, t
aa80: 68 69 73 20 77 65 62 70 61 67 65 20 69 73 20 6f  his webpage is o
aa90: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  nly available to
aaa0: 0a 2a 2a 20 61 64 6d 69 6e 69 73 74 72 61 74 6f  .** administrato
aab0: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65  rs..*/.void page
aac0: 5f 74 65 73 74 5f 74 69 74 6c 65 28 76 6f 69 64  _test_title(void
aad0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
aae0: 2a 7a 54 69 74 6c 65 3b 0a 20 20 6c 6f 67 69 6e  *zTitle;.  login
aaf0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
ab00: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70  ls();.  if( !g.p
ab10: 65 72 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20 20 20  erm.Admin ){.   
ab20: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30 29   login_needed(0)
ab30: 3b 0a 20 20 7d 0a 20 20 7a 54 69 74 6c 65 20 3d  ;.  }.  zTitle =
ab40: 20 50 28 22 74 69 74 6c 65 22 29 3b 0a 20 20 69   P("title");.  i
ab50: 66 28 20 7a 54 69 74 6c 65 3d 3d 30 20 29 7b 0a  f( zTitle==0 ){.
ab60: 20 20 20 20 7a 54 69 74 6c 65 20 3d 20 22 28 4e      zTitle = "(N
ab70: 6f 20 54 69 74 6c 65 29 22 3b 0a 20 20 7d 0a 20  o Title)";.  }. 
ab80: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 25   style_header("%
ab90: 73 22 2c 20 7a 54 69 74 6c 65 29 3b 0a 20 20 40  s", zTitle);.  @
aba0: 20 3c 70 3e 0a 20 20 40 20 54 68 69 73 20 70 61   <p>.  @ This pa
abb0: 67 65 20 73 65 74 73 20 69 74 73 20 74 69 74 6c  ge sets its titl
abc0: 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  e to the value o
abd0: 66 20 74 68 65 20 22 74 69 74 6c 65 22 20 71 75  f the "title" qu
abe0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
abf0: 20 40 20 54 68 65 20 66 6f 72 6d 20 62 65 6c 6f   @ The form belo
ac00: 77 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  w is a convenien
ac10: 74 20 77 61 79 20 74 6f 20 73 65 74 20 74 68 65  t way to set the
ac20: 20 74 69 74 6c 65 20 71 75 65 72 79 20 70 61 72   title query par
ac30: 61 6d 65 74 65 72 3a 0a 20 20 40 0a 20 20 40 20  ameter:.  @.  @ 
ac40: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45  <form method="GE
ac50: 54 22 3e 0a 20 20 40 20 54 69 74 6c 65 3a 20 3c  T">.  @ Title: <
ac60: 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74  input type="text
ac70: 22 20 73 69 7a 65 3d 22 35 30 22 20 6e 61 6d 65  " size="50" name
ac80: 3d 22 74 69 74 6c 65 22 20 76 61 6c 75 65 3d 22  ="title" value="
ac90: 25 68 28 7a 54 69 74 6c 65 29 22 3e 0a 20 20 40  %h(zTitle)">.  @
aca0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
acb0: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 53 75 62  bmit" value="Sub
acc0: 6d 69 74 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d  mit">.  @ </form
acd0: 3e 0a 20 20 73 74 79 6c 65 5f 66 69 6e 69 73 68  >.  style_finish
ace0: 5f 70 61 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _page();.}../*.*
acf0: 2a 20 57 45 42 50 41 47 45 3a 20 74 65 73 74 5f  * WEBPAGE: test_
ad00: 65 6e 76 0a 2a 2a 0a 2a 2a 20 44 69 73 70 6c 61  env.**.** Displa
ad10: 79 20 43 47 49 2d 76 61 72 69 61 62 6c 65 73 20  y CGI-variables 
ad20: 61 6e 64 20 6f 74 68 65 72 20 61 73 70 65 63 74  and other aspect
ad30: 73 20 6f 66 20 74 68 65 20 72 75 6e 2d 74 69 6d  s of the run-tim
ad40: 65 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  e.** environment
ad50: 2c 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  , for debugging 
ad60: 61 6e 64 20 74 72 6f 75 62 6c 65 2d 73 68 6f 6f  and trouble-shoo
ad70: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ting purposes..*
ad80: 2f 0a 76 6f 69 64 20 70 61 67 65 5f 74 65 73 74  /.void page_test
ad90: 5f 65 6e 76 28 76 6f 69 64 29 7b 0a 20 20 77 65  _env(void){.  we
ada0: 62 70 61 67 65 5f 65 72 72 6f 72 28 22 22 29 3b  bpage_error("");
adb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
adc0: 45 3a 20 68 6f 6e 65 79 70 6f 74 0a 2a 2a 20 54  E: honeypot.** T
add0: 68 69 73 20 70 61 67 65 20 69 73 20 61 20 68 6f  his page is a ho
ade0: 6e 65 79 70 6f 74 20 66 6f 72 20 73 70 69 64 65  neypot for spide
adf0: 72 73 20 61 6e 64 20 62 6f 74 73 2e 0a 2a 2f 0a  rs and bots..*/.
ae00: 76 6f 69 64 20 68 6f 6e 65 79 70 6f 74 5f 70 61  void honeypot_pa
ae10: 67 65 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69  ge(void){.  unsi
ae20: 67 6e 65 64 20 69 6e 74 20 75 53 65 65 64 20 3d  gned int uSeed =
ae30: 20 63 61 70 74 63 68 61 5f 73 65 65 64 28 29 3b   captcha_seed();
ae40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ae50: 44 65 63 6f 64 65 64 20 3d 20 63 61 70 74 63 68  Decoded = captch
ae60: 61 5f 64 65 63 6f 64 65 28 75 53 65 65 64 2c 20  a_decode(uSeed, 
ae70: 30 29 3b 0a 20 20 69 6e 74 20 62 41 75 74 6f 43  0);.  int bAutoC
ae80: 61 70 74 63 68 61 20 3d 20 64 62 5f 67 65 74 5f  aptcha = db_get_
ae90: 62 6f 6f 6c 65 61 6e 28 22 61 75 74 6f 2d 63 61  boolean("auto-ca
aea0: 70 74 63 68 61 22 2c 20 30 29 3b 0a 20 20 63 68  ptcha", 0);.  ch
aeb0: 61 72 20 2a 7a 43 61 70 74 63 68 61 20 3d 20 63  ar *zCaptcha = c
aec0: 61 70 74 63 68 61 5f 72 65 6e 64 65 72 28 7a 44  aptcha_render(zD
aed0: 65 63 6f 64 65 64 29 3b 0a 20 20 73 74 79 6c 65  ecoded);.  style
aee0: 5f 68 65 61 64 65 72 28 22 49 20 74 68 69 6e 6b  _header("I think
aef0: 20 79 6f 75 20 61 72 65 20 61 20 72 6f 62 6f 74   you are a robot
af00: 22 29 3b 0a 20 20 40 20 3c 70 3e 59 6f 75 20 73  ");.  @ <p>You s
af10: 65 65 6d 20 6c 69 6b 65 20 61 20 72 6f 62 6f 74  eem like a robot
af20: 2e 3c 2f 70 3e 0a 20 20 40 0a 20 20 40 20 3c 70  .</p>.  @.  @ <p
af30: 3e 49 73 20 74 68 61 74 20 69 6e 63 6f 72 72 65  >Is that incorre
af40: 63 74 3f 20 20 41 72 65 20 79 6f 75 20 72 65 61  ct?  Are you rea
af50: 6c 6c 79 20 68 75 6d 61 6e 3f 0a 20 20 40 20 49  lly human?.  @ I
af60: 66 20 73 6f 2c 20 70 6c 65 61 73 65 20 70 72 6f  f so, please pro
af70: 76 65 20 69 74 20 62 79 20 74 72 61 6e 73 63 72  ve it by transcr
af80: 69 62 69 6e 67 20 74 68 65 20 63 61 70 74 63 68  ibing the captch
af90: 61 20 74 65 78 74 0a 20 20 40 20 69 6e 74 6f 20  a text.  @ into 
afa0: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 62 65  the entry box be
afb0: 6c 6f 77 20 61 6e 64 20 70 72 65 73 73 69 6e 67  low and pressing
afc0: 20 22 53 75 62 6d 69 74 22 2e 0a 20 20 40 20 3c   "Submit"..  @ <
afd0: 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 52 2f  form action="%R/
afe0: 6c 6f 67 69 6e 22 20 6d 65 74 68 6f 64 3d 22 70  login" method="p
aff0: 6f 73 74 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74  ost">.  @ <input
b000: 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 69   type="hidden" i
b010: 64 3d 22 75 22 20 6e 61 6d 65 3d 22 75 22 20 76  d="u" name="u" v
b020: 61 6c 75 65 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22  alue="anonymous"
b030: 3e 0a 20 20 40 20 3c 70 3e 0a 20 20 40 20 43 61  >.  @ <p>.  @ Ca
b040: 70 74 63 68 61 3a 20 3c 69 6e 70 75 74 20 74 79  ptcha: <input ty
b050: 70 65 3d 22 74 65 78 74 22 20 69 64 3d 22 70 22  pe="text" id="p"
b060: 20 6e 61 6d 65 3d 22 70 22 20 76 61 6c 75 65 3d   name="p" value=
b070: 22 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74  "">.  @ <input t
b080: 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d  ype="submit" nam
b090: 65 3d 22 69 6e 22 20 76 61 6c 75 65 3d 22 53 75  e="in" value="Su
b0a0: 62 6d 69 74 22 3e 0a 20 20 40 20 0a 20 20 40 20  bmit">.  @ .  @ 
b0b0: 3c 70 3e 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  <p>Alternatively
b0c0: 2c 20 79 6f 75 20 63 61 6e 20 3c 61 20 68 72 65  , you can <a hre
b0d0: 66 3d 22 25 52 2f 6c 6f 67 69 6e 22 3e 6c 6f 67  f="%R/login">log
b0e0: 20 69 6e 3c 2f 61 3e 20 75 73 69 6e 67 20 61 6e   in</a> using an
b0f0: 0a 20 20 40 20 65 78 69 73 74 69 6e 67 20 75 73  .  @ existing us
b100: 65 72 69 64 2e 0a 20 20 40 0a 20 20 40 20 3c 70  erid..  @.  @ <p
b110: 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69  ><input type="hi
b120: 64 64 65 6e 22 20 6e 61 6d 65 3d 22 63 73 22 20  dden" name="cs" 
b130: 76 61 6c 75 65 3d 22 25 75 28 75 53 65 65 64 29  value="%u(uSeed)
b140: 22 3e 0a 20 20 40 20 3c 64 69 76 20 63 6c 61 73  ">.  @ <div clas
b150: 73 3d 22 63 61 70 74 63 68 61 22 3e 3c 74 61 62  s="captcha"><tab
b160: 6c 65 20 63 6c 61 73 73 3d 22 63 61 70 74 63 68  le class="captch
b170: 61 22 3e 3c 74 72 3e 3c 74 64 3e 5c 0a 20 20 40  a"><tr><td>\.  @
b180: 20 3c 70 72 65 20 63 6c 61 73 73 3d 22 63 61 70   <pre class="cap
b190: 74 63 68 61 22 3e 0a 20 20 40 20 25 68 28 7a 43  tcha">.  @ %h(zC
b1a0: 61 70 74 63 68 61 29 0a 20 20 40 20 3c 2f 70 72  aptcha).  @ </pr
b1b0: 65 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61  e></td></tr></ta
b1c0: 62 6c 65 3e 0a 20 20 69 66 28 20 62 41 75 74 6f  ble>.  if( bAuto
b1d0: 43 61 70 74 63 68 61 20 29 20 7b 0a 20 20 20 20  Captcha ) {.    
b1e0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
b1f0: 62 75 74 74 6f 6e 22 20 76 61 6c 75 65 3d 22 46  button" value="F
b200: 69 6c 6c 20 6f 75 74 20 63 61 70 74 63 68 61 22  ill out captcha"
b210: 20 69 64 3d 27 61 75 74 6f 66 69 6c 6c 42 75 74   id='autofillBut
b220: 74 6f 6e 27 20 5c 0a 20 20 20 20 20 40 20 64 61  ton' \.     @ da
b230: 74 61 2d 61 66 3d 27 25 73 28 7a 44 65 63 6f 64  ta-af='%s(zDecod
b240: 65 64 29 27 3e 0a 20 20 20 20 20 62 75 69 6c 74  ed)'>.     built
b250: 69 6e 5f 72 65 71 75 65 73 74 5f 6a 73 28 22 6c  in_request_js("l
b260: 6f 67 69 6e 2e 6a 73 22 29 3b 0a 20 20 7d 0a 20  ogin.js");.  }. 
b270: 20 40 20 3c 2f 64 69 76 3e 0a 20 20 66 72 65 65   @ </div>.  free
b280: 28 7a 43 61 70 74 63 68 61 29 3b 0a 20 20 40 0a  (zCaptcha);.  @.
b290: 20 20 40 20 3c 70 3e 57 65 20 72 65 67 72 65 74    @ <p>We regret
b2a0: 20 74 68 69 73 20 69 6e 63 6f 6e 76 65 6e 69 65   this inconvenie
b2b0: 6e 63 65 2e 20 48 6f 77 65 76 65 72 2c 20 72 6f  nce. However, ro
b2c0: 62 6f 74 73 20 68 61 76 65 20 62 65 63 6f 6d 65  bots have become
b2d0: 20 73 6f 0a 20 20 40 20 70 72 6f 6c 69 66 69 63   so.  @ prolific
b2e0: 20 61 6e 64 20 73 6f 20 61 67 67 72 65 73 73 69   and so aggressi
b2f0: 76 65 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  ve that they wil
b300: 6c 20 73 6f 61 6b 20 75 70 20 74 6f 6f 20 6d 75  l soak up too mu
b310: 63 68 20 43 50 55 20 74 69 6d 65 0a 20 20 40 20  ch CPU time.  @ 
b320: 61 6e 64 20 6e 65 74 77 6f 72 6b 20 62 61 6e 64  and network band
b330: 77 69 64 74 68 20 6f 6e 20 6f 75 72 20 73 65 72  width on our ser
b340: 76 65 72 73 20 69 66 20 61 6c 6c 6f 77 65 64 20  vers if allowed 
b350: 74 6f 20 72 75 6e 20 75 6e 63 68 65 63 6b 65 64  to run unchecked
b360: 2e 0a 20 20 40 20 59 6f 75 72 20 63 6f 6f 70 65  ..  @ Your coope
b370: 72 61 74 69 6f 6e 20 69 6e 20 64 65 6d 6f 6e 73  ration in demons
b380: 74 72 61 74 69 6e 67 20 74 68 61 74 20 79 6f 75  trating that you
b390: 20 61 72 65 20 68 75 6d 61 6e 20 69 73 0a 20 20   are human is.  
b3a0: 40 20 61 70 70 72 65 63 69 61 74 65 64 2e 0a 20  @ appreciated.. 
b3b0: 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61   style_finish_pa
b3c0: 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ge();.}../*.** W
b3d0: 65 62 70 61 67 65 73 20 74 68 61 74 20 65 6e 63  ebpages that enc
b3e0: 6f 75 6e 74 65 72 20 61 6e 20 65 72 72 6f 72 20  ounter an error 
b3f0: 64 75 65 20 74 6f 20 6d 69 73 73 69 6e 67 20 6f  due to missing o
b400: 72 20 69 6e 63 6f 72 72 65 63 74 0a 2a 2a 20 71  r incorrect.** q
b410: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
b420: 63 61 6e 20 6a 75 6d 70 20 74 6f 20 74 68 69 73  can jump to this
b430: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 6e 64   routine to rend
b440: 65 72 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d  er an error.** m
b450: 65 73 73 61 67 65 20 73 63 72 65 65 6e 2e 0a 2a  essage screen..*
b460: 2a 0a 2a 2a 20 46 6f 72 20 61 64 6d 69 6e 69 73  *.** For adminis
b470: 74 61 74 6f 72 73 2c 20 6f 72 20 69 66 20 74 68  tators, or if th
b480: 65 20 74 65 73 74 5f 65 6e 76 5f 65 6e 61 62 6c  e test_env_enabl
b490: 65 20 73 65 74 74 69 6e 67 20 69 73 20 74 72 75  e setting is tru
b4a0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 64 65 74 61 69  e, then.** detai
b4b0: 6c 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ls of the reques
b4c0: 74 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 72  t environment ar
b4d0: 65 20 64 69 73 70 6c 61 79 65 64 2e 20 20 4f 74  e displayed.  Ot
b4e0: 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 2a 2a  herwise, just.**
b4f0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
b500: 67 65 20 69 73 20 73 68 6f 77 6e 2e 0a 2a 2a 0a  ge is shown..**.
b510: 2a 2a 20 49 66 20 7a 46 6f 72 6d 61 74 20 69 73  ** If zFormat is
b520: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
b530: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 74  , then this is t
b540: 68 65 20 2f 74 65 73 74 5f 65 6e 76 20 70 61 67  he /test_env pag
b550: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 65 62 70 61  e..*/.void webpa
b560: 67 65 5f 65 72 72 6f 72 28 63 6f 6e 73 74 20 63  ge_error(const c
b570: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
b580: 2e 29 7b 0a 20 20 69 6e 74 20 73 68 6f 77 41 6c  .){.  int showAl
b590: 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  l = 0;.  char *z
b5a0: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
b5b0: 73 41 75 74 68 20 3d 20 30 3b 0a 20 20 63 68 61  sAuth = 0;.  cha
b5c0: 72 20 7a 43 61 70 5b 31 30 30 5d 3b 0a 0a 20 20  r zCap[100];..  
b5d0: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
b5e0: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28  entials();.  if(
b5f0: 20 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 7c 7c   g.perm.Admin ||
b600: 20 67 2e 70 65 72 6d 2e 53 65 74 75 70 20 20 7c   g.perm.Setup  |
b610: 7c 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e  | db_get_boolean
b620: 28 22 74 65 73 74 5f 65 6e 76 5f 65 6e 61 62 6c  ("test_env_enabl
b630: 65 22 2c 30 29 20 29 7b 0a 20 20 20 20 69 73 41  e",0) ){.    isA
b640: 75 74 68 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 63  uth = 1;.  }.  c
b650: 67 69 5f 6c 6f 61 64 5f 65 6e 76 69 72 6f 6e 6d  gi_load_environm
b660: 65 6e 74 28 29 3b 0a 20 20 73 74 79 6c 65 5f 73  ent();.  style_s
b670: 65 74 5f 63 75 72 72 65 6e 74 5f 66 65 61 74 75  et_current_featu
b680: 72 65 28 7a 46 6f 72 6d 61 74 5b 30 5d 3d 3d 30  re(zFormat[0]==0
b690: 20 3f 20 22 74 65 73 74 22 20 3a 20 22 65 72 72   ? "test" : "err
b6a0: 6f 72 22 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72  or");.  if( zFor
b6b0: 6d 61 74 5b 30 5d 20 29 7b 0a 20 20 20 20 76 61  mat[0] ){.    va
b6c0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61  _list ap;.    va
b6d0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
b6e0: 61 74 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  at);.    zErr = 
b6f0: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
b700: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
b710: 64 28 61 70 29 3b 0a 20 20 20 20 73 74 79 6c 65  d(ap);.    style
b720: 5f 68 65 61 64 65 72 28 22 42 61 64 20 52 65 71  _header("Bad Req
b730: 75 65 73 74 22 29 3b 0a 20 20 20 20 40 20 3c 68  uest");.    @ <h
b740: 31 3e 2f 25 68 28 67 2e 7a 50 61 74 68 29 3a 20  1>/%h(g.zPath): 
b750: 25 68 28 7a 45 72 72 29 3c 2f 68 31 3e 0a 20 20  %h(zErr)</h1>.  
b760: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 30 3b 0a 20    showAll = 0;. 
b770: 20 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75     cgi_set_statu
b780: 73 28 35 30 30 2c 20 22 42 61 64 20 52 65 71 75  s(500, "Bad Requ
b790: 65 73 74 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  est");.  }else i
b7a0: 66 28 20 21 69 73 41 75 74 68 20 29 7b 0a 20 20  f( !isAuth ){.  
b7b0: 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30    login_needed(0
b7c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c   }else{.    styl
b7e0: 65 5f 68 65 61 64 65 72 28 22 45 6e 76 69 72 6f  e_header("Enviro
b7f0: 6e 6d 65 6e 74 20 54 65 73 74 22 29 3b 0a 20 20  nment Test");.  
b800: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 50 42 28 22    showAll = PB("
b810: 73 68 6f 77 61 6c 6c 22 29 3b 0a 20 20 20 20 73  showall");.    s
b820: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 63 68 65  tyle_submenu_che
b830: 63 6b 62 6f 78 28 22 73 68 6f 77 61 6c 6c 22 2c  ckbox("showall",
b840: 20 22 43 6f 6f 6b 69 65 73 22 2c 20 30 2c 20 30   "Cookies", 0, 0
b850: 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62  );.    style_sub
b860: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 74  menu_element("St
b870: 61 74 73 22 2c 20 22 25 52 2f 73 74 61 74 22 29  ats", "%R/stat")
b880: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 41  ;.  }..  if( isA
b890: 75 74 68 20 29 7b 0a 20 20 23 69 66 20 21 64 65  uth ){.  #if !de
b8a0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
b8b0: 20 20 40 20 75 69 64 3d 25 64 28 67 65 74 75 69    @ uid=%d(getui
b8c0: 64 28 29 29 2c 20 67 69 64 3d 25 64 28 67 65 74  d()), gid=%d(get
b8d0: 67 69 64 28 29 29 3c 62 72 3e 0a 20 20 23 65 6e  gid())<br>.  #en
b8e0: 64 69 66 0a 20 20 20 20 40 20 67 2e 7a 42 61 73  dif.    @ g.zBas
b8f0: 65 55 52 4c 20 3d 20 25 68 28 67 2e 7a 42 61 73  eURL = %h(g.zBas
b900: 65 55 52 4c 29 3c 62 72 3e 0a 20 20 20 20 40 20  eURL)<br>.    @ 
b910: 67 2e 7a 48 74 74 70 73 55 52 4c 20 3d 20 25 68  g.zHttpsURL = %h
b920: 28 67 2e 7a 48 74 74 70 73 55 52 4c 29 3c 62 72  (g.zHttpsURL)<br
b930: 3e 0a 20 20 20 20 40 20 67 2e 7a 54 6f 70 20 3d  >.    @ g.zTop =
b940: 20 25 68 28 67 2e 7a 54 6f 70 29 3c 62 72 3e 0a   %h(g.zTop)<br>.
b950: 20 20 20 20 40 20 67 2e 7a 50 61 74 68 20 3d 20      @ g.zPath = 
b960: 25 68 28 67 2e 7a 50 61 74 68 29 3c 62 72 3e 0a  %h(g.zPath)<br>.
b970: 20 20 20 20 40 20 67 2e 75 73 65 72 55 69 64 20      @ g.userUid 
b980: 3d 20 25 64 28 67 2e 75 73 65 72 55 69 64 29 3c  = %d(g.userUid)<
b990: 62 72 3e 0a 20 20 20 20 40 20 67 2e 7a 4c 6f 67  br>.    @ g.zLog
b9a0: 69 6e 20 3d 20 25 68 28 67 2e 7a 4c 6f 67 69 6e  in = %h(g.zLogin
b9b0: 29 3c 62 72 3e 0a 20 20 20 20 40 20 67 2e 69 73  )<br>.    @ g.is
b9c0: 48 75 6d 61 6e 20 3d 20 25 64 28 67 2e 69 73 48  Human = %d(g.isH
b9d0: 75 6d 61 6e 29 3c 62 72 3e 0a 20 20 20 20 40 20  uman)<br>.    @ 
b9e0: 67 2e 6a 73 48 72 65 66 20 3d 20 25 64 28 67 2e  g.jsHref = %d(g.
b9f0: 6a 73 48 72 65 66 29 3c 62 72 3e 0a 20 20 20 20  jsHref)<br>.    
ba00: 69 66 28 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74  if( g.zLocalRoot
ba10: 20 29 7b 0a 20 20 20 20 20 20 40 20 67 2e 7a 4c   ){.      @ g.zL
ba20: 6f 63 61 6c 52 6f 6f 74 20 3d 20 25 68 28 67 2e  ocalRoot = %h(g.
ba30: 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3c 62 72 3e 0a  zLocalRoot)<br>.
ba40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba50: 20 40 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20   @ g.zLocalRoot 
ba60: 3d 20 3c 69 3e 6e 6f 6e 65 3c 2f 69 3e 3c 62 72  = <i>none</i><br
ba70: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  >.    }.    if( 
ba80: 67 2e 6e 52 65 71 75 65 73 74 20 29 7b 0a 20 20  g.nRequest ){.  
ba90: 20 20 20 20 40 20 67 2e 6e 52 65 71 75 65 73 74      @ g.nRequest
baa0: 20 3d 20 25 64 28 67 2e 6e 52 65 71 75 65 73 74   = %d(g.nRequest
bab0: 29 3c 62 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20  )<br>.    }.    
bac0: 69 66 28 20 67 2e 6e 50 65 6e 64 69 6e 67 52 65  if( g.nPendingRe
bad0: 71 75 65 73 74 3e 31 20 29 7b 0a 20 20 20 20 20  quest>1 ){.     
bae0: 20 40 20 67 2e 6e 50 65 6e 64 69 6e 67 52 65 71   @ g.nPendingReq
baf0: 75 65 73 74 20 3d 20 25 64 28 67 2e 6e 50 65 6e  uest = %d(g.nPen
bb00: 64 69 6e 67 52 65 71 75 65 73 74 29 3c 62 72 3e  dingRequest)<br>
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 63 61 70  .    }.    @ cap
bb20: 61 62 69 6c 69 74 69 65 73 20 3d 20 25 73 28 66  abilities = %s(f
bb30: 69 6e 64 5f 63 61 70 61 62 69 6c 69 74 69 65 73  ind_capabilities
bb40: 28 7a 43 61 70 29 29 3c 62 72 3e 0a 20 20 20 20  (zCap))<br>.    
bb50: 69 66 28 20 7a 43 61 70 5b 30 5d 20 29 7b 0a 20  if( zCap[0] ){. 
bb60: 20 20 20 20 20 40 20 61 6e 6f 6e 79 6d 6f 75 73       @ anonymous
bb70: 2d 61 64 64 73 20 3d 20 25 73 28 66 69 6e 64 5f  -adds = %s(find_
bb80: 61 6e 6f 6e 5f 63 61 70 61 62 69 6c 69 74 69 65  anon_capabilitie
bb90: 73 28 7a 43 61 70 29 29 3c 62 72 3e 0a 20 20 20  s(zCap))<br>.   
bba0: 20 7d 0a 20 20 20 20 40 20 67 2e 7a 52 65 70 6f   }.    @ g.zRepo
bbb0: 73 69 74 6f 72 79 4e 61 6d 65 20 3d 20 25 68 28  sitoryName = %h(
bbc0: 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d  g.zRepositoryNam
bbd0: 65 29 3c 62 72 3e 0a 20 20 20 20 40 20 6c 6f 61  e)<br>.    @ loa
bbe0: 64 5f 61 76 65 72 61 67 65 28 29 20 3d 20 25 66  d_average() = %f
bbf0: 28 6c 6f 61 64 5f 61 76 65 72 61 67 65 28 29 29  (load_average())
bc00: 3c 62 72 3e 0a 23 69 66 6e 64 65 66 20 5f 57 49  <br>.#ifndef _WI
bc10: 4e 33 32 0a 20 20 20 20 40 20 52 53 53 20 3d 20  N32.    @ RSS = 
bc20: 25 2e 32 66 28 66 6f 73 73 69 6c 5f 72 73 73 28  %.2f(fossil_rss(
bc30: 29 2f 31 30 30 30 30 30 30 2e 30 29 20 4d 42 3c  )/1000000.0) MB<
bc40: 2f 62 72 3e 0a 23 65 6e 64 69 66 0a 20 20 20 20  /br>.#endif.    
bc50: 28 76 6f 69 64 29 63 67 69 5f 63 73 72 66 5f 73  (void)cgi_csrf_s
bc60: 61 66 65 28 32 29 3b 0a 20 20 20 20 73 77 69 74  afe(2);.    swit
bc70: 63 68 28 20 67 2e 6f 6b 43 73 72 66 20 29 7b 0a  ch( g.okCsrf ){.
bc80: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a        case 1: {.
bc90: 20 20 20 20 20 20 20 20 20 40 20 43 53 52 46 20           @ CSRF 
bca0: 73 61 66 65 74 79 20 3d 20 53 61 6d 65 20 6f 72  safety = Same or
bcb0: 69 67 69 6e 3c 62 72 3e 0a 20 20 20 20 20 20 20  igin<br>.       
bcc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
bcd0: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 7b  .      case 2: {
bce0: 0a 20 20 20 20 20 20 20 20 20 40 20 43 53 52 46  .         @ CSRF
bcf0: 20 73 61 66 65 74 79 20 3d 20 53 61 6d 65 20 6f   safety = Same o
bd00: 72 69 67 69 6e 2c 20 50 4f 53 54 3c 62 72 3e 0a  rigin, POST<br>.
bd10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
bd30: 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20 20 20  se 3: {.        
bd40: 20 40 20 43 53 52 46 20 73 61 66 65 74 79 20 3d   @ CSRF safety =
bd50: 20 53 61 6d 65 20 6f 72 69 67 69 6e 2c 20 50 4f   Same origin, PO
bd60: 53 54 2c 20 43 53 52 46 20 74 6f 6b 65 6e 3c 62  ST, CSRF token<b
bd70: 72 3e 0a 20 20 20 20 20 20 20 20 20 62 72 65 61  r>.         brea
bd80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
bd90: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
bda0: 20 20 20 20 20 40 20 43 53 52 46 20 73 61 66 65       @ CSRF safe
bdb0: 74 79 20 3d 20 75 6e 73 61 66 65 3c 62 72 3e 0a  ty = unsafe<br>.
bdc0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bdd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
bde0: 20 20 20 40 20 66 6f 73 73 69 6c 5f 65 78 65 5f     @ fossil_exe_
bdf0: 69 64 28 29 20 3d 20 25 68 28 66 6f 73 73 69 6c  id() = %h(fossil
be00: 5f 65 78 65 5f 69 64 28 29 29 3c 62 72 3e 0a 20  _exe_id())<br>. 
be10: 20 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 41 64     if( g.perm.Ad
be20: 6d 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  min ){.      int
be30: 20 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   k;.      for(k=
be40: 30 3b 20 67 2e 61 72 67 76 4f 72 69 67 5b 6b 5d  0; g.argvOrig[k]
be50: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
be60: 42 6c 6f 62 20 74 3b 0a 20 20 20 20 20 20 20 20  Blob t;.        
be70: 62 6c 6f 62 5f 69 6e 69 74 28 26 74 2c 20 30 2c  blob_init(&t, 0,
be80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f   0);.        blo
be90: 62 5f 61 70 70 65 6e 64 5f 65 73 63 61 70 65 64  b_append_escaped
bea0: 5f 61 72 67 28 26 74 2c 20 67 2e 61 72 67 76 4f  _arg(&t, g.argvO
beb0: 72 69 67 5b 6b 5d 2c 20 30 29 3b 0a 20 20 20 20  rig[k], 0);.    
bec0: 20 20 20 20 40 20 61 72 67 76 5b 25 64 28 6b 29      @ argv[%d(k)
bed0: 5d 20 3d 20 25 68 28 62 6c 6f 62 5f 73 74 72 28  ] = %h(blob_str(
bee0: 26 74 29 29 3c 62 72 3e 0a 20 20 20 20 20 20 20  &t))<br>.       
bef0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 29 3b 0a   blob_zero(&t);.
bf00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bf10: 20 20 40 20 3c 68 72 3e 0a 20 20 20 20 50 28 22    @ <hr>.    P("
bf20: 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e 54 22  HTTP_USER_AGENT"
bf30: 29 3b 0a 20 20 20 20 50 28 22 53 45 52 56 45 52  );.    P("SERVER
bf40: 5f 53 4f 46 54 57 41 52 45 22 29 3b 0a 20 20 20  _SOFTWARE");.   
bf50: 20 63 67 69 5f 70 72 69 6e 74 5f 61 6c 6c 28 73   cgi_print_all(s
bf60: 68 6f 77 41 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  howAll, 0, 0);. 
bf70: 20 20 20 40 20 3c 70 3e 3c 66 6f 72 6d 20 6d 65     @ <p><form me
bf80: 74 68 6f 64 3d 22 50 4f 53 54 22 20 61 63 74 69  thod="POST" acti
bf90: 6f 6e 3d 22 25 52 2f 74 65 73 74 5f 65 6e 76 22  on="%R/test_env"
bfa0: 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74  >.    @ <input t
bfb0: 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d  ype="hidden" nam
bfc0: 65 3d 22 73 68 6f 77 61 6c 6c 22 20 76 61 6c 75  e="showall" valu
bfd0: 65 3d 22 25 64 28 73 68 6f 77 41 6c 6c 29 22 3e  e="%d(showAll)">
bfe0: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79  .    @ <input ty
bff0: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65  pe="submit" name
c000: 3d 22 70 6f 73 74 2d 74 65 73 74 2d 62 75 74 74  ="post-test-butt
c010: 6f 6e 22 20 76 61 6c 75 65 3d 22 50 4f 53 54 20  on" value="POST 
c020: 54 65 73 74 22 3e 0a 20 20 20 20 40 20 3c 2f 66  Test">.    @ </f
c030: 6f 72 6d 3e 0a 20 20 20 20 69 66 28 20 73 68 6f  orm>.    if( sho
c040: 77 41 6c 6c 20 26 26 20 62 6c 6f 62 5f 73 69 7a  wAll && blob_siz
c050: 65 28 26 67 2e 68 74 74 70 48 65 61 64 65 72 29  e(&g.httpHeader)
c060: 3e 30 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 68  >0 ){.      @ <h
c070: 72 3e 0a 20 20 20 20 20 20 40 20 3c 70 72 65 3e  r>.      @ <pre>
c080: 0a 20 20 20 20 20 20 40 20 25 68 28 62 6c 6f 62  .      @ %h(blob
c090: 5f 73 74 72 28 26 67 2e 68 74 74 70 48 65 61 64  _str(&g.httpHead
c0a0: 65 72 29 29 0a 20 20 20 20 20 20 40 20 3c 2f 70  er)).      @ </p
c0b0: 72 65 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  re>.    }.  }.  
c0c0: 69 66 28 20 7a 45 72 72 20 26 26 20 7a 45 72 72  if( zErr && zErr
c0d0: 5b 30 5d 20 29 7b 0a 20 20 20 20 73 74 79 6c 65  [0] ){.    style
c0e0: 5f 66 69 6e 69 73 68 5f 70 61 67 65 28 29 3b 0a  _finish_page();.
c0f0: 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b      cgi_reply();
c100: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69 74  .    fossil_exit
c110: 28 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (1);.  }else{.  
c120: 20 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70    style_finish_p
c130: 61 67 65 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age();.  }.}../*
c140: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 4e  .** Generate a N
c150: 6f 74 20 59 65 74 20 49 6d 70 6c 65 6d 65 6e 74  ot Yet Implement
c160: 65 64 20 65 72 72 6f 72 20 70 61 67 65 2e 0a 2a  ed error page..*
c170: 2f 0a 76 6f 69 64 20 77 65 62 70 61 67 65 5f 6e  /.void webpage_n
c180: 6f 74 5f 79 65 74 5f 69 6d 70 6c 65 6d 65 6e 74  ot_yet_implement
c190: 65 64 28 76 6f 69 64 29 7b 0a 20 20 77 65 62 70  ed(void){.  webp
c1a0: 61 67 65 5f 65 72 72 6f 72 28 22 4e 6f 74 20 79  age_error("Not y
c1b0: 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 29  et implemented")
c1c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c1d0: 61 74 65 20 61 20 77 65 62 70 61 67 65 20 66 6f  ate a webpage fo
c1e0: 72 20 61 20 77 65 62 70 61 67 65 5f 61 73 73 65  r a webpage_asse
c1f0: 72 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 77 65  rt()..*/.void we
c200: 62 70 61 67 65 5f 61 73 73 65 72 74 5f 70 61 67  bpage_assert_pag
c210: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
c220: 69 6c 65 2c 20 69 6e 74 20 69 4c 69 6e 65 2c 20  ile, int iLine, 
c230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
c240: 72 29 7b 0a 20 20 66 6f 73 73 69 6c 5f 77 61 72  r){.  fossil_war
c250: 6e 69 6e 67 28 22 61 73 73 65 72 74 69 6f 6e 20  ning("assertion 
c260: 66 61 75 6c 74 20 61 74 20 25 73 3a 25 64 20 2d  fault at %s:%d -
c270: 20 25 73 22 2c 20 7a 46 69 6c 65 2c 20 69 4c 69   %s", zFile, iLi
c280: 6e 65 2c 20 7a 45 78 70 72 29 3b 0a 20 20 63 67  ne, zExpr);.  cg
c290: 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28  i_reset_content(
c2a0: 29 3b 0a 20 20 77 65 62 70 61 67 65 5f 65 72 72  );.  webpage_err
c2b0: 6f 72 28 22 61 73 73 65 72 74 69 6f 6e 20 66 61  or("assertion fa
c2c0: 75 6c 74 20 61 74 20 25 73 3a 25 64 20 2d 20 25  ult at %s:%d - %
c2d0: 73 22 2c 20 7a 46 69 6c 65 2c 20 69 4c 69 6e 65  s", zFile, iLine
c2e0: 2c 20 7a 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , zExpr);.}../*.
c2f0: 2a 2a 20 49 73 73 75 65 20 61 20 34 30 34 20 4e  ** Issue a 404 N
c300: 6f 74 20 46 6f 75 6e 64 20 65 72 72 6f 72 20 66  ot Found error f
c310: 6f 72 20 61 20 77 65 62 70 61 67 65 0a 2a 2f 0a  or a webpage.*/.
c320: 76 6f 69 64 20 77 65 62 70 61 67 65 5f 6e 6f 74  void webpage_not
c330: 66 6f 75 6e 64 5f 65 72 72 6f 72 28 63 6f 6e 73  found_error(cons
c340: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
c350: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
c360: 4d 73 67 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61  Msg;.  va_list a
c370: 70 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61 74  p;.  if( zFormat
c380: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
c390: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
c3a0: 20 20 20 7a 4d 73 67 20 3d 20 76 6d 70 72 69 6e     zMsg = vmprin
c3b0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
c3c0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
c3d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
c3e0: 73 67 20 3d 20 22 4e 6f 74 20 46 6f 75 6e 64 22  sg = "Not Found"
c3f0: 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 73 65  ;.  }.  style_se
c400: 74 5f 63 75 72 72 65 6e 74 5f 66 65 61 74 75 72  t_current_featur
c410: 65 28 22 65 6e 6f 74 66 6f 75 6e 64 22 29 3b 0a  e("enotfound");.
c420: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
c430: 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 40  Not Found");.  @
c440: 20 3c 70 3e 25 68 28 7a 4d 73 67 29 3c 2f 70 3e   <p>%h(zMsg)</p>
c450: 0a 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75  .  cgi_set_statu
c460: 73 28 34 30 34 2c 20 22 4e 6f 74 20 46 6f 75 6e  s(404, "Not Foun
c470: 64 22 29 3b 0a 20 20 73 74 79 6c 65 5f 66 69 6e  d");.  style_fin
c480: 69 73 68 5f 70 61 67 65 28 29 3b 0a 7d 0a 0a 23  ish_page();.}..#
c490: 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23 20 64  if INTERFACE.# d
c4a0: 65 66 69 6e 65 20 77 65 62 70 61 67 65 5f 61 73  efine webpage_as
c4b0: 73 65 72 74 28 54 29 20 69 66 28 21 28 54 29 29  sert(T) if(!(T))
c4c0: 7b 77 65 62 70 61 67 65 5f 61 73 73 65 72 74 5f  {webpage_assert_
c4d0: 70 61 67 65 28 5f 5f 46 49 4c 45 5f 5f 2c 5f 5f  page(__FILE__,__
c4e0: 4c 49 4e 45 5f 5f 2c 23 54 29 3b 7d 0a 23 65 6e  LINE__,#T);}.#en
c4f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
c500: 6e 73 20 61 20 70 73 65 75 64 6f 2d 72 61 6e 64  ns a pseudo-rand
c510: 6f 6d 20 69 6e 70 75 74 20 66 69 65 6c 64 20 49  om input field I
c520: 44 2c 20 66 6f 72 20 75 73 65 20 69 6e 20 61 73  D, for use in as
c530: 73 6f 63 69 61 74 69 6e 67 20 61 6e 0a 2a 2a 20  sociating an.** 
c540: 49 44 2d 6c 65 73 73 20 69 6e 70 75 74 20 66 69  ID-less input fi
c550: 65 6c 64 20 77 69 74 68 20 61 20 6c 61 62 65 6c  eld with a label
c560: 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20  . The memory is 
c570: 6f 77 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  owned by the.** 
c580: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
c590: 63 20 63 68 61 72 20 2a 20 73 74 79 6c 65 5f 6e  c char * style_n
c5a0: 65 78 74 5f 69 6e 70 75 74 5f 69 64 28 29 7b 0a  ext_input_id(){.
c5b0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 70    static int inp
c5c0: 75 74 49 44 20 3d 20 30 3b 0a 20 20 2b 2b 69 6e  utID = 0;.  ++in
c5d0: 70 75 74 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  putID;.  return 
c5e0: 6d 70 72 69 6e 74 66 28 22 69 6e 70 75 74 2d 69  mprintf("input-i
c5f0: 64 2d 25 64 22 2c 20 69 6e 70 75 74 49 44 29 3b  d-%d", inputID);
c600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
c610: 73 20 61 20 6c 61 62 65 6c 65 64 20 63 68 65 63  s a labeled chec
c620: 6b 62 6f 78 20 65 6c 65 6d 65 6e 74 2e 20 7a 57  kbox element. zW
c630: 72 61 70 70 65 72 49 64 20 69 73 20 61 6e 20 6f  rapperId is an o
c640: 70 74 69 6f 6e 61 6c 20 49 44 0a 2a 2a 20 76 61  ptional ID.** va
c650: 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 74  lue for the cont
c660: 61 69 6e 69 6e 67 20 65 6c 65 6d 65 6e 74 20 28  aining element (
c670: 73 65 65 20 62 65 6c 6f 77 29 2e 20 7a 46 69 65  see below). zFie
c680: 6c 64 4e 61 6d 65 20 69 73 20 74 68 65 0a 2a 2a  ldName is the.**
c690: 20 66 6f 72 6d 20 65 6c 65 6d 65 6e 74 20 6e 61   form element na
c6a0: 6d 65 2e 20 7a 4c 61 62 65 6c 20 69 73 20 74 68  me. zLabel is th
c6b0: 65 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  e label for the 
c6c0: 63 68 65 63 6b 62 6f 78 2e 20 7a 56 61 6c 75 65  checkbox. zValue
c6d0: 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 74 69 6f   is.** the optio
c6e0: 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  nal value for th
c6f0: 65 20 63 68 65 63 6b 62 6f 78 2e 20 7a 54 69 70  e checkbox. zTip
c700: 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20   is an optional 
c710: 74 6f 6f 6c 74 69 70 2c 0a 2a 2a 20 77 68 69 63  tooltip,.** whic
c720: 68 20 67 65 74 73 20 73 65 74 20 61 73 20 74 68  h gets set as th
c730: 65 20 22 74 69 74 6c 65 22 20 61 74 74 72 69 62  e "title" attrib
c740: 75 74 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ute of the outer
c750: 6d 6f 73 74 0a 2a 2a 20 65 6c 65 6d 65 6e 74 2e  most.** element.
c760: 20 49 66 20 69 73 43 68 65 63 6b 65 64 20 69 73   If isChecked is
c770: 20 74 72 75 65 2c 20 74 68 65 20 63 68 65 63 6b   true, the check
c780: 62 6f 78 20 67 65 74 73 20 74 68 65 20 22 63 68  box gets the "ch
c790: 65 63 6b 65 64 22 0a 2a 2a 20 61 74 74 72 69 62  ecked".** attrib
c7a0: 75 74 65 20 73 65 74 2c 20 65 6c 73 65 20 69 74  ute set, else it
c7b0: 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 52   is not..**.** R
c7c0: 65 73 75 6c 74 69 6e 67 20 73 74 72 75 63 74 75  esulting structu
c7d0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 3c 64 69 76 20 63  re:.**.** <div c
c7e0: 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69 74 68  lass='input-with
c7f0: 2d 6c 61 62 65 6c 27 20 74 69 74 6c 65 3d 7b 7b  -label' title={{
c800: 7a 54 69 70 7d 7d 20 69 64 3d 7b 7b 7a 57 72 61  zTip}} id={{zWra
c810: 70 70 65 72 49 64 7d 7d 3e 0a 2a 2a 20 20 20 3c  pperId}}>.**   <
c820: 69 6e 70 75 74 20 74 79 70 65 3d 27 63 68 65 63  input type='chec
c830: 6b 62 6f 78 27 20 6e 61 6d 65 3d 7b 7b 7a 46 69  kbox' name={{zFi
c840: 65 6c 64 4e 61 6d 65 7d 7d 20 76 61 6c 75 65 3d  eldName}} value=
c850: 7b 7b 7a 56 61 6c 75 65 7d 7d 0a 2a 2a 20 20 20  {{zValue}}.**   
c860: 20 20 20 20 20 20 20 69 64 3d 27 41 20 52 41 4e         id='A RAN
c870: 44 4f 4d 20 56 41 4c 55 45 27 0a 2a 2a 20 20 20  DOM VALUE'.**   
c880: 20 20 20 20 20 20 20 7b 7b 69 73 43 68 65 63 6b         {{isCheck
c890: 65 64 20 3f 20 22 20 63 68 65 63 6b 65 64 20 3a  ed ? " checked :
c8a0: 20 22 22 7d 7d 2f 3e 0a 2a 2a 20 20 20 3c 6c 61   ""}}/>.**   <la
c8b0: 62 65 6c 20 66 6f 72 3d 27 49 44 20 4f 46 20 54  bel for='ID OF T
c8c0: 48 45 20 49 4e 50 55 54 20 46 49 45 4c 44 27 3e  HE INPUT FIELD'>
c8d0: 7b 7b 7a 4c 61 62 65 6c 7d 7d 3c 2f 6c 61 62 65  {{zLabel}}</labe
c8e0: 6c 3e 0a 2a 2a 20 3c 2f 64 69 76 3e 0a 2a 2a 0a  l>.** </div>.**.
c8f0: 2a 2a 20 7a 4c 61 62 65 6c 2c 20 61 6e 64 20 7a  ** zLabel, and z
c900: 56 61 6c 75 65 20 61 72 65 20 72 65 71 75 69 72  Value are requir
c910: 65 64 2e 20 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  ed. zFieldName, 
c920: 7a 57 72 61 70 70 65 72 49 64 2c 20 61 6e 64 20  zWrapperId, and 
c930: 7a 54 69 70 0a 2a 2a 20 61 72 65 20 6d 61 79 20  zTip.** are may 
c940: 62 65 20 4e 55 4c 4c 20 6f 72 20 65 6d 70 74 79  be NULL or empty
c950: 2e 0a 2a 2a 0a 2a 2a 20 42 65 20 73 75 72 65 20  ..**.** Be sure 
c960: 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 2d 77  that the input-w
c970: 69 74 68 2d 6c 61 62 65 6c 20 43 53 53 20 63 6c  ith-label CSS cl
c980: 61 73 73 20 69 73 20 64 65 66 69 6e 65 64 20 73  ass is defined s
c990: 65 6e 73 69 62 6c 79 2c 20 69 6e 0a 2a 2a 20 70  ensibly, in.** p
c9a0: 61 72 74 69 63 75 6c 61 72 2c 20 68 61 76 69 6e  articular, havin
c9b0: 67 20 69 74 73 20 64 69 73 70 6c 61 79 3a 69 6e  g its display:in
c9c0: 6c 69 6e 65 2d 62 6c 6f 63 6b 20 69 73 20 75 73  line-block is us
c9d0: 65 66 75 6c 20 66 6f 72 20 61 6c 69 67 6e 6d 65  eful for alignme
c9e0: 6e 74 0a 2a 2a 20 70 75 72 70 6f 73 65 73 2e 0a  nt.** purposes..
c9f0: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 6c 61  */.void style_la
ca00: 62 65 6c 65 64 5f 63 68 65 63 6b 62 6f 78 28 63  beled_checkbox(c
ca10: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 57 72 61  onst char * zWra
ca20: 70 70 65 72 49 64 2c 0a 20 20 20 20 20 20 20 20  pperId,.        
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ca50: 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 63 6f 6e 73  zFieldName, cons
ca60: 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c 2c  t char * zLabel,
ca70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
ca90: 73 74 20 63 68 61 72 20 2a 20 7a 56 61 6c 75 65  st char * zValue
caa0: 2c 20 69 6e 74 20 69 73 43 68 65 63 6b 65 64 2c  , int isChecked,
cab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
cad0: 73 74 20 63 68 61 72 20 2a 20 7a 54 69 70 29 7b  st char * zTip){
cae0: 0a 20 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c  .  char * zLabel
caf0: 49 44 20 3d 20 73 74 79 6c 65 5f 6e 65 78 74 5f  ID = style_next_
cb00: 69 6e 70 75 74 5f 69 64 28 29 3b 0a 20 20 43 58  input_id();.  CX
cb10: 28 22 3c 64 69 76 20 63 6c 61 73 73 3d 27 69 6e  ("<div class='in
cb20: 70 75 74 2d 77 69 74 68 2d 6c 61 62 65 6c 27 22  put-with-label'"
cb30: 29 3b 0a 20 20 69 66 28 7a 54 69 70 20 26 26 20  );.  if(zTip && 
cb40: 2a 7a 54 69 70 29 7b 0a 20 20 20 20 43 58 28 22  *zTip){.    CX("
cb50: 20 74 69 74 6c 65 3d 27 25 68 27 22 2c 20 7a 54   title='%h'", zT
cb60: 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 7a 57  ip);.  }.  if(zW
cb70: 72 61 70 70 65 72 49 64 20 26 26 20 2a 7a 57 72  rapperId && *zWr
cb80: 61 70 70 65 72 49 64 29 7b 0a 20 20 20 20 43 58  apperId){.    CX
cb90: 28 22 20 69 64 3d 27 25 73 27 22 2c 7a 57 72 61  (" id='%s'",zWra
cba0: 70 70 65 72 49 64 29 3b 0a 20 20 7d 0a 20 20 43  pperId);.  }.  C
cbb0: 58 28 22 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d  X("><input type=
cbc0: 27 63 68 65 63 6b 62 6f 78 27 20 69 64 3d 27 25  'checkbox' id='%
cbd0: 73 27 20 22 2c 20 7a 4c 61 62 65 6c 49 44 29 3b  s' ", zLabelID);
cbe0: 0a 20 20 69 66 28 7a 46 69 65 6c 64 4e 61 6d 65  .  if(zFieldName
cbf0: 20 26 26 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 29   && *zFieldName)
cc00: 7b 0a 20 20 20 20 43 58 28 22 6e 61 6d 65 3d 27  {.    CX("name='
cc10: 25 73 27 20 22 2c 7a 46 69 65 6c 64 4e 61 6d 65  %s' ",zFieldName
cc20: 29 3b 0a 20 20 7d 0a 20 20 43 58 28 22 76 61 6c  );.  }.  CX("val
cc30: 75 65 3d 27 25 54 27 25 73 2f 3e 22 2c 0a 20 20  ue='%T'%s/>",.  
cc40: 20 20 20 7a 56 61 6c 75 65 20 3f 20 7a 56 61 6c     zValue ? zVal
cc50: 75 65 20 3a 20 22 22 2c 20 69 73 43 68 65 63 6b  ue : "", isCheck
cc60: 65 64 20 3f 20 22 20 63 68 65 63 6b 65 64 22 20  ed ? " checked" 
cc70: 3a 20 22 22 29 3b 0a 20 20 43 58 28 22 3c 6c 61  : "");.  CX("<la
cc80: 62 65 6c 20 66 6f 72 3d 27 25 73 27 3e 25 68 3c  bel for='%s'>%h<
cc90: 2f 6c 61 62 65 6c 3e 3c 2f 64 69 76 3e 22 2c 20  /label></div>", 
cca0: 7a 4c 61 62 65 6c 49 44 2c 20 7a 4c 61 62 65 6c  zLabelID, zLabel
ccb0: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
ccc0: 28 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d 0a 0a 2f  (zLabelID);.}../
ccd0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 73 20 61 20 53  *.** Outputs a S
cce0: 45 4c 45 43 54 20 6c 69 73 74 20 66 72 6f 6d 20  ELECT list from 
ccf0: 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6c  a compile-time l
cd00: 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72 73 2e  ist of integers.
cd10: 0a 2a 2a 20 54 68 65 20 76 61 72 67 73 20 6d 75  .** The vargs mu
cd20: 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20  st be a list of 
cd30: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69  (const char *, i
cd40: 6e 74 29 20 70 61 69 72 73 2c 20 74 65 72 6d 69  nt) pairs, termi
cd50: 6e 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 61 20  nated.** with a 
cd60: 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 20 45 61 63  single NULL. Eac
cd70: 68 20 70 61 69 72 20 69 73 20 69 6e 74 65 72 70  h pair is interp
cd80: 72 65 74 65 64 20 61 73 2e 2e 2e 0a 2a 2a 0a 2a  reted as....**.*
cd90: 2a 20 49 66 20 74 68 65 20 28 63 6f 6e 73 74 20  * If the (const 
cda0: 63 68 61 72 20 2a 29 20 69 73 20 4e 55 4c 4c 2c  char *) is NULL,
cdb0: 20 69 74 20 69 73 20 74 68 65 20 65 6e 64 20 6f   it is the end o
cdc0: 66 20 74 68 65 20 6c 69 73 74 2c 20 65 6c 73 65  f the list, else
cdd0: 0a 2a 2a 20 61 20 6e 65 77 20 4f 50 54 49 4f 4e  .** a new OPTION
cde0: 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
cdf0: 64 2e 20 49 66 20 74 68 65 20 73 74 72 69 6e 67  d. If the string
ce00: 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 0a 2a   is empty, the.*
ce10: 2a 20 6c 61 62 65 6c 20 61 6e 64 20 76 61 6c 75  * label and valu
ce20: 65 20 6f 66 20 74 68 65 20 4f 50 54 49 4f 4e 20  e of the OPTION 
ce30: 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 70  is the integer p
ce40: 61 72 74 20 6f 66 20 74 68 65 20 70 61 69 72 2e  art of the pair.
ce50: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
ce60: 67 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  g is not empty, 
ce70: 69 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  it becomes the l
ce80: 61 62 65 6c 20 61 6e 64 20 74 68 65 20 69 6e 74  abel and the int
ce90: 65 67 65 72 0a 2a 2a 20 74 68 65 20 76 61 6c 75  eger.** the valu
cea0: 65 2e 20 49 66 20 74 68 61 74 20 76 61 6c 75 65  e. If that value
ceb0: 20 3d 3d 20 73 65 6c 65 63 74 65 64 56 61 6c 75   == selectedValu
cec0: 65 20 74 68 65 6e 20 74 68 61 74 20 4f 50 54 49  e then that OPTI
ced0: 4f 4e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 67 65  ON.** element ge
cee0: 74 73 20 74 68 65 20 27 73 65 6c 65 63 74 65 64  ts the 'selected
cef0: 27 20 61 74 74 72 69 62 75 74 65 2e 0a 2a 2a 0a  ' attribute..**.
cf00: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
cf10: 20 70 61 69 72 73 20 61 72 65 20 6e 6f 74 20 69   pairs are not i
cf20: 6e 20 28 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68  n (int, const ch
cf30: 61 72 20 2a 29 20 6f 72 64 65 72 20 62 65 63 61  ar *) order beca
cf40: 75 73 65 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  use.** there is 
cf50: 6e 6f 20 77 65 6c 6c 2d 6b 6e 6f 77 6e 20 69 6e  no well-known in
cf60: 74 65 67 65 72 20 76 61 6c 75 65 20 77 68 69 63  teger value whic
cf70: 68 20 77 65 20 63 61 6e 20 64 65 66 69 6e 69 74  h we can definit
cf80: 69 76 65 6c 79 20 75 73 65 0a 2a 2a 20 61 73 20  ively use.** as 
cf90: 61 20 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  a list terminato
cfa0: 72 2e 0a 2a 2a 0a 2a 2a 20 7a 57 72 61 70 70 65  r..**.** zWrappe
cfb0: 72 49 64 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e  rId is an option
cfc0: 61 6c 20 49 44 20 76 61 6c 75 65 20 66 6f 72 20  al ID value for 
cfd0: 74 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 65  the containing e
cfe0: 6c 65 6d 65 6e 74 20 28 73 65 65 0a 2a 2a 20 62  lement (see.** b
cff0: 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a 2a 20 7a 46 69  elow)..**.** zFi
d000: 65 6c 64 4e 61 6d 65 20 69 73 20 74 68 65 20 76  eldName is the v
d010: 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  alue of the form
d020: 20 65 6c 65 6d 65 6e 74 27 73 20 6e 61 6d 65 20   element's name 
d030: 61 74 74 72 69 62 75 74 65 2e 20 4e 6f 74 65 0a  attribute. Note.
d040: 2a 2a 20 74 68 61 74 20 66 6f 73 73 69 6c 20 70  ** that fossil p
d050: 72 65 66 65 72 73 20 75 6e 64 65 72 73 63 6f 72  refers underscor
d060: 65 73 20 6f 76 65 72 20 27 2d 27 20 66 6f 72 20  es over '-' for 
d070: 73 65 70 61 72 61 74 6f 72 73 20 69 6e 20 66 6f  separators in fo
d080: 72 6d 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6e 61  rm.** element na
d090: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 7a 4c 61 62 65  mes..**.** zLabe
d0a0: 6c 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  l is an optional
d0b0: 20 73 74 72 69 6e 67 20 74 6f 20 75 73 65 20 61   string to use a
d0c0: 73 20 61 20 22 6c 61 62 65 6c 22 20 66 6f 72 20  s a "label" for 
d0d0: 74 68 65 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 28  the element.** (
d0e0: 73 65 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a  see below)..**.*
d0f0: 2a 20 7a 54 6f 6f 6c 74 69 70 20 69 73 20 61 6e  * zTooltip is an
d100: 20 6f 70 74 69 6f 6e 61 6c 20 76 61 6c 75 65 20   optional value 
d110: 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 27 73  for the SELECT's
d120: 20 74 69 74 6c 65 20 61 74 74 72 69 62 75 74 65   title attribute
d130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 75  ..**.** The stru
d140: 63 74 75 72 65 20 6f 66 20 74 68 65 20 65 6d 69  cture of the emi
d150: 74 74 65 64 20 48 54 4d 4c 20 69 73 3a 0a 2a 2a  tted HTML is:.**
d160: 0a 2a 2a 20 3c 64 69 76 20 63 6c 61 73 73 3d 27  .** <div class='
d170: 69 6e 70 75 74 2d 77 69 74 68 2d 6c 61 62 65 6c  input-with-label
d180: 27 20 74 69 74 6c 65 3d 7b 7b 7a 54 6f 6f 6c 54  ' title={{zToolT
d190: 69 70 7d 7d 20 69 64 3d 7b 7b 7a 57 72 61 70 70  ip}} id={{zWrapp
d1a0: 65 72 49 64 7d 7d 3e 0a 2a 2a 20 20 20 3c 6c 61  erId}}>.**   <la
d1b0: 62 65 6c 20 66 6f 72 3d 27 53 45 4c 45 43 54 20  bel for='SELECT 
d1c0: 45 4c 45 4d 45 4e 54 20 49 44 27 3e 7b 7b 7a 4c  ELEMENT ID'>{{zL
d1d0: 61 62 65 6c 7d 7d 3c 2f 6c 61 62 65 6c 3e 0a 2a  abel}}</label>.*
d1e0: 2a 20 20 20 3c 73 65 6c 65 63 74 20 69 64 3d 27  *   <select id='
d1f0: 52 41 4e 44 4f 4d 20 49 44 27 20 6e 61 6d 65 3d  RANDOM ID' name=
d200: 7b 7b 7a 46 69 65 6c 64 4e 61 6d 65 7d 7d 3e 2e  {{zFieldName}}>.
d210: 2e 2e 3c 2f 73 65 6c 65 63 74 3e 0a 2a 2a 20 3c  ..</select>.** <
d220: 2f 64 69 76 3e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  /div>.**.** Exam
d230: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 73 74 79 6c 65  ple:.**.** style
d240: 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f 69 6e 74  _select_list_int
d250: 28 22 6d 79 2d 67 72 61 70 65 73 22 2c 20 22 6d  ("my-grapes", "m
d260: 79 5f 67 72 61 70 65 73 22 2c 20 22 47 72 61 70  y_grapes", "Grap
d270: 65 73 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  es",.**         
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 65               "Se
d290: 6c 65 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  lect the number 
d2a0: 6f 66 20 67 72 61 70 65 73 22 2c 0a 2a 2a 20 20  of grapes",.**  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 61 74 6f 69 28 50 44 28 22 6d 79       atoi(PD("my
d2d0: 5f 66 69 65 6c 64 22 2c 22 30 22 29 29 2c 0a 2a  _field","0")),.*
d2e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d2f0: 20 20 20 20 20 20 20 20 22 22 2c 20 31 2c 20 22          "", 1, "
d300: 32 22 2c 20 32 2c 20 22 54 68 72 65 65 22 2c 20  2", 2, "Three", 
d310: 33 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3,.**           
d320: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
d330: 29 3b 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 74  );.**.*/.void st
d340: 79 6c 65 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f  yle_select_list_
d350: 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  int(const char *
d360: 20 7a 57 72 61 70 70 65 72 49 64 2c 0a 20 20 20   zWrapperId,.   
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
d390: 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  ar *zFieldName, 
d3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61  const char * zLa
d3b0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  bel,.           
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 54 6f  const char * zTo
d3e0: 6f 6c 54 69 70 2c 20 69 6e 74 20 73 65 6c 65 63  olTip, int selec
d3f0: 74 65 64 56 61 6c 2c 0a 20 20 20 20 20 20 20 20  tedVal,.        
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 2e 2e 2e 20 29 7b 0a 20 20 63 68 61 72     ... ){.  char
d420: 20 2a 20 7a 4c 61 62 65 6c 49 44 20 3d 20 73 74   * zLabelID = st
d430: 79 6c 65 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69  yle_next_input_i
d440: 64 28 29 3b 0a 20 20 76 61 5f 6c 69 73 74 20 76  d();.  va_list v
d450: 61 72 67 73 3b 0a 0a 20 20 76 61 5f 73 74 61 72  args;..  va_star
d460: 74 28 76 61 72 67 73 2c 73 65 6c 65 63 74 65 64  t(vargs,selected
d470: 56 61 6c 29 3b 0a 20 20 43 58 28 22 3c 64 69 76  Val);.  CX("<div
d480: 20 63 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69   class='input-wi
d490: 74 68 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20 69  th-label'");.  i
d4a0: 66 28 7a 54 6f 6f 6c 54 69 70 20 26 26 20 2a 7a  f(zToolTip && *z
d4b0: 54 6f 6f 6c 54 69 70 29 7b 0a 20 20 20 20 43 58  ToolTip){.    CX
d4c0: 28 22 20 74 69 74 6c 65 3d 27 25 68 27 22 2c 7a  (" title='%h'",z
d4d0: 54 6f 6f 6c 54 69 70 29 3b 0a 20 20 7d 0a 20 20  ToolTip);.  }.  
d4e0: 69 66 28 7a 57 72 61 70 70 65 72 49 64 20 26 26  if(zWrapperId &&
d4f0: 20 2a 7a 57 72 61 70 70 65 72 49 64 29 7b 0a 20   *zWrapperId){. 
d500: 20 20 20 43 58 28 22 20 69 64 3d 27 25 73 27 22     CX(" id='%s'"
d510: 2c 7a 57 72 61 70 70 65 72 49 64 29 3b 0a 20 20  ,zWrapperId);.  
d520: 7d 0a 20 20 43 58 28 22 3e 22 29 3b 0a 20 20 69  }.  CX(">");.  i
d530: 66 28 7a 4c 61 62 65 6c 20 26 26 20 2a 7a 4c 61  f(zLabel && *zLa
d540: 62 65 6c 29 7b 0a 20 20 20 20 43 58 28 22 3c 6c  bel){.    CX("<l
d550: 61 62 65 6c 20 66 6f 72 3d 27 25 73 27 3e 25 68  abel for='%s'>%h
d560: 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c 61 62 65  </label>", zLabe
d570: 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20  lID, zLabel);.  
d580: 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65 63 74 20  }.  CX("<select 
d590: 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d 27 25 73  name='%s' id='%s
d5a0: 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  '>",zFieldName, 
d5b0: 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20 77 68 69  zLabelID);.  whi
d5c0: 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f 6e 73 74  le(1){.    const
d5d0: 20 63 68 61 72 20 2a 20 7a 4f 70 74 69 6f 6e 20   char * zOption 
d5e0: 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c 63  = va_arg(vargs,c
d5f0: 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 6e 74 20  har *);.    int 
d600: 76 3b 0a 20 20 20 20 69 66 28 4e 55 4c 4c 3d 3d  v;.    if(NULL==
d610: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20  zOption){.      
d620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d630: 20 76 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67   v = va_arg(varg
d640: 73 2c 69 6e 74 29 3b 0a 20 20 20 20 43 58 28 22  s,int);.    CX("
d650: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25  <option value='%
d660: 64 27 25 73 3e 22 2c 0a 20 20 20 20 20 20 20 20  d'%s>",.        
d670: 20 76 2c 20 76 3d 3d 73 65 6c 65 63 74 65 64 56   v, v==selectedV
d680: 61 6c 20 3f 20 22 20 73 65 6c 65 63 74 65 64 22  al ? " selected"
d690: 20 3a 20 22 22 29 3b 0a 20 20 20 20 69 66 28 2a   : "");.    if(*
d6a0: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20  zOption){.      
d6b0: 43 58 28 22 25 73 22 2c 20 7a 4f 70 74 69 6f 6e  CX("%s", zOption
d6c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d6d0: 20 20 20 20 43 58 28 22 25 64 22 2c 76 29 3b 0a      CX("%d",v);.
d6e0: 20 20 20 20 7d 0a 20 20 20 20 43 58 28 22 3c 2f      }.    CX("</
d6f0: 6f 70 74 69 6f 6e 3e 5c 6e 22 29 3b 0a 20 20 7d  option>\n");.  }
d700: 0a 20 20 43 58 28 22 3c 2f 73 65 6c 65 63 74 3e  .  CX("</select>
d710: 5c 6e 22 29 3b 0a 20 20 43 58 28 22 3c 2f 64 69  \n");.  CX("</di
d720: 76 3e 5c 6e 22 29 3b 0a 20 20 76 61 5f 65 6e 64  v>\n");.  va_end
d730: 28 76 61 72 67 73 29 3b 0a 20 20 66 6f 73 73 69  (vargs);.  fossi
d740: 6c 5f 66 72 65 65 28 7a 4c 61 62 65 6c 49 44 29  l_free(zLabelID)
d750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
d760: 2d 73 74 72 69 6e 67 20 63 6f 75 6e 74 65 72 70  -string counterp
d770: 61 72 74 20 6f 66 20 73 74 79 6c 65 5f 73 65 6c  art of style_sel
d780: 65 63 74 5f 6c 69 73 74 5f 69 6e 74 28 29 2c 20  ect_list_int(), 
d790: 74 68 69 73 20 76 61 72 69 61 6e 74 0a 2a 2a 20  this variant.** 
d7a0: 64 69 66 66 65 72 73 20 6f 6e 6c 79 20 69 6e 20  differs only in 
d7b0: 74 68 61 74 20 69 74 73 20 76 61 72 69 61 64 69  that its variadi
d7c0: 63 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  c arguments are 
d7d0: 43 2d 73 74 72 69 6e 67 73 20 69 6e 20 70 61 69  C-strings in pai
d7e0: 72 73 0a 2a 2a 20 6f 66 20 28 6f 70 74 69 6f 6e  rs.** of (option
d7f0: 4c 61 62 65 6c 2c 20 6f 70 74 69 6f 6e 56 61 6c  Label, optionVal
d800: 75 65 29 2e 20 49 66 20 61 20 67 69 76 65 6e 20  ue). If a given 
d810: 6f 70 74 69 6f 6e 4c 61 62 65 6c 20 69 73 20 61  optionLabel is a
d820: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
d830: 67 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  g, the correspon
d840: 64 69 6e 67 20 6f 70 74 69 6f 6e 56 61 6c 75 65  ding optionValue
d850: 20 69 73 20 75 73 65 64 20 61 73 20 69 74 73 20   is used as its 
d860: 6c 61 62 65 6c 2e 20 49 66 20 61 6e 79 0a 2a 2a  label. If any.**
d870: 20 67 69 76 65 6e 20 76 61 6c 75 65 20 6d 61 74   given value mat
d880: 63 68 65 73 20 7a 53 65 6c 65 63 74 65 64 56 61  ches zSelectedVa
d890: 6c 2c 20 74 68 61 74 20 6f 70 74 69 6f 6e 20 67  l, that option g
d8a0: 65 74 73 20 70 72 65 73 65 6c 65 63 74 65 64 2e  ets preselected.
d8b0: 20 49 66 0a 2a 2a 20 6e 6f 20 6f 70 74 69 6f 6e   If.** no option
d8c0: 73 20 6d 61 74 63 68 20 7a 53 65 6c 65 63 74 65  s match zSelecte
d8d0: 64 56 61 6c 20 74 68 65 6e 20 74 68 65 20 66 69  dVal then the fi
d8e0: 72 73 74 20 65 6e 74 72 79 20 69 73 20 73 65 6c  rst entry is sel
d8f0: 65 63 74 65 64 20 62 79 0a 2a 2a 20 64 65 66 61  ected by.** defa
d900: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 6f  ult..**.** Any o
d910: 66 20 28 7a 57 72 61 70 70 65 72 49 64 2c 20 7a  f (zWrapperId, z
d920: 54 6f 6f 6c 74 69 70 2c 20 7a 53 65 6c 65 63 74  Tooltip, zSelect
d930: 65 64 56 61 6c 29 20 6d 61 79 20 62 65 20 4e 55  edVal) may be NU
d940: 4c 4c 20 6f 72 20 65 6d 70 74 79 2e 0a 2a 2a 0a  LL or empty..**.
d950: 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  ** Example:.**.*
d960: 2a 20 73 74 79 6c 65 5f 73 65 6c 65 63 74 5f 6c  * style_select_l
d970: 69 73 74 5f 73 74 72 28 22 6d 79 2d 67 72 61 70  ist_str("my-grap
d980: 65 73 22 2c 20 22 6d 79 5f 67 72 61 70 65 73 22  es", "my_grapes"
d990: 2c 20 22 47 72 61 70 65 73 22 2c 0a 2a 2a 20 20  , "Grapes",.**  
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 20 22 53 65 6c 65 63 74 20 74 68 65 20      "Select the 
d9c0: 6e 75 6d 62 65 72 20 6f 66 20 67 72 61 70 65 73  number of grapes
d9d0: 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ",.**           
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 50 28 22 6d              P("m
d9f0: 79 5f 66 69 65 6c 64 22 29 2c 0a 2a 2a 20 20 20  y_field"),.**   
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 22 31 22 2c 20 22 4f 6e 65 22 2c 20      "1", "One", 
da20: 22 32 22 2c 20 22 54 77 6f 22 2c 20 22 22 2c 20  "2", "Two", "", 
da30: 22 33 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  "3",.**         
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
da50: 4c 4c 29 3b 0a 2a 2f 0a 76 6f 69 64 20 73 74 79  LL);.*/.void sty
da60: 6c 65 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f 73  le_select_list_s
da70: 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  tr(const char * 
da80: 7a 57 72 61 70 70 65 72 49 64 2c 0a 20 20 20 20  zWrapperId,.    
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
dab0: 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 63  r *zFieldName, c
dac0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 62  onst char * zLab
dad0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
daf0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 54 6f 6f  onst char * zToo
db00: 6c 54 69 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  lTip, char const
db10: 20 2a 20 7a 53 65 6c 65 63 74 65 64 56 61 6c 2c   * zSelectedVal,
db20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db30: 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 20              ... 
db40: 29 7b 0a 20 20 63 68 61 72 20 2a 20 7a 4c 61 62  ){.  char * zLab
db50: 65 6c 49 44 20 3d 20 73 74 79 6c 65 5f 6e 65 78  elID = style_nex
db60: 74 5f 69 6e 70 75 74 5f 69 64 28 29 3b 0a 20 20  t_input_id();.  
db70: 76 61 5f 6c 69 73 74 20 76 61 72 67 73 3b 0a 0a  va_list vargs;..
db80: 20 20 76 61 5f 73 74 61 72 74 28 76 61 72 67 73    va_start(vargs
db90: 2c 7a 53 65 6c 65 63 74 65 64 56 61 6c 29 3b 0a  ,zSelectedVal);.
dba0: 20 20 69 66 28 21 7a 53 65 6c 65 63 74 65 64 56    if(!zSelectedV
dbb0: 61 6c 29 7b 0a 20 20 20 20 7a 53 65 6c 65 63 74  al){.    zSelect
dbc0: 65 64 56 61 6c 20 3d 20 5f 5f 46 49 4c 45 5f 5f  edVal = __FILE__
dbd0: 2f 2a 73 6f 6d 65 20 73 74 72 69 6e 67 20 77 65  /*some string we
dbe0: 27 6c 6c 20 6e 65 76 65 72 20 6d 61 74 63 68 2a  'll never match*
dbf0: 2f 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3c 64 69  /;.  }.  CX("<di
dc00: 76 20 63 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77  v class='input-w
dc10: 69 74 68 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20  ith-label'");.  
dc20: 69 66 28 7a 54 6f 6f 6c 54 69 70 20 26 26 20 2a  if(zToolTip && *
dc30: 7a 54 6f 6f 6c 54 69 70 29 7b 0a 20 20 20 20 43  zToolTip){.    C
dc40: 58 28 22 20 74 69 74 6c 65 3d 27 25 68 27 22 2c  X(" title='%h'",
dc50: 7a 54 6f 6f 6c 54 69 70 29 3b 0a 20 20 7d 0a 20  zToolTip);.  }. 
dc60: 20 69 66 28 7a 57 72 61 70 70 65 72 49 64 20 26   if(zWrapperId &
dc70: 26 20 2a 7a 57 72 61 70 70 65 72 49 64 29 7b 0a  & *zWrapperId){.
dc80: 20 20 20 20 43 58 28 22 20 69 64 3d 27 25 73 27      CX(" id='%s'
dc90: 22 2c 7a 57 72 61 70 70 65 72 49 64 29 3b 0a 20  ",zWrapperId);. 
dca0: 20 7d 0a 20 20 43 58 28 22 3e 22 29 3b 0a 20 20   }.  CX(">");.  
dcb0: 69 66 28 7a 4c 61 62 65 6c 20 26 26 20 2a 7a 4c  if(zLabel && *zL
dcc0: 61 62 65 6c 29 7b 0a 20 20 20 20 43 58 28 22 3c  abel){.    CX("<
dcd0: 6c 61 62 65 6c 20 66 6f 72 3d 27 25 73 27 3e 25  label for='%s'>%
dce0: 68 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c 61 62  h</label>", zLab
dcf0: 65 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20  elID, zLabel);. 
dd00: 20 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65 63 74   }.  CX("<select
dd10: 20 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d 27 25   name='%s' id='%
dd20: 73 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d 65 2c  s'>",zFieldName,
dd30: 20 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20 77 68   zLabelID);.  wh
dd40: 69 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f 6e 73  ile(1){.    cons
dd50: 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c 20  t char * zLabel 
dd60: 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c 63  = va_arg(vargs,c
dd70: 68 61 72 20 2a 29 3b 0a 20 20 20 20 63 6f 6e 73  har *);.    cons
dd80: 74 20 63 68 61 72 20 2a 20 7a 56 61 6c 3b 0a 20  t char * zVal;. 
dd90: 20 20 20 69 66 28 4e 55 4c 4c 3d 3d 7a 4c 61 62     if(NULL==zLab
dda0: 65 6c 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  el){.      break
ddb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c  ;.    }.    zVal
ddc0: 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c   = va_arg(vargs,
ddd0: 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 43 58 28  char *);.    CX(
dde0: 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27  "<option value='
ddf0: 25 54 27 25 73 3e 22 2c 0a 20 20 20 20 20 20 20  %T'%s>",.       
de00: 7a 56 61 6c 2c 20 30 3d 3d 66 6f 73 73 69 6c 5f  zVal, 0==fossil_
de10: 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a 53 65  strcmp(zVal, zSe
de20: 6c 65 63 74 65 64 56 61 6c 29 20 3f 20 22 20 73  lectedVal) ? " s
de30: 65 6c 65 63 74 65 64 22 20 3a 20 22 22 29 3b 0a  elected" : "");.
de40: 20 20 20 20 69 66 28 2a 7a 4c 61 62 65 6c 29 7b      if(*zLabel){
de50: 0a 20 20 20 20 20 20 43 58 28 22 25 73 22 2c 20  .      CX("%s", 
de60: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 7d 65 6c  zLabel);.    }el
de70: 73 65 7b 0a 20 20 20 20 20 20 43 58 28 22 25 68  se{.      CX("%h
de80: 22 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ",zVal);.    }. 
de90: 20 20 20 43 58 28 22 3c 2f 6f 70 74 69 6f 6e 3e     CX("</option>
dea0: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 43 58 28 22  \n");.  }.  CX("
deb0: 3c 2f 73 65 6c 65 63 74 3e 5c 6e 22 29 3b 0a 20  </select>\n");. 
dec0: 20 43 58 28 22 3c 2f 64 69 76 3e 5c 6e 22 29 3b   CX("</div>\n");
ded0: 0a 20 20 76 61 5f 65 6e 64 28 76 61 72 67 73 29  .  va_end(vargs)
dee0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28  ;.  fossil_free(
def0: 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d 0a 0a 2f 2a  zLabelID);.}../*
df00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 3c  .** Generate a <
df10: 73 63 72 69 70 74 3e 20 77 69 74 68 20 61 6e 20  script> with an 
df20: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 6f 6e 63  appropriate nonc
df30: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4f 72 69 67 69 6e  e..**.** zOrigin
df40: 20 61 6e 64 20 69 4c 69 6e 65 20 61 72 65 20 74   and iLine are t
df50: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66  he source code f
df60: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 69 6e 65  ilename and line
df70: 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
df80: 67 65 6e 65 72 61 74 65 64 20 74 68 69 73 20 72  generated this r
df90: 65 71 75 65 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  equest..*/.void 
dfa0: 73 74 79 6c 65 5f 73 63 72 69 70 74 5f 62 65 67  style_script_beg
dfb0: 69 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  in(const char *z
dfc0: 4f 72 69 67 69 6e 2c 20 69 6e 74 20 69 4c 69 6e  Origin, int iLin
dfd0: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e){.  const char
dfe0: 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 3d 7a 4f 72   *z;.  for(z=zOr
dff0: 69 67 69 6e 3b 20 7a 5b 30 5d 21 3d 30 3b 20 7a  igin; z[0]!=0; z
e000: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 30  ++){.    if( z[0
e010: 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 30 5d 3d 3d  ]=='/' || z[0]==
e020: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 7a 4f  '\\' ){.      zO
e030: 72 69 67 69 6e 20 3d 20 7a 2b 31 3b 0a 20 20 20  rigin = z+1;.   
e040: 20 7d 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73 63   }.  }.  CX("<sc
e050: 72 69 70 74 20 6e 6f 6e 63 65 3d 27 25 73 27 3e  ript nonce='%s'>
e060: 2f 2a 20 25 73 3a 25 64 20 2a 2f 5c 6e 22 2c 20  /* %s:%d */\n", 
e070: 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 2c 20 7a  style_nonce(), z
e080: 4f 72 69 67 69 6e 2c 20 69 4c 69 6e 65 29 3b 0a  Origin, iLine);.
e090: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  }../* Generate t
e0a0: 68 65 20 63 6c 6f 73 69 6e 67 20 3c 2f 73 63 72  he closing </scr
e0b0: 69 70 74 3e 20 74 61 67 0a 2a 2f 0a 76 6f 69 64  ipt> tag.*/.void
e0c0: 20 73 74 79 6c 65 5f 73 63 72 69 70 74 5f 65 6e   style_script_en
e0d0: 64 28 76 6f 69 64 29 7b 0a 20 20 43 58 28 22 3c  d(void){.  CX("<
e0e0: 2f 73 63 72 69 70 74 3e 5c 6e 22 29 3b 0a 7d 0a  /script>\n");.}.
e0f0: 0a 2f 2a 0a 2a 2a 20 45 6d 69 74 73 20 61 20 4e  ./*.** Emits a N
e100: 4f 53 43 52 49 50 54 20 74 61 67 20 77 69 74 68  OSCRIPT tag with
e110: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
e120: 65 20 73 74 61 74 69 6e 67 20 74 68 61 74 20 4a  e stating that J
e130: 53 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  S is.** required
e140: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
e150: 20 70 61 67 65 2e 20 54 68 69 73 20 22 73 68 6f   page. This "sho
e160: 75 6c 64 22 20 62 65 20 63 61 6c 6c 65 64 20 6e  uld" be called n
e170: 65 61 72 20 74 68 65 20 74 6f 70 0a 2a 2a 20 6f  ear the top.** o
e180: 66 20 70 61 67 65 73 20 77 68 69 63 68 20 2a 72  f pages which *r
e190: 65 71 75 69 72 65 2a 20 4a 53 2e 20 54 68 65 20  equire* JS. The 
e1a0: 69 6e 6e 65 72 20 44 49 56 20 68 61 73 20 74 68  inner DIV has th
e1b0: 65 20 43 53 53 20 63 6c 61 73 73 0a 2a 2a 20 27  e CSS class.** '
e1c0: 65 72 72 6f 72 27 20 61 6e 64 20 63 61 6e 20 62  error' and can b
e1d0: 65 20 73 74 79 6c 65 64 20 76 69 61 20 61 20 28  e styled via a (
e1e0: 6e 6f 73 63 72 69 70 74 20 3e 20 2e 65 72 72 6f  noscript > .erro
e1f0: 72 29 20 43 53 53 20 73 65 6c 65 63 74 6f 72 2e  r) CSS selector.
e200: 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 65  .*/.void style_e
e210: 6d 69 74 5f 6e 6f 73 63 72 69 70 74 5f 66 6f 72  mit_noscript_for
e220: 5f 6a 73 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a  _js_page(void){.
e230: 20 20 43 58 28 22 3c 6e 6f 73 63 72 69 70 74 3e    CX("<noscript>
e240: 3c 64 69 76 20 63 6c 61 73 73 3d 27 65 72 72 6f  <div class='erro
e250: 72 27 3e 22 0a 20 20 20 20 20 22 54 68 69 73 20  r'>".     "This 
e260: 70 61 67 65 20 72 65 71 75 69 72 65 73 20 4a 61  page requires Ja
e270: 76 61 53 63 72 69 70 74 20 28 45 53 32 30 31 35  vaScript (ES2015
e280: 2c 20 61 2e 6b 2e 61 2e 20 45 53 36 2c 20 6f 72  , a.k.a. ES6, or
e290: 20 6e 65 77 65 72 29 2e 22 0a 20 20 20 20 20 22   newer).".     "
e2a0: 3c 2f 64 69 76 3e 3c 2f 6e 6f 73 63 72 69 70 74  </div></noscript
e2b0: 3e 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 45  >");.}../*.** SE
e2c0: 54 54 49 4e 47 3a 20 72 6f 62 6f 74 73 2d 74 78  TTING: robots-tx
e2d0: 74 20 77 69 64 74 68 3d 37 30 20 62 6c 6f 63 6b  t width=70 block
e2e0: 2d 74 65 78 74 20 6b 65 65 70 2d 65 6d 70 74 79  -text keep-empty
e2f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 74 74  .**.** This sett
e300: 69 6e 67 20 69 73 20 74 68 65 20 6f 76 65 72 72  ing is the overr
e310: 69 64 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ide value for th
e320: 65 20 2f 72 6f 62 6f 74 73 2e 74 78 74 20 66 69  e /robots.txt fi
e330: 6c 65 20 74 68 61 74 0a 2a 2a 20 46 6f 73 73 69  le that.** Fossi
e340: 6c 20 72 65 74 75 72 6e 73 20 77 68 65 6e 20 72  l returns when r
e350: 75 6e 20 61 73 20 61 20 73 74 61 6e 64 2d 61 6c  un as a stand-al
e360: 6f 6e 65 20 73 65 72 76 65 72 20 66 6f 72 20 61  one server for a
e370: 20 64 6f 6d 61 69 6e 2e 20 20 41 73 0a 2a 2a 20   domain.  As.** 
e380: 46 6f 73 73 69 6c 20 69 73 20 73 65 6c 64 6f 6d  Fossil is seldom
e390: 20 72 75 6e 20 61 73 20 61 20 73 74 61 6e 64 2d   run as a stand-
e3a0: 61 6c 6f 6e 65 20 73 65 72 76 65 72 20 28 61 6e  alone server (an
e3b0: 64 20 69 73 20 6d 6f 72 65 20 63 6f 6d 6d 6f 6e  d is more common
e3c0: 6c 79 0a 2a 2a 20 64 65 70 6c 6f 79 65 64 20 61  ly.** deployed a
e3d0: 73 20 61 20 43 47 49 20 6f 72 20 53 43 47 49 20  s a CGI or SCGI 
e3e0: 6f 72 20 62 65 68 69 6e 64 20 61 20 72 65 76 65  or behind a reve
e3f0: 72 73 65 20 70 72 6f 78 79 29 20 74 68 69 73 20  rse proxy) this 
e400: 73 65 74 74 69 6e 67 0a 2a 2a 20 72 61 72 65 6c  setting.** rarel
e410: 79 20 6e 65 65 64 65 64 2e 20 20 41 20 72 65 61  y needed.  A rea
e420: 73 6f 6e 61 62 6c 65 20 64 65 66 61 75 6c 74 20  sonable default 
e430: 72 6f 62 6f 74 73 2e 74 78 74 20 69 73 20 73 65  robots.txt is se
e440: 6e 74 20 69 66 20 74 68 69 73 0a 2a 2a 20 73 65  nt if this.** se
e450: 74 74 69 6e 67 20 69 73 20 65 6d 70 74 79 2e 0a  tting is empty..
e460: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  */../*.** WEBPAG
e470: 45 3a 20 72 6f 62 6f 74 73 2e 74 78 74 0a 2a 2a  E: robots.txt.**
e480: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 65 78 74 2f  .** Return text/
e490: 70 6c 61 69 6e 20 77 68 69 63 68 20 69 73 20 74  plain which is t
e4a0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
e4b0: 65 20 22 72 6f 62 6f 74 73 2d 74 78 74 22 20 73  e "robots-txt" s
e4c0: 65 74 74 69 6e 67 2c 20 69 66 0a 2a 2a 20 73 75  etting, if.** su
e4d0: 63 68 20 61 20 73 65 74 74 69 6e 67 20 65 78 69  ch a setting exi
e4e0: 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 6e 2d 65  sts and is non-e
e4f0: 6d 70 74 79 2e 20 20 4f 72 20 63 6f 6e 73 74 72  mpty.  Or constr
e500: 75 63 74 20 61 6e 20 52 46 43 2d 39 33 30 39 20  uct an RFC-9309 
e510: 63 6f 6d 70 6c 61 69 6e 74 0a 2a 2a 20 72 6f 62  complaint.** rob
e520: 6f 74 73 2e 74 78 74 20 66 69 6c 65 20 61 6e 64  ots.txt file and
e530: 20 72 65 74 75 72 6e 20 74 68 61 74 20 69 66 20   return that if 
e540: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 22 72 6f  there is not "ro
e550: 62 6f 74 73 2e 74 78 74 22 20 73 65 74 74 69 6e  bots.txt" settin
e560: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  g..**.** This is
e570: 20 75 73 65 66 75 6c 20 66 6f 72 20 72 6f 62 6f   useful for robo
e580: 74 20 65 78 63 6c 75 73 69 6f 6e 20 69 6e 20 63  t exclusion in c
e590: 61 73 65 73 20 77 68 65 72 65 20 46 6f 73 73 69  ases where Fossi
e5a0: 6c 20 69 73 20 72 75 6e 20 61 73 20 61 0a 2a 2a  l is run as a.**
e5b0: 20 73 74 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72   stand-alone ser
e5c0: 76 65 72 20 69 6e 20 69 74 73 20 6f 77 6e 20 64  ver in its own d
e5d0: 6f 6d 61 69 6e 2e 20 20 46 6f 72 20 74 68 65 20  omain.  For the 
e5e0: 6d 6f 72 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  more common case
e5f0: 20 77 68 65 72 65 0a 2a 2a 20 46 6f 73 73 69 6c   where.** Fossil
e600: 20 69 73 20 72 75 6e 20 61 73 20 61 20 43 47 49   is run as a CGI
e610: 2c 20 6f 72 20 53 43 47 49 2c 20 6f 72 20 61 20  , or SCGI, or a 
e620: 73 65 72 76 65 72 20 74 68 61 74 20 72 65 73 70  server that resp
e630: 6f 6e 64 69 6e 67 20 74 6f 20 61 20 72 65 76 65  onding to a reve
e640: 72 73 65 0a 2a 2a 20 70 72 6f 78 79 2c 20 74 68  rse.** proxy, th
e650: 65 20 72 65 74 75 72 6e 73 20 72 6f 62 6f 74 73  e returns robots
e660: 2e 74 78 74 20 66 69 6c 65 20 77 69 6c 6c 20 6e  .txt file will n
e670: 6f 74 20 62 65 20 61 74 20 74 68 65 20 74 6f 70  ot be at the top
e680: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 0a 2a 2a   level of the.**
e690: 20 64 6f 6d 61 69 6e 2c 20 61 6e 64 20 73 6f 20   domain, and so 
e6a0: 69 74 20 77 69 6c 6c 20 62 65 20 70 6f 69 6e 74  it will be point
e6b0: 6c 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 72 6f  less..*/.void ro
e6c0: 62 6f 74 73 74 78 74 5f 70 61 67 65 28 76 6f 69  botstxt_page(voi
e6d0: 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  d){.  const char
e6e0: 20 2a 7a 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   *z;.  static co
e6f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 66 6c 74 20  nst char *zDflt 
e700: 3d 20 0a 20 20 20 20 20 22 55 73 65 72 2d 61 67  = .     "User-ag
e710: 65 6e 74 3a 20 2a 5c 6e 22 0a 20 20 20 20 20 22  ent: *\n".     "
e720: 41 6c 6c 6f 77 3a 20 2f 64 6f 63 5c 6e 22 0a 20  Allow: /doc\n". 
e730: 20 20 20 20 22 41 6c 6c 6f 77 3a 20 2f 68 6f 6d      "Allow: /hom
e740: 65 5c 6e 22 0a 20 20 20 20 20 22 41 6c 6c 6f 77  e\n".     "Allow
e750: 3a 20 2f 66 6f 72 75 6d 5c 6e 22 0a 20 20 20 20  : /forum\n".    
e760: 20 22 41 6c 6c 6f 77 3a 20 2f 74 65 63 68 6e 6f   "Allow: /techno
e770: 74 65 5c 6e 22 0a 20 20 20 20 20 22 41 6c 6c 6f  te\n".     "Allo
e780: 77 3a 20 2f 74 6b 74 76 69 65 77 5c 6e 22 0a 20  w: /tktview\n". 
e790: 20 20 20 20 22 41 6c 6c 6f 77 3a 20 2f 77 69 6b      "Allow: /wik
e7a0: 69 5c 6e 22 0a 20 20 20 20 20 22 41 6c 6c 6f 77  i\n".     "Allow
e7b0: 3a 20 2f 75 76 2f 5c 6e 22 0a 20 20 20 20 20 22  : /uv/\n".     "
e7c0: 41 6c 6c 6f 77 3a 20 2f 24 5c 6e 22 0a 20 20 20  Allow: /$\n".   
e7d0: 20 20 22 44 69 73 61 6c 6c 6f 77 3a 20 2f 2a 5c    "Disallow: /*\
e7e0: 6e 22 0a 20 20 3b 0a 20 20 7a 20 3d 20 64 62 5f  n".  ;.  z = db_
e7f0: 67 65 74 28 22 72 6f 62 6f 74 73 2d 74 78 74 22  get("robots-txt"
e800: 2c 7a 44 66 6c 74 29 3b 0a 20 20 63 67 69 5f 73  ,zDflt);.  cgi_s
e810: 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28  et_content_type(
e820: 22 74 65 78 74 2f 70 6c 61 69 6e 22 29 3b 0a 20  "text/plain");. 
e830: 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74   cgi_append_cont
e840: 65 6e 74 28 7a 2c 20 2d 31 29 3b 0a 7d 0a        ent(z, -1);.}.