diff --git a/doc/html/DataFlow.png b/doc/html/DataFlow.png new file mode 100644 index 0000000..a499f45 Binary files /dev/null and b/doc/html/DataFlow.png differ diff --git a/doc/html/DistributionSystem.png b/doc/html/DistributionSystem.png new file mode 100644 index 0000000..4804e7e Binary files /dev/null and b/doc/html/DistributionSystem.png differ diff --git a/doc/html/Example2.png b/doc/html/Example2.png new file mode 100644 index 0000000..bff8f4e Binary files /dev/null and b/doc/html/Example2.png differ diff --git a/doc/html/Network.png b/doc/html/Network.png new file mode 100644 index 0000000..3a6df9e Binary files /dev/null and b/doc/html/Network.png differ diff --git a/doc/html/_action_clauses.html b/doc/html/_action_clauses.html new file mode 100644 index 0000000..7daa93f --- /dev/null +++ b/doc/html/_action_clauses.html @@ -0,0 +1,99 @@ + + + + + + + +EPANET: Action Clauses + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Action Clauses
+
+
+

An action clause in a Rule-Based Control takes the form of:

+

    object  id  STATUS / SETTING  IS  value

+

where

+ + + + + + +
object   =   LINK, PIPE, PUMP, or VALVE keyword
id     =   the object's ID label
value   =   a status condition (OPEN or CLOSED), pump speed setting, or valve setting
+


+ Some example action clauses are:
+ LINK 23 STATUS IS CLOSED
+ PUMP P100 SETTING IS 1.5
+ VALVE 123 SETTING IS 90
+

+

See the notes for the [STATUS] section for conventions used in specifying link status and setting, particularly for control valves.

+
+
+ + + + diff --git a/doc/html/_backdrop_page.html b/doc/html/_backdrop_page.html new file mode 100644 index 0000000..0ea9ee3 --- /dev/null +++ b/doc/html/_backdrop_page.html @@ -0,0 +1,104 @@ + + + + + + + +EPANET: [BACKDROP] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[BACKDROP]
+
+
+

Purpose:

+

Identifies a backdrop image and dimensions for visualizing the network's layout.

+

Formats:

+ + + + + + + + +
DIMENSIONS LLx LLy URx URy
UNITS FEET/METERS/DEGREES/NONE
FILEfilename
OFFSETX Y
+

Definitions:

+

DIMENSIONS provides the X and Y coordinates of the lower-left and upper-right corners of the network's bounding rectangle. Defaults are the extents of the nodal coordinates supplied in the [COORDINATES] section.

+

UNITS specifies the units that the network's dimensions are given in. Default is NONE.

+

FILE supplies the name of the file that contains a backdrop image for the network.

+

OFFSET lists the X and Y distance that the upper-left corner of the backdrop image is offset from the upper-left corner of the network's bounding rectangle. Default is zero offset.

+

Remarks:

+
    +
  1. The [BACKDROP] section is optional and only provides support for an external GUI program that uses the EPANET engine.
  2. +
  3. Only Windows Enhanced Metafiles and bitmap files can be used as backdrops.
  4. +
+
+
+ + + + diff --git a/doc/html/_condition_clauses.html b/doc/html/_condition_clauses.html new file mode 100644 index 0000000..fbe9dbe --- /dev/null +++ b/doc/html/_condition_clauses.html @@ -0,0 +1,146 @@ + + + + + + + +EPANET: Condition Clauses + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Condition Clauses
+
+
+

A condition clause in a Rule-Based Control takes the form of:

+

  object  id  attribute  relation  value
+

+

where

+ + + + + + + + + + +
object     =   a category of network object
id     =   the object's ID label
attribute   =   an attribute or property of the object
relation    =   a relational operator
value     =   an attribute value
+

Some example conditional clauses are:
+   JUNCTION 23 PRESSURE > 20
+   TANK T200 FILLTIME BELOW 3.5
+   LINK 44 STATUS IS OPEN
+   SYSTEM CLOCKTIME = 7:30 AM
+   SYSTEM DEMAND >= 1500
+

+

Objects can be any of the following keywords:
+   NODE  JUNCTION  TANK  RESERVOIR
+   LINK  PIPE  PUMP  VALVE
+   SYSTEM

+

When SYSTEM is used in a condition no ID is supplied.

+

The following attributes can be used with Node-type objects:
+    DEMAND
+    HEAD
+    PRESSURE

+

The following attributes can be used with Tanks:
+    LEVEL
+    FILLTIME  (hours needed to fill a tank)
+    DRAINTIME (hours needed to empty a tank)

+

These attributes can be used with Link-Type objects:
+    FLOW
+    STATUS  (OPEN, CLOSED, or ACTIVE)
+    SETTING  (pump speed or valve setting)

+

The SYSTEM object can use the following attributes:

+ + + + + + + + +
   DEMAND(total system demand)
   TIME(hours from the start of the simulation expressed
   either as a decimal number or in hours:minutes format)
   CLOCKTIME (24-hour clock time with AM or PM appended)
+

Relation operators consist of the following:
+

+ + + + + + + + + + + + +
  = IS
  <> NOT
  < BELOW
  > ABOVE
  <=
  >=
+
+
+ + + + diff --git a/doc/html/_coords_page.html b/doc/html/_coords_page.html new file mode 100644 index 0000000..0c2811a --- /dev/null +++ b/doc/html/_coords_page.html @@ -0,0 +1,97 @@ + + + + + + + +EPANET: [COORDINATES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[COORDINATES]
+
+
+

Purpose:

+

Assigns map coordinates to network's nodes.

+

Format:

+

One line for each node containing:

    +
  • Node ID label
  • +
  • X-coordinate
  • +
  • Y-coordinate
  • +
+

Remarks:

+
    +
  1. Include one line for each node that has coordinates.
  2. +
  3. The coordinates represent the distance from the node to an arbitrary origin at the lower left of the network. Any convenient units of measure for this distance can be used.
  4. +
  5. The locations of the nodes need not be to actual scale.
  6. +
  7. A [COORDINATES] section is optional and only provides support for an external GUI program that uses the EPANET engine.
  8. +
+
+
+ + + + diff --git a/doc/html/_ctrls_page.html b/doc/html/_ctrls_page.html new file mode 100644 index 0000000..934c86f --- /dev/null +++ b/doc/html/_ctrls_page.html @@ -0,0 +1,122 @@ + + + + + + + +EPANET: [CONTROLS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[CONTROLS]
+
+
+

Purpose:

+

Defines simple controls that modify links based on a single condition.
+

+

Format:

+

One line for each control which can be of the form:

+

   LINK linkID  status  IF NODE   nodeID  ABOVE / BELOW   value

+

   LINK linkID   status   AT TIME  time

+

   LINK linkID   status   AT CLOCKTIME clocktime   AM / PM

+

where:

+ + + + + + + + + + + + +
linkID=  a link ID label
status=   OPEN / CLOSED, a pump speed setting, or a control valve setting
+
nodeID=  a node ID label
value=  a pressure for a junction or a water level for a tank
time=  a time since the start of the simulation in hours
clocktime=  a 24-hour clock time (hrs:min)
+

Remarks:

    +
  1. Simple controls are used to change link status or settings based on tank water level, junction pressure, time into the simulation or time of day.
    +
  2. +
  3. See the notes for the [STATUS] section for conventions used in specifying link status and setting, particularly for control valves.
    +
  4. +
+

Examples:

+

[CONTROLS]
+ ;Close Link 12 if the level in Tank 23 exceeds 20 ft.
+ LINK 12 CLOSED IF NODE 23 ABOVE 20

+

;Open Link 12 if the pressure at Node 130 is under 30 psi
+ LINK 12 OPEN IF NODE 130 BELOW 30

+

;Pump PUMP02's speed is set to 1.5 at 16 hours into the simulation
+ LINK PUMP02 1.5 AT TIME 16

+

;Link 12 is closed at 10 am and opened at 8 pm throughout the simulation
+ LINK 12 CLOSED AT CLOCKTIME 10 AM
+ LINK 12 OPEN AT CLOCKTIME 8 PM

+
+
+ + + + diff --git a/doc/html/_curves_page.html b/doc/html/_curves_page.html new file mode 100644 index 0000000..0207547 --- /dev/null +++ b/doc/html/_curves_page.html @@ -0,0 +1,115 @@ + + + + + + + +EPANET: [CURVES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[CURVES]
+
+
+

Purpose:

+

Defines data curves and their X,Y points.
+

+

Format:

+

One line for each X,Y point on each curve containing:

    +
  • Curve ID label
  • +
  • an X value
  • +
  • a Y value
  • +
+

Remarks:

    +
  1. Curves can be used to represent the following relations:
      +
    • Head v. Flow for pumps
    • +
    • Efficiency v. Flow for pumps
    • +
    • Volume v. Depth for tanks
    • +
    • Head Loss v. Flow for General Purpose Valves
    • +
    +
  2. +
  3. The points of a curve must be entered in order of increasing X-values (lower to higher).
  4. +
  5. If the input file will be used with the Windows version of EPANET, then adding a comment which contains the curve type and description, separated by a colon, directly above the first entry for a curve will ensure that these items appear correctly in EPANET's Curve Editor. Curve types include PUMP, EFFICIENCY, VOLUME, and HEADLOSS. See the examples below.
  6. +
+

Example:

[CURVES]
+
;ID Flow Head
+
;PUMP: Curve for Pump 1
+
C1 0 200
+
C1 1000 100
+
C1 3000 0
+
+
;ID Flow Effic.
+
;EFFICIENCY:
+
E1 200 50
+
E1 1000 85
+
E1 2000 75
+
E1 3000 65
+
+
+ + + + diff --git a/doc/html/_data_flow.html b/doc/html/_data_flow.html new file mode 100644 index 0000000..11dcbc8 --- /dev/null +++ b/doc/html/_data_flow.html @@ -0,0 +1,97 @@ + + + + + + + +EPANET: Data Flow Diagram + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Data Flow Diagram
+
+
+

The EPANET Toolkit contains separate code modules for network building, hydraulic analysis, water quality analysis, and report generation. The data flow diagram for analyzing a pipe network is shown below. The processing steps depicted in this diagram can be summarized as follows:

+ + + +
+ +
+
+
    +
  • The network builder receives a description of the network being simulated either from an external input file (.inp) or from a series of function calls that create network objects and assign their properties via code. These data are stored in a Project data structure.
    +
  • +
  • The hydraulics solver carries out an extended period hydraulic simulation. The results obtained at every time step can be written to an external, unformatted (binary) hydraulics file (.hyd). Some of these time steps might represent intermediate points in time where system conditions change because of tanks becoming full or empty or pumps turning on or off due to level controls or timed operation.
    +
  • +
  • If a water quality simulation is requested, the water quality solver accesses the flow data from the hydraulics file as it computes substance transport and reaction throughout the network over each hydraulic time step. During this process it can write both the formerly computed hydraulic results as well as its water quality results for each preset reporting interval to an unformatted (binary) output file (.out). If no water quality analysis was called for, then the hydraulic results stored in the .hyd file can simply be written out to the binary output file at uniform reporting intervals.
    +
  • +
  • If requested, a report writer reads back the computed simulation results from the binary output file (.out) for each reporting period and writes out selected values to a formatted report file (.rpt). Any error or warning messages generated during the run are also written to this file.
    +
  • +
+

Toolkit functions exist to carry out all of these steps under the programmer's control, including the ability to read and modify the contents of the Project data structure.

+
+
+ + + + diff --git a/doc/html/_data_model.html b/doc/html/_data_model.html new file mode 100644 index 0000000..bfcc7df --- /dev/null +++ b/doc/html/_data_model.html @@ -0,0 +1,106 @@ + + + + + + + +EPANET: Network Data Model + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Network Data Model
+
+
+

EPANET models a pipe network as a collection of links connected to nodes. The links represent pipes, pumps, and control valves. The nodes represent junctions, tanks, and reservoirs. The figure below illustrates how these objects can be connected to one another to form a network.

+ + + +
+ +
+
+

Junctions have a user-supplied water withdrawal rate (i.e., consumer demand) associated with them. Tanks are storage units whose water level changes over time. Reservoirs are boundary points where a fixed hydraulic head applies.

+

Pipes have a length, diameter and roughness coefficient that determines their head loss as a function of flow rate. Pumps have either a constant power rating or a head curve that determines the head they add as a function of flow rate. Valves are used to regulate either flow or pressure. Controls can be applied to completely open or close a link or to adjust its setting (pump speed or valve setting).

+

In addition to these physical objects an EPANET model can also contain the following data objects:

    +
  • time patterns that allow demands, quality source strength and pump speed settings to vary at fixed intervals of time
  • +
  • data curves that describe relationships between two quantities, such as head versus flow for pumps and volume versus water level for tanks
  • +
  • simple controls that adjust a link's setting (such as a pump's status) based on node pressure, tank level, elapsed time, ot time of day
  • +
  • rule-based controls that consist of one or more premises that if true result in one set of actions being taken and if false result in a different set of actions being taken
  • +
  • water quality sources that introduce a chemical constituent into the network at specified nodes.
  • +
+

An EPANET model also contains a number of analysis options that specify:

    +
  • the project's flow units which in turn determines its unit system (US or SI)
  • +
  • the formula used to compute head loss
  • +
  • whether to use a demand driven or a pressure driven analysis
  • +
  • hydraulic convergence criteria
  • +
  • time steps used for hydraulic, water quality and reporting
  • +
  • the type of water quality analysis to perform (chemical reaction, source tracing or water age)
  • +
  • global values for chemical reaction coefficients that can be overridden for individual pipes
  • +
  • global values for energy usage parameters that can be overridden for individual pumps.
  • +
+

Please refer to the EPANET 2 Users Manual for more information on EPANET's data model.

+
+
+ + + + diff --git a/doc/html/_dmnds_page.html b/doc/html/_dmnds_page.html new file mode 100644 index 0000000..6064aad --- /dev/null +++ b/doc/html/_dmnds_page.html @@ -0,0 +1,103 @@ + + + + + + + +EPANET: [DEMANDS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[DEMANDS]
+
+
+

Purpose:

+

Supplement to [JUNCTIONS] section for defining multiple water demands at junction nodes.

+

Format:

+

One line for each category of demand at a junction containing:

    +
  • Junction ID label
  • +
  • Base demand (flow units)
  • +
  • Demand pattern ID (optional)
  • +
  • Name of demand category preceded by a semicolon (optional)
  • +
+

Remarks:

    +
  1. Only use for junctions whose demands need to be changed or supplemented from entries in [JUNCTIONS] section.
  2. +
  3. Data in this section replaces any demand entered in the [JUNCTIONS] section for the same junction.
  4. +
  5. An unlimited number of demand categories can be entered per junction.
  6. +
  7. If no demand pattern is supplied then the junction demand follows the Pattern entry in the [OPTIONS] section, or Pattern 1 if no such pattern is supplied. If the default pattern (or Pattern 1) does not exist, then the demand remains constant.
  8. +
+

Example:

[DEMANDS]
+
;ID Demand Pattern Category
+
;---------------------------------
+
J1 100 101 ;Domestic
+
J1 25 102 ;School
+
J256 50 101 ;Domestic
+
+
+ + + + diff --git a/doc/html/_emits_page.html b/doc/html/_emits_page.html new file mode 100644 index 0000000..46cc8b6 --- /dev/null +++ b/doc/html/_emits_page.html @@ -0,0 +1,96 @@ + + + + + + + +EPANET: [EMITTERS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[EMITTERS]
+
+
+

Purpose:

+

Defines junctions modeled as emitters (sprinklers or orifices).

+

Format:

+

One line for each emitter containing:

    +
  • Junction ID label
  • +
  • Flow coefficient, flow units at 1 psi (1 meter) pressure drop
  • +
+

Remarks:

    +
  1. Emitters are used to model flow through sprinkler heads or pipe leaks.
  2. +
  3. Flow out of the emitter equals the product of the flow coefficient and the junction pressure raised to a power.
  4. +
  5. The power can be specified using the EMITTER EXPONENT option in the [OPTIONS] section. The default power is 0.5, which normally applies to sprinklers and nozzles.
  6. +
  7. Actual demand reported in the program's results includes both the normal demand at the junction plus flow through the emitter.
  8. +
  9. An [EMITTERS] section is optional.
  10. +
+
+
+ + + + diff --git a/doc/html/_energy_page.html b/doc/html/_energy_page.html new file mode 100644 index 0000000..4b5c89b --- /dev/null +++ b/doc/html/_energy_page.html @@ -0,0 +1,106 @@ + + + + + + + +EPANET: [ENERGY] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[ENERGY]
+
+
+

Purpose:

+

Defines parameters used to compute pumping energy and cost.

+

Formats:

+

   GLOBAL   PRICE / PATTERN / EFFIC   value

+

   PUMP  pumpID   PRICE / PATTERN / EFFIC  value

+

   DEMAND CHARGE   value

+

Remarks:

    +
  1. First format is used to set global default values of energy price, price pattern, and pumping efficiency for all pumps.
  2. +
  3. Second format is used to override global defaults for specific pumps.
  4. +
  5. Parameters are defined as follows:
      +
    • PRICE = average cost per kW-hour,
    • +
    • PATTERN = ID label of time pattern describing how energy price varies with time,
    • +
    • EFFIC = either a single percent efficiency for global setting or the ID label of an efficiency curve for a specific pump,
    • +
    • DEMAND CHARGE = added cost per maximum kW usage during the simulation period.
    • +
    +
  6. +
  7. The default global pump efficiency is 75% and the default global energy price is 0.
  8. +
  9. All entries in this section are optional. Items offset by slashes (/) indicate allowable choices.
  10. +
+

Example:

[ENERGY]
+
GLOBAL PRICE 0.05 ;Sets global energy price
+
GLOBAL PATTERN PAT1 ;and time-of-day pattern
+
PUMP 23 PRICE 0.10 ;Overrides price for Pump 23
+
PUMP 23 EFFIC E23 ;Assigns effic. curve to Pump 23
+
+
+ + + + diff --git a/doc/html/_example1.html b/doc/html/_example1.html new file mode 100644 index 0000000..f9f2f24 --- /dev/null +++ b/doc/html/_example1.html @@ -0,0 +1,104 @@ + + + + + + + +EPANET: Embedded Engine Example + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Embedded Engine Example
+
+
+

This example shows how simple it is for the Toolkit to provide a network analysis engine for other applications. There are three steps that the application would need to take:

    +
  1. Have the application write network data to an EPANET-formatted input file.
  2. +
  3. Create a project and call EN_runproject, supplying the name of the EPANET input file, the name of a Report file where status and error messages are written, and the name of a binary Output file which will contain analysis results.
  4. +
  5. Have the application access the output file to display desired analysis results (see Output File).
  6. +
+

Here is an example where a callback function writeConsole is provided to write EPANET's progress messages to the console:

+
#include "epanet2_2.h"
+
+
void writeConsole(char *s)
+
{
+
fprintf(stdout, "\n%s", s);
+
}
+
+
int runEpanet(char* inpFile, char* rptFile, char* outFile)
+
{
+
int errcode;
+
EN_project ph;
+
EN_createproject(&pH);
+
errcode = EN_runproject(ph, inpFile, rptFile, outFile, &writeConsole);
+
EN_deleteproject(ph);
+
return errcode;
+
}
+
+
+ + + + diff --git a/doc/html/_example2.html b/doc/html/_example2.html new file mode 100644 index 0000000..4877c18 --- /dev/null +++ b/doc/html/_example2.html @@ -0,0 +1,149 @@ + + + + + + + +EPANET: Network Building Example + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Network Building Example
+
+
+

This example shows how a network can be built just through toolkit function calls, eliminating the need to always use an EPANET formatted input file. This creates opportunities to use other sources of network data in one's code, such as relational database files or GIS/CAD files.

+

Below is a schematic of the network to be built.

+ + +
+ +
+
+
#include "epanet2_2.h"
+
+
void netbuilder()
+
{
+
// Create a project that uses gpm for flow units and
+
// the Hazen-Williams formula for head loss
+
int index;
+
EN_Project ph;
+
EN_createproject(&ph);
+
EN_init(ph, "", "", EN_GPM, EN_HW);
+
+
// Add the first junction node to the project with
+
// an elevation of 700 ft and a demand of 0
+
EN_addnode(ph, "J1", EN_JUNCTION, &index);
+
EN_setjuncdata(ph, index, 700, 0, "");
+
+
// Add the remaining two junctions with elevations of
+
// 710 ft and demands of 250 and 500 gpm, respectively
+
EN_addnode(ph, "J2", EN_JUNCTION, &index);
+
EN_setjuncdata(ph, index, 710, 250, "");
+
EN_addnode(ph, "J3", EN_JUNCTION, &index);
+
EN_setjuncdata(ph, index, 710, 500, "");
+
+
// Add the reservoir at an elevation of 650 ft
+
EN_addnode(ph, "R1", EN_RESERVOIR, &index);
+
EN_setnodevalue(ph, index, EN_ELEVATION, 650);
+
+
// Add the tank node at elevation of 850 ft, initial water level
+
// at 120 ft, minimum level at 100 ft, maximum level at 150 ft
+
// and a diameter of 50.5 ft
+
EN_addnode(ph, "T1", EN_TANK, &index);
+
EN_settankdata(ph, index, 850, 120, 100, 150, 50.5, 0, "");
+
+
// Add the pipes to the project, setting their length,
+
// diameter, and roughness values
+
EN_addlink(ph, "P1", EN_PIPE, "J1", "J2", &index);
+
EN_setpipedata(ph, index, 10560, 12, 100, 0);
+
EN_addlink(ph, "P2", EN_PIPE, "J1", "T1", &index);
+
EN_setpipedata(ph, index, 5280, 14, 100, 0);
+
EN_addlink(ph, "P3", EN_PIPE, "J1", "J3", &index);
+
EN_setpipedata(ph, index, 5280, 14, 100, 0);
+
EN_addlink(ph, "P4", EN_PIPE, "J2", "J3", &index);
+
EN_setpipedata(ph, index, 5280, 14, 100, 0);
+
+
// Add a pump to the project
+
EN_addlink(ph, "PUMP", EN_PUMP, "R1", "J1", &index);
+
+
// Create a single point head curve (index = 1) and
+
// assign it to the pump
+
EN_addcurve(ph, "C1");
+
EN_setcurvevalue(ph, 1, 1, 1500, 250);
+
EN_setlinkvalue(ph, index, EN_PUMP_HCURVE, 1);
+
+
// Save the project for future use
+
EN_saveinpfile(ph, "example2.inp");
+
+
// Delete the project
+
EN_deleteproject(ph);
+
}
+
+
+ + + + diff --git a/doc/html/_example3.html b/doc/html/_example3.html new file mode 100644 index 0000000..c592b72 --- /dev/null +++ b/doc/html/_example3.html @@ -0,0 +1,120 @@ + + + + + + + +EPANET: Hydrant Rating Curve Example + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Hydrant Rating Curve Example
+
+
+

This example illustrates how the Toolkit could be used to develop a hydrant rating curve used in fire flow studies. This curve shows the amount of flow available at a node in the system as a function of pressure. The curve is generated by running a number of steady state hydraulic analyses with the node of interest subjected to a different demand in each analysis. For this example we assume that the ID label of the node of interest is MyNode and that N different demand levels stored in the array D need to be examined. The corresponding pressures will be stored in P. To keep the code more readable, no error checking is made on the results returned from the Toolkit function calls.

+
#include "epanet2_2.h"
+
+
void HydrantRating(char *MyNode, int N, double D[], double P[])
+
{
+
EN_Project ph;
+
int i, nodeindex;
+
long t;
+
double pressure;
+
+
// Create a project
+
EN_createproject(&ph);
+
+
// Retrieve network data from an input file
+
EN_open(ph, "example2.inp", "example2.rpt", "");
+
+
// Open the hydraulic solver
+
EN_openH(ph);
+
+
// Get the index of the node of interest
+
EN_getnodeindex(ph, MyNode, &nodeindex);
+
+
// Iterate over all demands
+
for (i=1; i<N; i++)
+
{
+
// Set nodal demand, initialize hydraulics, make a
+
// single period run, and retrieve pressure
+
EN_setnodevalue(ph, nodeindex, EN_BASEDEMAND, D[i]);
+
EN_initH(ph, 0);
+
EN_runH(ph, &t);
+
EN_getnodevalue(ph, nodeindex, EN_PRESSURE, &pressure);
+
P[i] = pressure;
+
}
+
+
// Close hydraulics solver & delete the project
+
EN_closeH(ph);
+
EN_deleteproject(ph);
+
}
+
+
+ + + + diff --git a/doc/html/_example4.html b/doc/html/_example4.html new file mode 100644 index 0000000..b12124d --- /dev/null +++ b/doc/html/_example4.html @@ -0,0 +1,143 @@ + + + + + + + +EPANET: Chlorine Dosage Example + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Chlorine Dosage Example
+
+
+

This example illustrates how the Toolkit could be used to determine the lowest dose of chlorine applied at the entrance to a distribution system needed to ensure that a minimum residual is met throughout the system. We assume that the EPANET input file contains the proper set of kinetic coefficients that describe the rate at which chlorine will decay in the system being studied. In the example code, the ID label of the source node is contained in SourceID, the minimum residual target is given by Ctarget, and the target is only checked after a start-up duration of 5 days (432,000 seconds). To keep the code more readable, no error checking is made on the results returned from the Toolkit function calls.

+
#include "epanet2_2.h"
+
+
double cl2dose(char *SourceID, double Ctarget)
+
{
+
int i, nnodes, sourceindex, violation;
+
double c, csource;
+
long t, tstep;
+
EN_Project ph;
+
+
// Open the toolkit & obtain a hydraulic solution
+
EN_createproject(&ph);
+
EN_open(ph, "example3.inp", "example3.rpt", "");
+
EN_solveH(ph);
+
+
// Get the number of nodes and the source node's index
+
EN_getcount(ph, EN_NODECOUNT, &nnodes);
+
EN_getnodeindex(ph, SourceID, &sourceindex);
+
+
// Setup the system to analyze for chlorine
+
// (in case it was not done in the input file)
+
EN_setqualtype(ph, EN_CHEM, "Chlorine", "mg/L", "");
+
+
// Open the water quality solver
+
EN_openQ(ph);
+
+
// Begin the search for the source concentration
+
csource = 0.0;
+
do {
+
+
// Update source concentration to next level
+
csource = csource + 0.1;
+
EN_setnodevalue(ph, sourceindex, EN_SOURCEQUAL, csource);
+
+
// Run WQ simulation checking for target violations
+
violation = 0;
+
EN_initQ(ph, 0);
+
do {
+
EN_runQ(ph, &t);
+
if (t > 432000) {
+
for (i=1; i<=nnodes; i++) {
+
EN_getnodevalue(ph, i, EN_QUALITY, &c);
+
if (c < Ctarget) {
+
violation = 1;
+
break;
+
}
+
}
+
}
+
EN_nextQ(ph, &tstep);
+
+
// End WQ run if violation found
+
} while (!violation && tstep > 0);
+
+
// Continue search if violation found
+
} while (violation && csource <= 4.0);
+
+
// Close up the WQ solver and delete the project
+
EN_closeQ(ph);
+
EN_deleteproject(ph);
+
return csource;
+
}
+
+
+ + + + diff --git a/doc/html/_files.html b/doc/html/_files.html new file mode 100644 index 0000000..6b5b494 --- /dev/null +++ b/doc/html/_files.html @@ -0,0 +1,85 @@ + + + + + + + +EPANET: Toolkit Files + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Toolkit Files
+
+
+

The Toolkit can make use of several different types of files when analyzing a pipe network. These include:

+
+
+ + + + diff --git a/doc/html/_header_files.html b/doc/html/_header_files.html new file mode 100644 index 0000000..fe3aa1d --- /dev/null +++ b/doc/html/_header_files.html @@ -0,0 +1,95 @@ + + + + + + + +EPANET: Header Files + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Header Files
+
+
+

The Toolkit provides several header files that are needed to develop C/C++ applications:

    +
  • epanet2.h contains declarations of the single-threaded version of the Toolkit (the ENxxx named functions).
  • +
  • epanet2_2.h contains declarations of the multi-threaded version of the Toolkit (the EN_xxx named functions).
  • +
  • epanet2_enums.h contains definitions of the symbolic constants used by the Toolkit.
  • +
  • epanet2.lib must be linked in to any Toolkit application compiled for Windows using MS Visual C++.
    + Developers need to issue an include directive for either epanet2.h or epanet2_2.h in their C/C++ code depending on whether they are building a single-threaded or multi-threaded application. There is no need to explicitly include epanet2_enums.h as it is automatically included by both of the other header files.
  • +
+

Several additional function declaration files that provide bindings for other programming languages are included with the Toolkit package:

    +
  • epanet2.bas for Visual Basic for Applications and Visual Basic 6
  • +
  • epanet2.vb for Visual Basic .NET
  • +
  • epanet2.pas for Delphi Pascal, Free Pascal or Lazarus.
  • +
+

These bindings only support the single-threaded version of the Toolkit.

+
+
+ + + + diff --git a/doc/html/_hyd_file.html b/doc/html/_hyd_file.html new file mode 100644 index 0000000..eb02ec2 --- /dev/null +++ b/doc/html/_hyd_file.html @@ -0,0 +1,86 @@ + + + + + + + +EPANET: Hydraulics File + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Hydraulics File
+
+
+

The Hydraulics file is an unformatted binary file used to store the results of a hydraulic analysis. Results for all time periods are stored, including those at intermediate times when special hydraulic events occur (e.g., pumps and tanks opening or closing because control conditions have been satisfied).

+

Normally it is a temporary file that is deleted after the EN_deleteproject function is called. However, it will be saved if the EN_savehydfile function is called before that.

+

Likewise, a previously saved Hydraulics file can be used if the command HYDRAULICS USE filename appears in the [OPTIONS] section of the input file, or if the EN_usehydfile function is called.

+

When the Toolkit function EN_solveH is used to make a hydraulic analysis, results are automatically saved to the Hydraulics file. When the EN_initH - EN_runH - EN_nextH set of functions is used, the initFlag argument to EN_initH determines whether results are saved or not. The need to save hydraulic results is application-dependent. They must always be saved to the Hydraulics file if a water quality analysis will follow.

+
+
+ + + + diff --git a/doc/html/_inp_file.html b/doc/html/_inp_file.html new file mode 100644 index 0000000..ca9f479 --- /dev/null +++ b/doc/html/_inp_file.html @@ -0,0 +1,108 @@ + + + + + + + +EPANET: Input File + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Input File
+
+
+

The Input file is a standard EPANET input data file that describes the system being analyzed. It can either be created external to the application being developed with the Toolkit or by the application itself. It is the first file name supplied to the EN_open function. A project's data associated with its Input file remains accessible until the project is closed down with the EN_close or deleted with EN_deleteproject.

+

The file is organized by sections where each section begins with a keyword enclosed in brackets. The various keywords are listed below. Click on a section to see the format of the data it contains.

+ + + + + + + + + + + + + + + + + + + +
Network Components System Operation Water Quality Options & Reporting GUI Support
[Title] [Curves] [Quality] [Options] [Backdrop]
[Junctions] [Patterns] [Reactions] [Times] [Coordinates]
[Reservoirs] [Energy] [Sources] [Report] [Vertices]
[Tanks] [Status] [Mixing] [Labels]
[Pipes] [Controls]
[Pumps] [Rules]
[Valves] [Demands]
[Emitters]
+

The order of sections is not important. However, whenever a node or link is referred to in a section it must have already been defined in the [JUNCTIONS], [RESERVOIRS], [TANKS], [PIPES], [PUMPS], or [VALVES] sections. Thus it is recommended that these sections be placed first.

+

Each section can contain one or more lines of data. Blank lines can appear anywhere in the file and the semicolon (;) can be used to indicate that what follows on the line is a comment, not data. A maximum of 1024 characters can appear on a line.

+

The ID labels used to identify nodes, links, curves and patterns can be any combination of up to 31 characters and numbers.

+

The GUI Support sections are provided to assist an external program that wishes to draw a visual representation of a project's network.

+
+
+ + + + diff --git a/doc/html/_juncs_page.html b/doc/html/_juncs_page.html new file mode 100644 index 0000000..d13d654 --- /dev/null +++ b/doc/html/_juncs_page.html @@ -0,0 +1,102 @@ + + + + + + + +EPANET: [JUNCTIONS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[JUNCTIONS]
+
+
+

Purpose:

+

Defines junction nodes contained in the network.

+

Format:

+

One line for each junction containing:

    +
  • ID label
  • +
  • Elevation, ft (m)
  • +
  • Base demand flow (flow units) (optional)
  • +
  • Demand pattern ID (optional)
  • +
+

Remarks:

    +
  1. A [JUNCTIONS] section with at least one junction is required.
  2. +
  3. If no demand pattern is supplied then the junction demand follows the Default Demand Pattern provided in the [OPTIONS] section, or Pattern 1 if no Default Pattern is specified. If the Default Pattern (or Pattern 1) does not exist, then the demand remains constant.
  4. +
  5. Demands can also be entered in the [DEMANDS] section and include multiple demand categories per junction.
  6. +
+

Example:

[JUNCTIONS]
+
;ID Elev. Demand Pattern
+
;------------------------------
+
J1 100 50 Pat1
+
J2 120 10 ;Uses default demand pattern
+
J3 115 ;No demand at this junction
+
+
+ + + + diff --git a/doc/html/_labels_page.html b/doc/html/_labels_page.html new file mode 100644 index 0000000..1c1fc11 --- /dev/null +++ b/doc/html/_labels_page.html @@ -0,0 +1,98 @@ + + + + + + + +EPANET: [LABELS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[LABELS]
+
+
+

Purpose:

+

Assigns coordinates to labels added to a network's visualization.

+

Format:

+

One line for each label containing:

    +
  • X-coordinate
  • +
  • Y-coordinate
  • +
  • Text of label in double quotes
  • +
  • ID label of an anchor node (optional)
  • +
+

Remarks:

+
    +
  1. Include one line for each label.
  2. +
  3. The coordinates refer to the upper left corner of the label and are with respect to an arbitrary origin at the lower left of the network.
  4. +
  5. The optional anchor node anchors the label to the node when the network layout is re-scaled during zoom-in operations.
  6. +
  7. The [LABELS] section is optional and only provides support for an external GUI program that uses the EPANET engine.
  8. +
+
+
+ + + + diff --git a/doc/html/_mixing_page.html b/doc/html/_mixing_page.html new file mode 100644 index 0000000..8516afa --- /dev/null +++ b/doc/html/_mixing_page.html @@ -0,0 +1,106 @@ + + + + + + + +EPANET: [MIXING] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[MIXING]
+
+
+

Purpose:

+

Identifies the model that governs mixing within storage tanks.

+

Format:

+

One line per tank containing:

    +
  • Tank ID label
  • +
  • Mixing model (MIXED, 2COMP, FIFO, or LIFO)
  • +
  • Compartment volume (fraction)
  • +
+

Remarks:

    +
  1. Mixing models include:
      +
    • Single compartment, complete mix model ( MIXED )
    • +
    • Two-compartment complete mix model ( 2COMP )
    • +
    • Plug flow, first in, first out model ( FIFO )
    • +
    • Stacked plug flow, last in, first out model ( LIFO )
    • +
    +
  2. +
  3. The compartment volume parameter only applies to the two-compartment model and represents the fraction of the total tank volume devoted to the inlet/outlet compartment.
  4. +
  5. The [MIXING] section is optional. Tanks not described in this section are assumed to be completely mixed.
  6. +
+

Example:

[MIXING]
+
;Tank Model
+
;-----------------------
+
T12 LIFO
+
T23 2COMP 0.2
+
+
+ + + + diff --git a/doc/html/_options_page.html b/doc/html/_options_page.html new file mode 100644 index 0000000..b3aa7cd --- /dev/null +++ b/doc/html/_options_page.html @@ -0,0 +1,184 @@ + + + + + + + +EPANET: [OPTIONS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[OPTIONS]
+
+
+

Purpose:

+

Defines various simulation options.

+

Formats:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UNITSCFS / GPM / MGD / IMGD / AFD /
LPS / LPM / MLD / CMH / CMD
HEADLOSSH-W / D-W / C-M
HYDRAULICSUSE / SAVE  filename
VISCOSITYvalue
SPECIFIC GRAVITYvalue
TRIALSvalue
ACCURACYvalue
FLOWCHANGEvalue
HEADERRORvalue
CHECKFREQvalue
MAXCHECKvalue
DAMPLIMITvalue
UNBALANCEDSTOP / CONTINUE / CONTINUE n
DEMAND MODELDDA / PDA
MINIMUM PRESSUREvalue
REQUIRED PRESSUREvalue
PRESSURE EXPONENTvalue
PATTERNid
DEMAND MULTIPLIERvalue
EMITTER EXPONENTvalue
QUALITYNONE / CHEMICAL / AGE / TRACE   nodeID
DIFFUSIVITYvalue
TOLERANCEvalue
MAPfilename
+

Definitions:

+

UNITS sets the units in which flow rates are expressed where:

    +
  • CFS = cubic feet per second
  • +
  • GPM = gallons per minute
  • +
  • MGD = million gallons per day
  • +
  • IMGD = Imperial MGD
  • +
  • AFD = acre-feet per day
  • +
  • LPS = liters per second
  • +
  • LPM = liters per minute
  • +
  • MLD = million liters per day
  • +
  • CMH = cubic meters per hour
  • +
  • CMD = cubic meters per day
  • +
+

For CFS, GPM, MGD, IMGD, and AFD other input quantities are expressed in US Customary Units. If flow units are in liters or cubic meters then Metric Units must be used for all other input quantities as well. (See the Measurement Units topic). The default flow units are GPM.

+

HEADLOSS selects a formula to use for computing head loss for flow through a pipe. The choices are the Hazen-Williams (H-W ), Darcy-Weisbach (D-W ), or Chezy-Manning (C-M ) formulas. The default is H-W.

+

The HYDRAULICS option allows you to either SAVE the current hydraulics solution to a file or USE a previously saved hydraulics solution. This is useful when studying factors that only affect water quality behavior.

+

VISCOSITY is the kinematic viscosity of the fluid being modeled relative to that of water at 20 deg. C (1.0 centistoke). The default value is 1.0.

+

SPECIFIC GRAVITY is the ratio of the density of the fluid being modeled to that of water at 4 deg. C (unitless). The default value is 1.0.

+

TRIALS are the maximum number of trials used to solve network hydraulics at each hydraulic time step of a simulation. The default is 40.

+

ACCURACY prescribes the convergence criterion that determines when a hydraulic solution has been reached. The trials end when the sum of all flow changes from the previous solution divided by the total flow in all links is less than this number. The default is 0.001.

+

FLOWCHANGE is a similar convergence criterion requiring that the largest absolute flow change between the current and previous solutions be less than the specified value (in flow units). The default is 0 which means that this criterion is not used.

+

HEADERROR is yet another convergence criterion requiring that the head loss computed by the head loss formula compared to the difference in nodal heads across each link be less than the specified value (in ft or m). The default is 0 which means that this criterion is not used.

+

CHECKFREQ sets the number of solution trials that pass during hydraulic balancing before the status of pumps, check valves, flow control valves and pipes connected to tanks are once again updated. The default value is 2, meaning that status checks are made every other trial.

+

MAXCHECK is the number of solution trials after which periodic status checks are discontinued. Instead, a status check is made only after convergence is achieved. The default value is 10, meaning that after 10 trials, instead of checking status every CHECKFREQ trials, status is checked only at convergence.

+

DAMPLIMIT is the accuracy value at which solution damping and status checks on PRVs and PSVs should begin. Damping limits all flow changes to 60% of what they would otherwise be as future trials unfold. The default is 0 which indicates that no damping should be used and that status checks on control valves are made at every iteration.

+

UNBALANCED determines what happens if a hydraulic solution cannot be reached within the prescribed number of TRIALS at some hydraulic time step into the simulation. STOP will halt the entire analysis at that point. CONTINUE will continue the analysis with a warning message issued. CONTINUE n will continue the search for a solution for another n trials with the status of all links held fixed at their current settings. The simulation will be continued at this point with a message issued about whether convergence was achieved or not. The default choice is STOP.

+

DEMAND MODEL specifies whether a demand driven analysis ( DDA ) or a pressure driven analysis ( PDA ) should be made. Under DDA full nodal demands are always met even if negative pressures result. PDA assumes that demand varies between 0 and its full value as a power function of nodal pressure. The default demand model is DDA.

+

MINIMUM PRESSURE is the pressure below which no demand can be delivered under a pressure driven analysis. It has no effect on a demand driven analysis. Its default value is 0.

+

REQUIRED PRESSURE is the pressure required to supply a node's full demand under a pressure driven analysis. It has no effect on a demand driven analysis. It must be at least 0.1 psi or m higher than the MINIMUM PRESSURE, which is also its default value.

+

PRESSURE EXPONENT is the power to which pressure is raised when computing the demand delivered to a node under a pressure driven analysis. It has no effect on a demand driven analysis. Its default value is 0.5.

+

PATTERN provides the ID label of a default demand pattern to be applied to all junctions where no demand pattern was specified. If no such pattern exists in the [PATTERNS] section then by default the pattern consists of a single multiplier equal to 1.0. If this option is not used, then the global default demand pattern has a label of "1".

+

The DEMAND MULTIPLIER is used to adjust the values of baseline demands for all junctions and all demand categories. For example, a value of 2 doubles all baseline demands, while a value of 0.5 would halve them. The default value is 1.0.

+

EMITTER EXPONENT specifies the power to which the pressure at a junction is raised when computing the flow issuing from an emitter. The default is 0.5.

+

QUALITY selects the type of water quality analysis to perform. The choices are NONE, CHEMICAL, AGE, and TRACE. In place of CHEMICAL the actual name of the chemical can be used followed by its concentration units (e.g., CHLORINE mg/L). If TRACE is selected it must be followed by the ID label of the node being traced. The default selection is NONE (no water quality analysis).

+

DIFFUSIVITY is the molecular diffusivity of the chemical being analyzed relative to that of chlorine in water. The default value is 1.0. Diffusivity is only used when mass transfer limitations are considered in pipe wall reactions. A value of 0 will cause EPANET to ignore mass transfer limitations.

+

TOLERANCE is the difference in water quality level below which one can say that one parcel of water is essentially the same as another. The default is 0.01 for all types of quality analyses (chemical, age (measured in hours), or source tracing (measured in percent)).

+

MAP is used to supply the name of a file containing coordinates of the network's nodes so that a map of the network can be drawn. It is not used for any hydraulic or water quality computations.

+

Remarks:

    +
  1. All options assume their default values if not explicitly specified in this section.
  2. +
  3. Items offset by slashes (/) indicate allowable choices.
  4. +
+

Example:

[OPTIONS]
+
UNITS CFS
+
HEADLOSS D-W
+
DEMAND MODEL PDA
+
REQUIRED PRESSURE 40
+
QUALITY TRACE Tank23
+
UNBALANCED CONTINUE 10
+
+
+ + + + diff --git a/doc/html/_out_file.html b/doc/html/_out_file.html new file mode 100644 index 0000000..4f8e8bd --- /dev/null +++ b/doc/html/_out_file.html @@ -0,0 +1,266 @@ + + + + + + + +EPANET: Output File + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Output File
+
+
+

The Output file is an unformatted binary file used to store both hydraulic and water quality results at uniform reporting intervals. It is the third file name supplied to the EN_open function (or second name to EN_init). If an empty string ("") is used as its name then a scratch temporary file will be used. Otherwise the Output file will be saved after the EN_close function is called. Saving this file is useful if further post-processing of the output results are needed.

+

The function EN_saveH will transfer hydraulic results to the Output file if no water quality analysis will be made. Using EN_solveQ to run a water quality analysis automatically saves both hydraulic and water quality results to this file. If the EN_initQ - EN_runQ - EN_nextQ set of functions is used to perform a water quality analysis, then results will be saved only if the saveflag argument of EN_initQ is set to EN_SAVE. Again, the need to save results to the Output file is application-dependent. If a formatted output report is to be generated using EN_report, then results must first be saved to the Output file.

+

The data written to the file is either 4-byte integers, 4-byte floats, or fixed-size strings whose size is a multiple of 4 bytes. This allows the file to be divided conveniently into 4-byte records. The file consists of four sections of the following sizes in bytes:

+ + + + + + + + + + + +
Section Size in Bytes
Prolog 884 + 36*Nnodes + 52*Nlinks + 8*Ntanks
Energy Usage 28*Npumps + 4
Dynamic Results (16*Nnodes + 32*Nlinks)*Nperiods
Epilog 28
+

where:

    +
  • Nnodes = number of nodes (junctions + reservoirs + tanks),
  • +
  • Nlinks = number of links (pipes + pumps + valves),
  • +
  • Ntanks = number of tanks and reservoirs,
  • +
  • Npumps = number of pumps,
  • +
  • Nperiods = number of reporting periods.
  • +
+

All of these counts are themselves written to the file's Prolog or Epilog sections.

+

+Prolog Section

+

The Prolog section of an EPANET binary output file contains the following data:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Item Type # Bytes
Magic Number = 516114521 Integer 4
Version (= 200) Integer 4
Number of Nodes Integer 4
Number of Reservoirs & Tanks Integer 4
Number of Links Integer 4
Number of Pumps Integer 4
Number of Valves Integer 4
Water Quality Option - see EN_QualityType Integer 4
Traced Node Index Integer 4
Flow Units Option Integer 4
Pressure Units Option:
+0 = psi
+1 = meters
+2 = kPa
Integer 4
Report Statistic Type - see EN_StatisticType Integer 4
Reporting Start Time (sec) Integer 4
Reporting Time Step (sec) Integer 4
Simulation Duration (sec) Integer 4
Project Title (1st line) Char 80
Project Title (2nd line) Char 80
Project Title (3rd line) Char 80
Name of Input File Char 260
Name of Report File Char 260
Name of Quality Chemical Char 32
Chemical Concentration Units Char 32
ID String of Each Node Char 32*Nnodes
ID String of Each Link Char 32*Nlinks
Index of Head Node of Each Link Integer 4*Nlinks
Index of Tail Node of Each Link Integer 4*Nlinks
Type Code of Each Link (see EN_LinkType) Integer 4*Nlinks
Node Index of Each Tank Integer 4*Ntanks
Surface Area of Each Tank Float 4*Ntanks
Elevation of Each Node Float 4*Nnodes
Length of Each Link Float 4*Nlinks
Diameter of Each Link Float 4*Nlinks
+

+Energy Usage Section

+

The Energy Usage section of an EPANET binary output file contains the following data:

+ + + + + + + + + + + + + + + + + + + +
Item (Repeated for Each Pump) Type # Bytes
Pump Index in list of links Integer 4
Pump Utilization (%) Float 4
Average Efficiency (%) Float 4
Average kW/MGal (or kW/m^3) Float 4
Average kW Float 4
Peak kW Float 4
Average Cost per Day Float 4
Peak Energy Usage (kWh) Float 4
+

+Dynamic Results Section

+

The Dynamic Results section of an EPANET binary output file contains the following set of data for each reporting period (the reporting time step is written to the Output File's Prolog Section and the number of such steps is written to the Epilog Section):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Item Type # Bytes
Demand at Each Node Float 4*Nnodes
Head (Grade) at Each Node Float 4*Nnodes
Pressure at Each Node Float 4*Nnodes
Water Quality at Each Node Float 4*Nnodes
Flow in Each Link
+ (negative for reverse flow)
Float 4*Nlinks
Velocity in Each Link Float 4*Nlinks
Head Loss per 1000 Units of Length for Each Link
+ (total head for pumps and head loss for valves)
Float 4*Nlinks
Average Water Quality in Each Link Float 4*Nlinks
Status Code for Each Link:
+0 = closed (pump shutoff head exceeded)
+1 = temporarily closed
+2 = closed
+3 = open
+4 = active (partially open)
+5 = open (pump max. flow exceeded)
+6 = open (FCV can't supply flow)
+7 = open (PRV/PSV can't supply pressure)
Float 4*Nlinks
Setting for Each Link Float 4*Nlinks
Reaction Rate for Each Link (mass/L/day) Float 4*Nlinks
Friction Factor for Each Link Float 4*Nlinks
+

+Epilog Section

+

The Epilog section of an EPANET binary output file contains the following data:

+ + + + + + + + + + + + + + + + + +
Item Type # Bytes
Average bulk reaction rate (mass/hr) Float 4
Average wall reaction rate (mass/hr) Float 4
Average tank reaction rate (mass/hr) Float 4
Average source inflow rate (mass/hr) Float 4
Number of Reporting Periods Integer 4
Warning Flag:
+0 = no warnings
+1 = warnings were generated
Integer 4
Magic Number = 516114521 Integer 4
+
+
+ + + + diff --git a/doc/html/_pats_page.html b/doc/html/_pats_page.html new file mode 100644 index 0000000..fc29c11 --- /dev/null +++ b/doc/html/_pats_page.html @@ -0,0 +1,103 @@ + + + + + + + +EPANET: [PATTERNS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[PATTERNS]
+
+
+

Purpose:

+

Defines time patterns.

+

Format:

+

One or more lines for each pattern containing:

    +
  • Pattern ID label
  • +
  • One or more multipliers
  • +
+

Remarks:

    +
  1. Multipliers define how some base quantity (e.g., demand) is adjusted for each time period.
  2. +
  3. All patterns share the same time period interval as defined in the [TIMES] section.
  4. +
  5. Each pattern can have a different number of time periods.
  6. +
  7. When the simulation time exceeds the pattern length the pattern wraps around to its first period.
  8. +
  9. Use as many lines as it takes to include all multipliers for each pattern.
  10. +
+

Example:

[PATTERNS]
+
;Pattern P1
+
P1 1.1 1.4 0.9 0.7
+
P1 0.6 0.5 0.8 1.0
+
;Pattern P2
+
P2 1 1 1 1
+
P2 0 0 1
+
+
+ + + + diff --git a/doc/html/_pipes_page.html b/doc/html/_pipes_page.html new file mode 100644 index 0000000..5cad83e --- /dev/null +++ b/doc/html/_pipes_page.html @@ -0,0 +1,107 @@ + + + + + + + +EPANET: [PIPES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[PIPES]
+
+
+

Purpose:

+

Defines all pipe links contained in the network.
+

+

Format:

+

One line for each pipe containing:

    +
  • ID label
  • +
  • ID of start node
  • +
  • ID of end node
  • +
  • Length, ft (m)
  • +
  • Diameter, inches (mm)
  • +
  • Roughness coefficient
  • +
  • Minor loss coefficient
  • +
  • Status (OPEN, CLOSED, or CV)
  • +
+

Remarks:

    +
  1. Roughness coefficient is unitless for Hazen-Williams and Chezy-Manning head loss formulas and has units of millifeet (mm) for the Darcy-Weisbach formula. Choice of head loss formula is supplied in the [OPTIONS] section.
  2. +
  3. Setting status to CV means that the pipe contains a check valve restricting flow to one direction.
  4. +
  5. If minor loss coefficient is 0 and pipe is OPEN then these two items can be dropped from the input line.
  6. +
+

Example:

[PIPES]
+
;ID Node1 Node2 Length Diam. Roughness Mloss Status
+
;-------------------------------------------------------------
+
P1 J1 J2 1200 12 120 0.2 OPEN
+
P2 J3 J2 600 6 110 0 CV
+
P3 J1 J10 1000 12 120
+
+
+ + + + diff --git a/doc/html/_pumps_page.html b/doc/html/_pumps_page.html new file mode 100644 index 0000000..65980d0 --- /dev/null +++ b/doc/html/_pumps_page.html @@ -0,0 +1,107 @@ + + + + + + + +EPANET: [PUMPS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[PUMPS]
+
+
+

Purpose:

+

Defines all pump links contained in the network.

+

Format:

+

One line for each pump containing:

    +
  • ID label
  • +
  • ID of start node
  • +
  • ID of end node
  • +
  • Keyword and Value (can be repeated)
  • +
+

Remarks:

    +
  1. Keywords consists of:
      +
    • POWER - power for constant energy pump, hp (kw)
    • +
    • HEAD - ID of curve that describes head versus flow for the pump
    • +
    • SPEED - relative speed setting (normal speed is 1.0, 0 means pump is off)
    • +
    • PATTERN - ID of time pattern that describes how speed setting varies with time
    • +
    +
  2. +
  3. Either POWER or HEAD must be supplied for each pump. The other keywords are optional.
  4. +
+

Example:

[PUMPS]
+
;ID Node1 Node2 Properties
+
;---------------------------------------------
+
Pump1 N12 N32 HEAD Curve1
+
Pump2 N121 N55 HEAD Curve1 SPEED 1.2
+
Pump3 N22 N23 POWER 100
+
+
+ + + + diff --git a/doc/html/_qual_page.html b/doc/html/_qual_page.html new file mode 100644 index 0000000..0005b9e --- /dev/null +++ b/doc/html/_qual_page.html @@ -0,0 +1,94 @@ + + + + + + + +EPANET: [QUALITY] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[QUALITY]
+
+
+

Purpose:

+

Defines initial water quality at nodes.

+

Format:

+

One line per node containing:

    +
  • Node ID label
  • +
  • Initial quality
  • +
+

Remarks:

    +
  1. Quality is assumed to be zero for nodes not listed.
  2. +
  3. Quality represents concentration for chemicals, hours for water age, or percent for source tracing.
  4. +
  5. The [QUALITY] section is optional.
  6. +
+
+
+ + + + diff --git a/doc/html/_reacts_page.html b/doc/html/_reacts_page.html new file mode 100644 index 0000000..65d0bc1 --- /dev/null +++ b/doc/html/_reacts_page.html @@ -0,0 +1,118 @@ + + + + + + + +EPANET: [REACTIONS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[REACTIONS]
+
+
+

Purpose:

+

Defines parameters related to chemical reactions occurring in the network.

+

Formats:

+

   ORDER  BULK / WALL / TANK  value

+

   GLOBAL  BULK / WALL  value

+

   BULK / WALL    pipeID  value

+

   TANK    tankID  value

+

   LIMITING POTENTIAL    value

+

   ROUGHNESS CORRELATION    value

+

Definitions:

+

ORDER is used to set the order of reactions occurring in the bulk fluid, at the pipe wall, or in tanks, respectively. Values for wall reactions must be either 0 or 1. If not supplied the default reaction order is 1.0.

+

GLOBAL is used to set a global value for all bulk reaction coefficients (pipes and tanks) or for all pipe wall coefficients. The default value is zero.

+

BULK, WALL, and TANK are used to override the global reaction coefficients for specific pipes and tanks.

+

LIMITING POTENTIAL specifies that reaction rates are proportional to the difference between the current concentration and some limiting potential value.

+

ROUGHNESS CORRELATION will make all default pipe wall reaction coefficients be related to pipe roughness in the following manner:

+ + + + + + + + +
Head Loss Equation Roughness Correlation
Hazen-Williams F / C
Darcy-Weisbach F / log(e/D)
Chezy-Manning F * n
+

where F = roughness correlation, C = Hazen-Williams C-factor, e = Darcy-Weisbach roughness, D = pipe diameter, and n = Chezy-Manning roughness coefficient. The default value computed this way can be overridden for any pipe by using the WALL format to supply a specific value for the pipe.

+

Remarks:

    +
  1. Remember to use positive numbers for growth reaction coefficients and negative numbers for decay coefficients.
  2. +
  3. The time units for all reaction coefficients are 1/days.
  4. +
  5. All entries in this section are optional. Items offset by slashes (/) indicate allowable choices.
  6. +
+

Example:

[REACTIONS]
+
ORDER WALL 0 ;Wall reactions are zero-order
+
GLOBAL BULK -0.5 ;Global bulk decay coeff.
+
GLOBAL WALL -1.0 ;Global wall decay coeff.
+
WALL P220 -0.5 ;Pipe-specific wall coeffs.
+
WALL P244 -0.7
+
+
+ + + + diff --git a/doc/html/_report_page.html b/doc/html/_report_page.html new file mode 100644 index 0000000..98846d1 --- /dev/null +++ b/doc/html/_report_page.html @@ -0,0 +1,146 @@ + + + + + + + +EPANET: [REPORT] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[REPORT]
+
+
+

Purpose:

+

Describes the contents of the output report produced from a simulation.

+

Formats:

+ + + + + + + + + + + + + + + + + + + + +
PAGESIZE  value
FILE  filename
STATUS  YES / NO / FULL
SUMMARY  YES / NO
MESSAGES  YES / NO
ENERGY  YES / NO
NODES  NONE / ALL/ node1 node2 ...
LINKS  NONE / ALL/ node1 node2 ...
variable  YES / NO
variable  BELOW / ABOVE / PRECISION value
+

Definitions:

+

PAGESIZE sets the number of lines written per page of the output report. The default is 0, meaning that no line limit per page is in effect.

+

FILE supplies the name of a file to which the output report will be written (ignored by the Windows version of EPANET). The default is to write the report to the project's Report File file.

+

STATUS determines whether a hydraulic status report should be generated. If YES is selected the report will identify all network components that change status during each time step of the simulation. If FULL is selected, then the status report will also include information from each trial of each hydraulic analysis. This level of detail is only useful for de-bugging networks that become hydraulically unbalanced. The default is NO.

+

SUMMARY determines whether a summary table of number of network components and key analysis options is generated. The default is YES.

+

ENERGY determines if a table reporting average energy usage and cost for each pump is provided. The default is NO.

+

NODES identifies which nodes will be reported on. You can either list individual node ID labels or use the keywords NONE or ALL. Additional NODES lines can be used to continue the list. The default is NONE.

+

LINKS identifies which links will be reported on. You can either list individual link ID labels or use the keywords NONE or ALL Additional LINKS lines can be used to continue the list. The default is NONE.

+

The variable reporting option is used to identify which quantities are reported on, how many decimal places are displayed, and what kind of filtering should be used to limit output reporting. Node variables that can be reported on include:

    +
  • Elevation
  • +
  • Demand
  • +
  • Head
  • +
  • Pressure
  • +
  • Quality
  • +
+

Link variables include:

    +
  • Length
  • +
  • Diameter
  • +
  • Flow
  • +
  • Velocity
  • +
  • Headloss
  • +
  • State (same as status: open, active, closed)
  • +
  • Setting (roughness for pipes, speed for pumps, pressure/flow setting for valves)
  • +
  • Reaction (reaction rate)
  • +
  • F-Factor (friction factor).
  • +
+

The default quantities reported are Demand, Head, Pressure, and Quality for nodes and Flow, Velocity, and Headloss for links. The default precision is two decimal places.

+

Remarks:

    +
  1. All options assume their default values if not explicitly specified in this section.
  2. +
  3. Items offset by slashes (/) indicate allowable choices.
  4. +
  5. The default is to not report on any nodes or links, so a NODES or LINKS option must be supplied if you wish to report results for these items.
  6. +
+

Example:

+

The following example reports on nodes N1, N2, N3, and N17 and all links with velocity above 3.0. The standard node variables (Demand, Head, Pressure, and Quality) are reported on while only Flow, Velocity, and F-Factor (friction factor) are displayed for links.

[REPORT]
+
NODES N1 N2 N3 N17
+
LINKS ALL
+
FLOW YES
+
VELOCITY PRECISION 4
+
F-FACTOR PRECISION 4
+
VELOCITY ABOVE 3.0
+
+
+ + + + diff --git a/doc/html/_resv_page.html b/doc/html/_resv_page.html new file mode 100644 index 0000000..a8b281e --- /dev/null +++ b/doc/html/_resv_page.html @@ -0,0 +1,100 @@ + + + + + + + +EPANET: [RESERVOIRS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[RESERVOIRS]
+
+
+

Purpose:

+

Defines all reservoir nodes contained in the network.

+

Format:

+

One line for each reservoir containing:

    +
  • ID label
  • +
  • Head, ft (m)
  • +
  • Head pattern ID (optional)
  • +
+

Remarks:

    +
  1. Head is the hydraulic head (elevation + pressure head) of water in the reservoir.
  2. +
  3. A head pattern can be used to make the reservoir head vary with time.
  4. +
  5. At least one reservoir or tank must be contained in the network.
  6. +
+

Example:

[RESERVOIRS]
+
;ID Head Pattern
+
;-----------------------
+
R1 512 ;Head stays constant
+
R2 120 Pat1 ;Head varies with time
+
+
+ + + + diff --git a/doc/html/_rpt_file.html b/doc/html/_rpt_file.html new file mode 100644 index 0000000..535eb98 --- /dev/null +++ b/doc/html/_rpt_file.html @@ -0,0 +1,86 @@ + + + + + + + +EPANET: Report File + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Report File
+
+
+

The Report file is the second file name supplied to the EN_open function (or the first file name to EN_init). It is used to log any error messages that occur when an Input file is being processed and to record all status messages that are generated during a hydraulic simulation. In addition, if the EN_report function is called the resulting report can also be written to this file as can user-generated lines of text using the EN_writeline function. The format of the report is controlled by statements placed in the [REPORT] section of the Input file and by similar statements included in calls to the EN_setreport function. Only results at a specified uniform reporting time interval are written to this file.

+

To suppress the writing of all error and warning messages to the Report file either include the command MESSAGES NO in the [REPORT] section of the Input file or call the Toolkit function EN_setreport("MESSAGES NO").

+

To route a formatted report to a different file than the Report file either include the command FILE filename in the [REPORT] section of the Input file or call the Toolkit function EN_setreport("FILE filename"), where filename is the name of the file to use.

+

Toolkit clients will not be able to access the contents of a Report file until a project is closed. If access is needed before then, the EN_copyreport function can be used to copy its current contents to another file. A EN_clearreport function is also available to clear the current contents of the Report file.

+
+
+ + + + diff --git a/doc/html/_rules_page.html b/doc/html/_rules_page.html new file mode 100644 index 0000000..2fb6126 --- /dev/null +++ b/doc/html/_rules_page.html @@ -0,0 +1,142 @@ + + + + + + + +EPANET: [RULES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[RULES]
+
+
+

Purpose:

+

Defines rule-based controls which modify links based on a combination of conditions.

+

Format:

+

Each rule is a series of statements of the form:

+

RULE   ruleID
+ IF       condition_1
+ AND   condition_2
+ OR     condition_3
+ AND   condition_4
+ etc.
+ THEN  action_1
+ AND   action_2
+ etc.
+ ELSE  action_3
+ AND   action_4
+ etc.
+ PRIORITY value
+

+

where:

+ + + + + + + + +
ruleID =  an ID label assigned to the rule
conditon_n =  a condition clause
action_n =  an action clause
PRIORITY =  a priority value (e.g., a number from 1 to 5)
+

Remarks:

    +
  1. Only the RULE, IF and THEN portions of a rule are required; the other portions are optional.
  2. +
  3. When mixing AND and OR clauses, the OR operator has higher precedence than AND, i.e.,
    +       IF A or B and C
    + is equivalent to
    +
    +       IF (A or B) and C
    + If the interpretation was meant to be
    +       IF A or (B and C)
    + then this can be expressed using two rules as in
    +       IF A THEN ...
    +       IF B and C THEN ...
    +
  4. +
  5. The PRIORITY value is used to determine which rule applies when two or more rules require that conflicting actions be taken on a link. A rule without a priority value always has a lower priority than one with a value. For two rules with the same priority value, the rule that appears first is given the higher priority.
  6. +
+

Example:

[RULES]
+
RULE 1
+
IF TANK 1 LEVEL ABOVE 19.1
+
THEN PUMP 335 STATUS IS CLOSED
+
AND PIPE 330 STATUS IS OPEN
+
+
RULE 2
+
IF SYSTEM CLOCKTIME >= 8 AM
+
AND SYSTEM CLOCKTIME < 6 PM
+
AND TANK 1 LEVEL BELOW 12
+
THEN PUMP 335 STATUS IS OPEN
+
+
RULE 3
+
IF SYSTEM CLOCKTIME >= 6 PM
+
OR SYSTEM CLOCKTIME < 8 AM
+
AND TANK 1 LEVEL BELOW 14
+
THEN PUMP 335 STATUS IS OPEN
+
+
+ + + + diff --git a/doc/html/_sources_page.html b/doc/html/_sources_page.html new file mode 100644 index 0000000..623f497 --- /dev/null +++ b/doc/html/_sources_page.html @@ -0,0 +1,124 @@ + + + + + + + +EPANET: [SOURCES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[SOURCES]
+
+
+

Purpose:

+

Defines locations of water quality sources.

+

Format:

+

One line for each water quality source containing:

    +
  • Node ID label
  • +
  • Source type (CONCEN, MASS, FLOWPACED, or SETPOINT)
  • +
  • Baseline source strength
  • +
  • Time pattern ID (optional)
  • +
+

Remarks:

    +
  1. For MASS type sources, strength is measured in mass flow per minute. All other types measure source strength in concentration units.
  2. +
  3. Source strength can be made to vary over time by specifying a time pattern.
  4. +
  5. A CONCEN source:
      +
    • represents the concentration of any external source inflow to the node
    • +
    • applies only when the node has a net negative demand (water enters the network at the node)
    • +
    • if the node is a junction, reported concentration is the result of mixing the source flow and inflow from the rest of the network
    • +
    • if the node is a reservoir, the reported concentration is the source concentration
    • +
    • if the node is a tank, the reported concentration is the internal concentration of the tank
    • +
    • is best used for nodes that represent source water supplies or treatment works (e.g., reservoirs or nodes assigned a negative demand)
    • +
    • do not use at storage tanks with simultaneous inflow/outflow.
    • +
    +
  6. +
  7. A MASS, FLOWPACED, or SETPOINT source:
      +
    • represents a booster source, where the substance is injected directly into the network regardless of what the demand at the node is
    • +
    • affects water leaving the node to the rest of the network in the following way:
        +
      • a MASS booster adds a fixed mass flow to that resulting from inflow to the node
      • +
      • a FLOWPACED booster adds a fixed concentration to the resultant inflow concentration at the node
      • +
      • a SETPOINT booster fixes the concentration of any flow leaving the node (as long as the concentration resulting from the inflows is below the setpoint)
      • +
      +
    • +
    • the reported concentration at a junction or reservoir booster source is the concentration that results after the boosting is applied; the reported concentration for a tank with a booster source is the internal concentration of the tank
    • +
    • is best used to model direct injection of a tracer or disinfectant into the network or to model a contaminant intrusion.
    • +
    +
  8. +
  9. A [SOURCES] section is not needed for simulating water age or source tracing.
  10. +
+

Example:
+

[SOURCES]
+
;Node Type Strength Pattern
+
;--------------------------------
+
N1 CONCEN 1.2 Pat1 ;Concentration varies with time
+
N44 MASS 12 ;Constant mass injection
+
+
+ + + + diff --git a/doc/html/_status_page.html b/doc/html/_status_page.html new file mode 100644 index 0000000..4060641 --- /dev/null +++ b/doc/html/_status_page.html @@ -0,0 +1,105 @@ + + + + + + + +EPANET: [STATUS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[STATUS]
+
+
+

Purpose:

+

Defines initial status of selected links at the start of a simulation.

+

Format:

+

One line per link being controlled containing:

    +
  • Link ID label
  • +
  • Status or setting
  • +
+

Remarks:

    +
  1. Links not listed in this section have a default status of OPEN (for pipes and pumps) or ACTIVE (for valves).
  2. +
  3. The Status value assigned in this section can be OPEN or CLOSED. For control valves (e.g., PRVs, FCVs, etc.) this means that the valve is either fully opened or closed, not active at its control setting.
  4. +
  5. The Setting value can be a speed setting for pumps or valve setting for valves.
  6. +
  7. The initial status of pipes can also be set in the [PIPES] section.
  8. +
  9. Check valves cannot have their status be preset.
  10. +
  11. Use [CONTROLS] or [RULES] to change status or setting at some future point in the simulation.
  12. +
  13. If a CLOSED or OPEN control valve is to become ACTIVE again, then its pressure or flow setting must be specified in the control or rule that reactivates it.
  14. +
+

Example:

[STATUS]
+
; Link Status/Setting
+
;----------------------
+
L22 CLOSED ;Link L22 is closed
+
P14 1.5 ;Speed for pump P14
+
PRV1 OPEN ;PRV1 forced open
+
;(overrides normal operation)
+
+
+ + + + diff --git a/doc/html/_tanks_page.html b/doc/html/_tanks_page.html new file mode 100644 index 0000000..478a4f3 --- /dev/null +++ b/doc/html/_tanks_page.html @@ -0,0 +1,113 @@ + + + + + + + +EPANET: [TANKS] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[TANKS]
+
+
+

Purpose:

+

Defines all tank nodes contained in the network.

+

Format:

+

One line for each junction containing:

    +
  • ID label
  • +
  • Bottom elevation, ft (m)
  • +
  • Initial water level, ft (m)
  • +
  • Minimum water level, ft (m)
  • +
  • Maximum water level, ft (m)
  • +
  • Nominal diameter, ft (m)
  • +
  • Minimum volume, cubic ft (cubic meters)
  • +
  • Volume curve ID (optional)
  • +
  • Overflow indicator (YES / NO) (optional)
  • +
+

Remarks:

    +
  1. Water surface elevation equals bottom elevation plus water level.
  2. +
  3. Non-cylindrical tanks can be modeled by specifying a curve of volume versus water depth in the [CURVES] section.
  4. +
  5. If a volume curve is supplied the diameter value can be any non-zero number
  6. +
  7. Minimum volume (tank volume at minimum water level) can be zero for a cylindrical tank or if a volume curve is supplied.
  8. +
  9. If the overflow indicator is YES then the tank is allowed to overflow once it reaches it maximum water level. The default is no overflow.
  10. +
  11. If the tank does not use a volume curve then an asterisk (*) can be used as a placeholder for it if an overflow indicator is specified.
  12. +
  13. A network must contain at least one tank or reservoir.
  14. +
+

Example:

[TANKS]
+
;ID Elev. InitLvl MinLvl MaxLvl Diam MinVol VolCurve Overflow
+
;---------------------------------------------------------------------
+
;Cylindrical tank that can overflow
+
T1 100 15 5 25 120 0 * YES
+
+
;Non-cylindrical tank with arbitrary diameter
+
T2 100 15 5 25 1 0 VC1
+
+
+ + + + diff --git a/doc/html/_times_page.html b/doc/html/_times_page.html new file mode 100644 index 0000000..45528ef --- /dev/null +++ b/doc/html/_times_page.html @@ -0,0 +1,127 @@ + + + + + + + +EPANET: [TIMES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[TIMES]
+
+
+

Purpose: Defines various time step parameters used in the simulation.

+

Formats:

+ + + + + + + + + + + + + + + + + + + + +
DURATION value (units)
HYDRAULIC TIMESTEP value (units)
QUALITY TIMESTEPvalue (units)
RULE TIMESTEPvalue (units)
PATTERN TIMESTEPvalue (units)
PATTERN STARTvalue (units)
REPORT TIMESTEPvalue (units)
REPORT STARTvalue (units)
START CLOCKTIMEvalue (AM / PM)
STATISTICNONE / AVERAGED / MINIMUM / MAXIMUM / RANGE
+

Definitions:

+

DURATION is the duration of the simulation. Use 0 to run a single period snapshot analysis. The default is 0.

+

HYDRAULIC TIMESTEP determines how often a new hydraulic state of the network is computed. If greater than either the PATTERN or REPORT time step it will be automatically reduced. The default is 1 hour.

+

QUALITY TIMESTEP is the time step used to track changes in water quality throughout the network. The default is 1/10 of the hydraulic time step.

+

RULE TIMESTEP is the time step used to check for changes in system status due to activation of rule-based controls between hydraulic time steps. The default is 1/10 of the hydraulic time step.

+

PATTERN TIMESTEP is the interval between time periods in all time patterns. The default is 1 hour.

+

PATTERN START is the time offset at which all patterns will start. For example, a value of 6 hours would start the simulation with each pattern in the time period that corresponds to hour 6. The default is 0.

+

REPORT TIMESTEP sets the time interval between which output results are reported. The default is 1 hour.

+

REPORT START is the length of time into the simulation at which output results begin to be reported. The default is 0.

+

START CLOCKTIME is the time of day (e.g., 3:00 PM) at which the simulation begins. The default is 12:00 AM midnight.

+

STATISTIC determines what kind of statistical post-processing should be done on the time series of simulation results generated. AVERAGED reports a set of time-averaged results, MINIMUM reports only the minimum values, MAXIMUM the maximum values, and RANGE reports the difference between the minimum and maximum values. NONE reports the full time series for all quantities for all nodes and links and is the default.

+

Remarks:

    +
  1. Units can be SECONDS (SEC), MINUTES (MIN), HOURS, or DAYS. The default is HOURS.
  2. +
  3. If no units are supplied, then time values can be expressed in either decimal hours or in hours:minutes notation.
  4. +
  5. All entries in the [TIMES] section are optional. Items offset by slashes (/) indicate allowable choices.
  6. +
+

Example:

[TIMES]
+
DURATION 240 HOURS
+
QUALITY TIMESTEP 3 MIN
+
QUALITY TIMESTEP 0:03
+
REPORT START 120
+
START CLOCKTIME 6:00 AM
+
+
+ + + + diff --git a/doc/html/_title_page.html b/doc/html/_title_page.html new file mode 100644 index 0000000..176ac7a --- /dev/null +++ b/doc/html/_title_page.html @@ -0,0 +1,88 @@ + + + + + + + +EPANET: [TITLE] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[TITLE]
+
+
+

Purpose:

+

Attaches a descriptive title to the network being analyzed.

+

Format:

+

Any number of lines of text.

+

Remarks:

+

The [TITLE] section is optional.

+
+
+ + + + diff --git a/doc/html/_toolkit_examples.html b/doc/html/_toolkit_examples.html new file mode 100644 index 0000000..5fa5793 --- /dev/null +++ b/doc/html/_toolkit_examples.html @@ -0,0 +1,85 @@ + + + + + + + +EPANET: Examples + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Examples
+
+
+

Here are several examples of how the Toolkit can be used for different types of network analyses.

+ +
+
+ + + + diff --git a/doc/html/_toolkit_versions.html b/doc/html/_toolkit_versions.html new file mode 100644 index 0000000..d387b99 --- /dev/null +++ b/doc/html/_toolkit_versions.html @@ -0,0 +1,90 @@ + + + + + + + +EPANET: Toolkit Versions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Toolkit Versions
+
+
+

The Toolkit comes with two sets of identical functions that programmers can utilize:

    +
  • the single-threaded version of the Toolkit is compatible with previous releases and only works with single threaded applications.
  • +
  • the multi-threaded version allows users to create multiple EPANET data sets (called projects) that can be analyzed concurrently.
  • +
+

Both Toolkit versions utilize identical function names and argument lists with the following exceptions:

    +
  • The #include "epanet2.h" directive must appear in all C/C++ code modules that use the single-threaded library while #include "epanet2_2.h" must be used for the multi-threaded library.
  • +
  • Function names in the single-threaded library begin with EN while those in the multi-threaded library begin with EN_ .
  • +
  • The multi-threaded functions contain an additional argument that references a particular network project that the function is applied to.
  • +
  • The multi-threaded library contains two additional functions that allow users to create and delete EPANET projects.
  • +
  • The single-threaded library uses single precision for its floating point arguments while the multi-threaded library uses double precision.
  • +
+

To avoid unnecessary duplication this document only discusses the multi-threaded version of the Toolkit.

+
+
+ + + + diff --git a/doc/html/_units.html b/doc/html/_units.html new file mode 100644 index 0000000..3bf6c08 --- /dev/null +++ b/doc/html/_units.html @@ -0,0 +1,137 @@ + + + + + + + +EPANET: Measurement Units + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Measurement Units
+
+
+

The toolkit can use data expressed in either US Customary of SI Metric units. A project's unit system depends on the unit system used for its choice of flow units. If the EN_open function is used to supply data to a project from an Input File then its flow units are set in the [OPTIONS] section of the file. If the EN_init function is used to initialize a project then the choice of flow units is the fourth argument to the function. The following table lists the units used to express the various parameters in an EPANET model.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter US Customary SI Metric
Concentration mg/L or ug/L mg/L or ug/L
Demand (see Flow units) (see Flow units)
Diameter (Pipes) inches millimeters
Diameter (Tanks) feet meters
Efficiency percent percent
Elevation feet meters
Emitter Coeff. flow units @ 1 psi drop flow units @ 1 meter drop
Energy kwatt - hours kwatt - hours
Flow CFS (cubic feet / sec) LPS (liters / sec)
GPM (gallons / min) LPM (liters / min)
MGD (million gal / day) MLD (megaliters / day)
IMGD (Imperial MGD) CMH (cubic meters / hr)
AFD (acre-feet / day) CMD (cubic meters / day)
Friction Factor unitless unitless
Head feet meters
Length feet meters
Minor Loss Coeff. unitless unitless
Power horsepower kwatts
Pressure psi meters
Reaction Coeff. (Bulk) 1/day (1st-order) 1/day (1st-order)
Reaction Coeff. (Wall) mass/sq-ft/day (0-order) mass/sq-m/day (0-order)
ft/day (1st-order) meters/day (1st-order)
Roughness Coeff. millifeet (Darcy-Weisbach) unitless otherwise mm (Darcy-Weisbach) unitless otherwise
Source Mass Injection mass/minute mass/minute
Velocity ft/sec meters/sec
Volume cubic feet cubic meters
Water Age hours hours
+
+
+ + + + diff --git a/doc/html/_valves_page.html b/doc/html/_valves_page.html new file mode 100644 index 0000000..e2a7195 --- /dev/null +++ b/doc/html/_valves_page.html @@ -0,0 +1,114 @@ + + + + + + + +EPANET: [VALVES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[VALVES]
+
+
+

Purpose:

+

Defines all control valve links contained in the network.

+

Format:

+

One line for each valve containing:

    +
  • ID label
  • +
  • ID of start node
  • +
  • ID of end node
  • +
  • Diameter, inches (mm)
  • +
  • Valve type
  • +
  • Valve setting
  • +
  • Minor loss coefficient
  • +
+

Remarks:

    +
  1. Valve types and settings include: + + + + + + + + + + + + + + +
    Valve Type Setting
    PRV (pressure reducing valve) Pressure, psi (m)
    PSV (pressure sustaining valve) Pressure, psi (m)
    PBV (pressure breaker valve) Pressure, psi (m)
    FCV (flow control valve) Flow (flow units)
    TCV (throttle control valve) Loss Coefficient
    GPV (general purpose valve) ID of head loss curve
    +
  2. +
  3. Shutoff valves and check valves are considered to be part of a pipe, not a separate control valve component (see [PIPES]).
  4. +
+
+
+ + + + diff --git a/doc/html/_vertex_page.html b/doc/html/_vertex_page.html new file mode 100644 index 0000000..a92654a --- /dev/null +++ b/doc/html/_vertex_page.html @@ -0,0 +1,96 @@ + + + + + + + +EPANET: [VERTICES] + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
[VERTICES]
+
+
+

Purpose:

+

Assigns interior vertex points that describe the shape of network links.

+

Format:

+

One line for each vertex point in each link containing such points that includes:

    +
  • Link ID label
  • +
  • X-coordinate
  • +
  • Y-coordinate
  • +
+

Remarks:

+
    +
  1. Vertex points allow links to be drawn as polylines instead of simple straight-lines between their end nodes.
  2. +
  3. The coordinates refer to the same coordinate system used for node and label coordinates.
  4. +
  5. A [VERTICES] section is optional and only provides support for an external GUI program that uses the EPANET engine.
  6. +
+
+
+ + + + diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/doc/html/bc_s.png differ diff --git a/doc/html/bdwn.png b/doc/html/bdwn.png new file mode 100644 index 0000000..940a0b9 Binary files /dev/null and b/doc/html/bdwn.png differ diff --git a/doc/html/closed.png b/doc/html/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/doc/html/closed.png differ diff --git a/doc/html/doc.png b/doc/html/doc.png new file mode 100644 index 0000000..17edabf Binary files /dev/null and b/doc/html/doc.png differ diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css new file mode 100644 index 0000000..5bc13aa --- /dev/null +++ b/doc/html/doxygen.css @@ -0,0 +1,1766 @@ +/* The standard CSS for doxygen 1.8.16 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png new file mode 100644 index 0000000..3ff17d8 Binary files /dev/null and b/doc/html/doxygen.png differ diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js new file mode 100644 index 0000000..ea0a7b3 --- /dev/null +++ b/doc/html/dynsections.js @@ -0,0 +1,120 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +EPANET: Simple Control Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Simple Control Functions
+
+
+ +

These functions are used for working with simple conditional controls. +More...

+

These functions are used for working with simple conditional controls.

+
+ + + + diff --git a/doc/html/group___curves.html b/doc/html/group___curves.html new file mode 100644 index 0000000..910e979 --- /dev/null +++ b/doc/html/group___curves.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Data Curve Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Data Curve Functions
+
+
+ +

These functions are used for working with data curves. +More...

+

These functions are used for working with data curves.

+
+ + + + diff --git a/doc/html/group___demands.html b/doc/html/group___demands.html new file mode 100644 index 0000000..48ed995 --- /dev/null +++ b/doc/html/group___demands.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Nodal Demand Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Nodal Demand Functions
+
+
+ +

These functions are used for managing nodal demands. +More...

+

These functions are used for managing nodal demands.

+
+ + + + diff --git a/doc/html/group___enumerations.html b/doc/html/group___enumerations.html new file mode 100644 index 0000000..13fc59c --- /dev/null +++ b/doc/html/group___enumerations.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Enumerated Types + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Enumerated Types
+
+
+ +

These are the toolkit's enumerated types whose members are used as function arguments. +More...

+

These are the toolkit's enumerated types whose members are used as function arguments.

+
+ + + + diff --git a/doc/html/group___error_codes.html b/doc/html/group___error_codes.html new file mode 100644 index 0000000..7bb923d --- /dev/null +++ b/doc/html/group___error_codes.html @@ -0,0 +1,205 @@ + + + + + + + +EPANET: Error Codes + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Error Codes
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Code Meaning
0 No error
101 Insufficient memory available
102 No network data available
103 Hydraulic solver not opened
104 No hydraulics for water quality analysis
105 Water quality solver not opened
106 No results saved to report on
107 Hydraulics supplied from external file
108 Cannot use external file while hydraulics solver is open
110 Cannot solve network hydraulic equations
120 Cannot solve water quality transport equations
200 One or more errors in an input file
201 Syntax error
202 Function call contains an illegal numeric value
203 Function call refers to an undefined node
204 Function call refers to an undefined link
205 Function call refers to an undefined time pattern
206 Function call refers to an undefined curve
207 Function call attempts to control a check valve pipe or a GPV valve
208 Function call contains illegal PDA pressure limits
209 Function call contains an illegal node property value
211 Function call contains an illegal link property value
212 Function call refers to an undefined Trace Node
213 Function call contains an invalid option value
214 Too many characters in a line of an input file
215 Function call contains a duplicate ID label
216 Function call refers to an undefined pump
217 Invalid pump energy data
219 Illegal valve connection to tank node
220 Illegal valve connection to another valve
221 Mis-placed clause in rule-based control
222 Link assigned same start and end nodes
223 Not enough nodes in network
224 No tanks or reservoirs in network
225 Invalid lower/upper levels for tank
226 No head curve or power rating for pump
227 Invalid head curve for pump
230 Nonincreasing x-values for curve
233 Network has unconnected node
240 Function call refers to nonexistent water quality source
241 Function call refers to nonexistent control
250 Function call contains invalid format (e.g. too long an ID name)
251 Function call contains invalid parameter code
253 Function call refers to nonexistent demand category
254 Function call refers to node with no coordinates
257 Function call refers to nonexistent rule
258 Function call refers to nonexistent rule clause
259 Function call attempts to delete a node that still has links connected to it
260 Function call attempts to delete node assigned as a Trace Node
261 Function call attempts to delete a node or link contained in a control
262 Function call attempts to modify network structure while a solver is open
301 Identical file names used for different types of files
302 Cannot open input file
303 Cannot open report file
304 Cannot open output file
305 Cannot open hydraulics file
306 Hydraulics file does not match network data
307 Cannot read hydraulics file
308 Cannot save results to binary file
309 Cannot save results to report file
+
+ + + + diff --git a/doc/html/group___hydraulics.html b/doc/html/group___hydraulics.html new file mode 100644 index 0000000..377c052 --- /dev/null +++ b/doc/html/group___hydraulics.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Hydraulic Analysis Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Hydraulic Analysis Functions
+
+
+ +

These functions are used to perform a hydraulic analysis. +More...

+

These functions are used to perform a hydraulic analysis.

+
+ + + + diff --git a/doc/html/group___links.html b/doc/html/group___links.html new file mode 100644 index 0000000..9d92d48 --- /dev/null +++ b/doc/html/group___links.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Network Link Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Network Link Functions
+
+
+ +

These functions are used for working with network links. +More...

+

These functions are used for working with network links.

+
+ + + + diff --git a/doc/html/group___nodes.html b/doc/html/group___nodes.html new file mode 100644 index 0000000..a887c94 --- /dev/null +++ b/doc/html/group___nodes.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Network Node Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Network Node Functions
+
+
+ +

These functions are used for working with network nodes. +More...

+

These functions are used for working with network nodes.

+
+ + + + diff --git a/doc/html/group___options.html b/doc/html/group___options.html new file mode 100644 index 0000000..eb62ffe --- /dev/null +++ b/doc/html/group___options.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Analysis Options Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Analysis Options Functions
+
+
+ +

These functions are used to get and set analysis options. +More...

+

These functions are used to get and set analysis options.

+
+ + + + diff --git a/doc/html/group___out_file_format.html b/doc/html/group___out_file_format.html new file mode 100644 index 0000000..c9da13c --- /dev/null +++ b/doc/html/group___out_file_format.html @@ -0,0 +1,270 @@ + + + + + + + +EPANET: OutFileFormat + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
OutFileFormat
+
+
+

The Toolkit uses an unformatted binary output file to store both hydraulic and water quality results at uniform reporting intervals. Data written to the file is either 4-byte integers, 4-byte floats, or fixed-size strings whose size is a multiple of 4 bytes. This allows the file to be divided conveniently into 4-byte records. The file consists of four sections of the following sizes in bytes:

+ + + + + + + + + + + +
Section Size in Bytes
Prolog 884 + 36*Nnodes + 52*Nlinks + 8*Ntanks
Energy Usage 28*Npumps + 4
Dynamic Results (16*Nnodes + 32*Nlinks)*Nperiods
Epilog 28
+

where:

+

All of these counts are themselves written to the file's Prolog or Epilog sections.

+ + +

Prolog Section

The Prolog section of an EPANET binary output file contains the following data: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Item Type # Bytes
Magic Number = 516114521 Integer 4
Version (= 200) Integer 4
Number of Nodes Integer 4
Number of Reservoirs & Tanks Integer 4
Number of Links Integer 4
Number of Pumps Integer 4
Number of Valves Integer 4
Water Quality Option - see EN_QualityType Integer 4
Traced Node Index Integer 4
Flow Units Option Integer 4
Pressure Units Option Integer 4
0 = psi
1 = meters
2 = kPa
Report Statistic Type - see EN_StatisticType Integer 4
Reporting Start Time (sec) Integer 4
Reporting Time Step (sec) Integer 4
Simulation Duration (sec) Integer 4
Project Title (1st line) Char 80
Project Title (2nd line) Char 80
Project Title (3rd line) Char 80
Name of Input File Char 260
Name of Report File Char 260
Name of Quality Chemical Char 32
Chemical Concentration Units Char 32
ID String of Each Node Char 32*Nnodes
ID String of Each Link Char 32*Nlinks
Index of Head Node of Each Link Integer 4*Nlinks
Index of Tail Node of Each Link Integer 4*Nlinks
Type Code of Each Link (see EN_LinkType) Integer 4*Nlinks
Node Index of Each Tank Integer 4*Ntanks
Surface Area of Each Tank Float 4*Ntanks
Elevation of Each Node Float 4*Nnodes
Length of Each Link Float 4*Nlinks
Diameter of Each Link Float 4*Nlinks
+
+ +

Energy Usage Section

The Energy Usage section of an EPANET binary output file contains the following data: + + + + + + + + + + + + + + + + + + +
Item (Repeated for Each Pump) Type # Bytes
Pump Index in list of links Integer 4
Pump Utilization (%) Float 4
Average Efficiency (%) Float 4
Average kwatts/MGal (or kwatts/cu m) Float 4
Average kwatts Float 4
Peak kwatts Float 4
Average Cost per Day Float 4
Peak Energy Usage (kw-hrs) Float 4
+
+ +

Dynamic Results Section

The Dynamic Results section of an EPANET binary output file contains the following set of data for each reporting period (the reporting time step is written to the Output File's Prolog Section and the number of such steps is written to the Epilog Section): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Item Type # Bytes
Demand at Each Node Float 4*Nnodes
Head (Grade) at Each Node Float 4*Nnodes
Pressure at Each Node Float 4*Nnodes
Water Quality at Each Node Float 4*Nnodes
Flow in Each Link Float 4*Nlinks
(negative for reverse flow)
Velocity in Each Link Float 4*Nlinks
Headloss per 1000 Units of Length for Each Link Float 4*Nlinks
(total head for pumps and head loss for valves)
Average Water Quality in Each Link Float 4*Nlinks
Status Code for Each Link Float 4*Nlinks
0 = closed (pump shutoff head exceeded)
1 = temporarily closed
2 = closed
3 = open
4 = active (partially open
5 = open (pump max. flow exceeded)
6 = open (FCV can't supply flow
7 = open (PRV/PSV can't supply pressure)
Setting for Each Link Float 4*Nlinks
Reaction Rate for Each Link (mass/L/day) Float 4*Nlinks
Friction Factor for Each Link Float 4*Nlinks
+
+ +

Epilog Section

The Epilog section of an EPANET binary output file contains the following data: + + + + + + + + + + + + + + + + + + + + +
Item Type # Bytes
Average bulk reaction rate (mass/hr) Float 4
Average wall reaction rate (mass/hr) Float 4
Average tank reaction rate (mass/hr) Float 4
Average source inflow rate (mass/hr) Float 4
Number of Reporting Periods Integer 4
Warning Flag: Integer 4
0 = no warnings
1 = warnings were generated
Magic Number = 516114521 Integer 4
+
+ + + + diff --git a/doc/html/group___patterns.html b/doc/html/group___patterns.html new file mode 100644 index 0000000..982e89a --- /dev/null +++ b/doc/html/group___patterns.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Time Pattern Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Time Pattern Functions
+
+
+ +

These functions are used for working with time patterns. +More...

+

These functions are used for working with time patterns.

+
+ + + + diff --git a/doc/html/group___project.html b/doc/html/group___project.html new file mode 100644 index 0000000..cd17e53 --- /dev/null +++ b/doc/html/group___project.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Project Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Project Functions
+
+
+ +

These functions are used to manage a project. +More...

+

These functions are used to manage a project.

+
+ + + + diff --git a/doc/html/group___quality.html b/doc/html/group___quality.html new file mode 100644 index 0000000..5a5166a --- /dev/null +++ b/doc/html/group___quality.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Water Quality Analysis Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Water Quality Analysis Functions
+
+
+ +

These functions are used to perform a water quality analysis. +More...

+

These functions are used to perform a water quality analysis.

+
+ + + + diff --git a/doc/html/group___reporting.html b/doc/html/group___reporting.html new file mode 100644 index 0000000..68b8b7c --- /dev/null +++ b/doc/html/group___reporting.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Reporting Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Reporting Functions
+
+
+ +

These functions are used to report simulation results. +More...

+

These functions are used to report simulation results.

+
+ + + + diff --git a/doc/html/group___rules.html b/doc/html/group___rules.html new file mode 100644 index 0000000..cba2ceb --- /dev/null +++ b/doc/html/group___rules.html @@ -0,0 +1,81 @@ + + + + + + + +EPANET: Rule-Based Control Functions + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Rule-Based Control Functions
+
+
+ +

These functions are used for working with rule-based controls. +More...

+

These functions are used for working with rule-based controls.

+
+ + + + diff --git a/doc/html/group___warning_codes.html b/doc/html/group___warning_codes.html new file mode 100644 index 0000000..d3a7a5a --- /dev/null +++ b/doc/html/group___warning_codes.html @@ -0,0 +1,93 @@ + + + + + + + +EPANET: Warning Codes + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Warning Codes
+
+
+ + + + + + + + + + + + + + + +
Code Description
1 System hydraulically unbalanced - convergence to a hydraulic solution was not achieved in the allowed number of trials
2 System may be hydraulically unstable - hydraulic convergence was only achieved after the status of all links was held fixed
3 System disconnected - one or more nodes with positive demands were disconnected from all supply sources
4 Pumps cannot deliver enough flow or head - one or more pumps were forced to either shut down (due to insufficient head) or operate beyond the maximum rated flow
5 Valves cannot deliver enough flow - one or more flow control valves could not deliver the required flow even when fully open
6 System has negative pressures - negative pressures occurred at one or more junctions with positive demand
+
+ + + + diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100644 index 0000000..bd7c6e8 --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,102 @@ + + + + + + + +EPANET: Overview + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Overview
+
+
+

EPANET is a program that performs extended period simulation of hydraulic and water quality behavior within water distribution system pipe networks. A network can consist of pipes, nodes (pipe junctions), pumps, valves and storage tanks or reservoirs. EPANET tracks the flow of water in each pipe, the pressure at each node, the height of water in each tank, and the concentration of a chemical species throughout the network during a multi-time period simulation. In addition to chemical species, water age and source tracing can also be simulated.

+ + + +
+ +
+
+

The EPANET Programmer's Toolkit is a library of functions (or API) written in C that allow programmers to customize the use of EPANET's hydraulic and water quality solution engine to their own applications. Both EPANET and its toolkit were originally developed by the U.S. Environmental Protection Agency (USEPA).

+

The OWA-EPANET Toolkit is an open-source version of the original EPANET Toolkit that extends its capabilities by:

    +
  • providing a full set of functions to set and retrieve values for all parameters contained in a network model
  • +
  • allowing networks to be built completely from function calls instead of from an input file
  • +
  • allowing multiple projects to be analyzed in parallel in a thread-safe manner
  • +
  • adding the ability to use pressure dependent demands in hydraulic analyses
  • +
  • producing more robust results with regard to hydraulic convergence, low/zero flow conditions, and water quality mass balance
  • +
  • achieving faster run times for single period hydraulic analyses.
  • +
+

Before using the OWA-EPANET Toolkit one should be familiar with the way that EPANET represents a pipe network, the design and operating information it requires, and the steps it uses to simulate a network's behavior. The following topics provide some introductory material on these subjects:

+

More detailed information can be obtained from reading the EPANET 2 Users Manual.

+

Note: OWA (Open Water Analytics) exists on GitHub as an open community for the exchange of information and ideas related to computing in the water & wastewater industries. It's activities and code projects are neither affiliated with nor endorsed by the USEPA.

+
+
+ + + + diff --git a/doc/html/jquery.js b/doc/html/jquery.js new file mode 100644 index 0000000..103c32d --- /dev/null +++ b/doc/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/html/md_readme.html b/doc/html/md_readme.html new file mode 100644 index 0000000..2976447 --- /dev/null +++ b/doc/html/md_readme.html @@ -0,0 +1,101 @@ + + + + + + + +EPANET: Generating Documentation for OWA-EPANET 2.2 + + + + + + + + + +
+
+ + + + + + +
+
EPANET +  2.2.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Generating Documentation for OWA-EPANET 2.2
+
+
+

You must have Doxygen installed on your machine to generate documentation for the OWA-EPANET Toolkit. Assuming this is the case, open a terminal window, navigate to the project's doc directory and issue the command doxygen. This will generate HTML documentation placed in a sub-directory named html. From that directory you can launch the index.html file to view the full documentation in a web browser.

+

To generate a Windows compiled HTML Help file you must have Microsoft's HTML Help Workshop installed. You then need to edit the Doxygen configuration file doxyfile as follows:

+
    +
  1. Change the GENERATE_HTMLHELP setting to YES.
  2. +
  3. Enter the location where the Help Workshop system was installed next to the HHC_LOCATION setting.
  4. +
+

After running Doxygen again the resulting Help file named owa-epanet.chm will appear in the html sub-directory.

+

Doxygen uses the special comments placed in the project's epanet2_2.h and epanet2_enums.h header files to document EPANET's API. It also uses supplementary material contained in the following files of the project's doc directory to generate additional pages of documentation:

+
    +
  • main.dox: generates the Overview section.
  • +
  • usage.dox: generates the Usage section.
  • +
  • toolkit-examples.dox : generates the Examples section.
  • +
  • toolkit-files.dox: generates the Toolkit Files section.
  • +
  • input-file.dox: generates the Input File sub-section.
  • +
  • toolkit-units.dox: generates the Measurement Units section.
  • +
  • modules.dox: defines the contents of the API Reference section.
  • +
+

Finally, a group of special Doxygen files are used to customize the format of the generated documentation. These include the following:

    +
  • doxyfile: the main Doxygen configuration file
  • +
  • DoxygenLayout.xml: sets the title of the automatically generated Modules section to API Reference and hides the Files section in the tree view pane of the document.
  • +
  • extrastylesheet.css: reduces the size of the the h1 heading style.
  • +
  • newfooter.html: replaces the default Doxygen footer in HTML output with a custom one.
  • +
+
+
+ + + + diff --git a/doc/html/menu.js b/doc/html/menu.js new file mode 100644 index 0000000..433c15b --- /dev/null +++ b/doc/html/menu.js @@ -0,0 +1,50 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/html/menudata.js b/doc/html/menudata.js new file mode 100644 index 0000000..7ee4a28 --- /dev/null +++ b/doc/html/menudata.js @@ -0,0 +1,26 @@ +/* +@licstart The following is the entire license notice for the +JavaScript code in this file. + +Copyright (C) 1997-2019 by Dimitri van Heesch + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License as published by +the Free Software Foundation + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +@licend The above is the entire license notice +for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"API Reference",url:"modules.html"}]} diff --git a/doc/html/modules.html b/doc/html/modules.html new file mode 100644 index 0000000..f30a0e6 --- /dev/null +++ b/doc/html/modules.html @@ -0,0 +1,97 @@ + + + + + + + +EPANET: API Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    EPANET +  2.2.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    API Reference
    +
    +
    +
    These topics describe the Toolkit's functions, enumerations, and error/warning codes.
    + + + + + + + + + + + + + + + + + +
     Project FunctionsThese functions are used to manage a project
     Hydraulic Analysis FunctionsThese functions are used to perform a hydraulic analysis
     Water Quality Analysis FunctionsThese functions are used to perform a water quality analysis
     Reporting FunctionsThese functions are used to report simulation results
     Analysis Options FunctionsThese functions are used to get and set analysis options
     Network Node FunctionsThese functions are used for working with network nodes
     Nodal Demand FunctionsThese functions are used for managing nodal demands
     Network Link FunctionsThese functions are used for working with network links
     Time Pattern FunctionsThese functions are used for working with time patterns
     Data Curve FunctionsThese functions are used for working with data curves
     Simple Control FunctionsThese functions are used for working with simple conditional controls
     Rule-Based Control FunctionsThese functions are used for working with rule-based controls
     Enumerated TypesThese are the toolkit's enumerated types whose members are used as function arguments
     Error Codes
     Warning Codes
     OutFileFormat
    +
    +
    + + + + diff --git a/doc/html/nav_f.png b/doc/html/nav_f.png new file mode 100644 index 0000000..72a58a5 Binary files /dev/null and b/doc/html/nav_f.png differ diff --git a/doc/html/nav_g.png b/doc/html/nav_g.png new file mode 100644 index 0000000..2093a23 Binary files /dev/null and b/doc/html/nav_g.png differ diff --git a/doc/html/nav_h.png b/doc/html/nav_h.png new file mode 100644 index 0000000..33389b1 Binary files /dev/null and b/doc/html/nav_h.png differ diff --git a/doc/html/open.png b/doc/html/open.png new file mode 100644 index 0000000..30f75c7 Binary files /dev/null and b/doc/html/open.png differ diff --git a/doc/html/pages.html b/doc/html/pages.html new file mode 100644 index 0000000..6bb9638 --- /dev/null +++ b/doc/html/pages.html @@ -0,0 +1,126 @@ + + + + + + + +EPANET: Related Pages + + + + + + + + + +
    +
    + + + + + + +
    +
    EPANET +  2.2.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Related Pages
    +
    + + + + + diff --git a/doc/html/search/all_0.html b/doc/html/search/all_0.html new file mode 100644 index 0000000..a52d5f0 --- /dev/null +++ b/doc/html/search/all_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_0.js b/doc/html/search/all_0.js new file mode 100644 index 0000000..6dde81a --- /dev/null +++ b/doc/html/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['action_20clauses_0',['Action Clauses',['../_action_clauses.html',1,'RulesPage']]], + ['analysis_20options_20functions_1',['Analysis Options Functions',['../group___options.html',1,'']]] +]; diff --git a/doc/html/search/all_1.html b/doc/html/search/all_1.html new file mode 100644 index 0000000..0fcb704 --- /dev/null +++ b/doc/html/search/all_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_1.js b/doc/html/search/all_1.js new file mode 100644 index 0000000..9003a7a --- /dev/null +++ b/doc/html/search/all_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['condition_20clauses_2',['Condition Clauses',['../_condition_clauses.html',1,'RulesPage']]], + ['chlorine_20dosage_20example_3',['Chlorine Dosage Example',['../_example4.html',1,'ToolkitExamples']]] +]; diff --git a/doc/html/search/all_2.html b/doc/html/search/all_2.html new file mode 100644 index 0000000..19c530f --- /dev/null +++ b/doc/html/search/all_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_2.js b/doc/html/search/all_2.js new file mode 100644 index 0000000..1ba5d4e --- /dev/null +++ b/doc/html/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['data_20curve_20functions_4',['Data Curve Functions',['../group___curves.html',1,'']]], + ['data_20flow_20diagram_5',['Data Flow Diagram',['../_data_flow.html',1,'']]], + ['dynamic_20results_20section_6',['Dynamic Results Section',['../group___out_file_format.html',1,'']]] +]; diff --git a/doc/html/search/all_3.html b/doc/html/search/all_3.html new file mode 100644 index 0000000..1ae887f --- /dev/null +++ b/doc/html/search/all_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_3.js b/doc/html/search/all_3.js new file mode 100644 index 0000000..43c2603 --- /dev/null +++ b/doc/html/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['enumerated_20types_7',['Enumerated Types',['../group___enumerations.html',1,'']]], + ['error_20codes_8',['Error Codes',['../group___error_codes.html',1,'']]], + ['embedded_20engine_20example_9',['Embedded Engine Example',['../_example1.html',1,'ToolkitExamples']]], + ['energy_20usage_20section_10',['Energy Usage Section',['../group___out_file_format.html',1,'']]], + ['epilog_20section_11',['Epilog Section',['../group___out_file_format.html',1,'']]], + ['examples_12',['Examples',['../_toolkit_examples.html',1,'']]] +]; diff --git a/doc/html/search/all_4.html b/doc/html/search/all_4.html new file mode 100644 index 0000000..14c90ef --- /dev/null +++ b/doc/html/search/all_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_4.js b/doc/html/search/all_4.js new file mode 100644 index 0000000..a7f5c72 --- /dev/null +++ b/doc/html/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['generating_20documentation_20for_20owa_2depanet_202_2e2_13',['Generating Documentation for OWA-EPANET 2.2',['../md_readme.html',1,'']]] +]; diff --git a/doc/html/search/all_5.html b/doc/html/search/all_5.html new file mode 100644 index 0000000..60fa53e --- /dev/null +++ b/doc/html/search/all_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_5.js b/doc/html/search/all_5.js new file mode 100644 index 0000000..2e242c8 --- /dev/null +++ b/doc/html/search/all_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['hydrant_20rating_20curve_20example_14',['Hydrant Rating Curve Example',['../_example3.html',1,'ToolkitExamples']]], + ['header_20files_15',['Header Files',['../_header_files.html',1,'Files']]], + ['hydraulics_20file_16',['Hydraulics File',['../_hyd_file.html',1,'Files']]], + ['hydraulic_20analysis_20functions_17',['Hydraulic Analysis Functions',['../group___hydraulics.html',1,'']]] +]; diff --git a/doc/html/search/all_6.html b/doc/html/search/all_6.html new file mode 100644 index 0000000..7180363 --- /dev/null +++ b/doc/html/search/all_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_6.js b/doc/html/search/all_6.js new file mode 100644 index 0000000..62f2ad8 --- /dev/null +++ b/doc/html/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['input_20file_18',['Input File',['../_inp_file.html',1,'Files']]] +]; diff --git a/doc/html/search/all_7.html b/doc/html/search/all_7.html new file mode 100644 index 0000000..ee6d2e4 --- /dev/null +++ b/doc/html/search/all_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_7.js b/doc/html/search/all_7.js new file mode 100644 index 0000000..74c634d --- /dev/null +++ b/doc/html/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['measurement_20units_19',['Measurement Units',['../_units.html',1,'']]] +]; diff --git a/doc/html/search/all_8.html b/doc/html/search/all_8.html new file mode 100644 index 0000000..7829aa4 --- /dev/null +++ b/doc/html/search/all_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_8.js b/doc/html/search/all_8.js new file mode 100644 index 0000000..9e67fa9 --- /dev/null +++ b/doc/html/search/all_8.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['network_20data_20model_20',['Network Data Model',['../_data_model.html',1,'']]], + ['nodal_20demand_20functions_21',['Nodal Demand Functions',['../group___demands.html',1,'']]], + ['network_20building_20example_22',['Network Building Example',['../_example2.html',1,'ToolkitExamples']]], + ['network_20link_20functions_23',['Network Link Functions',['../group___links.html',1,'']]], + ['network_20node_20functions_24',['Network Node Functions',['../group___nodes.html',1,'']]] +]; diff --git a/doc/html/search/all_9.html b/doc/html/search/all_9.html new file mode 100644 index 0000000..e4242c7 --- /dev/null +++ b/doc/html/search/all_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_9.js b/doc/html/search/all_9.js new file mode 100644 index 0000000..f3e50c9 --- /dev/null +++ b/doc/html/search/all_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['overview_25',['Overview',['../index.html',1,'']]], + ['output_20file_26',['Output File',['../_out_file.html',1,'Files']]], + ['outfileformat_27',['OutFileFormat',['../group___out_file_format.html',1,'']]] +]; diff --git a/doc/html/search/all_a.html b/doc/html/search/all_a.html new file mode 100644 index 0000000..47a4a78 --- /dev/null +++ b/doc/html/search/all_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_a.js b/doc/html/search/all_a.js new file mode 100644 index 0000000..80f9298 --- /dev/null +++ b/doc/html/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['prolog_20section_28',['Prolog Section',['../group___out_file_format.html',1,'']]], + ['project_20functions_29',['Project Functions',['../group___project.html',1,'']]] +]; diff --git a/doc/html/search/all_b.html b/doc/html/search/all_b.html new file mode 100644 index 0000000..1320a43 --- /dev/null +++ b/doc/html/search/all_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_b.js b/doc/html/search/all_b.js new file mode 100644 index 0000000..39016e7 --- /dev/null +++ b/doc/html/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['reporting_20functions_30',['Reporting Functions',['../group___reporting.html',1,'']]], + ['report_20file_31',['Report File',['../_rpt_file.html',1,'Files']]], + ['rule_2dbased_20control_20functions_32',['Rule-Based Control Functions',['../group___rules.html',1,'']]] +]; diff --git a/doc/html/search/all_c.html b/doc/html/search/all_c.html new file mode 100644 index 0000000..32a3a1b --- /dev/null +++ b/doc/html/search/all_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_c.js b/doc/html/search/all_c.js new file mode 100644 index 0000000..ce625aa --- /dev/null +++ b/doc/html/search/all_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['simple_20control_20functions_33',['Simple Control Functions',['../group___controls.html',1,'']]] +]; diff --git a/doc/html/search/all_d.html b/doc/html/search/all_d.html new file mode 100644 index 0000000..a386096 --- /dev/null +++ b/doc/html/search/all_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_d.js b/doc/html/search/all_d.js new file mode 100644 index 0000000..4e53488 --- /dev/null +++ b/doc/html/search/all_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['toolkit_20files_34',['Toolkit Files',['../_files.html',1,'']]], + ['time_20pattern_20functions_35',['Time Pattern Functions',['../group___patterns.html',1,'']]], + ['toolkit_20versions_36',['Toolkit Versions',['../_toolkit_versions.html',1,'']]] +]; diff --git a/doc/html/search/all_e.html b/doc/html/search/all_e.html new file mode 100644 index 0000000..2931618 --- /dev/null +++ b/doc/html/search/all_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_e.js b/doc/html/search/all_e.js new file mode 100644 index 0000000..c3e3285 --- /dev/null +++ b/doc/html/search/all_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['usage_37',['Usage',['../toolkit-usage.html',1,'']]] +]; diff --git a/doc/html/search/all_f.html b/doc/html/search/all_f.html new file mode 100644 index 0000000..ca42a52 --- /dev/null +++ b/doc/html/search/all_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/all_f.js b/doc/html/search/all_f.js new file mode 100644 index 0000000..597e753 --- /dev/null +++ b/doc/html/search/all_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['water_20quality_20analysis_20functions_38',['Water Quality Analysis Functions',['../group___quality.html',1,'']]], + ['warning_20codes_39',['Warning Codes',['../group___warning_codes.html',1,'']]] +]; diff --git a/doc/html/search/close.png b/doc/html/search/close.png new file mode 100644 index 0000000..9342d3d Binary files /dev/null and b/doc/html/search/close.png differ diff --git a/doc/html/search/groups_0.html b/doc/html/search/groups_0.html new file mode 100644 index 0000000..49412e8 --- /dev/null +++ b/doc/html/search/groups_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_0.js b/doc/html/search/groups_0.js new file mode 100644 index 0000000..4288e9c --- /dev/null +++ b/doc/html/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['analysis_20options_20functions_40',['Analysis Options Functions',['../group___options.html',1,'']]] +]; diff --git a/doc/html/search/groups_1.html b/doc/html/search/groups_1.html new file mode 100644 index 0000000..8e3ac96 --- /dev/null +++ b/doc/html/search/groups_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_1.js b/doc/html/search/groups_1.js new file mode 100644 index 0000000..77e679d --- /dev/null +++ b/doc/html/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['data_20curve_20functions_41',['Data Curve Functions',['../group___curves.html',1,'']]] +]; diff --git a/doc/html/search/groups_2.html b/doc/html/search/groups_2.html new file mode 100644 index 0000000..9c46700 --- /dev/null +++ b/doc/html/search/groups_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_2.js b/doc/html/search/groups_2.js new file mode 100644 index 0000000..14e3dd7 --- /dev/null +++ b/doc/html/search/groups_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['enumerated_20types_42',['Enumerated Types',['../group___enumerations.html',1,'']]], + ['error_20codes_43',['Error Codes',['../group___error_codes.html',1,'']]] +]; diff --git a/doc/html/search/groups_3.html b/doc/html/search/groups_3.html new file mode 100644 index 0000000..8eb56c9 --- /dev/null +++ b/doc/html/search/groups_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_3.js b/doc/html/search/groups_3.js new file mode 100644 index 0000000..0af1b09 --- /dev/null +++ b/doc/html/search/groups_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hydraulic_20analysis_20functions_44',['Hydraulic Analysis Functions',['../group___hydraulics.html',1,'']]] +]; diff --git a/doc/html/search/groups_4.html b/doc/html/search/groups_4.html new file mode 100644 index 0000000..42b5567 --- /dev/null +++ b/doc/html/search/groups_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_4.js b/doc/html/search/groups_4.js new file mode 100644 index 0000000..9e3e3ae --- /dev/null +++ b/doc/html/search/groups_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['nodal_20demand_20functions_45',['Nodal Demand Functions',['../group___demands.html',1,'']]], + ['network_20link_20functions_46',['Network Link Functions',['../group___links.html',1,'']]], + ['network_20node_20functions_47',['Network Node Functions',['../group___nodes.html',1,'']]] +]; diff --git a/doc/html/search/groups_5.html b/doc/html/search/groups_5.html new file mode 100644 index 0000000..8d01ff1 --- /dev/null +++ b/doc/html/search/groups_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_5.js b/doc/html/search/groups_5.js new file mode 100644 index 0000000..e857edb --- /dev/null +++ b/doc/html/search/groups_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['outfileformat_48',['OutFileFormat',['../group___out_file_format.html',1,'']]] +]; diff --git a/doc/html/search/groups_6.html b/doc/html/search/groups_6.html new file mode 100644 index 0000000..4989cbc --- /dev/null +++ b/doc/html/search/groups_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_6.js b/doc/html/search/groups_6.js new file mode 100644 index 0000000..e502f7f --- /dev/null +++ b/doc/html/search/groups_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_20functions_49',['Project Functions',['../group___project.html',1,'']]] +]; diff --git a/doc/html/search/groups_7.html b/doc/html/search/groups_7.html new file mode 100644 index 0000000..c51bb3d --- /dev/null +++ b/doc/html/search/groups_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_7.js b/doc/html/search/groups_7.js new file mode 100644 index 0000000..091bca3 --- /dev/null +++ b/doc/html/search/groups_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reporting_20functions_50',['Reporting Functions',['../group___reporting.html',1,'']]], + ['rule_2dbased_20control_20functions_51',['Rule-Based Control Functions',['../group___rules.html',1,'']]] +]; diff --git a/doc/html/search/groups_8.html b/doc/html/search/groups_8.html new file mode 100644 index 0000000..a533f14 --- /dev/null +++ b/doc/html/search/groups_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_8.js b/doc/html/search/groups_8.js new file mode 100644 index 0000000..6a44bc3 --- /dev/null +++ b/doc/html/search/groups_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['simple_20control_20functions_52',['Simple Control Functions',['../group___controls.html',1,'']]] +]; diff --git a/doc/html/search/groups_9.html b/doc/html/search/groups_9.html new file mode 100644 index 0000000..464b748 --- /dev/null +++ b/doc/html/search/groups_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_9.js b/doc/html/search/groups_9.js new file mode 100644 index 0000000..89fc020 --- /dev/null +++ b/doc/html/search/groups_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['time_20pattern_20functions_53',['Time Pattern Functions',['../group___patterns.html',1,'']]] +]; diff --git a/doc/html/search/groups_a.html b/doc/html/search/groups_a.html new file mode 100644 index 0000000..ac547d3 --- /dev/null +++ b/doc/html/search/groups_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/groups_a.js b/doc/html/search/groups_a.js new file mode 100644 index 0000000..98f98bf --- /dev/null +++ b/doc/html/search/groups_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['water_20quality_20analysis_20functions_54',['Water Quality Analysis Functions',['../group___quality.html',1,'']]], + ['warning_20codes_55',['Warning Codes',['../group___warning_codes.html',1,'']]] +]; diff --git a/doc/html/search/mag_sel.png b/doc/html/search/mag_sel.png new file mode 100644 index 0000000..39c0ed5 Binary files /dev/null and b/doc/html/search/mag_sel.png differ diff --git a/doc/html/search/nomatches.html b/doc/html/search/nomatches.html new file mode 100644 index 0000000..4377320 --- /dev/null +++ b/doc/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/html/search/pages_0.html b/doc/html/search/pages_0.html new file mode 100644 index 0000000..32cbf49 --- /dev/null +++ b/doc/html/search/pages_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_0.js b/doc/html/search/pages_0.js new file mode 100644 index 0000000..aed884a --- /dev/null +++ b/doc/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['action_20clauses_56',['Action Clauses',['../_action_clauses.html',1,'RulesPage']]] +]; diff --git a/doc/html/search/pages_1.html b/doc/html/search/pages_1.html new file mode 100644 index 0000000..86c9cd3 --- /dev/null +++ b/doc/html/search/pages_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_1.js b/doc/html/search/pages_1.js new file mode 100644 index 0000000..4f7ffeb --- /dev/null +++ b/doc/html/search/pages_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['condition_20clauses_57',['Condition Clauses',['../_condition_clauses.html',1,'RulesPage']]], + ['chlorine_20dosage_20example_58',['Chlorine Dosage Example',['../_example4.html',1,'ToolkitExamples']]] +]; diff --git a/doc/html/search/pages_2.html b/doc/html/search/pages_2.html new file mode 100644 index 0000000..0c8adf5 --- /dev/null +++ b/doc/html/search/pages_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_2.js b/doc/html/search/pages_2.js new file mode 100644 index 0000000..136b9b9 --- /dev/null +++ b/doc/html/search/pages_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['data_20flow_20diagram_59',['Data Flow Diagram',['../_data_flow.html',1,'']]], + ['dynamic_20results_20section_60',['Dynamic Results Section',['../group___out_file_format.html',1,'']]] +]; diff --git a/doc/html/search/pages_3.html b/doc/html/search/pages_3.html new file mode 100644 index 0000000..7c591a2 --- /dev/null +++ b/doc/html/search/pages_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_3.js b/doc/html/search/pages_3.js new file mode 100644 index 0000000..d4cc27b --- /dev/null +++ b/doc/html/search/pages_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['embedded_20engine_20example_61',['Embedded Engine Example',['../_example1.html',1,'ToolkitExamples']]], + ['energy_20usage_20section_62',['Energy Usage Section',['../group___out_file_format.html',1,'']]], + ['epilog_20section_63',['Epilog Section',['../group___out_file_format.html',1,'']]], + ['examples_64',['Examples',['../_toolkit_examples.html',1,'']]] +]; diff --git a/doc/html/search/pages_4.html b/doc/html/search/pages_4.html new file mode 100644 index 0000000..63ed7c7 --- /dev/null +++ b/doc/html/search/pages_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_4.js b/doc/html/search/pages_4.js new file mode 100644 index 0000000..f0a722c --- /dev/null +++ b/doc/html/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['generating_20documentation_20for_20owa_2depanet_202_2e2_65',['Generating Documentation for OWA-EPANET 2.2',['../md_readme.html',1,'']]] +]; diff --git a/doc/html/search/pages_5.html b/doc/html/search/pages_5.html new file mode 100644 index 0000000..5ef74eb --- /dev/null +++ b/doc/html/search/pages_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_5.js b/doc/html/search/pages_5.js new file mode 100644 index 0000000..a32d6be --- /dev/null +++ b/doc/html/search/pages_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['hydrant_20rating_20curve_20example_66',['Hydrant Rating Curve Example',['../_example3.html',1,'ToolkitExamples']]], + ['header_20files_67',['Header Files',['../_header_files.html',1,'Files']]], + ['hydraulics_20file_68',['Hydraulics File',['../_hyd_file.html',1,'Files']]] +]; diff --git a/doc/html/search/pages_6.html b/doc/html/search/pages_6.html new file mode 100644 index 0000000..cd867a0 --- /dev/null +++ b/doc/html/search/pages_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_6.js b/doc/html/search/pages_6.js new file mode 100644 index 0000000..732ae77 --- /dev/null +++ b/doc/html/search/pages_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['input_20file_69',['Input File',['../_inp_file.html',1,'Files']]] +]; diff --git a/doc/html/search/pages_7.html b/doc/html/search/pages_7.html new file mode 100644 index 0000000..2a0841f --- /dev/null +++ b/doc/html/search/pages_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_7.js b/doc/html/search/pages_7.js new file mode 100644 index 0000000..5f5d7e1 --- /dev/null +++ b/doc/html/search/pages_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['measurement_20units_70',['Measurement Units',['../_units.html',1,'']]] +]; diff --git a/doc/html/search/pages_8.html b/doc/html/search/pages_8.html new file mode 100644 index 0000000..b30ace9 --- /dev/null +++ b/doc/html/search/pages_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_8.js b/doc/html/search/pages_8.js new file mode 100644 index 0000000..30eed5b --- /dev/null +++ b/doc/html/search/pages_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['network_20data_20model_71',['Network Data Model',['../_data_model.html',1,'']]], + ['network_20building_20example_72',['Network Building Example',['../_example2.html',1,'ToolkitExamples']]] +]; diff --git a/doc/html/search/pages_9.html b/doc/html/search/pages_9.html new file mode 100644 index 0000000..7cdd670 --- /dev/null +++ b/doc/html/search/pages_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_9.js b/doc/html/search/pages_9.js new file mode 100644 index 0000000..1df679f --- /dev/null +++ b/doc/html/search/pages_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['overview_73',['Overview',['../index.html',1,'']]], + ['output_20file_74',['Output File',['../_out_file.html',1,'Files']]] +]; diff --git a/doc/html/search/pages_a.html b/doc/html/search/pages_a.html new file mode 100644 index 0000000..8cee6b8 --- /dev/null +++ b/doc/html/search/pages_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_a.js b/doc/html/search/pages_a.js new file mode 100644 index 0000000..c528084 --- /dev/null +++ b/doc/html/search/pages_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['prolog_20section_75',['Prolog Section',['../group___out_file_format.html',1,'']]] +]; diff --git a/doc/html/search/pages_b.html b/doc/html/search/pages_b.html new file mode 100644 index 0000000..f793838 --- /dev/null +++ b/doc/html/search/pages_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_b.js b/doc/html/search/pages_b.js new file mode 100644 index 0000000..57aa5e0 --- /dev/null +++ b/doc/html/search/pages_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['report_20file_76',['Report File',['../_rpt_file.html',1,'Files']]] +]; diff --git a/doc/html/search/pages_c.html b/doc/html/search/pages_c.html new file mode 100644 index 0000000..b91a398 --- /dev/null +++ b/doc/html/search/pages_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_c.js b/doc/html/search/pages_c.js new file mode 100644 index 0000000..99c5616 --- /dev/null +++ b/doc/html/search/pages_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['toolkit_20files_77',['Toolkit Files',['../_files.html',1,'']]], + ['toolkit_20versions_78',['Toolkit Versions',['../_toolkit_versions.html',1,'']]] +]; diff --git a/doc/html/search/pages_d.html b/doc/html/search/pages_d.html new file mode 100644 index 0000000..0160c22 --- /dev/null +++ b/doc/html/search/pages_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/html/search/pages_d.js b/doc/html/search/pages_d.js new file mode 100644 index 0000000..63ff728 --- /dev/null +++ b/doc/html/search/pages_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['usage_79',['Usage',['../toolkit-usage.html',1,'']]] +]; diff --git a/doc/html/search/search.css b/doc/html/search/search.css new file mode 100644 index 0000000..3cf9df9 --- /dev/null +++ b/doc/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/html/search/search.js b/doc/html/search/search.js new file mode 100644 index 0000000..a554ab9 --- /dev/null +++ b/doc/html/search/search.js @@ -0,0 +1,814 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; eli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/doc/html/toolkit-usage.html b/doc/html/toolkit-usage.html new file mode 100644 index 0000000..a55fb1a --- /dev/null +++ b/doc/html/toolkit-usage.html @@ -0,0 +1,281 @@ + + + + + + + +EPANET: Usage + + + + + + + + + +
    +
    + + + + + + +
    +
    EPANET +  2.2.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Usage
    +
    +
    +

    The following topics briefly describe how to accomplish some basic tasks using the OWA-EPANET Toolkit in C/C++ code. See the Examples topic for code listings of complete applications of the Toolkit.

    +

    +Creating a Project

    +

    Before any use is made of the Toolkit, a project and its handle must be created. After all processing is completed the project should be deleted. See the code snippet below:

    +
    EN_Project ph; // a project handle
    +
    EN_createproject(&ph);
    +
    +
    // Call functions that perform desired analysis
    +
    +
    EN_deleteproject(ph);
    +

    +Detecting Error Conditions

    +

    All of the Toolkit functions return an error/warning code. A 0 indicates that the function ran successfully. A number greater than 0 but less than 100 indicates that a warning condition was generated while a number higher than 100 indicates that the function failed.

    +

    The meaning of specific error and warning codes are listed in the Error Codes and Warning Codes sections of this guide. The Toolkit function EN_geterror can be used to obtain the text of a specific error/warning code. The following example uses a macro named ERRCODE along with a variable named errcode to execute Toolkit commands only if no fatal errors have already been detected:

    +
    #define ERRCODE(x) (errcode = ((errcode > 100) ? (errcode) : (x)))
    +
    +
    void runHydraulics(EN_Project ph, char *inputFile, char *reportFile)
    +
    {
    +
    int errcode = 0;
    +
    char errmsg[EN_MAXMSG + 1];
    +
    +
    ERRCODE(EN_open(ph, inputFile, reportFile, ""));
    +
    ERRCODE(EN_solveH(ph));
    +
    ERRCODE(EN_saveH(ph));
    +
    ERRCODE(EN_report(ph));
    +
    EN_geterror(ph, errcode, errmsg);
    +
    if (errcode) printf("\n%s\n", errmsg);
    +
    }
    +

    +Providing Network Data

    +

    Once a project is created there are two ways in which it can be populated with data. The first is to use the EN_open function to load an EPANET-formatted Input File that provides a description of the network to be analyzed. This function should be called immediately after a project is created. It takes as arguments the name of the input file to open and the names of a report file and a binary output file, both of which are optional. Here is a code sample showing this approach:

    +
    EN_Project ph;
    +
    int errcode;
    +
    EN_createproject(&ph);
    +
    errcode = EN_open(ph, "net1.inp", "net1.rpt", "");
    +
    if (errcode == 0)
    +
    {
    +
    // Call functions that perform desired analysis
    +
    }
    +
    EN_deleteproject(ph);
    +

    After an input file has been loaded in this fashion the resulting network can have objects added or deleted, and their properties set using the various Toolkit functions .

    +

    The second method for supplying network data to a project is to use the Toolkit's functions to add objects and to set their properties via code. In this case the EN_init function should be called immediately after creating a project, passing in the names of a report and binary output files (both optional) as well as the choices of flow units and head loss formulas to use. After that the various EN_add functions, such as EN_addnode, EN_addlink, EN_addpattern, EN_addcontrol, etc., can be called to add new objects to the network. Here is a partial example of constructing a network from code:

    +
    int index;
    +
    EN_Project ph;
    +
    EN_createproject(&ph);
    +
    EN_init(ph, "net1.rpt", "", EN_GPM, EN_HW);
    +
    EN_addnode(ph, "J1", EN_JUNCTION, &index);
    +
    EN_addnode(ph, "J2", EN_JUNCTION, &index);
    +
    EN_addlink(ph, "P1", EN_PIPE, "J1", "J2", &index);
    +
    // additional function calls to complete building the network
    +

    See the Network Building Example for a more complete example. The labels used to name objects cannot contain spaces, semi-colons, or double quotes nor exceed EN_MAXID characters in length. While adding objects their properties can be set as described in the next section. Attemtping to change a network's structure by adding or deleting nodes and links while the Toolkit's hydraulic or water quality solvers are open will result in an error condition.

    +

    +Setting Object Properties

    +

    The Toolkit contains several functions for retrieving and setting the properties of a network's objects and its analysis options. The names of retrieval functions all begin with EN_get (e.g., EN_getnodevalue, EN_getoption, etc.) while the functions used for setting parameter values begin with EN_set (e.g., EN_setnodevalue, EN_setoption, etc.).

    +

    Most of these functions use an index number to refer to a specific network component (such as a node, link, time pattern or data curve). This number is simply the position of the component in the list of all components of similar type (e.g., node 10 is the tenth node, starting from 1, in the network) and is not the same as the ID label assigned to the component. A series of functions exist to determine a component's index number given its ID label (see EN_getnodeindex, EN_getlinkindex, EN_getpatternindex, and EN_getcurveindex). Likewise, functions exist to retrieve a component's ID label given its index number (see EN_getlinkid, EN_getnodeid, EN_getpatternid, and EN_getcurveid). The EN_getcount function can be used to determine the number of different components in the network. Be aware that a component's index can change as elements are added or deleted from the network. The EN_addnode and EN_addlink functions return the index of the newly added node or link as a convenience for immediately setting their properties.

    +

    The code below is an example of using the property retrieval and setting functions. It changes all links with diameter of 10 inches to 12 inches.

    +
    void changeDiameters(EN_Project ph)
    +
    {
    +
    int i, nLinks;
    +
    double diam;
    +
    EN_getcount(ph, EN_LINKCOUNT, &nLinks);
    +
    for (i = 1; i <= nLinks; i++)
    +
    {
    +
    EN_getlinkvalue(ph, i, EN_DIAMETER, &diam);
    +
    if (diam == 10) EN_setlinkvalue(ph, i, EN_DIAMETER, 12);
    +
    }
    +
    }
    +

    +Computing Hydraulics

    +

    There are two ways to use the Toolkit to run a hydraulic analysis:

      +
    1. Use the EN_solveH function to run a complete extended period analysis, without having access to intermediate results.
    2. +
    3. Use the EN_openH - EN_initH - EN_runH - EN_nextH - EN_closeH series of functions to step through the simulation one hydraulic time step at a time.
    4. +
    +

    Method 1 is useful if you only want to run a single hydraulic analysis, perhaps to provide input to a water quality analysis. With this method hydraulic results are always saved to an intermediate hydraulics file at every time step.

    +

    Method 2 must be used if you need to access results between time steps or if you wish to run many analyses efficiently. To accomplish the latter, you would make only one call to EN_openH to begin the process, then make successive calls to EN_initH - EN_runH - EN_nextH to perform each analysis, and finally call EN_closeH to close down the hydraulics system. An example of this is shown below (calls to EN_nextH are not needed because we are only making a single period analysis in this example).

    +
    void runHydraulics(EN_Project ph, int nRuns)
    +
    {
    +
    int i;
    +
    long t;
    +
    EN_openH(ph);
    +
    for (i = 1; i <= nRuns; i++)
    +
    {
    +
    // user-supplied function to set parameters
    +
    setparams(ph, i);
    +
    // initialize hydraulics; don't save them to file
    +
    EN_initH(ph, EN_NOSAVE);
    +
    // solve hydraulics
    +
    EN_runH(ph, &t);
    +
    // user-supplied function to process results
    +
    getresults(ph, i);
    +
    }
    +
    EN_closeH(ph);
    +
    }
    +

    +Computing Water Quality

    +

    As with a hydraulic analysis, there are two ways to carry out a water quality analysis:

    +
      +
    1. Use the EN_solveQ function to run a complete extended period analysis, without having access to intermediate results. A complete set of hydraulic results must have been generated either from running a hydraulic analysis or from importing a saved hydraulics file from a previous run.
    2. +
    3. Use the EN_openQ - EN_initQ - EN_runQ - EN_nextQ - EN_closeQ series of functions to step through the simulation one hydraulic time step at a time. (Replacing EN_nextQ with EN_stepQ will step through one water quality time step at a time.)
    4. +
    +

    The second option can either be carried out after a hydraulic analysis has been run or simultaneously as hydraulics are being computed. Example code for these two alternatives is shown below:

    +
    int runSequentialQuality(EN_Project ph)
    +
    {
    +
    int err;
    +
    long t, tStep;
    +
    err = EN_solveH(ph);
    +
    if (err > 100) return err;
    +
    EN_openQ(ph);
    +
    EN_initQ(ph, EN_NOSAVE);
    +
    do {
    +
    EN_runQ(ph, &t);
    +
    // Access quality results for time t here
    +
    EN_nextQ(ph, &tStep);
    +
    } while (tStep > 0);
    +
    EN_closeQ(ph);
    +
    return 0;
    +
    }
    +
    +
    int runConcurrentQuality(EN_Project ph)
    +
    {
    +
    int err = 0;
    +
    long t, tStep;
    +
    EN_openH(ph);
    +
    EN_initH(ph, EN_NOSAVE);
    +
    EN_openQ(ph);
    +
    EN_initQ(ph, EN_NOSAVE);
    +
    do {
    +
    err = EN_runH(ph, &t);
    +
    if (err > 100) break;
    +
    EN_runQ(ph, &t);
    +
    // Access hydraulic & quality results for time t here
    +
    EN_nextH(ph, &tStep);
    +
    EN_nextQ(ph, &tStep);
    +
    } while (tStep > 0);
    +
    EN_closeH(ph);
    +
    EN_closeQ(ph);
    +
    return err;
    +
    }
    +

    +Retrieving Computed Results

    +

    The EN_getnodevalue and EN_getlinkvalue functions can also be used to retrieve the results of hydraulic and water quality simulations. The computed parameters (and their Toolkit codes) that can be retrieved are as follows:

    + + + + + + + + + + + + + + + + + + +
    For Nodes: For Links:
    EN_DEMAND (demand) EN_FLOW (flow rate)
    EN_DEMANDDEFICIT (demand deficit) EN_VELOCITY (flow velocity)
    EN_HEAD (hydraulic head) EN_HEADLOSS (head loss)
    EN_PRESSURE (pressure) EN_STATUS (link status)
    EN_TANKLEVEL (tank water level) EN_SETTING (pump speed or valve setting)
    EN_TANKVOLUME (tank water volume) EN_ENERGY (pump energy usage)
    EN_QUALITY (water quality) EN_PUMP_EFFIC (pump efficiency)
    EN_SOURCEMASS (source mass inflow)
    +

    The following code shows how to retrieve the pressure at each node of a network after each time step of a hydraulic analysis (writetofile is a user-defined function that will write a record to a file):

    void getPressures(EN_Project ph)
    +
    {
    +
    int i, numNodes;
    +
    long t, tStep;
    +
    double p;
    +
    char id[EN_MAXID + 1];
    +
    EN_getcount(ph, EN_NODECOUNT, &numNodes);
    +
    EN_openH(ph);
    +
    EN_initH(ph, EN_NOSAVE);
    +
    do {
    +
    EN_runH(ph, &t);
    +
    for (i = 1; i <= NumNodes; i++) {
    +
    EN_getnodevalue(ph, i, EN_PRESSURE, &p);
    +
    EN_getnodeid(ph, i, id);
    +
    writetofile(t, id, p);
    +
    }
    +
    EN_nextH(&tStep);
    +
    } while (tStep > 0);
    +
    EN_closeH(ph);
    +
    }
    +

    +Producing a Report

    +

    The Toolkit has some built-in capabilities to produce formatted output results saved to a file. More specialized reporting needs can always be handled by writing custom code.

    +

    The EN_setreport function is used to define the format of a report while the EN_report function actually writes the report. The latter should be called only after a hydraulic or water quality analysis has been made. An example of creating a report that lists all nodes where the pressure variation over the duration of the simulation exceeds 20 psi is shown below:

    +
    void reportPressureVariation(EN_Project ph)
    +
    {
    +
    // Compute ranges (max - min)
    +
    EN_settimeparam(ph, EN_STATISTIC, EN_RANGE);
    +
    +
    // Solve and save hydraulics
    +
    EN_solveH(ph);
    +
    EN_saveH(ph);
    +
    +
    // Define contents of the report
    +
    EN_resetreport(ph);
    +
    EN_setreport(ph, "FILE myfile.rpt");
    +
    EN_setreport(ph, "NODES ALL");
    +
    EN_setreport(ph, "PRESSURE PRECISION 1");
    +
    EN_setreport(ph, "PRESSURE ABOVE 20");
    +
    +
    // Write the report to file
    +
    EN_report(ph);
    +
    }
    +
    +
    + + + +