Content-Type: multipart/related; start=; boundary=----------XGzFGuQFvdcv6yi3Ar77fC Content-Location: http://dev.xonotic.org/projects/3/wiki/Introduction_to_QuakeC Subject: =?utf-8?Q?Xonotic=20-=20Introduction=20to=20QuakeC=20-=20Xonotic=20Development?= MIME-Version: 1.0 ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline; filename=Introduction_to_QuakeC.htm Content-Type: text/html; charset=utf-8; name=Introduction_to_QuakeC.htm Content-ID: Content-Location: http://dev.xonotic.org/projects/3/wiki/Introduction_to_QuakeC Content-Transfer-Encoding: 8bit Xonotic - Introduction to QuakeC - Xonotic Development

QuakeC

Article TODO

  • expand explanations

About QuakeC

QuakeC is a very simplified dialect of the well-known C programming language, and is used by the Quake I engine and its derivatives. Xonotic uses the FTEQCC dialect of QuakeC, so only this dialect will be described (as well as some common extensions among Quake engines).

Example code

To see what QuakeC looks like, here is a piece of example code:

 1   // needed declarations:
 2   float vlen(vector v) = #12;
 3   entity nextent(entity e) = #47;
 4   .string classname;
 5   .vector origin;
 6   // ...
 7   entity findchain(.string fld, string match)
 8   {
 9     entity first, prev;
10     entity e;
11     first = prev = world;
12     for(e = world; (e = nextent(e)); ++e)
13       if(e.fld == match)
14       {
15         e.chain = world;
16         if(prev)
17           prev.chain = e;
18         else
19           first = e;
20         prev = e;
21       }
22     return first;
23   }
24   // ...
25   entity findnearestspawn(vector v)
26   {
27     entity nearest;
28     entity e;
29     for(e = findchain(classname, "info_player_deathmatch"); e; e = e.chain)
30       if(!nearest)
31         nearest = e;
32       else if(vlen(e.origin - v) < vlen(nearest.origin - v))
33         nearest = e;
34     return nearest;
35   }

Note: findchain is implemented in QuakeC for demonstration purposes only so one can see how to build a linked list, as this function is already built in to the engine and can be used directly

Other resources

Here is a forum on Inside3D where you can read more about QuakeC and ask questions: For available functions in QuakeC, look in the following places:

Variables

Declaring

To declare a variable, the syntax is the same as in C:

float i;

However, variables cannot be initialized in their declaration for historical reasons, and trying to do so would define a constant.

Whenever a variable declaration could be interpreted as something else by the compiler, the var keyword helps disambiguating. For example,

float(float a, float b) myfunc;

is an old-style function declaration, while

var float(float a, float b) myfunc;

declares a variable of function type. An alternate and often more readable way to disambiguate variable declarations is using a typedef, like so:

typedef float(float, float) myfunc_t;
myfunc_t myfunc;

Scope

A variable declared in the global scope has global scope, and is visible starting from its declaration to the end of the code. The order the code is read in by the compiler is defined in the file %progs.src%.
A variable declared inside a function has function scope, and is visible starting from its declaration to the end of the function (not to the end of the block).

Some variables are declared in sys.qh. Their declarations or names should never be changed, as they have to match the order and names of the variables in the file file progdefs.h of the engine exactly, or the code won't load. The special markers end_sys_globals and end_sys_fields are placed to denote the end of this shared declaration section.

Types

Quake only knows four elementary data types: the basic types float, vector, string, and the object type entity. Also, there is a very special type of types, fields, and of course functions. FTEQCC also adds arrays, although these are slow and a bit buggy. Note that there are no pointers!

float

This is the basic numeric type in QuakeC. It represents the standard 32bit floating point type as known from C. It has 23 bits of mantissa, 8 bits of exponent, and one sign bit. The numeric range goes from about 1.175e-38 to about 3.403e+38, and the number of significant decimal digits is about six.

As float has 23 bits of mantissa, it can also be used to safely represent integers in the range from -16777216 to 16777216. 16777217 is the first integer float can not represent.

Common functions for float are especially ceil, floor (working just like in C, rounding up/down to the next integer), and random, which yields a random number r with 0 %<=% r < 1.

vector

This type is basically three floats together. By declaring a vector v, you also create three floats v_x, v_y and v_z (note the underscore) that contain the components of the vector.

Vectors can be used with the usual mathematical operators in the usual way used in mathematics. For example, vector + vector simply returns the sum of the vectors, and vector * float scales the vector by the given factor. Note however that dividing a vector by a float is NOT supported, one has to use vector * (1 / float) instead. Multiplying two vectors yields their dot product of type float.

Common functions to be used on vectors are vlen (vector length), normalize (vector divided by its length, i.e. a unit vector).

Vector literals are written like '1 0 0'.

COMPILER BUG: Always use vector = vector * float instead of vector *= float, as the latter creates incorrect code!

string

A string in QuakeC is an immutable reference to a null-terminated character string stored in the engine. It is not possible to change a character in a string, but there are various functions to create new strings:

  • ftos and vtos convert floats and vectors to strings. Their inverses are, of course, stof and stov, which parse a string into a float or a vector.
  • strcat concatenates 2 to 8 strings together, as in:
    strcat("a", "b", "c")=="abc";
    
  • strstrofs(haystack, needle, offset) searches for an occurrence of one string in another, as in:
    strstrofs("haystack", "ac", 0)==5;
    
    The offset defines from which starting position to search, and the return value is -1 if no match is found. The offset returned is 0-based, and to search in the whole string, a start offset of 0 would be used.
  • substring(string, startpos, length) returns part of a string. The offset is 0-based here, too.
Note that there are different kinds of strings, regarding memory management:
  • Temporary strings are strings returned by built-in string handling functions such as substring, strcat. They last only for the duration of the function call from the engine. That means it is safe to return a temporary string in a function you wrote, but not to store them in global variables or objects as their storage will be overwritten soon.
  • Allocated strings are strings that are explicitly allocated. They are returned by strzone and persist until they are freed (using strunzone). Note that strzone does not change the string given as a parameter, but returns the newly allocated string and keeps the passed temporary string the same way! That means:
    • To allocate a string, do for example:
      myglobal = strzone(strcat("hello ", "world"));
      
    • To free the string when it is no longer needed, do:
      strunzone(myglobal);
      
  • Engine-owned strings, such as netname. These should be treated just like temporary strings: if you want to keep them in your own variables, strzone them.
  • Constant strings: A string literal like "foo" gets permanent storage assigned by the compiler. There is no need to strzone such strings.
  • The null string: A global uninitialized string variable has the special property that is is usually treated like the constant, empty, string "" (so using it does not constitute an error), but it is the only string that evaluates to FALSE in an if expression (but not in the ! operator - in boolean context, the string "" counts as FALSE too). As this is a useful property, Xonotic code declares such a string variable of the name string_null. That means that the following patterns are commonly used for allocating strings:
    • Assigning to a global string variable:
      if(myglobal)
           strunzone(myglobal);
      
      myglobal = strzone(...);
      
    • Freeing the global string variable:
      if(myglobal)
           strunzone(myglobal);
      
      myglobal = string_null;
      
    • Checking if a global string value has been set:
      if(myglobal) {
           value has been set;
      }
      else {
           string has not yet been set;
      }
      

entity

The main object type in QuakeC is entity, a reference to an engine internal object. An entity can be imagined as a huge struct, containing many fields. This is the only object type in the language. However, fields can be added to the entity type by the following syntax:

.float myfield;

and then all objects e get a field that can be accessed like in e.myfield.

The special entity world also doubles as the null reference. It can not be written to other than in the spawnfunc_worldspawn function that is run when the map is loaded, and is the only entity value that counts as false in an if expression. Thus, functions that return entities tend to return world to indicate failure (e.g. find returns world to indicate no more entity can be found).

If a field has not been set, it gets the usual zero value of the type when the object is created (i.e. 0 for float, string_null for string, '0 0 0' for vector, and world for entity).

fields

A reference to such a field can be stored too, in a field variable. It is declared and used like

  .float myfield;
  // ...
  // and in some function:
  var .float myfieldvar;
  myfieldvar = myfield;
  e.myfieldvar = 42;
Field variables can be used as function parameters too - in that case you leave the var keyword out, as it is not needed for disambiguation.

functions

Functions work just like in C:

  float sum3(float a, float b, float c)
  {
    return a + b + c;
  }

However, the syntax to declare function pointers is simplified:

  typedef float(float, float, float) op3func_t;
  var float(float a, float b, float c) f;
  op3func_t g;
  f = sum3;
  g = f;
  print(ftos(g(1, 2, 3)), "\n"); // prints 6

Also note that the var keyword is used again to disambiguate from a global function declaration.

In original QuakeC by iD Software, this simplified function pointer syntax also was the only way to define functions (you may still encounter this in Xonotic's code in a few places):

  float(float a, float b) sum2 = {
    return a + b;
  }

A special kind of functions are the built-in functions, which are defined by the engine. These are imported using so-called built-in numbers, with a syntax like:

  string strcat(string a, string b, ...) = #115;

void

Just like in C, the void type is a special placeholder type to declare that a function returns nothing. However, unlike in C, it is possible to declare variables of this type, although the only purpose of this is to declare a variable name without allocating space for it. The only occasion where this is used is the special end_sys_globals and end_sys_fields marker variables.

arrays

As the QuakeC virtual machine provides no pointers or similar ways to handle arrays, array support is added by FTEQCC and very limited. Arrays can only be global, must have a fixed size (not dynamically allocated), and are a bit buggy and slow. Almost as great as in FORTRAN, except they can't be multidimensional either!

You declare arrays like in C:

  #define MAX_ASSASSINS 16
  entity assassins[MAX_ASSASSINS];
  #define BTREE_MAX_CHILDREN 5
  .entity btree_child[BTREE_MAX_CHILDREN];
  #define MAX_FLOATFIELDS 3
  var .float myfloatfields[MAX_FLOATFIELDS];

The former is a global array of entities and can be used the usual way:
  assassins[self.assassin_index] = self;

The middle one is a global array of (allocated and constant) entity fields and not a field of array type (which does not exist), so its usage looks a bit strange:
for(i = 0; i < BTREE_MAX_CHILDREN; ++i)
  self.(btree_child[i]) = world;

Note that this works:
var .entity indexfield;
indexfield = btree_child[i];
self.indexfield = world;

The latter one is a global array of (assignable) entity field variables, and looks very similar:
myfloatfields[2] = health;
self.(myfloatfields[2]) = 0;
// equivalent to self.health = 0;

Do not use arrays when you do not need to - using both arrays and function calls in the same expression can get messed up (COMPILER BUG), and arrays are slowly emulated using functions ArrayGet*myfloatfields and ArraySet*myfloatfields the compiler generates that internally do a binary search for the array index.

Peculiar language constructs

This section deals with language constructs in FTEQCC that are not similar to anything in other languages.

if not

There is a second way to do a negated if:

if not(expression)
...

It compiles to slightly more efficient code than

if(!expression)
...

and has the notable difference that

if not("")
...

will not execute (as "" counts as true in an if expression), but

if(!"")
...

will execute (as both "" and string_null is false when boolean operators are used on it).

Common patterns

Some patterns in code that are often encountered in Xonotic are listed here, in no particular order.

Classes in Quake

The usual way to handle classes in Quake is using fields, function pointers and the special property classname.

But first, let's look at how the engine creates entities when the map is loaded.

Assume you have the following declarations in your code:

entity self;
.string classname;
.vector origin;
.float height;

and the engine encounters the entity

{
"classname" "func_bobbing"
"height" "128"
"origin" "0 32 -64"
}

then it will, during loading the map, behave as if the following QuakeC code was executed:

self = spawn();
self.classname = "func_bobbing";
self.height = 128;
self.origin = '0 32 -64';
spawnfunc_func_bobbing();

We learn from this: * The special global entity variable self is used when "methods" of an object are called, like - in this case - the "constructor" or spawn function spawnfunc_func_bobbing. * Before calling the spawn function, the engine sets the mapper specified fields to the values. String values can be treated by the QC code as if they are constant strings, that means there is no need to strzone them. * Spawn functions always have the spawnfunc_ name prefix and take no arguments. * The string field classname always contains the name of the entity class when it was created by the engine. * As the engine uses this pattern when loading maps and this can't be changed, it makes very much sense to follow this pattern for all entities, even for internal use. Especially making sure classname is set to a sensible value is very helpful.

Methods are represented as fields of function type:

.void() think;

and are assigned to the function to be called in the spawn function, like:

void func_bobbing_think()
{
// lots of stuff
}
void spawnfunc_func_bobbing()
{
// ... even more stuff ...
self.think = func_bobbing_think;
}

To call a method of the same object, you would use

self.think();

but to call a method of another object, you first have to set self to that other object, but you typically need to restore self to its previous value when done:

entity oldself;
// ...
oldself = self;
self.think();
self = oldself;

Think functions

A very common entry point to QuakeC functions are so-called think functions.

They use the following declarations:

.void() think;
.float nextthink;

If nextthink is not zero, the object gets an attached timer: as soon as time reaches nextthink, the think method is called with self set to the object. Before that, nextthink is set to zero. So a typical use is a periodic timer, like this:

void func_awesome_think()
{
bprint("I am awesome!\n");
self.nextthink = time + 2;
}
void spawnfunc_func_awesome()
{
// ...
self.think = func_awesome_think;
self.nextthink = time + 2;
}

Find loops

One common way to loop through entities is the find loop. It works by calling a built-in function like

entity find(entity start, .string field, string match) = #18;

repeatedly. This function is defined as follows:

  • if start is world, the first entity e with e.field==match is returned
  • otherwise, the entity e after start in the entity order with e.field==match is returned
  • if no such entity exists, world is returned

It can be used to enumerate all entities of a given type, for example "info_player_deathmatch":

entity e;
for(e = world; (e = find(e, classname, "info_player_deathmatch")); )
print("Spawn point found at ", vtos(e.origin), "\n");

There are many other functions that can be used in find loops, for example findfloat, findflags, findentity.

Note that the function findradius is misnamed and is not used as part of a find loop, but instead sets up a linked list of the entities found.

Linked lists

An alternate way to loop through a set of entities is a linked list. I assume you are already familiar with the concept, so I'll skip information about how to manage them.

It is however noteworthy that some built-in functions create such linked lists using the entity field chain as list pointer. Some of these functions are the aforementioned findradius, and findchain, findchainfloat, findchainflags and findchainentity.

A loop like the following could be used with these:

entity e;
for(e = findchain(classname, "info_player_deathmatch"); e; e = e.chain)
print("Spawn point found at ", vtos(e.origin), "\n");

The main advantage of linked lists however is that you can keep them in memory by using other fields than chain for storing their pointers. That way you can avoid having to search all entities over and over again (which is what find does internally) when you commonly need to work with the same type of entities.

Error handling

Error handling is virtually non-existent in QuakeC code. There is no way to throw and handle exceptions.

However, built-in functions like fopen return -1 on error.

To report an error condition, the following means are open to you: * Use the print function to spam it to the console. Hopefully someone will read that something went wrong. After that, possibly use remove to delete the entity that caused the error (but make sure there are no leftover references to it!). * Use the error function to abort the program code and report a fatal error with a backtrace showing how it came to it. * Use the objerror function to abort spawning an entity (i.e. removing it again). This also prints an error message, and the entity that caused the error will not exist in game. Do not forget to return from the spawn function directly after calling objerror!

target and targetname

In the map editor, entities can be connected by assigning a name to them in the target field of the targeting entity and the targetname field of the targeted entity.

To QuakeC, these are just strings - to actually use the connection, one would use a find loop:

entity oldself;
oldself = self;
for(self = world; (self = find(self, targetname, oldself.target)); )
self.use();
self = oldself;

the enemy field and its friends

As the find loop for target and targetname causes the engine to loop through all entities and compare their targetname field, it may make sense to do this only once when the map is loaded.

For this, a common pattern is using the pre-defined enemy field to store the target of an entity.

However, this can't be done during spawning of the entities yet, as the order in which entities are loaded is defined by the map editor and tends to be random. So instead, one should do that at a later time, for example when the entity is first used, in a think function, or - the preferred way in the Xonotic code base - in an InitializeEntity function:

void teleport_findtarget()
{
// ...
self.enemy = find(world, targetname, self.target);
if(!self.enemy)
// some error handling...
// ...
}
void spawnfunc_trigger_teleport()
{
// ...
InitializeEntity(self, teleport_findtarget, INITPRIO_FINDTARGET);
// ...
}

InitializeEntity functions are guaranteed to be executed at the beginning of the next frame, before the think functions are run, and are run in an order according to their priorities (the INITPRIO_ constants).

if-chains

With default compile options (i.e. if the option -flo is not passed to the compiler), boolean expressions are evaluated fully. This means that in

if(!flag && SomeComplexFunction(self))
...

SomeCompexFunction is always evaluated, even if flag is true. To avoid this, one can use:

if(!flag)
if(SomeComplexFunction(self))
...

Tracing

Pitfalls and compiler bugs

complex operators

Do not count on the modifying and reading operators like = or + to always work. Using them in simple cases like:

a += 42;
for(i = 0; i < n; ++i)
...

is generally safe, but complex constructs like:

self.enemy.frags += self.value--;

are doomed. Instead, split up such expressions into simpler steps:

self.enemy.frags = self.enemy.frags + self.value;
self.value -= 1;

The compiler warning RETURN VALUE ALREADY IN USE is a clear indicator that an expression was too complex for it to deal with it correctly. If you encounter the warning, do make sure you change the code to no longer cause it, as the generated code will be incorrect then.

Also, do not use the += like operators on vector_s, as they are known to create incorrect code and only operate on the _x component of the vector.

functions VS. arrays

Mixing function calls with array dereferencing, or doing more than one array dereferencing in the same expression, is known to create incorrect code. Avoid constructs like:

print(ftos(floatarray[i]), " --> ", stringarray[i], anotherstringarray[i], "\n");

as the array dereferencings and the ftos return value are likely to overwrite each other. Instead, simplify it:

float f;
string s, s2;
// ...
f = floatarray[i];
s = stringarray[i];
s2 = anotherstringarray[i];
print(ftos(f), " --> ", s, s2, "\n");

vectoangles does not match makevectors

The pitch angle is inverted between these two functions. You have to negate the pitch (i.e. the x component of the vector representing the euler angles) to make it fit the other function.

As a rule of thumb, vectoangles returns angles as stored in the angles field (used to rotate entities for display), while makevectors expects angles as stored in the v_angle field (used to transmit the direction the player is aiming). There is about just as much good reason in this as there is for 1:1 patch cables. Just deal with it.

Entry points

The server-side code calls the following entry points of the QuakeC code:

  • void ClientDisconnect(): called when a player leaves the server. Do not forget to strunzone all strings stored in the player entity here, and do not forget to clear all references to the player!
  • void SV_Shutdown(): called when the map changes or the server is quit. A good place to store persistent data like the database of race records.
  • void SV_ChangeTeam(float newteam): called when a player changes his team. Can be used to disallow team changes, or to clear the player's scores.
  • void ClientKill(): called when the player uses the "kill" console command to suicide.
  • void RestoreGame(): called directly after loading a save game. Useful to, for example, load the databases from disk again.
  • void ClientConnect(): called as soon as a client has connected, downloaded everything, and is ready to play. This is the typical place to initialize the player entity.
  • void PutClientInServer(): called when the client requests to spawn. Typically puts the player somewhere on the map and lets him play.
  • .float SendEntity(entity to, float sendflags): called when the engine requires a CSQC networked entity to send itself to a client, referenced by to. Should write some data to MSG_ENTITY. FALSE can be returned to make the entity not send. See EXT_CSQC for information on this.
  • void URI_Get_Callback(...):
  • void GameCommand(string command): called when the "sv_cmd" console command is used, which is commonly used to add server console commands to the game. It should somehow handle the command, and print results to the server console.
  • void SV_OnEntityNoSpawnFunction(): called when there is no matching spawn function for an entity. Just ignore this...
  • void SV_OnEntityPreSpawnFunction: called before even looking for the spawn function, so you can even change its classname in there. If it remove()s the entity, the spawn function will not be looked for.
  • void SV_OnEntityPostSpawnFunction: called ONLY after its spawn function or SV_OnEntityNoSpawnFunction was called, and skipped if the entity got removed by either.
  • void SetNewParms():
  • void SetChangeParms():
  • .float customizeentityforclient(): called for an entity before it is going to be sent to the player specified by other. Useful to change properties of the entity right before sending, e.g. to make an entity appear only to some players, or to make it have a different appearance to different players.
  • .void touch(): called when two entities touch; the other entity can be found in other. It is, of course, called two times (the second time with self and other reversed).
  • .void contentstransition():
  • .void think(): described above, basically a timer function.
  • .void blocked(): called when a MOVETYPE_PUSH entity is blocked by another entity. Typically does either nothing, reverse the direction of the door moving, or kills the player who dares to step in the way of the Mighty Crusher Door.
  • .void movetypesteplandevent(): called when a player hits the floor.
  • .void PlayerPreThink(): called before a player runs his physics. As a special exception, frametime is set to 0 if this is called for a client-side prediction frame, as it still will get called for server frames.
  • .void PlayerPreThink(): called after a player runs his physics. As a special exception, frametime is set to 0 if this is called for a client-side prediction frame, as it still will get called for server frames.
  • void StartFrame(): called at the beginning of each server frame, before anything else is done.
  • void EndFrame(): called at the end of each server frame, just before waiting until the next frame is due.
  • void SV_PlayerPhysics(): allows to replace the player physics with your own code. The movement the player requests can be found in the vector field movement, and the currently pressed buttons are found in various fields, whose names are aliased to the BUTTON_ macros.
  • void SV_ParseClientCommand(string command): handles commands sent by the client to the server using "cmd ...". Unhandled commands can be passed to the built-in function clientcommand to execute the normal engine behaviour.


------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline Content-Type: text/css; charset=utf-8 Content-Location: http://dev.xonotic.org/stylesheets/application.css Content-Transfer-Encoding: 8bit body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; } h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;} h1 {margin:0; padding:0; font-size: 24px;} h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;} h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;} h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;} /***** Layout *****/ #wrapper {background: white;} #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;} #top-menu ul {margin: 0; padding: 0;} #top-menu li { float:left; list-style-type:none; margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px; white-space:nowrap; } #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;} #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; } #account {float:right;} #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;} #header a {color:#f8f8f8;} #header h1 a.ancestor { font-size: 80%; } #quick-search {float:right;} #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;} #main-menu ul {margin: 0; padding: 0;} #main-menu li { float:left; list-style-type:none; margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px; white-space:nowrap; } #main-menu li a { display: block; color: #fff; text-decoration: none; font-weight: bold; margin: 0; padding: 4px 10px 4px 10px; } #main-menu li a:hover {background:#759FCF; color:#fff;} #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;} #admin-menu ul {margin: 0; padding: 0;} #admin-menu li {margin: 0; padding: 0 0 12px 0; list-style-type:none;} #admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;} #admin-menu a.projects { background-image: url(../images/projects.png); } #admin-menu a.users { background-image: url(../images/user.png); } #admin-menu a.groups { background-image: url(../images/group.png); } #admin-menu a.roles { background-image: url(../images/database_key.png); } #admin-menu a.trackers { background-image: url(../images/ticket.png); } #admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); } #admin-menu a.workflows { background-image: url(../images/ticket_go.png); } #admin-menu a.custom_fields { background-image: url(../images/textfield.png); } #admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); } #admin-menu a.settings { background-image: url(../images/changeset.png); } #admin-menu a.plugins { background-image: url(../images/plugin.png); } #admin-menu a.info { background-image: url(../images/help.png); } #main {background-color:#EEEEEE;} #sidebar{ float: right; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;} * html #sidebar{ width: 22%; } #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; } #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; } * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; } #sidebar .contextual { margin-right: 1em; } #content { width: 75%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; } * html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;} html>body #content { min-height: 600px; } * html body #content { height: 600px; } /* IE */ #main.nosidebar #sidebar{ display: none; } #main.nosidebar #content{ width: auto; border-right: 0; } #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;} #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; } #login-form table td {padding: 6px;} #login-form label {font-weight: bold;} #login-form input#username, #login-form input#password { width: 300px; } input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; } .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; } /***** Links *****/ a, a:link, a:visited{ color: #2A5685; text-decoration: none; } a:hover, a:active{ color: #c61a1a; text-decoration: underline;} a img{ border: 0; } a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; } /***** Tables *****/ table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; } table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; } table.list td { vertical-align: top; } table.list td.id { width: 2%; text-align: center;} table.list td.checkbox { width: 15px; padding: 0px;} table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; } table.list td.buttons a { padding-right: 0.6em; } table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; } tr.project td.name a { white-space:nowrap; } tr.project.idnt td.name a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;} tr.project.idnt-1 td.name {padding-left: 0.5em;} tr.project.idnt-2 td.name {padding-left: 2em;} tr.project.idnt-3 td.name {padding-left: 3.5em;} tr.project.idnt-4 td.name {padding-left: 5em;} tr.project.idnt-5 td.name {padding-left: 6.5em;} tr.project.idnt-6 td.name {padding-left: 8em;} tr.project.idnt-7 td.name {padding-left: 9.5em;} tr.project.idnt-8 td.name {padding-left: 11em;} tr.project.idnt-9 td.name {padding-left: 12.5em;} tr.issue { text-align: center; white-space: nowrap; } tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; } tr.issue td.subject { text-align: left; } tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;} tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;} tr.issue.idnt-1 td.subject {padding-left: 0.5em;} tr.issue.idnt-2 td.subject {padding-left: 2em;} tr.issue.idnt-3 td.subject {padding-left: 3.5em;} tr.issue.idnt-4 td.subject {padding-left: 5em;} tr.issue.idnt-5 td.subject {padding-left: 6.5em;} tr.issue.idnt-6 td.subject {padding-left: 8em;} tr.issue.idnt-7 td.subject {padding-left: 9.5em;} tr.issue.idnt-8 td.subject {padding-left: 11em;} tr.issue.idnt-9 td.subject {padding-left: 12.5em;} tr.entry { border: 1px solid #f8f8f8; } tr.entry td { white-space: nowrap; } tr.entry td.filename { width: 30%; } tr.entry td.size { text-align: right; font-size: 90%; } tr.entry td.revision, tr.entry td.author { text-align: center; } tr.entry td.age { text-align: right; } tr.entry.file td.filename a { margin-left: 16px; } tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;} tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);} tr.changeset td.author { text-align: center; width: 15%; } tr.changeset td.committed_on { text-align: center; width: 15%; } table.files tr.file td { text-align: center; } table.files tr.file td.filename { text-align: left; padding-left: 24px; } table.files tr.file td.digest { font-size: 80%; } table.members td.roles, table.memberships td.roles { width: 45%; } tr.message { height: 2.6em; } tr.message td.subject { padding-left: 20px; } tr.message td.created_on { white-space: nowrap; } tr.message td.last_message { font-size: 80%; white-space: nowrap; } tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; } tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; } tr.version.closed, tr.version.closed a { color: #999; } tr.version td.name { padding-left: 20px; } tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; } tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; } tr.user td { width:13%; } tr.user td.email { width:18%; } tr.user td { white-space: nowrap; } tr.user.locked, tr.user.registered { color: #aaa; } tr.user.locked a, tr.user.registered a { color: #aaa; } tr.time-entry { text-align: center; white-space: nowrap; } tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; } td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; } td.hours .hours-dec { font-size: 0.9em; } table.plugins td { vertical-align: middle; } table.plugins td.configure { text-align: right; padding-right: 1em; } table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; } table.plugins span.description { display: block; font-size: 0.9em; } table.plugins span.url { display: block; font-size: 0.9em; } table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; } table.list tbody tr.group span.count { color: #aaa; font-size: 80%; } table.list tbody tr:hover { background-color:#ffffdd; } table.list tbody tr.group:hover { background-color:inherit; } table td {padding:2px;} table p {margin:0;} .odd {background-color:#f6f7f8;} .even {background-color: #fff;} a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; } a.sort.asc { background-image: url(../images/sort_asc.png); } a.sort.desc { background-image: url(../images/sort_desc.png); } table.attributes { width: 100% } table.attributes th { vertical-align: top; text-align: left; } table.attributes td { vertical-align: top; } table.boards a.board, h3.comments { background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 20px; } td.center {text-align:center;} h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; } div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; } div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; } div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; } div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; } #watchers ul {margin: 0; padding: 0;} #watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;} #watchers select {width: 95%; display: block;} #watchers a.delete {opacity: 0.4;} #watchers a.delete:hover {opacity: 1;} #watchers img.gravatar {vertical-align: middle;margin: 0 4px 2px 0;} .highlight { background-color: #FCFD8D;} .highlight.token-1 { background-color: #faa;} .highlight.token-2 { background-color: #afa;} .highlight.token-3 { background-color: #aaf;} .box{ padding:6px; margin-bottom: 10px; background-color:#f6f6f6; color:#505050; line-height:1.5em; border: 1px solid #e4e4e4; } div.square { border: 1px solid #999; float: left; margin: .3em .4em 0 .4em; overflow: hidden; width: .6em; height: .6em; } .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;} .contextual input, .contextual select {font-size:0.9em;} .message .contextual { margin-top: 0; } .splitcontentleft{float:left; width:49%;} .splitcontentright{float:right; width:49%;} form {display: inline;} input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;} fieldset {border: 1px solid #e4e4e4; margin:0;} legend {color: #484848;} hr { width: 100%; height: 1px; background: #ccc; border: 0;} blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;} blockquote blockquote { margin-left: 0;} acronym { border-bottom: 1px dotted; cursor: help; } textarea.wiki-edit { width: 99%; } li p {margin-top: 0;} div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;} p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;} p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; } p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; } div.issue div.subject div div { padding-left: 16px; } div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;} div.issue div.subject>div>p { margin-top: 0.5em; } div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;} #issue_tree table.issues { border: 0; } #issue_tree td.checkbox {display:none;} fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; } fieldset.collapsible legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; } fieldset.collapsible.collapsed legend { background-image: url(../images/arrow_collapsed.png); } fieldset#date-range p { margin: 2px 0 2px 0; } fieldset#filters table { border-collapse: collapse; } fieldset#filters table td { padding: 0; vertical-align: middle; } fieldset#filters tr.filter { height: 2em; } fieldset#filters td.add-filter { text-align: right; vertical-align: top; } .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; } div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;} div#issue-changesets .changeset { padding: 4px;} div#issue-changesets .changeset { border-bottom: 1px solid #ddd; } div#issue-changesets p { margin-top: 0; margin-bottom: 1em;} div#activity dl, #search-results { margin-left: 2em; } div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; } div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; } div#activity dt.me .time { border-bottom: 1px solid #999; } div#activity dt .time { color: #777; font-size: 80%; } div#activity dd .description, #search-results dd .description { font-style: italic; } div#activity span.project:after, #search-results span.project:after { content: " -"; } div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; } #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; } div#search-results-counts {float:right;} div#search-results-counts ul { margin-top: 0.5em; } div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; } dt.issue { background-image: url(../images/ticket.png); } dt.issue-edit { background-image: url(../images/ticket_edit.png); } dt.issue-closed { background-image: url(../images/ticket_checked.png); } dt.issue-note { background-image: url(../images/ticket_note.png); } dt.changeset { background-image: url(../images/changeset.png); } dt.news { background-image: url(../images/news.png); } dt.message { background-image: url(../images/message.png); } dt.reply { background-image: url(../images/comments.png); } dt.wiki-page { background-image: url(../images/wiki_edit.png); } dt.attachment { background-image: url(../images/attachment.png); } dt.document { background-image: url(../images/document.png); } dt.project { background-image: url(../images/projects.png); } dt.time-entry { background-image: url(../images/time.png); } #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); } div#roadmap .related-issues { margin-bottom: 1em; } div#roadmap .related-issues td.checkbox { display: none; } div#roadmap .wiki h1:first-child { display: none; } div#roadmap .wiki h1 { font-size: 120%; } div#roadmap .wiki h2 { font-size: 110%; } div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; } div#version-summary fieldset { margin-bottom: 1em; } div#version-summary .total-hours { text-align: right; } table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; } table#time-report tbody tr { font-style: italic; color: #777; } table#time-report tbody tr.last-level { font-style: normal; color: #555; } table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; } table#time-report .hours-dec { font-size: 0.9em; } form .attributes { margin-bottom: 8px; } form .attributes p { padding-top: 1px; padding-bottom: 2px; } form .attributes select { min-width: 50%; } ul.projects { margin: 0; padding-left: 1em; } ul.projects.root { margin: 0; padding: 0; } ul.projects ul { border-left: 3px solid #e0e0e0; } ul.projects li { list-style-type:none; } ul.projects li.root { margin-bottom: 1em; } ul.projects li.child { margin-top: 1em;} ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; } .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; } #tracker_project_ids ul { margin: 0; padding-left: 1em; } #tracker_project_ids li { list-style-type:none; } ul.properties {padding:0; font-size: 0.9em; color: #777;} ul.properties li {list-style-type:none;} ul.properties li span {font-style:italic;} .total-hours { font-size: 110%; font-weight: bold; } .total-hours span.hours-int { font-size: 120%; } .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;} #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; } #workflow_copy_form select { width: 200px; } .pagination {font-size: 90%} p.pagination {margin-top:8px;} /***** Tabular forms ******/ .tabular p{ margin: 0; padding: 5px 0 8px 0; padding-left: 180px; /*width of left column containing the label elements*/ height: 1%; clear:left; } html>body .tabular p {overflow:hidden;} .tabular label{ font-weight: bold; float: left; text-align: right; margin-left: -180px; /*width of left column*/ width: 175px; /*width of labels. Should be smaller than left column to create some right margin*/ } .tabular label.floating{ font-weight: normal; margin-left: 0px; text-align: left; width: 270px; } .tabular label.block{ font-weight: normal; margin-left: 0px !important; text-align: left; float: none; display: block; width: auto; } input#time_entry_comments { width: 90%;} #preview fieldset {margin-top: 1em; background: url(../images/draft.png)} .tabular.settings p{ padding-left: 300px; } .tabular.settings label{ margin-left: -300px; width: 295px; } .tabular.settings textarea { width: 99%; } fieldset.settings label { display: block; } .required {color: #bb0000;} .summary {font-style: italic;} #attachments_fields input[type=text] {margin-left: 8px; } div.attachments { margin-top: 12px; } div.attachments p { margin:4px 0 2px 0; } div.attachments img { vertical-align: middle; } div.attachments span.author { font-size: 0.9em; color: #888; } p.other-formats { text-align: right; font-size:0.9em; color: #666; } .other-formats span + span:before { content: "| "; } a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; } /* Project members tab */ div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft, div#tab-content-users .splitcontentleft { width: 64% } div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright, div#tab-content-users .splitcontentright { width: 34% } div#tab-content-members fieldset, div#tab-content-memberships fieldset, div#tab-content-users fieldset { padding:1em; margin-bottom: 1em; } div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend, div#tab-content-users fieldset legend { font-weight: bold; } div#tab-content-members fieldset label, div#tab-content-memberships fieldset label, div#tab-content-users fieldset label { display: block; } div#tab-content-members fieldset div, div#tab-content-users fieldset div { max-height: 400px; overflow:auto; } table.members td.group { padding-left: 20px; background: url(../images/group.png) no-repeat 0% 50%; } input#principal_search, input#user_search {width:100%} * html div#tab-content-members fieldset div { height: 450px; } /***** Flash & error messages ****/ #errorExplanation, div.flash, .nodata, .warning { padding: 4px 4px 4px 30px; margin-bottom: 12px; font-size: 1.1em; border: 2px solid; } div.flash {margin-top: 8px;} div.flash.error, #errorExplanation { background: url(../images/exclamation.png) 8px 50% no-repeat; background-color: #ffe3e3; border-color: #dd0000; color: #880000; } div.flash.notice { background: url(../images/true.png) 8px 5px no-repeat; background-color: #dfffdf; border-color: #9fcf9f; color: #005f00; } div.flash.warning { background: url(../images/warning.png) 8px 5px no-repeat; background-color: #FFEBC1; border-color: #FDBF3B; color: #A6750C; text-align: left; } .nodata, .warning { text-align: center; background-color: #FFEBC1; border-color: #FDBF3B; color: #A6750C; } #errorExplanation ul { font-size: 0.9em;} #errorExplanation h2, #errorExplanation p { display: none; } /***** Ajax indicator ******/ #ajax-indicator { position: absolute; /* fixed not supported by IE */ background-color:#eee; border: 1px solid #bbb; top:35%; left:40%; width:20%; font-weight:bold; text-align:center; padding:0.6em; z-index:100; filter:alpha(opacity=50); opacity: 0.5; } html>body #ajax-indicator { position: fixed; } #ajax-indicator span { background-position: 0% 40%; background-repeat: no-repeat; background-image: url(../images/loading.gif); padding-left: 26px; vertical-align: bottom; } /***** Calendar *****/ table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;} table.cal thead th {width: 14%;} table.cal tbody tr {height: 100px;} table.cal th { background-color:#EEEEEE; padding: 4px; } table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;} table.cal td p.day-num {font-size: 1.1em; text-align:right;} table.cal td.odd p.day-num {color: #bbb;} table.cal td.today {background:#ffffdd;} table.cal td.today p.day-num {font-weight: bold;} table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;} table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;} table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;} p.cal.legend span {display:block;} /***** Tooltips ******/ .tooltip{position:relative;z-index:24;} .tooltip:hover{z-index:25;color:#000;} .tooltip span.tip{display: none; text-align:left;} div.tooltip:hover span.tip{ display:block; position:absolute; top:12px; left:24px; width:270px; border:1px solid #555; background-color:#fff; padding: 4px; font-size: 0.8em; color:#505050; } /***** Progress bar *****/ table.progress { border: 1px solid #D7D7D7; border-collapse: collapse; border-spacing: 0pt; empty-cells: show; text-align: center; float:left; margin: 1px 6px 1px 0px; } table.progress td { height: 0.9em; } table.progress td.closed { background: #BAE0BA none repeat scroll 0%; } table.progress td.done { background: #DEF0DE none repeat scroll 0%; } table.progress td.open { background: #FFF none repeat scroll 0%; } p.pourcent {font-size: 80%;} p.progress-info {clear: left; font-style: italic; font-size: 80%;} /***** Tabs *****/ #content .tabs {height: 2.6em; margin-bottom:1.2em; position:relative; overflow:hidden;} #content .tabs ul {margin:0; position:absolute; bottom:0; padding-left:1em; width: 2000px; border-bottom: 1px solid #bbbbbb;} #content .tabs ul li { float:left; list-style-type:none; white-space:nowrap; margin-right:8px; background:#fff; position:relative; margin-bottom:-1px; } #content .tabs ul li a{ display:block; font-size: 0.9em; text-decoration:none; line-height:1.3em; padding:4px 6px 4px 6px; border: 1px solid #ccc; border-bottom: 1px solid #bbbbbb; background-color: #eeeeee; color:#777; font-weight:bold; } #content .tabs ul li a:hover { background-color: #ffffdd; text-decoration:none; } #content .tabs ul li a.selected { background-color: #fff; border: 1px solid #bbbbbb; border-bottom: 1px solid #fff; } #content .tabs ul li a.selected:hover { background-color: #fff; } div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; } button.tab-left, button.tab-right { font-size: 0.9em; cursor: pointer; height:24px; border: 1px solid #ccc; border-bottom: 1px solid #bbbbbb; position:absolute; padding:4px; width: 20px; bottom: -1px; } button.tab-left { right: 20px; background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%; } button.tab-right { right: 0; background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%; } /***** Auto-complete *****/ div.autocomplete { position:absolute; width:400px; margin:0; padding:0; } div.autocomplete ul { list-style-type:none; margin:0; padding:0; } div.autocomplete ul li { list-style-type:none; display:block; margin:-1px 0 0 0; padding:2px; cursor:pointer; font-size: 90%; border: 1px solid #ccc; border-left: 1px solid #ccc; border-right: 1px solid #ccc; background-color:white; } div.autocomplete ul li.selected { background-color: #ffb;} div.autocomplete ul li span.informal { font-size: 80%; color: #aaa; } #parent_issue_candidates ul li {width: 500px;} /***** Diff *****/ .diff_out { background: #fcc; } .diff_in { background: #cfc; } /***** Wiki *****/ div.wiki table { border: 1px solid #505050; border-collapse: collapse; margin-bottom: 1em; } div.wiki table, div.wiki td, div.wiki th { border: 1px solid #bbb; padding: 4px; } div.wiki .external { background-position: 0% 60%; background-repeat: no-repeat; padding-left: 12px; background-image: url(../images/external.png); } div.wiki a.new { color: #b73535; } div.wiki pre { margin: 1em 1em 1em 1.6em; padding: 2px 2px 2px 0; background-color: #fafafa; border: 1px solid #dadada; width:auto; overflow-x: auto; } div.wiki ul.toc { background-color: #ffffdd; border: 1px solid #e4e4e4; padding: 4px; line-height: 1.2em; margin-bottom: 12px; margin-right: 12px; margin-left: 0; display: table } * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */ div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; } div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; } div.wiki ul.toc li { list-style-type:none;} div.wiki ul.toc li.heading2 { margin-left: 6px; } div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; } div.wiki ul.toc a { font-size: 0.9em; font-weight: normal; text-decoration: none; color: #606060; } div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;} a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; } a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; } h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; } div.wiki img { vertical-align: middle; } /***** My page layout *****/ .block-receiver { border:1px dashed #c0c0c0; margin-bottom: 20px; padding: 15px 0 15px 0; } .mypage-box { margin:0 0 20px 0; color:#505050; line-height:1.5em; } .handle { cursor: move; } a.close-icon { display:block; margin-top:3px; overflow:hidden; width:12px; height:12px; background-repeat: no-repeat; cursor:pointer; background-image:url('../images/close.png'); } a.close-icon:hover { background-image:url('../images/close_hl.png'); } /***** Gantt chart *****/ .gantt_hdr { position:absolute; top:0; height:16px; border-top: 1px solid #c0c0c0; border-bottom: 1px solid #c0c0c0; border-right: 1px solid #c0c0c0; text-align: center; overflow: hidden; } .task { position: absolute; height:8px; font-size:0.8em; color:#888; padding:0; margin:0; line-height:0.8em; white-space:nowrap; } .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; } .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; } .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; } .task_todo.parent { background: #888; border: 1px solid #888; height: 6px;} .task_late.parent, .task_done.parent { height: 3px;} .task_todo.parent .left { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -5px; left: 0px; top: -1px;} .task_todo.parent .right { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-right: -5px; right: 0px; top: -1px;} .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; } /***** Icons *****/ .icon { background-position: 0% 50%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px; } .icon-add { background-image: url(../images/add.png); } .icon-edit { background-image: url(../images/edit.png); } .icon-copy { background-image: url(../images/copy.png); } .icon-duplicate { background-image: url(../images/duplicate.png); } .icon-del { background-image: url(../images/delete.png); } .icon-move { background-image: url(../images/move.png); } .icon-save { background-image: url(../images/save.png); } .icon-cancel { background-image: url(../images/cancel.png); } .icon-multiple { background-image: url(../images/table_multiple.png); } .icon-folder { background-image: url(../images/folder.png); } .open .icon-folder { background-image: url(../images/folder_open.png); } .icon-package { background-image: url(../images/package.png); } .icon-home { background-image: url(../images/home.png); } .icon-user { background-image: url(../images/user.png); } .icon-projects { background-image: url(../images/projects.png); } .icon-help { background-image: url(../images/help.png); } .icon-attachment { background-image: url(../images/attachment.png); } .icon-history { background-image: url(../images/history.png); } .icon-time { background-image: url(../images/time.png); } .icon-time-add { background-image: url(../images/time_add.png); } .icon-stats { background-image: url(../images/stats.png); } .icon-warning { background-image: url(../images/warning.png); } .icon-fav { background-image: url(../images/fav.png); } .icon-fav-off { background-image: url(../images/fav_off.png); } .icon-reload { background-image: url(../images/reload.png); } .icon-lock { background-image: url(../images/locked.png); } .icon-unlock { background-image: url(../images/unlock.png); } .icon-checked { background-image: url(../images/true.png); } .icon-details { background-image: url(../images/zoom_in.png); } .icon-report { background-image: url(../images/report.png); } .icon-comment { background-image: url(../images/comment.png); } .icon-summary { background-image: url(../images/lightning.png); } .icon-file { background-image: url(../images/files/default.png); } .icon-file.text-plain { background-image: url(../images/files/text.png); } .icon-file.text-x-c { background-image: url(../images/files/c.png); } .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); } .icon-file.text-x-php { background-image: url(../images/files/php.png); } .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); } .icon-file.text-xml { background-image: url(../images/files/xml.png); } .icon-file.image-gif { background-image: url(../images/files/image.png); } .icon-file.image-jpeg { background-image: url(../images/files/image.png); } .icon-file.image-png { background-image: url(../images/files/image.png); } .icon-file.image-tiff { background-image: url(../images/files/image.png); } .icon-file.application-pdf { background-image: url(../images/files/pdf.png); } .icon-file.application-zip { background-image: url(../images/files/zip.png); } .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); } img.gravatar { padding: 2px; border: solid 1px #d5d5d5; background: #fff; } div.issue img.gravatar { float: right; margin: 0 0 0 1em; padding: 5px; } div.issue table img.gravatar { height: 14px; width: 14px; padding: 2px; float: left; margin: 0 0.5em 0 0; } h2 img.gravatar { padding: 3px; margin: -2px 4px -4px 0; vertical-align: top; } h4 img.gravatar { padding: 3px; margin: -6px 0 -4px 0; vertical-align: top; } td.username img.gravatar { float: left; margin: 0 1em 0 0; } #activity dt img.gravatar { float: left; margin: 0 1em 1em 0; } #activity dt, .journal { clear: left; } h2 img { vertical-align:middle; } .hascontextmenu { cursor: context-menu; } /***** Media print specific styles *****/ @media print { #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; } #main { background: #fff; } #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;} #wiki_add_attachment { display:none; } } ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline Content-Type: image/gif Content-Location: http://dev.xonotic.org/images/loading.gif Content-Transfer-Encoding: Base64 R0lGODlhEAAQAMQAAP///+7u7t3d3bu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMz MyIiIhEREQARAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBwAQACwAAAAAEAAQ AAAFdyAkQgGJJOWoQgIjBM8jkKsoPEzgyMGsCjPDw7ADpkQBxRDmSCRetpRA6Rj4 kFBkgLC4IlUGhbNQIwXOYYWCXDufzYPDMaoKGBoKb886OjAKdgZAAgQkfCwzAgsD BAUCgl8jAQkHEAVkAoA1AgczlyIDczUDA2UhACH5BAUHABAALAAAAAAPABAAAAVj ICSO0IGIATkqIiMKDaGKC8Q49jPMYsE0hQdrlABCGgvT45FKiRKQhWA0mPKGPAgB cTjsspBCAoH4gl+FmXNEUEBVAYHToJAVZK/XWoQQDAgBZioHaX8igigFKYYQVlkC jiMhACH5BAUHABAALAAAAAAQAA8AAAVgICSOUGGQqIiIChMESyo6CdQGdRqUENES I8FAdFgAFwqDISYwPB4CVSMnEhSej+FogNhtHyfRQFmIol5owmEta/fcKITB6y4c hoMBmk7yGgSAEAJ8JAVDgQFmKUCCZnwhACH5BAUHABAALAAAAAAQABAAAAViICSO YkGe4hFAiSImAwotB+si6Co2QxvjAYHIgBAqDoWCK2Bq6A40iA4yYMggNZKwGFgV CAQZotFwwJIF4QnxaC9IsZNgLtAJDKbraJCGzPVSIgEDXVNXA0JdgH6ChoCKKCEA IfkEBQcAEAAsAAAAABAADgAABUkgJI7QcZComIjPw6bs2kINLB5uW9Bo0gyQx8Lk KgVHiccKVdyRlqjFSAApOKOtR810StVeU9RAmLqOxi0qRG3LptikAVQEh4UAACH5 BAUHABAALAAAAAAQABAAAAVxICSO0DCQKBQQonGIh5AGB2sYkMHIqYAIN0EDRxoQ ZIaC6bAoMRSiwMAwCIwCggRkwRMJWKSAomBVCc5lUiGRUBjO6FSBwWggwijBooDC diFfIlBRAlYBZQ0PWRANaSkED1oQYHgjDA8nM3kPfCmejiEAIfkEBQcAEAAsAAAA ABAAEAAABWAgJI6QIJCoOIhFwabsSbiFAotGMEMKgZoB3cBUQIgURpFgmEI0EqjA CYXwiYJBGAGBgGIDWsVicbiNEgSsGbKCIMCwA4IBCRgXt8bDACkvYQF6U1OADg8m DlaACQtwJCEAIfkEBQcAEAAsAAABABAADwAABV4gJEKCOAwiMa4Q2qIDwq4wiriB mItCCREHUsIwCgh2q8MiyEKODK7ZbHCoqqSjWGKI1d2kRp+RAWGyHg+DQUEmKliG x4HBKECIMwG61AgssAQPKA19EAxRKz4QCVIhACH5BAUHABAALAAAAAAQABAAAAVj ICSOUBCQqHhCgiAOKyqcLVvEZOC2geGiK5NpQBAZCilgAYFMogo/J0lgqEpHgoO2 +GIMUL6p4vFojhQNg8rxWLgYBQJCASkwEKLC17hYFJtRIwwBfRAJDk4ObwsidEkr WkkhACH5BAUHABAALAAAAQAQAA8AAAVcICSOUGAGAqmKpjis6vmuqSrUxQyPhDEE tpUOgmgYETCCcrB4OBWwQsGHEhQatVFhB/mNAojFVsQgBhgKpSHRTRxEhGwhoRg0 CCXYAkKHHPZCZRAKUERZMAYGMCEAIfkEBQcAEAAsAAABABAADwAABV0gJI4kFJTo GAilwKLCST6PUcrB8A70844CXenwILRkIoYyBRk4BQlHo3FIOQmvAEGBMpYSop/I gPBCFpCqIuEsIESHgkgoJxwQAjSzwb1DClwwgQhgAVVMIgVyKCEAIfkECQcAEAAs AAAAABAAEAAABWQgJI5kSQ6NYK7Dw6xr8hCw+ELC85hCIAq3Am0U6JUKjkHJNzIs FAqDqShQHRhY6bKqgvgGCZOSFDhAUiWCYQwJSxGHKqGAE/5EqIHBjOgyRQELCBB7 EAQHfySDhGYQdDWGQyUhADs= ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline Content-Type: image/png Content-Location: http://dev.xonotic.org/images/external.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAADFBMVEUAAADO1sa1 vbWcpZx8bxz6AAAAAXRSTlMAQObYZgAAACpJREFUCNdNzMENADAMg8CLvf/OfTXK DyEEJm0zCMiarqmCHsqnzHbn9gAQmABaI2lSJgAAAABJRU5ErkJggg== ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline Content-Type: image/png Content-Location: http://dev.xonotic.org/images/history.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAJFBMVEX/AAD////n 5+/39/fv7+/n5+fW1t7e3ufv7/fe3t7W1tbn7+/6D0IiAAAAAXRSTlMAQObYZgAA AFZJREFUGNOtzrEOgEAMAlCuQHun//+/DlqNi5NsfSGkwH8RAVB9UkFAapAp0ns3 XKJkzwsiremtQvMEriyFc7k3RmWZyhU9OpxFzCzjEQLMGzDi/dhXDrvVAZlyxkl5 AAAAAElFTkSuQmCC ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline; filename=application.css Content-Type: text/css; charset=utf-8; name=application.css Content-Location: http://dev.xonotic.org/themes/alternate/stylesheets/application.css?1274230131 Content-Transfer-Encoding: 8bit @import url(../../../stylesheets/application.css); body, #wrapper { background-color:#EEEEEE; } #header, #top-menu { margin: 0px 10px 0px 11px; } #main { background: #EEEEEE; margin: 8px 10px 0px 10px; } #content, #main.nosidebar #content { background: #fff; border-right: 1px solid #bbb; border-bottom: 1px solid #bbb; border-left: 1px solid #d7d7d7; border-top: 1px solid #d7d7d7; } #footer { background-color:#EEEEEE; border: 0px; } /* Headers */ h2, h3, h4, .wiki h1, .wiki h2, .wiki h3 {border-bottom: 0px;} /* Menu */ #main-menu li a { background-color: #507AAA; font-weight: bold;} #main-menu li a:hover { background: #507AAA; text-decoration: underline; } #main-menu li a.selected, #main-menu li a.selected:hover { background-color:#EEEEEE; } /* Tables */ table.list tbody td, table.list tbody tr:hover td { border: solid 1px #d7d7d7; } table.list thead th { border-width: 1px; border-style: solid; border-top-color: #d7d7d7; border-right-color: #d7d7d7; border-left-color: #d7d7d7; border-bottom-color: #999999; } /* Issues grid styles by priorities (provided by Wynn Netherland) */ table.list tr.issue a { color: #666; } tr.odd.priority-5, table.list tbody tr.odd.priority-5:hover { color: #900; font-weight: bold; } tr.odd.priority-5 { background: #ffc4c4; } tr.even.priority-5, table.list tbody tr.even.priority-5:hover { color: #900; font-weight: bold; } tr.even.priority-5 { background: #ffd4d4; } tr.priority-5 a, tr.priority-5:hover a { color: #900; } tr.odd.priority-5 td, tr.even.priority-5 td { border-color: #ffb4b4; } tr.odd.priority-4, table.list tbody tr.odd.priority-4:hover { color: #900; } tr.odd.priority-4 { background: #ffc4c4; } tr.even.priority-4, table.list tbody tr.even.priority-4:hover { color: #900; } tr.even.priority-4 { background: #ffd4d4; } tr.priority-4 a { color: #900; } tr.odd.priority-4 td, tr.even.priority-4 td { border-color: #ffb4b4; } tr.odd.priority-3, table.list tbody tr.odd.priority-3:hover { color: #900; } tr.odd.priority-3 { background: #fee; } tr.even.priority-3, table.list tbody tr.even.priority-3:hover { color: #900; } tr.even.priority-3 { background: #fff2f2; } tr.priority-3 a { color: #900; } tr.odd.priority-3 td, tr.even.priority-3 td { border-color: #fcc; } tr.odd.priority-1, table.list tbody tr.odd.priority-1:hover { color: #559; } tr.odd.priority-1 { background: #eaf7ff; } tr.even.priority-1, table.list tbody tr.even.priority-1:hover { color: #559; } tr.even.priority-1 { background: #f2faff; } tr.priority-1 a { color: #559; } tr.odd.priority-1 td, tr.even.priority-1 td { border-color: #add7f3; } /* Buttons */ input[type="button"], input[type="submit"], input[type="reset"] { background-color: #f2f2f2; color: #222222; border: 1px outset #cccccc; } input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover { background-color: #ccccbb; } /* Fields */ input[type="text"], input[type="password"], textarea, select { padding: 2px; border: 1px solid #d7d7d7; } input[type="text"], input[type="password"] { padding: 3px; } input[type="text"]:focus, input[type="password"]:focus, textarea:focus, select:focus { border: 1px solid #888866; } option { border-bottom: 1px dotted #d7d7d7; } /* Misc */ .box { background-color: #fcfcfc; } ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline; filename=jstoolbar.css Content-Type: text/css; charset=utf-8; name=jstoolbar.css Content-Location: http://dev.xonotic.org/stylesheets/jstoolbar.css?1274230131 Content-Transfer-Encoding: 8bit .jstEditor { padding-left: 0px; } .jstEditor textarea, .jstEditor iframe { margin: 0; } .jstHandle { height: 10px; font-size: 0.1em; cursor: s-resize; /*background: transparent url(img/resizer.png) no-repeat 45% 50%;*/ } .jstElements { padding: 3px 3px; } .jstElements button { margin-right : 6px; width : 24px; height: 24px; padding: 4px; border-style: solid; border-width: 1px; border-color: #ddd; background-color : #f7f7f7; background-position : 50% 50%; background-repeat: no-repeat; } .jstElements button:hover { border-color : #000; } .jstElements button span { display : none; } .jstElements span { display : inline; } .jstSpacer { width : 0px; font-size: 1px; margin-right: 4px; } .jstElements .help { float: right; margin-right: 1em; padding-top: 8px; font-size: 0.9em; } /* Buttons -------------------------------------------------------- */ .jstb_strong { background-image: url(../images/jstoolbar/bt_strong.png); } .jstb_em { background-image: url(../images/jstoolbar/bt_em.png); } .jstb_ins { background-image: url(../images/jstoolbar/bt_ins.png); } .jstb_del { background-image: url(../images/jstoolbar/bt_del.png); } .jstb_code { background-image: url(../images/jstoolbar/bt_code.png); } .jstb_h1 { background-image: url(../images/jstoolbar/bt_h1.png); } .jstb_h2 { background-image: url(../images/jstoolbar/bt_h2.png); } .jstb_h3 { background-image: url(../images/jstoolbar/bt_h3.png); } .jstb_ul { background-image: url(../images/jstoolbar/bt_ul.png); } .jstb_ol { background-image: url(../images/jstoolbar/bt_ol.png); } .jstb_bq { background-image: url(../images/jstoolbar/bt_bq.png); } .jstb_unbq { background-image: url(../images/jstoolbar/bt_bq_remove.png); } .jstb_pre { background-image: url(../images/jstoolbar/bt_pre.png); } .jstb_link { background-image: url(../images/jstoolbar/bt_link.png); } .jstb_img { background-image: url(../images/jstoolbar/bt_img.png); } ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline; filename=stylesheet.css Content-Type: text/css; charset=utf-8; name=stylesheet.css Content-Location: http://dev.xonotic.org/plugin_assets/redmine_vote/stylesheets/stylesheet.css?1274230391 Content-Transfer-Encoding: 8bit .icon-vote-up { background-image: url(../images/arrow_090.png); } .icon-vote-down { background-image: url(../images/arrow_270.png); } span.votes-positive { color: green; font-weight: bold } span.votes-negative { color: red; font-weight: bold } ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline; filename=wiki_extensions.css Content-Type: text/css; charset=utf-8; name=wiki_extensions.css Content-Location: http://dev.xonotic.org/plugin_assets/redmine_wiki_extensions/stylesheets/wiki_extensions.css Content-Transfer-Encoding: 8bit .wiki_extensions_fn{ vertical-align:super; font-size:x-small; } .wiki_extensions_fnlist{ /* font-size:10px; */ } .wiki_extensions_fnlist ul li { list-style-type: none; list-style-image: none; } .wiki_extensions_fnlist ul { padding-left:0; } .wiki_ext_new_date { font-weight: bold; } .wiki_ext_new_mark { font-style: italic; color: #ff0000; } #wiki_extensions_tag_form .tag_field { margin-right: 1em; } .tag_level5{ font-size:xx-large; } .tag_level4{ font-size:x-large; } .tag_level3{ font-size:large; } .tag_level2{ font-size:small; } .tag_level1{ font-size:x-small; } #wikiext_taglist_complete { background-color: #E6E6FA; padding: 0; } #wikiext_taglist_complete ul { padding-left: 1em; margin: 0; } #wikiext_taglist_complete li{ list-style-type: none; margin: 0; } #sidebar ol.wikiext-popularity { padding-left: 20px; } ------------XGzFGuQFvdcv6yi3Ar77fC Content-Disposition: inline; filename=scm.css Content-Type: text/css; charset=utf-8; name=scm.css Content-Location: http://dev.xonotic.org/stylesheets/scm.css?1274230131 Content-Transfer-Encoding: 8bit div.changeset-changes ul { margin: 0; padding: 0; } div.changeset-changes ul > ul { margin-left: 18px; padding: 0; } li.change { list-style-type:none; background-image: url(../images/bullet_black.png); background-position: 1px 1px; background-repeat: no-repeat; padding-top: 1px; padding-bottom: 1px; padding-left: 20px; margin: 0; } li.change.folder { background-image: url(../images/folder_open.png); } li.change.folder.change-A { background-image: url(../images/folder_open_add.png); } li.change.folder.change-M { background-image: url(../images/folder_open_orange.png); } li.change.change-A { background-image: url(../images/bullet_add.png); } li.change.change-M { background-image: url(../images/bullet_orange.png); } li.change.change-C { background-image: url(../images/bullet_blue.png); } li.change.change-R { background-image: url(../images/bullet_purple.png); } li.change.change-D { background-image: url(../images/bullet_delete.png); } li.change .copied-from { font-style: italic; color: #999; font-size: 0.9em; } li.change .copied-from:before { content: " - "} #changes-legend { float: right; font-size: 0.8em; margin: 0; } #changes-legend li { float: left; background-position: 5px 0; } table.filecontent { border: 1px solid #ccc; border-collapse: collapse; width:98%; background-color: #fafafa; } table.filecontent th { border: 1px solid #ccc; background-color: #eee; } table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding: 0.2em;} table.filecontent tr.spacing th { text-align:center; } table.filecontent tr.spacing td { height: 0.4em; background: #EAF2F5;} table.filecontent th.line-num { border: 1px solid #d7d7d7; font-size: 0.8em; text-align: right; width: 2%; padding-right: 3px; color: #999; } table.filecontent th.line-num a { text-decoration: none; color: inherit; } table.filecontent td.line-code pre { margin: 0px; white-space: pre-wrap; /* CSS2.1 compliant */ white-space: -moz-pre-wrap; /* Mozilla-based browsers */ white-space: -o-pre-wrap; /* Opera 7+ */ } /* 12 different colors for the annonate view */ table.annotate tr.bloc-0 {background: #FFFFBF;} table.annotate tr.bloc-1 {background: #EABFFF;} table.annotate tr.bloc-2 {background: #BFFFFF;} table.annotate tr.bloc-3 {background: #FFD9BF;} table.annotate tr.bloc-4 {background: #E6FFBF;} table.annotate tr.bloc-5 {background: #BFCFFF;} table.annotate tr.bloc-6 {background: #FFBFEF;} table.annotate tr.bloc-7 {background: #FFE6BF;} table.annotate tr.bloc-8 {background: #FFE680;} table.annotate tr.bloc-9 {background: #AA80FF;} table.annotate tr.bloc-10 {background: #FFBFDC;} table.annotate tr.bloc-11 {background: #BFE4FF;} table.annotate td.revision { text-align: center; width: 2%; padding-left: 1em; background: inherit; } table.annotate td.author { text-align: center; border-right: 1px solid #d7d7d7; white-space: nowrap; padding-left: 1em; padding-right: 1em; width: 3%; background: inherit; font-size: 90%; } table.annotate td.line-code { background-color: #fafafa; } div.action_M { background: #fd8 } div.action_D { background: #f88 } div.action_A { background: #bfb } /************* CodeRay styles *************/ .syntaxhl div {display: inline;} .syntaxhl .no { padding: 2px 4px 2px 4px; background-color: #eee; margin:0 } .syntaxhl .code pre { overflow: auto } .syntaxhl .debug { color:white ! important; background:blue ! important; } .syntaxhl .af { color:#00C } .syntaxhl .an { color:#007 } .syntaxhl .at { color:#f08 } .syntaxhl .av { color:#700 } .syntaxhl .aw { color:#C00 } .syntaxhl .bi { color:#509; font-weight:bold } .syntaxhl .c { color:#888; } .syntaxhl .ch { color:#04D } .syntaxhl .ch .k { color:#04D } .syntaxhl .ch .dl { color:#039 } .syntaxhl .cl { color:#B06; font-weight:bold } .syntaxhl .cm { color:#A08; font-weight:bold } .syntaxhl .co { color:#036; font-weight:bold } .syntaxhl .cr { color:#0A0 } .syntaxhl .cv { color:#369 } .syntaxhl .de { color:#B0B; } .syntaxhl .df { color:#099; font-weight:bold } .syntaxhl .di { color:#088; font-weight:bold } .syntaxhl .dl { color:black } .syntaxhl .do { color:#970 } .syntaxhl .dt { color:#34b } .syntaxhl .ds { color:#D42; font-weight:bold } .syntaxhl .e { color:#666; font-weight:bold } .syntaxhl .en { color:#800; font-weight:bold } .syntaxhl .er { color:#F00; background-color:#FAA } .syntaxhl .ex { color:#C00; font-weight:bold } .syntaxhl .fl { color:#60E; font-weight:bold } .syntaxhl .fu { color:#06B; font-weight:bold } .syntaxhl .gv { color:#d70; font-weight:bold } .syntaxhl .hx { color:#058; font-weight:bold } .syntaxhl .i { color:#00D; font-weight:bold } .syntaxhl .ic { color:#B44; font-weight:bold } .syntaxhl .il { background: #ddd; color: black } .syntaxhl .il .il { background: #ccc } .syntaxhl .il .il .il { background: #bbb } .syntaxhl .il .idl { background: #ddd; font-weight: bold; color: #666 } .syntaxhl .idl { background-color: #bbb; font-weight: bold; color: #666; } .syntaxhl .im { color:#f00; } .syntaxhl .in { color:#B2B; font-weight:bold } .syntaxhl .iv { color:#33B } .syntaxhl .la { color:#970; font-weight:bold } .syntaxhl .lv { color:#963 } .syntaxhl .oc { color:#40E; font-weight:bold } .syntaxhl .of { color:#000; font-weight:bold } .syntaxhl .op { } .syntaxhl .pc { color:#038; font-weight:bold } .syntaxhl .pd { color:#369; font-weight:bold } .syntaxhl .pp { color:#579; } .syntaxhl .ps { color:#00C; font-weight:bold } .syntaxhl .pt { color:#074; font-weight:bold } .syntaxhl .r, .kw { color:#080; font-weight:bold } .syntaxhl .ke { color: #808; } .syntaxhl .ke .dl { color: #606; } .syntaxhl .ke .ch { color: #80f; } .syntaxhl .vl { color: #088; } .syntaxhl .rx { background-color:#fff0ff } .syntaxhl .rx .k { color:#808 } .syntaxhl .rx .dl { color:#404 } .syntaxhl .rx .mod { color:#C2C } .syntaxhl .rx .fu { color:#404; font-weight: bold } .syntaxhl .s { background-color:#fff0f0; color: #D20; } .syntaxhl .s .s { background-color:#ffe0e0 } .syntaxhl .s .s .s { background-color:#ffd0d0 } .syntaxhl .s .k { } .syntaxhl .s .ch { color: #b0b; } .syntaxhl .s .dl { color: #710; } .syntaxhl .sh { background-color:#f0fff0; color:#2B2 } .syntaxhl .sh .k { } .syntaxhl .sh .dl { color:#161 } .syntaxhl .sy { color:#A60 } .syntaxhl .sy .k { color:#A60 } .syntaxhl .sy .dl { color:#630 } .syntaxhl .ta { color:#070 } .syntaxhl .tf { color:#070; font-weight:bold } .syntaxhl .ts { color:#D70; font-weight:bold } .syntaxhl .ty { color:#339; font-weight:bold } .syntaxhl .v { color:#036 } .syntaxhl .xt { color:#444 } .syntaxhl .ins { background: #cfc; } .syntaxhl .del { background: #fcc; } .syntaxhl .chg { color: #aaf; background: #007; } .syntaxhl .head { color: #f8f; background: #505 } .syntaxhl .ins .ins { color: #080; font-weight:bold } .syntaxhl .del .del { color: #800; font-weight:bold } .syntaxhl .chg .chg { color: #66f; } .syntaxhl .head .head { color: #f4f; } ------------XGzFGuQFvdcv6yi3Ar77fC--