From 26a5461cc43a749c9f02149276b9ec2a801c9e79 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 19 Dec 2021 08:32:51 +0100 Subject: [PATCH] update doc --- docs/annotated.html | 15 +- docs/classclutchlog-members.html | 15 +- docs/classclutchlog.html | 38 +- docs/classclutchlog_1_1fmt-members.html | 15 +- docs/classclutchlog_1_1fmt.html | 57 +- docs/classes.html | 29 +- docs/clutchlog_8h.html | 37 +- docs/clutchlog_8h__incl.map | 12 + docs/clutchlog_8h__incl.md5 | 2 +- docs/clutchlog_8h__incl.png | Bin 18192 -> 21574 bytes docs/clutchlog_8h_source.html | 848 +++++++++++++++++- docs/dir_000050_000000.html | 77 ++ .../dir_0597ce40fdf188e7870807c32590691d.html | 15 +- .../dir_084dfc9a5a5be3c9e27543ac1f550db2.html | 15 +- .../dir_0c6859326e57c84153d9ce3980c7b614.html | 15 +- .../dir_10ddb028b6670bd8aa01364e6cad76a9.html | 15 +- .../dir_10e5b046fa80f4154fb6ef98b74319ee.html | 15 +- .../dir_11d96b0893f97b142d6effd564752a90.html | 15 +- .../dir_14f0b626af56b1ff4afcbb0dad5c9b00.html | 15 +- .../dir_2010fee6dc55af84ec3880814fe9859d.html | 15 +- .../dir_232d0e660737fa098457ae695f029c6e.html | 15 +- .../dir_27117ea8c3a88700c8b1db11c9562238.html | 81 ++ .../dir_2c58f47b9ec63c233e9a6dc44b0220ce.html | 15 +- .../dir_3353b0403823e43b133a3a97f7b61528.html | 15 +- .../dir_3354f823b93c486985d8eff812f202d0.html | 15 +- .../dir_3580e889fffd597e9f1e74f0989be3f4.html | 15 +- .../dir_38468fa15d001d8f53eb5a2cc819fc4d.html | 15 +- .../dir_3b3b5af829689cf9fc261f0e6a0edda6.html | 81 ++ .../dir_3e4d9bbf23e4011a0d79c59ef1fbe4fa.html | 85 ++ .../dir_44d46ce0fefad9fb4568613342a0f089.html | 15 +- .../dir_49bf50162b43c6eb0e5d51c9a154dd85.html | 81 ++ .../dir_56412180890141897a46e337654f67d2.html | 85 ++ .../dir_56a467a6a3c52bfafa193ec205c1fdda.html | 15 +- .../dir_581e3e812319f368929566c0af58ce01.html | 85 ++ .../dir_59425e443f801f1f2fd8bbe4959a3ccf.html | 21 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.map | 2 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 | 2 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.png | Bin 2465 -> 2470 bytes .../dir_5b4d8a0ca6574b7df09df571ad9e67b6.html | 81 ++ .../dir_61ab004aa8225a3da30151b57198e21f.html | 15 +- .../dir_7993767c315ca7e2492c0e12f2140894.html | 15 +- .../dir_7ac2ccaca1f97cd5484903d036e6e018.html | 85 ++ .../dir_7bfd87e22fd8913a7cdac6885aea0fda.html | 81 ++ .../dir_7cb602820ef60ce7eb9af6d9eb8de17a.html | 15 +- .../dir_818a2d2dcebf5fa9f09b2ff370a5de12.html | 81 ++ .../dir_8497d690b57aba136d1839e5c427d666.html | 15 +- .../dir_894f8a189fd86151cf73b234a425a3d7.html | 85 ++ .../dir_8a6224de47695006c09a16d36b73e641.html | 81 ++ .../dir_99be30a3dc5b3fd221ff5ea6bdbc52f4.html | 15 +- .../dir_99f269110bdc8201794420d5043dadef.html | 85 ++ .../dir_9a935cfcf36ab9c047ca734a48c6ea47.html | 15 +- .../dir_a5e190e82988878b02be1ad8893fe33a.html | 15 +- .../dir_a6147547081efd8e9250c1acee302c56.html | 15 +- .../dir_a808995e8af62dcd5e402dfccd15597d.html | 85 ++ .../dir_a943a781f3047d1fe445d5e8eba50028.html | 15 +- .../dir_b1c763aea5b862e235cc9501e2ce06da.html | 15 +- .../dir_be65af4ad555fa38f52fdec43511df23.html | 15 +- .../dir_bf56be71754e1b48f8f3e417eb89bb69.html | 15 +- .../dir_c318bd5cf14aaa5601e6029e0b5b4048.html | 15 +- .../dir_dd500134467ec65427366f3cbbc5ff81.html | 15 +- .../dir_de06b53c2e04c67b773395f92873ff7f.html | 15 +- .../dir_ec4f48f1c0ac567d297185d46cf69b0c.html | 15 +- .../dir_ede0e87241159758c1b375c196bd55d8.html | 15 +- .../dir_f324b8056e3921282ea6aa7d15c7705c.html | 15 +- .../dir_f544411fb6a30872da080b65ab4522b8.html | 15 +- .../dir_f803ec176eda9a8494dc55dc57236527.html | 15 +- docs/doxygen.css | 303 +++++-- docs/dynsections.js | 27 +- docs/files.html | 15 +- docs/functions.html | 15 +- docs/functions_enum.html | 15 +- docs/functions_func.html | 15 +- docs/functions_rela.html | 15 +- docs/globals.html | 18 +- docs/globals_defs.html | 18 +- docs/graph_legend.html | 56 +- docs/graph_legend.md5 | 2 +- docs/graph_legend.png | Bin 19465 -> 17595 bytes docs/group__DefaultConfigMacros.html | 15 +- docs/group__Formating.html | 15 +- docs/group__Main.html | 15 +- docs/group__UseMacros.html | 90 +- docs/index.html | 141 ++- docs/jquery.js | 94 +- docs/menu.js | 26 +- docs/menudata.js | 22 + docs/modules.html | 15 +- docs/search/all_0.html | 8 +- docs/search/all_0.js | 2 +- docs/search/all_1.html | 8 +- docs/search/all_1.js | 21 +- docs/search/all_2.html | 8 +- docs/search/all_2.js | 4 +- docs/search/all_3.html | 8 +- docs/search/all_3.js | 14 +- docs/search/all_4.html | 8 +- docs/search/all_4.js | 2 +- docs/search/all_5.html | 8 +- docs/search/all_5.js | 14 +- docs/search/all_6.html | 8 +- docs/search/all_6.js | 2 +- docs/search/all_7.html | 8 +- docs/search/all_7.js | 6 +- docs/search/all_8.html | 8 +- docs/search/all_8.js | 2 +- docs/search/all_9.html | 8 +- docs/search/all_9.js | 2 +- docs/search/all_a.html | 8 +- docs/search/all_a.js | 4 +- docs/search/all_b.html | 8 +- docs/search/all_b.js | 4 +- docs/search/classes_0.html | 8 +- docs/search/classes_0.js | 2 +- docs/search/classes_1.html | 8 +- docs/search/classes_1.js | 2 +- docs/search/classes_2.html | 8 +- docs/search/classes_2.js | 2 +- docs/search/enums_0.html | 8 +- docs/search/enums_0.js | 2 +- docs/search/enums_1.html | 8 +- docs/search/enums_1.js | 2 +- docs/search/enums_2.html | 8 +- docs/search/enums_2.js | 2 +- docs/search/enums_3.html | 8 +- docs/search/enums_3.js | 2 +- docs/search/files_0.html | 8 +- docs/search/files_0.js | 2 +- docs/search/functions_0.html | 8 +- docs/search/functions_0.js | 2 +- docs/search/functions_1.html | 8 +- docs/search/functions_1.js | 10 +- docs/search/functions_2.html | 8 +- docs/search/functions_2.js | 12 +- docs/search/functions_3.html | 8 +- docs/search/functions_3.js | 4 +- docs/search/functions_4.html | 8 +- docs/search/functions_4.js | 2 +- docs/search/functions_5.html | 8 +- docs/search/functions_5.js | 2 +- docs/search/functions_6.html | 8 +- docs/search/functions_6.js | 2 +- docs/search/functions_7.html | 8 +- docs/search/functions_7.js | 2 +- docs/search/groups_0.html | 8 +- docs/search/groups_0.js | 2 +- docs/search/groups_1.html | 8 +- docs/search/groups_1.js | 2 +- docs/search/groups_2.html | 8 +- docs/search/groups_2.js | 2 +- docs/search/groups_3.html | 8 +- docs/search/groups_3.js | 2 +- docs/search/mag_sel.png | Bin 563 -> 465 bytes docs/search/nomatches.html | 2 +- docs/search/related_0.html | 8 +- docs/search/related_0.js | 2 +- docs/search/search.js | 25 +- docs/search/search_l.png | Bin 604 -> 567 bytes docs/search/search_r.png | Bin 612 -> 553 bytes docs/structclutchlog_1_1scope__t-members.html | 15 +- docs/structclutchlog_1_1scope__t.html | 15 +- docs/tabs.css | 2 +- 161 files changed, 3506 insertions(+), 760 deletions(-) create mode 100644 docs/dir_000050_000000.html create mode 100644 docs/dir_27117ea8c3a88700c8b1db11c9562238.html create mode 100644 docs/dir_3b3b5af829689cf9fc261f0e6a0edda6.html create mode 100644 docs/dir_3e4d9bbf23e4011a0d79c59ef1fbe4fa.html create mode 100644 docs/dir_49bf50162b43c6eb0e5d51c9a154dd85.html create mode 100644 docs/dir_56412180890141897a46e337654f67d2.html create mode 100644 docs/dir_581e3e812319f368929566c0af58ce01.html create mode 100644 docs/dir_5b4d8a0ca6574b7df09df571ad9e67b6.html create mode 100644 docs/dir_7ac2ccaca1f97cd5484903d036e6e018.html create mode 100644 docs/dir_7bfd87e22fd8913a7cdac6885aea0fda.html create mode 100644 docs/dir_818a2d2dcebf5fa9f09b2ff370a5de12.html create mode 100644 docs/dir_894f8a189fd86151cf73b234a425a3d7.html create mode 100644 docs/dir_8a6224de47695006c09a16d36b73e641.html create mode 100644 docs/dir_99f269110bdc8201794420d5043dadef.html create mode 100644 docs/dir_a808995e8af62dcd5e402dfccd15597d.html diff --git a/docs/annotated.html b/docs/annotated.html index e0b9a27..ef3571d 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -1,9 +1,9 @@ - + - + clutchlog: Class List @@ -22,7 +22,7 @@
clutchlog -  0.5.0 +  0.6.0
@@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -75,7 +78,7 @@ $(function() { diff --git a/docs/classclutchlog-members.html b/docs/classclutchlog-members.html index 3d671bb..9c609f6 100644 --- a/docs/classclutchlog-members.html +++ b/docs/classclutchlog-members.html @@ -1,9 +1,9 @@ - + - + clutchlog: Member List @@ -22,7 +22,7 @@
clutchlog -  0.5.0 +  0.6.0
@@ -30,18 +30,21 @@ - + +/* @license-end */ - + +/* @license-end */
  template<class ... FMT> void style (level stage, FMT... styles) - Set the style (color and typo) of the given log level. More...
+ Set the style (color and typo) of the given log level. More...
  void style (level stage, fmt style) @@ -140,7 +143,7 @@ void  Get the configured fmt instance of the given log level.
 
level level_of (const std::string name) - Return the log level tag corresponding to the given pre-configured name. More...
+ Return the log level tag corresponding to the given pre-configured name. More...
 
Low-level API
@@ -148,7 +151,7 @@ void  Gather information on the current location of the call.
  std::string 
replace (const std::string &form, const std::string &mark, const std::string &tag) const - Replace mark by tag in form. More...
+ Replace mark by tag in form. More...
  std::string replace (const std::string &form, const std::string &mark, const size_t tag) const @@ -181,11 +184,11 @@ High-level API debug =6, xdebug =7
- } Available log levels.
- + } + Available log levels.
  static clutchloglogger () - Get the logger instance. More...
+ Get the logger instance. More...
  @@ -30,18 +30,21 @@

@@ -287,7 +290,8 @@ void 

operator= ( @@ -331,7 +335,9 @@ void operator= (

Replace mark by tag in form.

-
log.replace("{greet} {world}", "\\{greet\\}", "hello");
// returns "hello {world}"
+
log.replace("{greet} {world}", "\\{greet\\}", "hello");
+
// returns "hello {world}"
+
@@ -371,7 +377,7 @@ template<class ... FMT>

Set the style (color and typo) of the given log level.

-

This version accept style arguments as if they were passed to clutchlog::fmt.

+

This version accept style arguments as if they were passed to clutchlog::fmt.

@@ -379,11 +385,13 @@ template<class ... FMT>
  • clutchlog/clutchlog.h
  • +
    void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
    Print a log message IF the location matches the given one.
    Definition: clutchlog.h:678
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:202
    diff --git a/docs/classclutchlog_1_1fmt-members.html b/docs/classclutchlog_1_1fmt-members.html index 84134e0..265b1ed 100644 --- a/docs/classclutchlog_1_1fmt-members.html +++ b/docs/classclutchlog_1_1fmt-members.html @@ -1,9 +1,9 @@ - + - + clutchlog: Member List @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    - + +/* @license-end */ - + +/* @license-end */

      none
    - } Foreground color codes.
    - + } + Foreground color codes.
      enum  bg {
      black = 40, @@ -111,8 +114,8 @@ Public Types
      none
    - } Background color codes.
    - + } + Background color codes.
      enum  typo {
      reset = 0, @@ -122,18 +125,18 @@ Public Types
      none
    - } Typographic style codes.
    - + } + Typographic style codes.
      - + - +

    Public Member Functions

     fmt ()
      Empty constructor, only useful for a no-op formatter.
      Empty constructor, only useful for a no-op formatter.
     
    std::string operator() (const std::string &msg) const
     Format the given string with the currently encoded format. More...
     Format the given string with the currently encoded format. More...
     
    All combination of constructors with different parameters orders.
    @@ -157,15 +160,15 @@ Public Member Functions
    - - - + - - + - +

    Public Attributes

    +
    enum clutchlog::fmt::fg fore
     
    +
     
    enum clutchlog::fmt::bg back
     
    +
     
    enum clutchlog::fmt::typo style
     
     
    @@ -177,7 +180,7 @@ std::ostream &  - +

    Protected Member Functions

    Friends

    std::ostream & operator<< (std::ostream &os, const fmt &fmt)
     Output stream overload. More...
     Output stream overload. More...
     

    Detailed Description

    @@ -209,13 +212,15 @@ Friends

    Format the given string with the currently encoded format.

    -

    Allow to use a formatter as a function:

    clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
    std::cout << error("ERROR") << std::endl;
    Note
    A formatter called this way WILL output a reset escape code at the end.
    +

    Allow to use a formatter as a function:

    clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
    +
    std::cout << error("ERROR") << std::endl;
    +
    Note
    A formatter called this way WILL output a reset escape code at the end.

    Friends And Related Function Documentation

    -

    ◆ operator<<

    +

    ◆ operator<<

    @@ -249,7 +254,10 @@ Friends

    Output stream overload.

    -

    Allow to use a formatter as a tag within a stream:

    clutchlog::fmt end(clutchlog::fmt::typo::reset);
    clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
    std::cout << error << "ERROR" << end << std::endl;
    Note
    An formatter called this way will NOT output a reset escape code.
    +

    Allow to use a formatter as a tag within a stream:

    clutchlog::fmt end(clutchlog::fmt::typo::reset);
    +
    clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
    +
    std::cout << error << "ERROR" << end << std::endl;
    +
    Note
    An formatter called this way will NOT output a reset escape code.
    @@ -257,11 +265,12 @@ Friends
  • clutchlog/clutchlog.h
  • +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:223
    diff --git a/docs/classes.html b/docs/classes.html index a1a8e1b..dd4cc6d 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -1,9 +1,9 @@ - + - + clutchlog: Class Index @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -66,11 +69,17 @@ $(function() {
    c | f | s
    + + + + - + + + +
      c  
    -
      f  
    -
      s  
    -
      f  
    +
      s  
    +
    clutchlog   clutchlog::fmt   clutchlog::scope_t   
    clutchlog   clutchlog::fmt   clutchlog::scope_t   
    c | f | s
    @@ -79,7 +88,7 @@ $(function() { diff --git a/docs/clutchlog_8h.html b/docs/clutchlog_8h.html index b520bcd..fa54f37 100644 --- a/docs/clutchlog_8h.html +++ b/docs/clutchlog_8h.html @@ -1,9 +1,9 @@ - + - + clutchlog: clutchlog/clutchlog.h File Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */
    clutchlog.h File Reference
    -
    #include <filesystem>
    +
    #include <ciso646>
    +#include <filesystem>
    #include <iostream>
    #include <sstream>
    #include <fstream>
    @@ -84,6 +88,20 @@ $(function() { Include dependency graph for clutchlog.h:
    + + + + + + + + + + + + + +

    Go to the source code of this file.

    @@ -138,15 +156,18 @@ Macros  Dump the given container. More...
      #define CLUTCHFUNC(LEVEL, FUNC, ...) - Call an assert at the given level. More...
    + Call any function if the scope matches. More...
      +#define CLUTCHCODE(LEVEL, ...) + Run any code if the scope matches. More...
    diff --git a/docs/clutchlog_8h__incl.map b/docs/clutchlog_8h__incl.map index 896c405..153db44 100644 --- a/docs/clutchlog_8h__incl.map +++ b/docs/clutchlog_8h__incl.map @@ -1,2 +1,14 @@ + + + + + + + + + + + + diff --git a/docs/clutchlog_8h__incl.md5 b/docs/clutchlog_8h__incl.md5 index 6b2b480..3ff80d1 100644 --- a/docs/clutchlog_8h__incl.md5 +++ b/docs/clutchlog_8h__incl.md5 @@ -1 +1 @@ -8a99df5205b118d2ea433982b8d2959e \ No newline at end of file +a95a8117ff16a338816367072750e70d \ No newline at end of file diff --git a/docs/clutchlog_8h__incl.png b/docs/clutchlog_8h__incl.png index 0df2d529cf80c9238bb6aab4aef85a1ca345b205..498e945c9b0c70c58b540ef1884673712b2c321d 100644 GIT binary patch literal 21574 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 R!6R-UvXV*?rQ&Zt{x79FSI+ + - + clutchlog: clutchlog/clutchlog.h Source File @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */
    clutchlog.h
    -Go to the documentation of this file.
    1 #ifndef __CLUTCHLOG_H__
    2 #define __CLUTCHLOG_H__
    3 #pragma once
    4 
    7 #include <filesystem>
    8 #include <iostream>
    9 #include <sstream>
    10 #include <fstream>
    11 #include <cassert>
    12 #include <cstdlib>
    13 #include <string>
    14 #include <limits>
    15 #include <regex>
    16 #include <map>
    17 
    18 #if __has_include(<execinfo.h>) && __has_include(<stdlib.h>) && __has_include(<libgen.h>)
    19 #include <execinfo.h> // execinfo
    20 #include <stdlib.h> // getenv
    21 #include <libgen.h> // basename
    22 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 1
    23 #else
    24 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 0
    25 #endif
    26 
    27 /**********************************************************************
    28  * Enable by default in Debug builds.
    29  **********************************************************************/
    30 #ifndef WITH_CLUTCHLOG
    31 #ifndef NDEBUG
    32 #define WITH_CLUTCHLOG
    33 #endif
    34 #endif
    35 
    36 /**********************************************************************
    37  * Macros definitions
    38  **********************************************************************/
    39 #ifdef WITH_CLUTCHLOG
    40 
    44 #ifndef CLUTCHLOG_DEFAULT_FORMAT
    45 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    47 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
    48 #else
    49 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
    50 #endif
    51 #endif // CLUTCHLOG_DEFAULT_FORMAT
    52 
    53 #ifndef CLUTCHDUMP_DEFAULT_FORMAT
    54 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    56 #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}"
    57 #else
    58 #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func} @ {file}:{line}"
    59 #endif
    60 #endif // CLUTCHDUMP_DEFAULT_FORMAT
    61 
    62 #ifndef CLUTCHDUMP_DEFAULT_SEP
    63 #define CLUTCHDUMP_DEFAULT_SEP "\n"
    65 #endif // CLUTCHDUMP_DEFAULT_SEP
    66 
    67 #ifndef CLUTCHLOG_DEFAULT_DEPTH_MARK
    68 #define CLUTCHLOG_DEFAULT_DEPTH_MARK ">"
    70 #endif // CLUTCHLOG_DEFAULT_DEPTH_MARK
    71 
    72 #ifndef CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG
    73 #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::progress
    75 #endif // CLUTCHLOG_DEFAULT_DEPTH_BUILT
    76 
    82 #define CLUTCHLOC __FILE__, __FUNCTION__, __LINE__
    84 
    86 #ifndef NDEBUG
    87 #define CLUTCHLOG( LEVEL, WHAT ) { \
    88  auto& logger = clutchlog::logger(); \
    89  std::ostringstream msg ; msg << WHAT; \
    90  logger.log(clutchlog::level::LEVEL, msg.str(), CLUTCHLOC); \
    91 }
    92 #else // not Debug build.
    93 #define CLUTCHLOG( LEVEL, WHAT ) { \
    94  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
    95  auto& logger = clutchlog::logger(); \
    96  std::ostringstream msg ; msg << WHAT; \
    97  logger.log(clutchlog::level::LEVEL, msg.str(), CLUTCHLOC); \
    98  } \
    99 }
    100 #endif // NDEBUG
    101 
    103 #ifndef NDEBUG
    104 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) { \
    105  auto& logger = clutchlog::logger(); \
    106  logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
    107  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
    108 }
    109 #else // not Debug build.
    110 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) { \
    111  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
    112  auto& logger = clutchlog::logger(); \
    113  logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
    114  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
    115  } \
    116 }
    117 #endif // NDEBUG
    118 
    120 #ifndef NDEBUG
    121 #define CLUTCHFUNC( LEVEL, FUNC, ... ) { \
    122  auto& logger = clutchlog::logger(); \
    123  clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    124  if(scope.matches) { \
    125  FUNC(__VA_ARGS__); \
    126  } \
    127 }
    128 #else // not Debug build.
    129 #define CLUTCHFUNC( LEVEL, FUNC, ... ) { do {/*nothing*/} while(false); }
    130 #endif // NDEBUG
    131 
    134 #else // not WITH_CLUTCHLOG
    135 // Disabled macros can still be used in Release builds.
    136 #define CLUTCHLOG( LEVEL, WHAT ) { do {/*nothing*/} while(false); }
    137 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) { do {/*nothing*/} while(false); }
    138 #define CLUTCHFUNC( LEVEL, FUNC, ... ) { do {/*nothing*/} while(false); }
    139 #endif // WITH_CLUTCHLOG
    140 
    141 /**********************************************************************
    142  * Implementation
    143  **********************************************************************/
    144 
    145 #ifdef WITH_CLUTCHLOG
    146 
    154 {
    155  public:
    165  static clutchlog& logger()
    166  {
    167  static clutchlog instance;
    168  return instance;
    169  }
    170 
    172  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    173 
    186  class fmt {
    187  public:
    189  enum class fg {
    190  black = 30,
    191  red = 31,
    192  green = 32,
    193  yellow = 33,
    194  blue = 34,
    195  magenta = 35,
    196  cyan = 36,
    197  white = 37,
    198  none
    199  } fore;
    200 
    202  enum class bg {
    203  black = 40,
    204  red = 41,
    205  green = 42,
    206  yellow = 43,
    207  blue = 44,
    208  magenta = 45,
    209  cyan = 46,
    210  white = 47,
    211  none
    212  } back;
    213 
    215  enum class typo {
    216  reset = 0,
    217  bold = 1,
    218  underline = 4,
    219  inverse = 7,
    220  none
    221  } style;
    222 
    224  fmt() : fore(fg::none), back(bg::none), style(typo::none) { }
    225 
    228  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    229  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) { }
    230  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    231  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) { }
    232  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) { }
    233  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) { }
    236  protected:
    238  std::ostream& print_on( std::ostream& os) const
    239  {
    240  std::vector<int> codes; codes.reserve(3);
    241  if(this->fore != fg::none) { codes.push_back(static_cast<int>(this->fore ));}
    242  if(this->back != bg::none) { codes.push_back(static_cast<int>(this->back ));}
    243  if(this->style != typo::none) { codes.push_back(static_cast<int>(this->style));}
    244  if(codes.size() == 0) {return os;}
    245 
    246  os << "\033[";
    247  assert(codes.size() > 0);
    248  os << codes[0];
    249  for(size_t i=1; i < codes.size(); ++i) {
    250  os << ";" << codes[i];
    251  }
    252  os << "m";
    253  return os;
    254  }
    255 
    256  public:
    268  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
    269  {
    270  return fmt.print_on(os);
    271  }
    272 
    283  std::string operator()( const std::string& msg ) const
    284  {
    285  std::ostringstream os;
    286  this->print_on(os);
    287  fmt reset(fmt::typo::reset);
    288  os << msg;
    289  reset.print_on(os);
    290  return os.str();
    291  }
    292  }; // fmt class
    293 
    300  public:
    301  clutchlog(clutchlog const&) = delete;
    302  void operator=(clutchlog const&) = delete;
    303 
    304  private:
    305  clutchlog() :
    306  // system, main, log
    307  _strip_calls(5),
    308  _level_word({
    309  {level::critical,"Critical"},
    310  {level::error ,"Error"},
    311  {level::warning ,"Warning"},
    312  {level::progress,"Progress"},
    313  {level::note ,"Note"},
    314  {level::info ,"Info"},
    315  {level::debug ,"Debug"},
    316  {level::xdebug ,"XDebug"}
    317  }),
    318  _level_fmt({
    319  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
    320  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
    321  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
    322  {level::progress,fmt()},
    323  {level::note ,fmt()},
    324  {level::info ,fmt()},
    325  {level::debug ,fmt()},
    326  {level::xdebug ,fmt()}
    327  }),
    328  _format_log(CLUTCHLOG_DEFAULT_FORMAT),
    329  _format_dump(CLUTCHDUMP_DEFAULT_FORMAT),
    330  _out(&std::clog),
    331 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    332  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
    333  _depth_mark(CLUTCHLOG_DEFAULT_DEPTH_MARK),
    334 #endif
    335  _stage(level::error),
    336  _in_file(".*"),
    337  _in_func(".*"),
    338  _in_line(".*")
    339  {
    340  // Reverse the level->word map into a word->level map.
    341  for(auto& lw : _level_word) {
    342  _word_level[lw.second] = lw.first;
    343  }
    344  }
    345 
    346  protected:
    347  const size_t _strip_calls;
    348  const std::map<level,std::string> _level_word;
    349  std::map<std::string,level> _word_level;
    350  std::map<level,fmt> _level_fmt;
    351  std::string _format_log;
    352  std::string _format_dump;
    353  std::ostream* _out;
    354 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    355  size_t _depth;
    356  std::string _depth_mark;
    357 #endif
    358  level _stage;
    359  std::regex _in_file;
    360  std::regex _in_func;
    361  std::regex _in_line;
    362 
    363  static const size_t max_buffer = 4096;
    366  public:
    367 
    371  void format(const std::string& format) {_format_log = format;}
    374  std::string format() const {return _format_log;}
    375 
    377  void format_comment(const std::string& format) {_format_dump = format;}
    379  std::string format_comment() const {return _format_dump;}
    380 
    382  void out(std::ostream& out) {_out = &out;}
    384  std::ostream& out() {return *_out;}
    385 
    386 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    387  void depth(size_t d) {_depth = d;}
    390  size_t depth() const {return _depth;}
    391 
    393  void depth_mark(std::string mark) {_depth_mark = mark;}
    395  std::string depth_mark() const {return _depth_mark;}
    396 #endif
    397 
    399  void threshold(level l) {_stage = l;}
    401  level threshold() const {return _stage;}
    402 
    404  void file(std::string file) {_in_file = file;}
    406  void func(std::string func) {_in_func = func;}
    408  void line(std::string line) {_in_line = line;}
    409 
    411  void location(
    412  const std::string& in_file,
    413  const std::string& in_function=".*",
    414  const std::string& in_line=".*"
    415  )
    416  {
    417  file(in_file);
    418  func(in_function);
    419  line(in_line);
    420  }
    421 
    426  template<class ... FMT>
    427  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
    429  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
    431  fmt style(level stage) const { return _level_fmt.at(stage); }
    432 
    437  level level_of(const std::string name)
    438  {
    439  const auto ilevel = _word_level.find(name);
    440  if( ilevel != std::end(_word_level)) {
    441  return ilevel->second;
    442  } else {
    443  throw std::out_of_range("'" + name + "' is not a valid log level name");
    444  }
    445  }
    446 
    449  public:
    450 
    454  struct scope_t {
    456  bool matches; // everything is compatible
    457  level stage; // current log level
    458 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    459  size_t depth; // current depth
    460 #endif
    461  bool there; // location is compatible
    462  scope_t() :
    463  matches(false),
    464  stage(level::xdebug),
    465 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    466  depth(0),
    467 #endif
    468  there(false)
    469  {}
    470  }; // scope_t
    471 
    472 
    475  const level& stage,
    476  const std::string& file,
    477  const std::string& func,
    478  const size_t line
    479  ) const
    480  {
    481  scope_t scope; // False scope by default.
    482 
    483  /***** Log level stage *****/
    484  // Test stage first, because it's fastest.
    485  scope.stage = stage;
    486  if(not (scope.stage <= _stage)) {
    487  // Bypass useless computations if no match
    488  // because of the stage.
    489  return scope;
    490  }
    491 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    492  /***** Stack depth *****/
    493  // Backtrace in second, quite fast.
    494  size_t stack_depth;
    495  void *buffer[max_buffer];
    496  stack_depth = backtrace(buffer, max_buffer);
    497  scope.depth = stack_depth;
    498  if(not (scope.depth <= _depth + _strip_calls)) {
    499  // Bypass if no match.
    500  return scope;
    501  }
    502 #endif
    503 
    504  /***** Location *****/
    505  // Location last, slowest.
    506  std::ostringstream sline; sline << line;
    507  scope.there =
    508  std::regex_search(file, _in_file)
    509  and std::regex_search(func, _in_func)
    510  and std::regex_search(sline.str(), _in_line);
    511 
    512  // No need to retest stage and depth, which are true here.
    513  scope.matches = scope.there;
    514 
    515  return scope;
    516  } // locate
    517 
    525  std::string replace(
    526  const std::string& form,
    527  const std::string& mark,
    528  const std::string& tag
    529  ) const
    530  {
    531  // Useless debug code, unless something fancy would be done with name tags.
    532  // std::regex re;
    533  // try {
    534  // re = std::regex(mark);
    535  //
    536  // } catch(const std::regex_error& e) {
    537  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
    538  // switch(e.code()) {
    539  // case std::regex_constants::error_collate:
    540  // std::cerr << "the expression contains an invalid collating element name";
    541  // break;
    542  // case std::regex_constants::error_ctype:
    543  // std::cerr << "the expression contains an invalid character class name";
    544  // break;
    545  // case std::regex_constants::error_escape:
    546  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
    547  // break;
    548  // case std::regex_constants::error_backref:
    549  // std::cerr << "the expression contains an invalid back reference";
    550  // break;
    551  // case std::regex_constants::error_brack:
    552  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
    553  // break;
    554  // case std::regex_constants::error_paren:
    555  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
    556  // break;
    557  // case std::regex_constants::error_brace:
    558  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
    559  // break;
    560  // case std::regex_constants::error_badbrace:
    561  // std::cerr << "the expression contains an invalid range in a {} expression";
    562  // break;
    563  // case std::regex_constants::error_range:
    564  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
    565  // break;
    566  // case std::regex_constants::error_space:
    567  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
    568  // break;
    569  // case std::regex_constants::error_badrepeat:
    570  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
    571  // break;
    572  // case std::regex_constants::error_complexity:
    573  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
    574  // break;
    575  // case std::regex_constants::error_stack:
    576  // std::cerr << "there was not enough memory to perform a match";
    577  // break;
    578  // default:
    579  // std::cerr << "unknown error";
    580  // }
    581  // std::cerr << std::endl;
    582  // throw;
    583  // } // catch
    584 
    585  const std::regex re(mark);
    586  return std::regex_replace(form, re, tag);
    587  }
    588 
    590  std::string replace(
    591  const std::string& form,
    592  const std::string& mark,
    593  const size_t tag
    594  ) const
    595  {
    596  std::ostringstream stag; stag << tag;
    597  return replace(form, mark, stag.str());
    598  }
    599 
    601  std::string format(
    602  std::string format,
    603  const std::string& what,
    604 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    605  const std::string& name,
    606 #endif
    607  const level& stage,
    608  const std::string& file,
    609  const std::string& func,
    610  const size_t line
    611 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    612  ,
    613  const size_t depth
    614 #endif
    615  ) const
    616  {
    617  format = replace(format, "\\{msg\\}", what);
    618  format = replace(format, "\\{file\\}", file);
    619  format = replace(format, "\\{func\\}", func);
    620  format = replace(format, "\\{line\\}", line);
    621 
    622  format = replace(format, "\\{level\\}", _level_word.at(stage));
    623  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
    624  format = replace(format, "\\{level_letter\\}", letter);
    625 
    626 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    627  format = replace(format, "\\{name\\}", name);
    628  format = replace(format, "\\{depth\\}", depth);
    629 
    630  std::ostringstream chevrons;
    631  for(size_t i = _strip_calls; i < depth; ++i) {
    632  chevrons << _depth_mark;
    633  }
    634  format = replace(format, "\\{depth_marks\\}", chevrons.str());
    635 #endif
    636 
    637  return _level_fmt.at(stage)(format);
    638  }
    639 
    641  void log(
    642  const level& stage,
    643  const std::string& what,
    644  const std::string& file, const std::string& func, size_t line
    645  ) const
    646  {
    647  scope_t scope = locate(stage, file, func, line);
    648 
    649  if(scope.matches) {
    650 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    651  *_out << format(_format_log, what, basename(getenv("_")),
    652  stage, file, func,
    653  line, scope.depth );
    654 #else
    655  *_out << format(_format_log, what,
    656  stage, file, func,
    657  line );
    658 
    659 #endif
    660  _out->flush();
    661  } // if scopes.matches
    662  }
    663 
    665  template<class In>
    666  void dump(
    667  const level& stage,
    668  const In container_begin, const In container_end,
    669  const std::string& file, const std::string& func, size_t line,
    670  const std::string& filename_template="dump_{n}.dat",
    671  const std::string sep=CLUTCHDUMP_DEFAULT_SEP
    672  ) const
    673  {
    674  scope_t scope = locate(stage, file, func, line);
    675 
    676  if(scope.matches) {
    677  const std::string tag = "\\{n\\}";
    678  const std::regex re(tag);
    679  std::string outfile = "";
    680 
    681  // If the file name template has the {n} tag.
    682  if(std::regex_search(filename_template, re)) {
    683  // Increment n until a free one is found.
    684  size_t n = 0;
    685  do {
    686  outfile = replace(filename_template, tag, n);
    687  n++;
    688  } while( std::filesystem::exists( outfile ) );
    689 
    690  } else {
    691  // Use the parameter as is.
    692  outfile = filename_template;
    693  }
    694 
    695  std::ofstream fd(outfile);
    696 
    697  if(_format_dump.size() > 0) {
    698 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    699  fd << format(_format_dump, "", basename(getenv("_")),
    700  stage, file, func,
    701  line, scope.depth );
    702 #else
    703  fd << format(_format_dump, "",
    704  stage, file, func,
    705  line );
    706 #endif
    707  fd << sep; // sep after comment line.
    708  }
    709 
    710  std::copy(container_begin, container_end,
    711  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
    712 
    713  fd.close();
    714  } // if scopes.matches
    715  }
    716 
    718 };
    719 
    722 #else // not WITH_CLUTCHLOG
    723 
    724 
    725 /**********************************************************************
    726  * Fake implementation
    727  **********************************************************************/
    728 
    729 // Equivalent class with empty methods, will be optimized out
    730 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
    731 #pragma GCC diagnostic push
    732 #pragma GCC diagnostic ignored "-Wreturn-type"
    733 class clutchlog
    734 {
    735  public:
    736  static clutchlog& logger() { }
    737  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    738  class fmt {
    739  public:
    740  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, none } fore;
    741  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, none } back;
    742  enum class typo { reset, bold, underline, inverse, none } style;
    743  fmt() : fore(fg::none), back(bg::none), style(typo::none) { }
    744  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    745  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) { }
    746  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    747  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) { }
    748  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) { }
    749  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) { }
    750  protected:
    751  std::ostream& print_on(std::ostream&) const { }
    752  public:
    753  friend std::ostream& operator<<(std::ostream&, const fmt&) { }
    754  std::string operator()(const std::string&) const { }
    755  };
    756  public:
    757  clutchlog(clutchlog const&) = delete;
    758  void operator=(clutchlog const&) = delete;
    759  private:
    760  clutchlog() {}
    761  protected:
    762  struct scope_t {};
    763  scope_t locate(
    764  const level&,
    765  const std::string&,
    766  const std::string&,
    767  const size_t
    768  ) const
    769  { }
    770  public:
    771  void format(const std::string&) {}
    772  std::string format() const {}
    773 
    774  void format_comment(const std::string&) {}
    775  std::string format_comment() const {}
    776 
    777  void out(std::ostream&) {}
    778  std::ostream& out() {}
    779 
    780 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    781  void depth(size_t) {}
    782  size_t depth() const {}
    783 
    784  void depth_mark(std::string) {}
    785  std::string depth_mark() const {}
    786 #endif
    787 
    788  void threshold(level) {}
    789  level threshold() const {}
    790 
    791  void file(std::string) {}
    792  void func(std::string) {}
    793  void line(std::string) {}
    794 
    795 #pragma GCC diagnostic push
    796 #pragma GCC diagnostic ignored "-Wunused-parameter"
    797  void location(
    798  const std::string&,
    799  const std::string& in_function=".*",
    800  const std::string& in_line=".*"
    801  )
    802  { }
    803 #pragma GCC diagnostic pop
    804  void style(level, fmt) { }
    805  fmt style(level) const { }
    806  level level_of(const std::string) { }
    807  public:
    808  std::string replace(
    809  const std::string&,
    810  const std::string&,
    811  const std::string&
    812  ) const
    813  { }
    814 
    815  std::string replace(
    816  const std::string&,
    817  const std::string&,
    818  const size_t
    819  ) const
    820  { }
    821 
    822  std::string format(
    823  std::string,
    824  const std::string&,
    825 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    826  const std::string&,
    827 #endif
    828  const level&,
    829  const std::string&,
    830  const std::string&,
    831  const size_t
    832 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    833  ,
    834  const size_t
    835 #endif
    836  ) const
    837  { }
    838 
    839  void log(
    840  const level&,
    841  const std::string&,
    842  const std::string&, const std::string&, size_t
    843  ) const
    844  { }
    845 
    846  template<class In>
    847  void dump(
    848  const level&,
    849  const In, const In,
    850  const std::string&, const std::string&, size_t,
    851  const std::string&,
    852  const std::string
    853  ) const
    854  { }
    855 };
    856 #pragma GCC diagnostic pop
    857 #endif // WITH_CLUTCHLOG
    858 
    859 #endif // __CLUTCHLOG_H__
    void threshold(level l)
    Set the log level below which logs are not printed.
    Definition: clutchlog.h:399
    -
    void out(std::ostream &out)
    Set the output stream on which to print.
    Definition: clutchlog.h:382
    -
    Definition: clutchlog.h:153
    -
    void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
    Print a log message IF the location matches the given one.
    Definition: clutchlog.h:641
    -
    std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
    Replace mark by tag in form.
    Definition: clutchlog.h:525
    -
    void func(std::string func)
    Set the regular expression filtering the function location.
    Definition: clutchlog.h:406
    -
    std::string format() const
    Get the template string.
    Definition: clutchlog.h:374
    -
    void line(std::string line)
    Set the regular expression filtering the line location.
    Definition: clutchlog.h:408
    -
    void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
    Set the regular expressions filtering the location.
    Definition: clutchlog.h:411
    -
    void format_comment(const std::string &format)
    Set the template string for dumps.
    Definition: clutchlog.h:377
    -
    std::string format_comment() const
    Get the template string for dumps.
    Definition: clutchlog.h:379
    -
    fmt()
     Empty constructor, only useful for a no-op formatter.
    Definition: clutchlog.h:224
    -
    std::string format(std::string format, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Substitute all tags in the format string with the corresponding information and apply the style corre...
    Definition: clutchlog.h:601
    -
    Structure holding a location matching.
    Definition: clutchlog.h:455
    -
    scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Gather information on the current location of the call.
    Definition: clutchlog.h:474
    -
    #define CLUTCHLOG_DEFAULT_FORMAT
    Default format of the messages.
    Definition: clutchlog.h:49
    -
    fg
    Foreground color codes.
    Definition: clutchlog.h:189
    -
    level
    Available log levels.
    Definition: clutchlog.h:172
    -
    #define CLUTCHDUMP_DEFAULT_FORMAT
    Default format of the comment line in file dump.
    Definition: clutchlog.h:58
    -
    std::ostream & out()
    Get the output stream on which to print.
    Definition: clutchlog.h:384
    -
    friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
    Output stream overload.
    Definition: clutchlog.h:268
    -
    level level_of(const std::string name)
    Return the log level tag corresponding to the given pre-configured name.
    Definition: clutchlog.h:437
    -
    void style(level stage, FMT... styles)
    Set the style (color and typo) of the given log level.
    Definition: clutchlog.h:427
    -
    std::string operator()(const std::string &msg) const
    Format the given string with the currently encoded format.
    Definition: clutchlog.h:283
    -
    void style(level stage, fmt style)
    Set the style (color and typo) of the given log level, passing a fmt instance.
    Definition: clutchlog.h:429
    -
    std::ostream & print_on(std::ostream &os) const
    Print the currently encoded format escape code on the given output stream.
    Definition: clutchlog.h:238
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:165
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:215
    -
    bg
    Background color codes.
    Definition: clutchlog.h:202
    -
    void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=CLUTCHDUMP_DEFAULT_SEP) const
    Dump a serializable container after a comment line with log information.
    Definition: clutchlog.h:666
    -
    void file(std::string file)
    Set the regular expression filtering the file location.
    Definition: clutchlog.h:404
    -
    std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
    Replace mark by tag in form, converting tag to its string representation first.
    Definition: clutchlog.h:590
    -
    fmt style(level stage) const
    Get the configured fmt instance of the given log level.
    Definition: clutchlog.h:431
    -
    #define CLUTCHDUMP_DEFAULT_SEP
    Default item separator for dump.
    Definition: clutchlog.h:64
    -
    level threshold() const
    Get the log level below which logs are not printed.
    Definition: clutchlog.h:401
    -
    #define CLUTCHLOG_DEFAULT_DEPTH_MARK
    Default mark for stack depth.
    Definition: clutchlog.h:69
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:186
    +Go to the documentation of this file.
    1 #ifndef __CLUTCHLOG_H__
    +
    2 #define __CLUTCHLOG_H__
    +
    3 #pragma once
    +
    4 
    +
    6 #include <ciso646>
    +
    7 #ifdef FSEXPERIMENTAL
    +
    8 #include <experimental/filesystem>
    +
    9 namespace fs = std::experimental::filesystem;
    +
    10 #else
    +
    11 #include <filesystem>
    +
    12 namespace fs = std::filesystem;
    +
    13 #endif
    +
    14 
    +
    15 #include <iostream>
    +
    16 #include <sstream>
    +
    17 #include <fstream>
    +
    18 #include <cassert>
    +
    19 #include <cstdlib>
    +
    20 #include <string>
    +
    21 #include <limits>
    +
    22 #include <regex>
    +
    23 #include <map>
    +
    24 
    +
    25 #if __has_include(<execinfo.h>) && __has_include(<stdlib.h>) && __has_include(<libgen.h>)
    +
    26 #include <execinfo.h> // execinfo
    +
    27 #include <stdlib.h> // getenv
    +
    28 #include <libgen.h> // basename
    +
    29 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 1
    +
    30 #else
    +
    31 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 0
    +
    32 #endif
    +
    33 
    +
    34 /**********************************************************************
    +
    35  * Enable by default in Debug builds.
    +
    36  **********************************************************************/
    +
    37 #ifndef WITH_CLUTCHLOG
    +
    38 #ifndef NDEBUG
    +
    39 #define WITH_CLUTCHLOG
    +
    40 #endif
    +
    41 #endif
    +
    42 
    +
    43 /**********************************************************************
    +
    44  * Macros definitions
    +
    45  **********************************************************************/
    +
    46 #ifdef WITH_CLUTCHLOG
    +
    47 
    +
    51 #ifndef CLUTCHLOG_DEFAULT_FORMAT
    +
    52 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    54 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
    +
    55 #else
    +
    56 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
    +
    57 #endif
    +
    58 #endif // CLUTCHLOG_DEFAULT_FORMAT
    +
    59 
    +
    60 #ifndef CLUTCHDUMP_DEFAULT_FORMAT
    +
    61 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    63 #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}"
    +
    64 #else
    +
    65 #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func} @ {file}:{line}"
    +
    66 #endif
    +
    67 #endif // CLUTCHDUMP_DEFAULT_FORMAT
    +
    68 
    +
    69 #ifndef CLUTCHDUMP_DEFAULT_SEP
    +
    70 #define CLUTCHDUMP_DEFAULT_SEP "\n"
    +
    72 #endif // CLUTCHDUMP_DEFAULT_SEP
    +
    73 
    +
    74 #ifndef CLUTCHLOG_DEFAULT_DEPTH_MARK
    +
    75 #define CLUTCHLOG_DEFAULT_DEPTH_MARK ">"
    +
    77 #endif // CLUTCHLOG_DEFAULT_DEPTH_MARK
    +
    78 
    +
    79 #ifndef CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG
    +
    80 #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::progress
    +
    82 #endif // CLUTCHLOG_DEFAULT_DEPTH_BUILT
    +
    83 
    +
    89 #define CLUTCHLOC __FILE__, __FUNCTION__, __LINE__
    +
    91 
    +
    93 #ifndef NDEBUG
    +
    94 #define CLUTCHLOG( LEVEL, WHAT ) { \
    +
    95  auto& logger = clutchlog::logger(); \
    +
    96  std::ostringstream msg ; msg << WHAT; \
    +
    97  logger.log(clutchlog::level::LEVEL, msg.str(), CLUTCHLOC); \
    +
    98 }
    +
    99 #else // not Debug build.
    +
    100 #define CLUTCHLOG( LEVEL, WHAT ) { \
    +
    101  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
    +
    102  auto& logger = clutchlog::logger(); \
    +
    103  std::ostringstream msg ; msg << WHAT; \
    +
    104  logger.log(clutchlog::level::LEVEL, msg.str(), CLUTCHLOC); \
    +
    105  } \
    +
    106 }
    +
    107 #endif // NDEBUG
    +
    108 
    +
    110 #ifndef NDEBUG
    +
    111 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) { \
    +
    112  auto& logger = clutchlog::logger(); \
    +
    113  logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
    +
    114  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
    +
    115 }
    +
    116 #else // not Debug build.
    +
    117 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) { \
    +
    118  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
    +
    119  auto& logger = clutchlog::logger(); \
    +
    120  logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
    +
    121  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
    +
    122  } \
    +
    123 }
    +
    124 #endif // NDEBUG
    +
    125 
    +
    127 #ifndef NDEBUG
    +
    128 #define CLUTCHFUNC( LEVEL, FUNC, ... ) { \
    +
    129  auto& logger = clutchlog::logger(); \
    +
    130  clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    +
    131  if(scope.matches) { \
    +
    132  FUNC(__VA_ARGS__); \
    +
    133  } \
    +
    134 }
    +
    135 #else // not Debug build.
    +
    136 #define CLUTCHFUNC( LEVEL, FUNC, ... ) { \
    +
    137  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
    +
    138  auto& logger = clutchlog::logger(); \
    +
    139  clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    +
    140  if(scope.matches) { \
    +
    141  FUNC(__VA_ARGS__); \
    +
    142  } \
    +
    143  } \
    +
    144 }
    +
    145 #endif // NDEBUG
    +
    146 
    +
    148 #ifndef NDEBUG
    +
    149 #define CLUTCHCODE( LEVEL, ... ) { \
    +
    150  auto& logger = clutchlog::logger(); \
    +
    151  clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    +
    152  if(scope.matches) { \
    +
    153  __VA_ARGS__ \
    +
    154  } \
    +
    155 }
    +
    156 #else // not Debug build.
    +
    157 #define CLUTCHCODE( LEVEL, CODE ) { \
    +
    158  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
    +
    159  auto& logger = clutchlog::logger(); \
    +
    160  clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    +
    161  if(scope.matches) { \
    +
    162  CODE \
    +
    163  } \
    +
    164  } \
    +
    165 }
    +
    166 #endif // NDEBUG
    +
    167 
    +
    170 #else // not WITH_CLUTCHLOG
    +
    171 // Disabled macros can still be called in Release builds.
    +
    172 #define CLUTCHLOG( LEVEL, WHAT ) { do {/*nothing*/} while(false); }
    +
    173 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) { do {/*nothing*/} while(false); }
    +
    174 #define CLUTCHFUNC( LEVEL, FUNC, ... ) { do {/*nothing*/} while(false); }
    +
    175 #define CLUTCHCODE( LEVEL, CODE ) { do {/*nothing*/} while(false); }
    +
    176 #endif // WITH_CLUTCHLOG
    +
    177 
    +
    178 /**********************************************************************
    +
    179  * Implementation
    +
    180  **********************************************************************/
    +
    181 
    +
    182 #ifdef WITH_CLUTCHLOG
    +
    183 
    + +
    191 {
    +
    192  public:
    +
    202  static clutchlog& logger()
    +
    203  {
    +
    204  static clutchlog instance;
    +
    205  return instance;
    +
    206  }
    +
    207 
    +
    209  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    +
    210 
    +
    223  class fmt {
    +
    224  public:
    +
    226  enum class fg {
    +
    227  black = 30,
    +
    228  red = 31,
    +
    229  green = 32,
    +
    230  yellow = 33,
    +
    231  blue = 34,
    +
    232  magenta = 35,
    +
    233  cyan = 36,
    +
    234  white = 37,
    +
    235  none
    +
    236  } fore;
    +
    237 
    +
    239  enum class bg {
    +
    240  black = 40,
    +
    241  red = 41,
    +
    242  green = 42,
    +
    243  yellow = 43,
    +
    244  blue = 44,
    +
    245  magenta = 45,
    +
    246  cyan = 46,
    +
    247  white = 47,
    +
    248  none
    +
    249  } back;
    +
    250 
    +
    252  enum class typo {
    +
    253  reset = 0,
    +
    254  bold = 1,
    +
    255  underline = 4,
    +
    256  inverse = 7,
    +
    257  none
    +
    258  } style;
    +
    259 
    +
    261  fmt() : fore(fg::none), back(bg::none), style(typo::none) { }
    +
    262 
    +
    265  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    +
    266  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) { }
    +
    267  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    +
    268  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) { }
    +
    269  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) { }
    +
    270  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) { }
    +
    273  protected:
    +
    275  std::ostream& print_on( std::ostream& os) const
    +
    276  {
    +
    277  std::vector<int> codes; codes.reserve(3);
    +
    278  if(this->fore != fg::none) { codes.push_back(static_cast<int>(this->fore ));}
    +
    279  if(this->back != bg::none) { codes.push_back(static_cast<int>(this->back ));}
    +
    280  if(this->style != typo::none) { codes.push_back(static_cast<int>(this->style));}
    +
    281  if(codes.size() == 0) {return os;}
    +
    282 
    +
    283  os << "\033[";
    +
    284  assert(codes.size() > 0);
    +
    285  os << codes[0];
    +
    286  for(size_t i=1; i < codes.size(); ++i) {
    +
    287  os << ";" << codes[i];
    +
    288  }
    +
    289  os << "m";
    +
    290  return os;
    +
    291  }
    +
    292 
    +
    293  public:
    +
    305  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
    +
    306  {
    +
    307  return fmt.print_on(os);
    +
    308  }
    +
    309 
    +
    320  std::string operator()( const std::string& msg ) const
    +
    321  {
    +
    322  std::ostringstream os;
    +
    323  this->print_on(os);
    +
    324  fmt reset(fmt::typo::reset);
    +
    325  os << msg;
    +
    326  reset.print_on(os);
    +
    327  return os.str();
    +
    328  }
    +
    329  }; // fmt class
    +
    330 
    +
    337  public:
    +
    338  clutchlog(clutchlog const&) = delete;
    +
    339  void operator=(clutchlog const&) = delete;
    +
    340 
    +
    341  private:
    +
    342  clutchlog() :
    +
    343  // system, main, log
    +
    344  _strip_calls(5),
    +
    345  _level_word({
    +
    346  {level::critical,"Critical"},
    +
    347  {level::error ,"Error"},
    +
    348  {level::warning ,"Warning"},
    +
    349  {level::progress,"Progress"},
    +
    350  {level::note ,"Note"},
    +
    351  {level::info ,"Info"},
    +
    352  {level::debug ,"Debug"},
    +
    353  {level::xdebug ,"XDebug"}
    +
    354  }),
    +
    355  _level_fmt({
    +
    356  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
    +
    357  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
    +
    358  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
    +
    359  {level::progress,fmt()},
    +
    360  {level::note ,fmt()},
    +
    361  {level::info ,fmt()},
    +
    362  {level::debug ,fmt()},
    +
    363  {level::xdebug ,fmt()}
    +
    364  }),
    +
    365  _format_log(CLUTCHLOG_DEFAULT_FORMAT),
    +
    366  _format_dump(CLUTCHDUMP_DEFAULT_FORMAT),
    +
    367  _out(&std::clog),
    +
    368 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    369  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
    +
    370  _depth_mark(CLUTCHLOG_DEFAULT_DEPTH_MARK),
    +
    371 #endif
    +
    372  _stage(level::error),
    +
    373  _in_file(".*"),
    +
    374  _in_func(".*"),
    +
    375  _in_line(".*")
    +
    376  {
    +
    377  // Reverse the level->word map into a word->level map.
    +
    378  for(auto& lw : _level_word) {
    +
    379  _word_level[lw.second] = lw.first;
    +
    380  }
    +
    381  }
    +
    382 
    +
    383  protected:
    +
    384  const size_t _strip_calls;
    +
    385  const std::map<level,std::string> _level_word;
    +
    386  std::map<std::string,level> _word_level;
    +
    387  std::map<level,fmt> _level_fmt;
    +
    388  std::string _format_log;
    +
    389  std::string _format_dump;
    +
    390  std::ostream* _out;
    +
    391 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    392  size_t _depth;
    +
    393  std::string _depth_mark;
    +
    394 #endif
    +
    395  level _stage;
    +
    396  std::regex _in_file;
    +
    397  std::regex _in_func;
    +
    398  std::regex _in_line;
    +
    399 
    +
    400  static const size_t max_buffer = 4096;
    +
    403  public:
    +
    404 
    +
    408  void format(const std::string& format) {_format_log = format;}
    +
    411  std::string format() const {return _format_log;}
    +
    412 
    +
    414  void format_comment(const std::string& format) {_format_dump = format;}
    +
    416  std::string format_comment() const {return _format_dump;}
    +
    417 
    +
    419  void out(std::ostream& out) {_out = &out;}
    +
    421  std::ostream& out() {return *_out;}
    +
    422 
    +
    423 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    424  void depth(size_t d) {_depth = d;}
    +
    427  size_t depth() const {return _depth;}
    +
    428 
    +
    430  void depth_mark(std::string mark) {_depth_mark = mark;}
    +
    432  std::string depth_mark() const {return _depth_mark;}
    +
    433 #endif
    +
    434 
    +
    436  void threshold(level l) {_stage = l;}
    +
    438  level threshold() const {return _stage;}
    +
    439 
    +
    441  void file(std::string file) {_in_file = file;}
    +
    443  void func(std::string func) {_in_func = func;}
    +
    445  void line(std::string line) {_in_line = line;}
    +
    446 
    +
    448  void location(
    +
    449  const std::string& in_file,
    +
    450  const std::string& in_function=".*",
    +
    451  const std::string& in_line=".*"
    +
    452  )
    +
    453  {
    +
    454  file(in_file);
    +
    455  func(in_function);
    +
    456  line(in_line);
    +
    457  }
    +
    458 
    +
    463  template<class ... FMT>
    +
    464  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
    +
    466  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
    +
    468  fmt style(level stage) const { return _level_fmt.at(stage); }
    +
    469 
    +
    474  level level_of(const std::string name)
    +
    475  {
    +
    476  const auto ilevel = _word_level.find(name);
    +
    477  if( ilevel != std::end(_word_level)) {
    +
    478  return ilevel->second;
    +
    479  } else {
    +
    480  throw std::out_of_range("'" + name + "' is not a valid log level name");
    +
    481  }
    +
    482  }
    +
    483 
    +
    486  public:
    +
    487 
    +
    491  struct scope_t {
    +
    493  bool matches; // everything is compatible
    +
    494  level stage; // current log level
    +
    495 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    496  size_t depth; // current depth
    +
    497 #endif
    +
    498  bool there; // location is compatible
    +
    499  scope_t() :
    +
    500  matches(false),
    +
    501  stage(level::xdebug),
    +
    502 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    503  depth(0),
    +
    504 #endif
    +
    505  there(false)
    +
    506  {}
    +
    507  }; // scope_t
    +
    508 
    +
    509 
    + +
    512  const level& stage,
    +
    513  const std::string& file,
    +
    514  const std::string& func,
    +
    515  const size_t line
    +
    516  ) const
    +
    517  {
    +
    518  scope_t scope; // False scope by default.
    +
    519 
    +
    520  /***** Log level stage *****/
    +
    521  // Test stage first, because it's fastest.
    +
    522  scope.stage = stage;
    +
    523  if(not (scope.stage <= _stage)) {
    +
    524  // Bypass useless computations if no match
    +
    525  // because of the stage.
    +
    526  return scope;
    +
    527  }
    +
    528 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    529  /***** Stack depth *****/
    +
    530  // Backtrace in second, quite fast.
    +
    531  size_t stack_depth;
    +
    532  void *buffer[max_buffer];
    +
    533  stack_depth = backtrace(buffer, max_buffer);
    +
    534  scope.depth = stack_depth;
    +
    535  if(not (scope.depth <= _depth + _strip_calls)) {
    +
    536  // Bypass if no match.
    +
    537  return scope;
    +
    538  }
    +
    539 #endif
    +
    540 
    +
    541  /***** Location *****/
    +
    542  // Location last, slowest.
    +
    543  std::ostringstream sline; sline << line;
    +
    544  scope.there =
    +
    545  std::regex_search(file, _in_file)
    +
    546  and std::regex_search(func, _in_func)
    +
    547  and std::regex_search(sline.str(), _in_line);
    +
    548 
    +
    549  // No need to retest stage and depth, which are true here.
    +
    550  scope.matches = scope.there;
    +
    551 
    +
    552  return scope;
    +
    553  } // locate
    +
    554 
    +
    562  std::string replace(
    +
    563  const std::string& form,
    +
    564  const std::string& mark,
    +
    565  const std::string& tag
    +
    566  ) const
    +
    567  {
    +
    568  // Useless debug code, unless something fancy would be done with name tags.
    +
    569  // std::regex re;
    +
    570  // try {
    +
    571  // re = std::regex(mark);
    +
    572  //
    +
    573  // } catch(const std::regex_error& e) {
    +
    574  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
    +
    575  // switch(e.code()) {
    +
    576  // case std::regex_constants::error_collate:
    +
    577  // std::cerr << "the expression contains an invalid collating element name";
    +
    578  // break;
    +
    579  // case std::regex_constants::error_ctype:
    +
    580  // std::cerr << "the expression contains an invalid character class name";
    +
    581  // break;
    +
    582  // case std::regex_constants::error_escape:
    +
    583  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
    +
    584  // break;
    +
    585  // case std::regex_constants::error_backref:
    +
    586  // std::cerr << "the expression contains an invalid back reference";
    +
    587  // break;
    +
    588  // case std::regex_constants::error_brack:
    +
    589  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
    +
    590  // break;
    +
    591  // case std::regex_constants::error_paren:
    +
    592  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
    +
    593  // break;
    +
    594  // case std::regex_constants::error_brace:
    +
    595  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
    +
    596  // break;
    +
    597  // case std::regex_constants::error_badbrace:
    +
    598  // std::cerr << "the expression contains an invalid range in a {} expression";
    +
    599  // break;
    +
    600  // case std::regex_constants::error_range:
    +
    601  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
    +
    602  // break;
    +
    603  // case std::regex_constants::error_space:
    +
    604  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
    +
    605  // break;
    +
    606  // case std::regex_constants::error_badrepeat:
    +
    607  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
    +
    608  // break;
    +
    609  // case std::regex_constants::error_complexity:
    +
    610  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
    +
    611  // break;
    +
    612  // case std::regex_constants::error_stack:
    +
    613  // std::cerr << "there was not enough memory to perform a match";
    +
    614  // break;
    +
    615  // default:
    +
    616  // std::cerr << "unknown error";
    +
    617  // }
    +
    618  // std::cerr << std::endl;
    +
    619  // throw;
    +
    620  // } // catch
    +
    621 
    +
    622  const std::regex re(mark);
    +
    623  return std::regex_replace(form, re, tag);
    +
    624  }
    +
    625 
    +
    627  std::string replace(
    +
    628  const std::string& form,
    +
    629  const std::string& mark,
    +
    630  const size_t tag
    +
    631  ) const
    +
    632  {
    +
    633  std::ostringstream stag; stag << tag;
    +
    634  return replace(form, mark, stag.str());
    +
    635  }
    +
    636 
    +
    638  std::string format(
    +
    639  std::string format,
    +
    640  const std::string& what,
    +
    641 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    642  const std::string& name,
    +
    643 #endif
    +
    644  const level& stage,
    +
    645  const std::string& file,
    +
    646  const std::string& func,
    +
    647  const size_t line
    +
    648 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    649  ,
    +
    650  const size_t depth
    +
    651 #endif
    +
    652  ) const
    +
    653  {
    +
    654  format = replace(format, "\\{msg\\}", what);
    +
    655  format = replace(format, "\\{file\\}", file);
    +
    656  format = replace(format, "\\{func\\}", func);
    +
    657  format = replace(format, "\\{line\\}", line);
    +
    658 
    +
    659  format = replace(format, "\\{level\\}", _level_word.at(stage));
    +
    660  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
    +
    661  format = replace(format, "\\{level_letter\\}", letter);
    +
    662 
    +
    663 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    664  format = replace(format, "\\{name\\}", name);
    +
    665  format = replace(format, "\\{depth\\}", depth - _strip_calls);
    +
    666 
    +
    667  std::ostringstream chevrons;
    +
    668  for(size_t i = _strip_calls; i < depth; ++i) {
    +
    669  chevrons << _depth_mark;
    +
    670  }
    +
    671  format = replace(format, "\\{depth_marks\\}", chevrons.str());
    +
    672 #endif
    +
    673 
    +
    674  return _level_fmt.at(stage)(format);
    +
    675  }
    +
    676 
    +
    678  void log(
    +
    679  const level& stage,
    +
    680  const std::string& what,
    +
    681  const std::string& file, const std::string& func, size_t line
    +
    682  ) const
    +
    683  {
    +
    684  scope_t scope = locate(stage, file, func, line);
    +
    685 
    +
    686  if(scope.matches) {
    +
    687 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    688  *_out << format(_format_log, what, basename(getenv("_")),
    +
    689  stage, file, func,
    +
    690  line, scope.depth );
    +
    691 #else
    +
    692  *_out << format(_format_log, what,
    +
    693  stage, file, func,
    +
    694  line );
    +
    695 
    +
    696 #endif
    +
    697  _out->flush();
    +
    698  } // if scopes.matches
    +
    699  }
    +
    700 
    +
    702  template<class In>
    +
    703  void dump(
    +
    704  const level& stage,
    +
    705  const In container_begin, const In container_end,
    +
    706  const std::string& file, const std::string& func, size_t line,
    +
    707  const std::string& filename_template="dump_{n}.dat",
    +
    708  const std::string sep=CLUTCHDUMP_DEFAULT_SEP
    +
    709  ) const
    +
    710  {
    +
    711  scope_t scope = locate(stage, file, func, line);
    +
    712 
    +
    713  if(scope.matches) {
    +
    714  const std::string tag = "\\{n\\}";
    +
    715  const std::regex re(tag);
    +
    716  std::string outfile = "";
    +
    717 
    +
    718  // If the file name template has the {n} tag.
    +
    719  if(std::regex_search(filename_template, re)) {
    +
    720  // Increment n until a free one is found.
    +
    721  size_t n = 0;
    +
    722  do {
    +
    723  outfile = replace(filename_template, tag, n);
    +
    724  n++;
    +
    725  } while( fs::exists( outfile ) );
    +
    726 
    +
    727  } else {
    +
    728  // Use the parameter as is.
    +
    729  outfile = filename_template;
    +
    730  }
    +
    731 
    +
    732  std::ofstream fd(outfile);
    +
    733 
    +
    734  if(_format_dump.size() > 0) {
    +
    735 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    736  fd << format(_format_dump, "", basename(getenv("_")),
    +
    737  stage, file, func,
    +
    738  line, scope.depth );
    +
    739 #else
    +
    740  fd << format(_format_dump, "",
    +
    741  stage, file, func,
    +
    742  line );
    +
    743 #endif
    +
    744  fd << sep; // sep after comment line.
    +
    745  }
    +
    746 
    +
    747  std::copy(container_begin, container_end,
    +
    748  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
    +
    749 
    +
    750  fd.close();
    +
    751  } // if scopes.matches
    +
    752  }
    +
    753 
    +
    755 };
    +
    756 
    +
    759 #else // not WITH_CLUTCHLOG
    +
    760 
    +
    761 
    +
    762 /**********************************************************************
    +
    763  * Fake implementation
    +
    764  **********************************************************************/
    +
    765 
    +
    766 // Equivalent class with empty methods, will be optimized out
    +
    767 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
    +
    768 #pragma GCC diagnostic push
    +
    769 #pragma GCC diagnostic ignored "-Wreturn-type"
    +
    770 class clutchlog
    +
    771 {
    +
    772  public:
    +
    773  static clutchlog& logger() { }
    +
    774  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    +
    775  class fmt {
    +
    776  public:
    +
    777  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, none } fore;
    +
    778  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, none } back;
    +
    779  enum class typo { reset, bold, underline, inverse, none } style;
    +
    780  fmt() : fore(fg::none), back(bg::none), style(typo::none) { }
    +
    781  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    +
    782  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) { }
    +
    783  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) { }
    +
    784  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) { }
    +
    785  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) { }
    +
    786  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) { }
    +
    787  protected:
    +
    788  std::ostream& print_on(std::ostream&) const { }
    +
    789  public:
    +
    790  friend std::ostream& operator<<(std::ostream&, const fmt&) { }
    +
    791  std::string operator()(const std::string&) const { }
    +
    792  };
    +
    793  public:
    +
    794  clutchlog(clutchlog const&) = delete;
    +
    795  void operator=(clutchlog const&) = delete;
    +
    796  private:
    +
    797  clutchlog() {}
    +
    798  protected:
    +
    799  struct scope_t {};
    +
    800  scope_t locate(
    +
    801  const level&,
    +
    802  const std::string&,
    +
    803  const std::string&,
    +
    804  const size_t
    +
    805  ) const
    +
    806  { }
    +
    807  public:
    +
    808  void format(const std::string&) {}
    +
    809  std::string format() const {}
    +
    810 
    +
    811  void format_comment(const std::string&) {}
    +
    812  std::string format_comment() const {}
    +
    813 
    +
    814  void out(std::ostream&) {}
    +
    815  std::ostream& out() {}
    +
    816 
    +
    817 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    818  void depth(size_t) {}
    +
    819  size_t depth() const {}
    +
    820 
    +
    821  void depth_mark(std::string) {}
    +
    822  std::string depth_mark() const {}
    +
    823 #endif
    +
    824 
    +
    825  void threshold(level) {}
    +
    826  level threshold() const {}
    +
    827 
    +
    828  void file(std::string) {}
    +
    829  void func(std::string) {}
    +
    830  void line(std::string) {}
    +
    831 
    +
    832 #pragma GCC diagnostic push
    +
    833 #pragma GCC diagnostic ignored "-Wunused-parameter"
    +
    834  void location(
    +
    835  const std::string&,
    +
    836  const std::string& in_function=".*",
    +
    837  const std::string& in_line=".*"
    +
    838  )
    +
    839  { }
    +
    840 #pragma GCC diagnostic pop
    +
    841  void style(level, fmt) { }
    +
    842  fmt style(level) const { }
    +
    843  level level_of(const std::string) { }
    +
    844  public:
    +
    845  std::string replace(
    +
    846  const std::string&,
    +
    847  const std::string&,
    +
    848  const std::string&
    +
    849  ) const
    +
    850  { }
    +
    851 
    +
    852  std::string replace(
    +
    853  const std::string&,
    +
    854  const std::string&,
    +
    855  const size_t
    +
    856  ) const
    +
    857  { }
    +
    858 
    +
    859  std::string format(
    +
    860  std::string,
    +
    861  const std::string&,
    +
    862 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    863  const std::string&,
    +
    864 #endif
    +
    865  const level&,
    +
    866  const std::string&,
    +
    867  const std::string&,
    +
    868  const size_t
    +
    869 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    870  ,
    +
    871  const size_t
    +
    872 #endif
    +
    873  ) const
    +
    874  { }
    +
    875 
    +
    876  void log(
    +
    877  const level&,
    +
    878  const std::string&,
    +
    879  const std::string&, const std::string&, size_t
    +
    880  ) const
    +
    881  { }
    +
    882 
    +
    883  template<class In>
    +
    884  void dump(
    +
    885  const level&,
    +
    886  const In, const In,
    +
    887  const std::string&, const std::string&, size_t,
    +
    888  const std::string&,
    +
    889  const std::string
    +
    890  ) const
    +
    891  { }
    +
    892 };
    +
    893 #pragma GCC diagnostic pop
    +
    894 #endif // WITH_CLUTCHLOG
    +
    895 
    +
    896 #endif // __CLUTCHLOG_H__
    +
    void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
    Print a log message IF the location matches the given one.
    Definition: clutchlog.h:678
    +
    #define CLUTCHDUMP_DEFAULT_SEP
    Default item separator for dump.
    Definition: clutchlog.h:71
    +
    void line(std::string line)
    Set the regular expression filtering the line location.
    Definition: clutchlog.h:445
    +
    void out(std::ostream &out)
    Set the output stream on which to print.
    Definition: clutchlog.h:419
    +
    std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
    Replace mark by tag in form.
    Definition: clutchlog.h:562
    +
    #define CLUTCHLOG_DEFAULT_FORMAT
    Default format of the messages.
    Definition: clutchlog.h:56
    +
    fg
    Foreground color codes.
    Definition: clutchlog.h:226
    +
    void format_comment(const std::string &format)
    Set the template string for dumps.
    Definition: clutchlog.h:414
    +
    void file(std::string file)
    Set the regular expression filtering the file location.
    Definition: clutchlog.h:441
    +
    scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Gather information on the current location of the call.
    Definition: clutchlog.h:511
    +
    fmt()
    &#160;Empty constructor, only useful for a no-op formatter.
    Definition: clutchlog.h:261
    +
    void style(level stage, fmt style)
    Set the style (color and typo) of the given log level, passing a fmt instance.
    Definition: clutchlog.h:466
    +
    void threshold(level l)
    Set the log level below which logs are not printed.
    Definition: clutchlog.h:436
    +
    level threshold() const
    Get the log level below which logs are not printed.
    Definition: clutchlog.h:438
    +
    level
    Available log levels.
    Definition: clutchlog.h:209
    +
    bg
    Background color codes.
    Definition: clutchlog.h:239
    +
    std::string format(std::string format, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Substitute all tags in the format string with the corresponding information and apply the style corre...
    Definition: clutchlog.h:638
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:202
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:223
    +
    void func(std::string func)
    Set the regular expression filtering the function location.
    Definition: clutchlog.h:443
    +
    std::string format() const
    Get the template string.
    Definition: clutchlog.h:411
    +
    #define CLUTCHDUMP_DEFAULT_FORMAT
    Default format of the comment line in file dump.
    Definition: clutchlog.h:65
    +
    void style(level stage, FMT... styles)
    Set the style (color and typo) of the given log level.
    Definition: clutchlog.h:464
    +
    level level_of(const std::string name)
    Return the log level tag corresponding to the given pre-configured name.
    Definition: clutchlog.h:474
    +
    std::string operator()(const std::string &msg) const
    Format the given string with the currently encoded format.
    Definition: clutchlog.h:320
    +
    std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
    Replace mark by tag in form, converting tag to its string representation first.
    Definition: clutchlog.h:627
    +
    std::string format_comment() const
    Get the template string for dumps.
    Definition: clutchlog.h:416
    +
    void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=CLUTCHDUMP_DEFAULT_SEP) const
    Dump a serializable container after a comment line with log information.
    Definition: clutchlog.h:703
    +
    Structure holding a location matching.
    Definition: clutchlog.h:492
    +
    std::ostream & print_on(std::ostream &os) const
    Print the currently encoded format escape code on the given output stream.
    Definition: clutchlog.h:275
    +
    std::ostream & out()
    Get the output stream on which to print.
    Definition: clutchlog.h:421
    +
    #define CLUTCHLOG_DEFAULT_DEPTH_MARK
    Default mark for stack depth.
    Definition: clutchlog.h:76
    +
    friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
    Output stream overload.
    Definition: clutchlog.h:305
    +
    fmt style(level stage) const
    Get the configured fmt instance of the given log level.
    Definition: clutchlog.h:468
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:252
    +
    void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
    Set the regular expressions filtering the location.
    Definition: clutchlog.h:448
    +
    Definition: clutchlog.h:190
    diff --git a/docs/dir_000050_000000.html b/docs/dir_000050_000000.html new file mode 100644 index 0000000..db45639 --- /dev/null +++ b/docs/dir_000050_000000.html @@ -0,0 +1,77 @@ + + + + + + + +clutchlog: tests -> clutchlog Relation + + + + + + + + + +
    +
    + + + + + + +
    +
    clutchlog +  0.6.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +

    tests → clutchlog Relation

    File in testsIncludes file in clutchlog
    t-assert.cppclutchlog.h
    t-color.cppclutchlog.h
    t-demo.cppclutchlog.h
    t-dump.cppclutchlog.h
    t-log.cppclutchlog.h
    + + + + diff --git a/docs/dir_0597ce40fdf188e7870807c32590691d.html b/docs/dir_0597ce40fdf188e7870807c32590691d.html index 27c5c81..9a3879c 100644 --- a/docs/dir_0597ce40fdf188e7870807c32590691d.html +++ b/docs/dir_0597ce40fdf188e7870807c32590691d.html @@ -1,9 +1,9 @@ - + - + clutchlog: Release_OFF/CMakeFiles/3.10.2 Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_084dfc9a5a5be3c9e27543ac1f550db2.html b/docs/dir_084dfc9a5a5be3c9e27543ac1f550db2.html index e8d2d97..d547775 100644 --- a/docs/dir_084dfc9a5a5be3c9e27543ac1f550db2.html +++ b/docs/dir_084dfc9a5a5be3c9e27543ac1f550db2.html @@ -1,9 +1,9 @@ - + - + clutchlog: Release_OFF/CMakeFiles/3.18.4 Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_0c6859326e57c84153d9ce3980c7b614.html b/docs/dir_0c6859326e57c84153d9ce3980c7b614.html index 6ba266d..fa0eed0 100644 --- a/docs/dir_0c6859326e57c84153d9ce3980c7b614.html +++ b/docs/dir_0c6859326e57c84153d9ce3980c7b614.html @@ -1,9 +1,9 @@ - + - + clutchlog: Release_ON/CMakeFiles/3.18.4 Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_10ddb028b6670bd8aa01364e6cad76a9.html b/docs/dir_10ddb028b6670bd8aa01364e6cad76a9.html index 6b9322d..17d1b96 100644 --- a/docs/dir_10ddb028b6670bd8aa01364e6cad76a9.html +++ b/docs/dir_10ddb028b6670bd8aa01364e6cad76a9.html @@ -1,9 +1,9 @@ - + - + clutchlog: RelWithDebInfo_OFF/CMakeFiles Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */
    diff --git a/docs/dir_232d0e660737fa098457ae695f029c6e.html b/docs/dir_232d0e660737fa098457ae695f029c6e.html index 7b3e62a..5f50bf8 100644 --- a/docs/dir_232d0e660737fa098457ae695f029c6e.html +++ b/docs/dir_232d0e660737fa098457ae695f029c6e.html @@ -1,9 +1,9 @@ - + - + clutchlog: Release_ON Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */
    diff --git a/docs/dir_38468fa15d001d8f53eb5a2cc819fc4d.html b/docs/dir_38468fa15d001d8f53eb5a2cc819fc4d.html index 5e050cd..36c5937 100644 --- a/docs/dir_38468fa15d001d8f53eb5a2cc819fc4d.html +++ b/docs/dir_38468fa15d001d8f53eb5a2cc819fc4d.html @@ -1,9 +1,9 @@ - + - + clutchlog: Debug_OFF/CMakeFiles/3.18.4 Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_3b3b5af829689cf9fc261f0e6a0edda6.html b/docs/dir_3b3b5af829689cf9fc261f0e6a0edda6.html new file mode 100644 index 0000000..e100023 --- /dev/null +++ b/docs/dir_3b3b5af829689cf9fc261f0e6a0edda6.html @@ -0,0 +1,81 @@ + + + + + + + +clutchlog: Release_OFF/CMakeFiles/3.22.1/CompilerIdCXX Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    clutchlog +  0.6.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    CompilerIdCXX Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/dir_3e4d9bbf23e4011a0d79c59ef1fbe4fa.html b/docs/dir_3e4d9bbf23e4011a0d79c59ef1fbe4fa.html new file mode 100644 index 0000000..4df173a --- /dev/null +++ b/docs/dir_3e4d9bbf23e4011a0d79c59ef1fbe4fa.html @@ -0,0 +1,85 @@ + + + + + + + +clutchlog: CMakeFiles/3.20.2 Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    clutchlog +  0.6.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    3.20.2 Directory Reference
    +
    +
    + + +

    +Directories

    +
    + + + + diff --git a/docs/dir_44d46ce0fefad9fb4568613342a0f089.html b/docs/dir_44d46ce0fefad9fb4568613342a0f089.html index 67399b1..e4f1b22 100644 --- a/docs/dir_44d46ce0fefad9fb4568613342a0f089.html +++ b/docs/dir_44d46ce0fefad9fb4568613342a0f089.html @@ -1,9 +1,9 @@ - + - + clutchlog: Debug_OFF/CMakeFiles/3.10.2/CompilerIdCXX Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */
    tests
    - - - + + +
    @@ -82,7 +85,7 @@ Directory dependency graph for tests: diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map index 8f4297f..ea00df7 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map @@ -1,5 +1,5 @@ - + diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 index b4555bf..47ba441 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 @@ -1 +1 @@ -1952cc54af7dc9a50e1812305a9c5e50 \ No newline at end of file +d4d81e1e042ac800c009c85756147e76 \ No newline at end of file diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.png b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.png index 7496e0ad3c98b7d340ede02c99686cff09e15a77..4ca4da77a2ef45b0665e2969b0f565c6fa4c1644 100644 GIT binary patch literal 2470 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 F{9ikchOz(v literal 2465 zcmb7Gdpy(KAO9jHcO^zeDP%mkM5v6-Tqfi?Yh{$Vjm&MsQlwG|lO7MUT0OiAD|7#ChX?Fo&I}!nh`Xy5qDQWJ$0`2ZLnmSUk z9_3J~4lTW+Z5DP+ElCWGOE3pvhqjuiF4c-D+J+vA$-Z4p$pT$=@tZE)gJG<8jal6p zy^*}gn9do0nVwKsFZpJ&zhdpOWAyAr@$v^Y8vU9#Yuokht|kA4fX}z3z7W`cqb-mS5aZt|bRbrg zsKrG`*+e%eTUuK3SEqM3CD69J-}c z&tZfZwlKFn@`975i#$!N^7DRdtQ>e!`dbG2H-~DCXM}m@6Qsf0GZFfig=^HNq@|A| zrtQ=59k}W)0W~cnH#Zz(`?CvNQ1MWQ9C3tz#d3so9bQ{*cV&P05OX4R0}sk6Sz)Od zN&#mYW8fDS$;qOhMwl0%^nE?5YHH?@59sHwI=w4BjG<(ZA+Oh)a7&{B%GE@3h%j+4 zWOKn3)nd8phO%(4ZtBDKq>1}1>xrLA#sP<+{zH)z`yiR?djBydw{e0GY>;LHRJVxU zlXVAiQdU-0oR{OH zU#I*3^yztpq|alvav8i8+gM(DxfSAktJr;JVd2^L2`bGC@{p1k+{{a4oJ zM;vJb&EXZCYd>cvxZGQFb2zw@6O``v7uJG5-COwQu==Xc)a0a>msh$-ba{-Kq+(}h z$Egb^H#vPLK|OHoZxznr6Q?QW+#=b&H`VC4FEvk^Bm40e5k^jq<-4 zR6aR58N0wS=PVKz#+jOrA3ruL={sa(r1t!2-UB+H&yR?X?quCiVUX5vAE&3!u`-ox zl9wNr6A*`li6BCMsfr*J?i8Vgchpq^78gR__X^iG(qQe!G zIttct{(;v={)#R`1_4vzXVoPJjn$*4s z-cl2(EWU%cw|Abg{GL~C1-;XUBuVRKJK1bKLqnHq71EBiK3A;8vM)xZ_4M?DEs9k& zGz@(FeW$*hF)9T@6w%chLZMJ+sxf99hD841>hF>BB)npu+@ZsV*CV7Pvr)rUYK#i{ zoqE6aI$1az{;c+2Z{_ZA8!n7KncCm)E9L50ZVz+D9qK6E(f;q?03M2IynEui`W7i7 z(=H+n-{N|{jF^;k00O}*ScFMl3PST)5D28o%sw5$_AxXt2xg%2D3okj1r5nT)g2uj zF>y-|?&0w@flP@r=H;oz{>^4P&#aL;J3D#HeAeAzNxiS#Kc1uqf#@I*h(pH4tc?vD zfVaS{>*?u9_o2f*J(cI?=fi6V8>D;Mhq}qS;l;(p3msRtRXu-R5E>fFsI9eNgF=p$ z^xdCdq|)9COa)?$C^#i0B|15|D6l2*mQ=8ej0`5l-C$>LUtefoVBkMH!@_DEZzwY= zD!^q!IPOqo0JpszU=kO#CAWUySPUC<1f+Nu;&Gob`1NaI*mLyw=;GpH)zhcB=Iese zAHATAKv*63#H!66WrM=r(`U|fu4a(`d8<5-H{#!8+SoX)6I6Cqk)^OY*dVTcN#wG`u2~E zY%6yEv{u%;I^9dFvh@lZ^OdY5kw{~seSLj4q_5>~HzW=Zv`=-D!+%ex5H-f~VLj9F zi3CD(_X6?wj-5O2zL&AG!*OwO=C6Bu?@%a;#qODbOd_;qMAQ`V`R61?B1;+2jc?u~(GD|diCugo+|0rvBP&b3$lbsMT`w0_ zr^R3}P|tC@?v<3BW1vKXE2myFg~2U$gw#|@K|ukdvlFhdb08y*?fmtk<%QXRmajz*09uvWmN=9vtw^`fR^tidXq0XM&GZ0}JEfxu* zC6wlD&g=lK7*iA8-`{UyZC!Y}8Yy9uhQzStO#L3YUbiZXgD+1AxyZ87r z{KU)Cuf!NPB?Se?&`^D_u`yz`t&nDKbrvl3F9BJixm^fsRiB-ozly9})Ba{O6k(aK zVHscsQpAMpU)c+Ov~`KTCH5cmNc}V+swL!zrTMmx`MZ3%_L4srfN=7JKZONn{1-iT BjxhiL diff --git a/docs/dir_5b4d8a0ca6574b7df09df571ad9e67b6.html b/docs/dir_5b4d8a0ca6574b7df09df571ad9e67b6.html new file mode 100644 index 0000000..3da5169 --- /dev/null +++ b/docs/dir_5b4d8a0ca6574b7df09df571ad9e67b6.html @@ -0,0 +1,81 @@ + + + + + + + +clutchlog: RelWithDebInfo_ON/CMakeFiles/3.22.1/CompilerIdCXX Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    clutchlog +  0.6.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    CompilerIdCXX Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/dir_61ab004aa8225a3da30151b57198e21f.html b/docs/dir_61ab004aa8225a3da30151b57198e21f.html index 9fe89a3..31ae4d2 100644 --- a/docs/dir_61ab004aa8225a3da30151b57198e21f.html +++ b/docs/dir_61ab004aa8225a3da30151b57198e21f.html @@ -1,9 +1,9 @@ - + - + clutchlog: Debug_OFF/CMakeFiles/3.18.4/CompilerIdCXX Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */
    diff --git a/docs/dir_99f269110bdc8201794420d5043dadef.html b/docs/dir_99f269110bdc8201794420d5043dadef.html new file mode 100644 index 0000000..0117971 --- /dev/null +++ b/docs/dir_99f269110bdc8201794420d5043dadef.html @@ -0,0 +1,85 @@ + + + + + + + +clutchlog: RelWithDebInfo_OFF/CMakeFiles/3.22.1 Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    clutchlog +  0.6.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    3.22.1 Directory Reference
    +
    +
    + + +

    +Directories

    +
    + + + + diff --git a/docs/dir_9a935cfcf36ab9c047ca734a48c6ea47.html b/docs/dir_9a935cfcf36ab9c047ca734a48c6ea47.html index d788b6d..b325126 100644 --- a/docs/dir_9a935cfcf36ab9c047ca734a48c6ea47.html +++ b/docs/dir_9a935cfcf36ab9c047ca734a48c6ea47.html @@ -1,9 +1,9 @@ - + - + clutchlog: CMakeFiles Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */
    diff --git a/docs/dir_be65af4ad555fa38f52fdec43511df23.html b/docs/dir_be65af4ad555fa38f52fdec43511df23.html index 6691b68..0db0277 100644 --- a/docs/dir_be65af4ad555fa38f52fdec43511df23.html +++ b/docs/dir_be65af4ad555fa38f52fdec43511df23.html @@ -1,9 +1,9 @@ - + - + clutchlog: CMakeFiles/3.18.4 Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_bf56be71754e1b48f8f3e417eb89bb69.html b/docs/dir_bf56be71754e1b48f8f3e417eb89bb69.html index e9ec3a6..26335fb 100644 --- a/docs/dir_bf56be71754e1b48f8f3e417eb89bb69.html +++ b/docs/dir_bf56be71754e1b48f8f3e417eb89bb69.html @@ -1,9 +1,9 @@ - + - + clutchlog: RelWithDebInfo_ON/CMakeFiles/3.18.4 Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html index 3ec60e1..fa9dcca 100644 --- a/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html +++ b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html @@ -1,9 +1,9 @@ - + - + clutchlog: clutchlog Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_dd500134467ec65427366f3cbbc5ff81.html b/docs/dir_dd500134467ec65427366f3cbbc5ff81.html index a8a7b38..1270f15 100644 --- a/docs/dir_dd500134467ec65427366f3cbbc5ff81.html +++ b/docs/dir_dd500134467ec65427366f3cbbc5ff81.html @@ -1,9 +1,9 @@ - + - + clutchlog: Debug_OFF/CMakeFiles/3.10.2 Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */
    diff --git a/docs/dir_de06b53c2e04c67b773395f92873ff7f.html b/docs/dir_de06b53c2e04c67b773395f92873ff7f.html index a0801e1..d80fb61 100644 --- a/docs/dir_de06b53c2e04c67b773395f92873ff7f.html +++ b/docs/dir_de06b53c2e04c67b773395f92873ff7f.html @@ -1,9 +1,9 @@ - + - + clutchlog: RelWithDebInfo_ON Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */
    diff --git a/docs/dir_f324b8056e3921282ea6aa7d15c7705c.html b/docs/dir_f324b8056e3921282ea6aa7d15c7705c.html index 2be8e24..10dae33 100644 --- a/docs/dir_f324b8056e3921282ea6aa7d15c7705c.html +++ b/docs/dir_f324b8056e3921282ea6aa7d15c7705c.html @@ -1,9 +1,9 @@ - + - + clutchlog: Release_ON/CMakeFiles/3.10.2/CompilerIdCXX Directory Reference @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@
    - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ - + +/* @license-end */ @@ -74,7 +77,7 @@ $(function() { diff --git a/docs/functions.html b/docs/functions.html index 0478543..df8b594 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -1,9 +1,9 @@ - + - + clutchlog: Class Members @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -169,7 +172,7 @@ $(function() { diff --git a/docs/functions_enum.html b/docs/functions_enum.html index f2e5964..846cb0c 100644 --- a/docs/functions_enum.html +++ b/docs/functions_enum.html @@ -1,9 +1,9 @@ - + - + clutchlog: Class Members - Enumerations @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -78,7 +81,7 @@ $(function() { diff --git a/docs/functions_func.html b/docs/functions_func.html index 05fa33d..4dee3a4 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -1,9 +1,9 @@ - + - + clutchlog: Class Members - Functions @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -120,7 +123,7 @@ $(function() { diff --git a/docs/functions_rela.html b/docs/functions_rela.html index de26b5e..95f2c7f 100644 --- a/docs/functions_rela.html +++ b/docs/functions_rela.html @@ -1,9 +1,9 @@ - + - + clutchlog: Class Members - Related Functions @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -69,7 +72,7 @@ $(function() { diff --git a/docs/globals.html b/docs/globals.html index 9a6533d..4b6b747 100644 --- a/docs/globals.html +++ b/docs/globals.html @@ -1,9 +1,9 @@ - + - + clutchlog: File Members @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -60,6 +63,9 @@ $(function() {
    Here is a list of all documented file members with links to the documentation:
      +
    • CLUTCHCODE +: clutchlog.h +
    • CLUTCHDUMP : clutchlog.h
    • @@ -93,7 +99,7 @@ $(function() { diff --git a/docs/globals_defs.html b/docs/globals_defs.html index 01a8845..0508cdf 100644 --- a/docs/globals_defs.html +++ b/docs/globals_defs.html @@ -1,9 +1,9 @@ - + - + clutchlog: File Members @@ -22,7 +22,7 @@
      clutchlog -  0.5.0 +  0.6.0
      @@ -30,18 +30,21 @@
    - + +/* @license-end */ @@ -60,6 +63,9 @@ $(function() {
     
      +
    • CLUTCHCODE +: clutchlog.h +
    • CLUTCHDUMP : clutchlog.h
    • @@ -93,7 +99,7 @@ $(function() { diff --git a/docs/graph_legend.html b/docs/graph_legend.html index b78c3c5..50b6ecf 100644 --- a/docs/graph_legend.html +++ b/docs/graph_legend.html @@ -1,9 +1,9 @@ - + - + clutchlog: Graph Legend @@ -22,7 +22,7 @@
      clutchlog -  0.5.0 +  0.6.0
      @@ -30,18 +30,21 @@
    - + +/* @license-end */ @@ -64,11 +67,42 @@ $(function() {

    This page explains how to interpret the graphs that are generated by doxygen.

    -

    Consider the following example:

    /*! Invisible class because of truncation */
    class Invisible { };
    /*! Truncated class, inheritance relation is hidden */
    class Truncated : public Invisible { };
    /* Class not documented with doxygen comments */
    class Undocumented { };
    /*! Class that is inherited using public inheritance */
    class PublicBase : public Truncated { };
    /*! A template class */
    template<class T> class Templ { };
    /*! Class that is inherited using protected inheritance */
    class ProtectedBase { };
    /*! Class that is inherited using private inheritance */
    class PrivateBase { };
    /*! Class that is used by the Inherited class */
    class Used { };
    /*! Super class that inherits a number of other classes */
    class Inherited : public PublicBase,
    protected ProtectedBase,
    private PrivateBase,
    public Undocumented,
    public Templ<int>
    {
    private:
    Used *m_usedClass;
    };

    This will result in the following graph:

    -
    - -
    -

    The boxes in the above graph have the following meaning:

    +

    Consider the following example:

    /*! Invisible class because of truncation */
    +
    class Invisible { };
    +
    +
    /*! Truncated class, inheritance relation is hidden */
    +
    class Truncated : public Invisible { };
    +
    +
    /* Class not documented with doxygen comments */
    +
    class Undocumented { };
    +
    +
    /*! Class that is inherited using public inheritance */
    +
    class PublicBase : public Truncated { };
    +
    +
    /*! A template class */
    +
    template<class T> class Templ { };
    +
    +
    /*! Class that is inherited using protected inheritance */
    +
    class ProtectedBase { };
    +
    +
    /*! Class that is inherited using private inheritance */
    +
    class PrivateBase { };
    +
    +
    /*! Class that is used by the Inherited class */
    +
    class Used { };
    +
    +
    /*! Super class that inherits a number of other classes */
    +
    class Inherited : public PublicBase,
    +
    protected ProtectedBase,
    +
    private PrivateBase,
    +
    public Undocumented,
    +
    public Templ<int>
    +
    {
    +
    private:
    +
    Used *m_usedClass;
    +
    };
    +

    This will result in the following graph:

    +

    The boxes in the above graph have the following meaning:

    - + +/* @license-end */ @@ -95,7 +98,7 @@ Macros diff --git a/docs/group__Formating.html b/docs/group__Formating.html index d377bb7..ca16420 100644 --- a/docs/group__Formating.html +++ b/docs/group__Formating.html @@ -1,9 +1,9 @@ - + - + clutchlog: Formating tools @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -78,7 +81,7 @@ Classes diff --git a/docs/group__Main.html b/docs/group__Main.html index 6dcf9c2..cd1739b 100644 --- a/docs/group__Main.html +++ b/docs/group__Main.html @@ -1,9 +1,9 @@ - + - + clutchlog: Main class @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -82,7 +85,7 @@ Classes diff --git a/docs/group__UseMacros.html b/docs/group__UseMacros.html index 2541920..3338574 100644 --- a/docs/group__UseMacros.html +++ b/docs/group__UseMacros.html @@ -1,9 +1,9 @@ - + - + clutchlog: High-level API macros @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -73,17 +76,57 @@ Macros  Handy shortcuts to location.
      #define CLUTCHLOG(LEVEL, WHAT) - Log a message at the given level. More...
    + Log a message at the given level. More...
      #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME) - Dump the given container. More...
    + Dump the given container. More...
      #define CLUTCHFUNC(LEVEL, FUNC, ...) - Call an assert at the given level. More...
    + Call any function if the scope matches. More...
      +#define CLUTCHCODE(LEVEL, ...) + Run any code if the scope matches. More...

    Detailed Description

    Macro Definition Documentation

    + +

    ◆ CLUTCHCODE

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define CLUTCHCODE( LEVEL,
     ... 
    )
    +
    +Value:
    { \
    +
    auto& logger = clutchlog::logger(); \
    +
    clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    +
    if(scope.matches) { \
    +
    __VA_ARGS__ \
    +
    } \
    +
    }
    +
    +

    Run any code if the scope matches.

    + +
    +

    ◆ CLUTCHDUMP

    @@ -115,9 +158,11 @@ Macros
    -Value:
    { \
    auto& logger = clutchlog::logger(); \
    logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
    }
    #define CLUTCHLOC
    Handy shortcuts to location.
    Definition: clutchlog.h:83
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:165
    -
    #define CLUTCHDUMP_DEFAULT_SEP
    Default item separator for dump.
    Definition: clutchlog.h:64
    +Value:
    { \
    +
    auto& logger = clutchlog::logger(); \
    +
    logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
    + +
    }

    Dump the given container.

    @@ -154,10 +199,15 @@ Macros
    -Value:
    { \
    auto& logger = clutchlog::logger(); \
    clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    if(scope.matches) { \
    FUNC(__VA_ARGS__); \
    } \
    }
    #define CLUTCHLOC
    Handy shortcuts to location.
    Definition: clutchlog.h:83
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:165
    +Value:
    { \
    +
    auto& logger = clutchlog::logger(); \
    +
    clutchlog::scope_t scope = logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
    +
    if(scope.matches) { \
    +
    FUNC(__VA_ARGS__); \
    +
    } \
    +
    }
    -

    Call an assert at the given level.

    +

    Call any function if the scope matches.

    @@ -186,19 +236,25 @@ Macros
    -Value:
    { \
    auto& logger = clutchlog::logger(); \
    std::ostringstream msg ; msg << WHAT; \
    logger.log(clutchlog::level::LEVEL, msg.str(), CLUTCHLOC); \
    }
    #define CLUTCHLOC
    Handy shortcuts to location.
    Definition: clutchlog.h:83
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:165
    +Value:
    { \
    +
    auto& logger = clutchlog::logger(); \
    +
    std::ostringstream msg ; msg << WHAT; \
    +
    logger.log(clutchlog::level::LEVEL, msg.str(), CLUTCHLOC); \
    +
    }

    Log a message at the given level.

    +
    #define CLUTCHDUMP_DEFAULT_SEP
    Default item separator for dump.
    Definition: clutchlog.h:71
    +
    #define CLUTCHLOC
    Handy shortcuts to location.
    Definition: clutchlog.h:90
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:202
    diff --git a/docs/index.html b/docs/index.html index c699516..0dc2d7d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,9 +1,9 @@ - + - + clutchlog: Main Page @@ -22,7 +22,7 @@
    clutchlog -  0.5.0 +  0.6.0
    @@ -30,18 +30,21 @@ - + +/* @license-end */ @@ -58,7 +61,7 @@ $(function() { -
    +

    Clutchlog is a logging system which targets versatile debugging. It allows to (de)clutch messages for a given: log level, source code location or call stack depth.

    @@ -100,7 +104,13 @@ Features

    Example

    -

    Adding a message is a simple as calling a macro (which is declutched in Debug build type, when NDEBUG is not defined):

    CLUTCHLOG(info, "matrix size: " << m << "x" << n);

    To configure the display, you indicate the three types of locations, for example in your main function:

    auto& log = clutchlog::logger();
    log.depth(2); // Log functions called from "main" but not below.
    log.threshold(clutchlog::level::info); // Log only "info", "warning", "error" or "critical" messages.
    log.file("algebra/.*"); // Will match any file in the "algebra" directory.
    log.func("(mul|add|sub|div)"); // Will match "multiply", for instance.

    For more detailled examples, see the "API documentation" section below and the tests directory.

    +

    Adding a message is a simple as calling a macro (which is declutched in Debug build type, when NDEBUG is not defined):

    CLUTCHLOG(info, "matrix size: " << m << "x" << n);
    +

    To configure the display, you indicate the three types of locations, for example in your main function:

    auto& log = clutchlog::logger();
    +
    log.depth(2); // Log functions called from "main" but not below.
    +
    log.threshold(clutchlog::level::info); // Log only "info", "warning", "error" or "critical" messages.
    +
    log.file("algebra/.*"); // Will match any file in the "algebra" directory.
    +
    log.func("(mul|add|sub|div)"); // Will match "multiply", for instance.
    +

    For more detailled examples, see the "API documentation" section below and the tests directory.

    Rationale

    Most of existing logging systems targets service events storage, like fast queuing of transactions in a round-robin database. Their aim is to provide a simple interface to efficiently store messages somewhere, which is appropriated when you have a well known service running and you want to be able to trace complex users interactions across its states.

    @@ -111,13 +121,42 @@ Rationale API documentation

    Calls

    -

    The main entrypoint is the CLUTCHLOG macro, which takes the desired log level and message. The message can be anything which can be output in an ostringstream.

    // Simple string:
    CLUTCHLOG(info, "hello world");
    // Serialisable variable:
    double value = 0;
    CLUTCHLOG(error, value);
    // passed using inline output stream operators:
    CLUTCHLOG(debug, "hello " << value << " world");

    There is also a macro to dump the content of an iterable within a separate file: CLUTCHDUMP. This function takes care of incrementing a numeric suffix in the file name, if an existing file with this name exists.

    std::vector<int> v(10);
    std::generate(v.begin(), v.end(), std::rand);
    CLUTCHLOG(debug, vec, "test_{n}.dat");
    /* Will output in cat "rand_0.dat"
    * # [t-dump] Info in main (at depth 5) @ /home/nojhan/code/clutchlog/tests/t-dump.cpp:22
    * 1804289383
    * 846930886
    * 1681692777
    */

    Note that if you pass a file name without the {n} tag, the file will be overwritten as is.

    +

    The main entrypoint is the CLUTCHLOG macro, which takes the desired log level and message. The message can be anything which can be output in an ostringstream.

    // Simple string:
    +
    CLUTCHLOG(info, "hello world");
    +
    +
    // Serialisable variable:
    +
    double value = 0;
    +
    CLUTCHLOG(error, value);
    +
    +
    // passed using inline output stream operators:
    +
    CLUTCHLOG(debug, "hello " << value << " world");
    +

    There is also a macro to dump the content of an iterable within a separate file: CLUTCHDUMP. This function takes care of incrementing a numeric suffix in the file name, if an existing file with this name exists.

    std::vector<int> v(10);
    +
    std::generate(v.begin(), v.end(), std::rand);
    +
    CLUTCHDUMP(debug, vec, "test_{n}.dat");
    +
    /* Will output in cat "rand_0.dat"
    +
    * # [t-dump] Info in main (at depth 5) @ /home/nojhan/code/clutchlog/tests/t-dump.cpp:22
    +
    * 1804289383
    +
    * 846930886
    +
    * 1681692777
    +
    */
    +

    Note that if you pass a file name without the {n} tag, the file will be overwritten as is.

    Location filtering

    -

    To configure the global behaviour of the logger, you must first get a reference on its (singleton) instance:

    auto& log = clutchlog::logger();

    One can configure the location(s) at which messages should actually be logged:

    log.depth(3); // Depth of the call stack, defaults to the maximum possible value.
    log.threshold(clutchlog::level::error); // Log level, defaults to error.

    Current levels are defined in an enumeration as clutchlog::level:

    enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};

    File, function and line filters are indicated using (ECMAScript) regular expressions:

    log.file(".*"); // File location, defaults to any.
    log.func(".*"); // Function location, defaults to any.
    log.line(".*"); // Line location, defaults to any.

    A shortcut function can be used to filter all at once:

    log.location(file, func, line); // Defaults to any, second and last parameters being optional.

    Strings may be used to set up the threshold, using level_of:

    log.threshold( log.level_of("XDebug") ); // You have to know the exact string.

    Note that the case of the log levels strings matters (see below).

    +

    To configure the global behaviour of the logger, you must first get a reference on its (singleton) instance:

    auto& log = clutchlog::logger();
    +

    One can configure the location(s) at which messages should actually be logged:

    log.depth(3); // Depth of the call stack, defaults to the maximum possible value.
    +
    log.threshold(clutchlog::level::error); // Log level, defaults to error.
    +

    Current levels are defined in an enumeration as clutchlog::level:

    enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    +

    File, function and line filters are indicated using (ECMAScript) regular expressions:

    log.file(".*"); // File location, defaults to any.
    +
    log.func(".*"); // Function location, defaults to any.
    +
    log.line(".*"); // Line location, defaults to any.
    +

    A shortcut function can be used to filter all at once:

    log.location(file, func, line); // Defaults to any, second and last parameters being optional.
    +

    Strings may be used to set up the threshold, using level_of:

    log.threshold( log.level_of("XDebug") ); // You have to know the exact string.
    +

    Note that the case of the log levels strings matters (see below).

    Output Configuration

    -

    The output stream can be configured using the out method:

    log.out(std::clog); // Defaults to clog.

    The format of the messages can be defined with the format method, passing a string with standardized tags surrounded by {}:

    log.format("{msg}");

    Available tags are:

    +

    The output stream can be configured using the out method:

    log.out(std::clog); // Defaults to clog.
    +

    The format of the messages can be defined with the format method, passing a string with standardized tags surrounded by {}:

    log.format("{msg}");
    +

    Available tags are:

    • {msg}: the logged message,
    • {name}: the name of the current binary,
    • @@ -130,14 +169,23 @@ Output Configuration
    • {depth_marks}: as many chevrons > as there is calls in the stack.

    The default log format is "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n", it can be overriden at compile time by defining the CLUTCHLOG_DEFAULT_FORMAT macro.

    -

    The default format of the comment added with the dump macro is "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}". It can be edited with the format_comment method. If it is set to an empty string, then no comment line is added. The default can be modified at compile time with CLUTCHDUMP_DEFAULT_FORMAT. By default, the separator between items in the container is a new line. To change this behaviour, you can change CLUTCHDUMP_DEFAULT_SEP or call the low-level dump method.

    -

    The mark used with the {depth_marks} tag can be configured with the depth_mark method, and its default with the CLUTCHLOG_DEFAULT_DEPTH_MARK macro:

    log.depth_mark(CLUTCHLOG_DEFAULT_DEPTH_MARK); // Defaults to ">".

    +

    The default format of the first line of comment added with the dump macro is "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}". It can be edited with the format_comment method. If it is set to an empty string, then no comment line is added. The default can be modified at compile time with CLUTCHDUMP_DEFAULT_FORMAT. By default, the separator between items in the container is a new line. To change this behaviour, you can change CLUTCHDUMP_DEFAULT_SEP or call the low-level dump method.

    +

    The mark used with the {depth_marks} tag can be configured with the depth_mark method, and its default with the CLUTCHLOG_DEFAULT_DEPTH_MARK macro:

    log.depth_mark(CLUTCHLOG_DEFAULT_DEPTH_MARK); // Defaults to ">".
    +

    Output style

    -

    The output can be colored differently depending on the log level.

    // Print error messages in bold red:
    log.style(clutchlog::level::error, // First, the log level.
    clutchlog::fmt::fg::red, // Then the styles, in any order...
    clutchlog::fmt::typo::bold);

    Or, if you want to declare some semantics beforehand:

    // Print warning messages in bold magenta:
    using fmt = clutchlog::fmt;
    fmt warn(fmt::fg::magenta, fmt::typo::bold);
    log.style(clutchlog::level::warning, warn);

    Using the clutchlog::fmt class, you can style:

    +

    The output can be colored differently depending on the log level.

    // Print error messages in bold red:
    +
    log.style(clutchlog::level::error, // First, the log level.
    +
    clutchlog::fmt::fg::red, // Then the styles, in any order...
    +
    clutchlog::fmt::typo::bold);
    +

    Or, if you want to declare some semantics beforehand:

    // Print warning messages in bold magenta:
    +
    using fmt = clutchlog::fmt;
    +
    fmt warn(fmt::fg::magenta, fmt::typo::bold);
    +
    log.style(clutchlog::level::warning, warn);
    +

    Using the clutchlog::fmt class, you can style:

    Any of the three arguments may be passed, in any order, if an argument is omitted, it defaults to no color/style.

    Available colors are:

    @@ -160,21 +208,43 @@ Output style
  • inverse,
  • none.
  • -

    You may use styling within the format message template itself, to add even more colors:

    using fmt = clutchlog::fmt;
    std::ostringstream format;
    fmt discreet(fmt::fg::blue);
    format << "{level}: "
    << discreet("{file}:") // Used as a function (inserts a reset at the end).
    << fmt(fmt::fg::yellow) << "{line}" // Used as a tag (no reset inserted).
    << fmt(fmt::typo::reset) << " {msg}" << std::endl; // This is a reset.
    log.format(format.str());

    Note: messages at the "critical", "error" and "warning" log levels are colored by default. You may want to set their style to none if you want to stay in control of inserted colors in the format template.

    +

    You may use styling within the format message template itself, to add even more colors:

    using fmt = clutchlog::fmt;
    +
    std::ostringstream format;
    +
    fmt discreet(fmt::fg::blue);
    +
    format << "{level}: "
    +
    << discreet("{file}:") // Used as a function (inserts a reset at the end).
    +
    << fmt(fmt::fg::yellow) << "{line}" // Used as a tag (no reset inserted).
    +
    << fmt(fmt::typo::reset) << " {msg}" << std::endl; // This is a reset.
    +
    log.format(format.str());
    +

    Note: messages at the "critical", "error" and "warning" log levels are colored by default. You may want to set their style to none if you want to stay in control of inserted colors in the format template.

    Disabled calls

    By default, clutchlog is always enabled if the NDEBUG preprocessor variable is not defined (this variable is set by CMake in build types that differs from Debug).

    You can however force clutchlog to be enabled in any build type by setting the WITH_CLUTCHLOG preprocessor variable.

    When the NDEBUG preprocessor variable is set (e.g. in Release build), clutchlog will do its best to allow the compiler to optimize out any calls for log levels which are under or equal to progress.

    -

    You can change this behavior at compile time by setting the CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG preprocessor variable to the desired maximum log level, for example:

    // Will always allow to log everything even in Release mode.
    #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::xdebug

    Note that allowing a log level does not mean that it will actually output something. If the configured log level at runtime is lower than the log level of the message, it will still not be printed.

    +

    You can change this behavior at compile time by setting the CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG preprocessor variable to the desired maximum log level, for example:

    // Will always allow to log everything even in Release mode.
    +
    #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::xdebug
    +

    Note that allowing a log level does not mean that it will actually output something. If the configured log level at runtime is lower than the log level of the message, it will still not be printed.

    This behavior intend to remove as many conditional statements as possible when not debugging, without having to use preprocessor guards around calls to clutchlog, thus saving run time at no readability cost.

    Low-level API

    -

    All configuration setters have a getters counterpart, with the same name but taking no parameter, for example:

    std::string mark = log.depth_mark();

    To control more precisely the logging, one can use the low-level log method:

    log.log(clutchlog::level::xdebug, "hello world", "main.cpp", "main", 122);

    A helper macro can helps to fill in the location with the actual one, as seen by the compiler:

    log.log(clutchlog::level::xdebug, "hello world", CLUTCHLOC);

    A similar dump method exists:

    log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), CLUTCHLOC, "dumped_{n}.dat", "\n");
    log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), "main.cpp", "main", 122, "dumped.dat", "\n\n");

    +

    All configuration setters have a getters counterpart, with the same name but taking no parameter, for example:

    std::string mark = log.depth_mark();
    +

    To control more precisely the logging, one can use the low-level log method:

    log.log(clutchlog::level::xdebug, "hello world", "main.cpp", "main", 122);
    +

    A helper macro can helps to fill in the location with the actual one, as seen by the compiler:

    log.log(clutchlog::level::xdebug, "hello world", CLUTCHLOC);
    +

    A similar dump method exists:

    log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), CLUTCHLOC, "dumped_{n}.dat", "\n");
    +
    log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), "main.cpp", "main", 122, "dumped.dat", "\n\n");
    +

    (De)clutch any function call

    The CLUTHFUNC macro allows to wrap any function within the current logger.

    -

    For instance, this can be useful if you want to (de)clutch calls to asserts. To do that, just declare your own macro:

    #define ASSERT(LEVEL, ...) { CLUTCHFUNC(LEVEL, assert, __VA_ARGS__) }

    Thus, any call like ASSERT(error, x > 3); will be declutchable with the same configuration than a call to CLUTCHLOG.

    -

    +

    For instance, this can be useful if you want to (de)clutch calls to asserts. To do that, just declare your own macro:

    #define ASSERT(LEVEL, ...) { CLUTCHFUNC(LEVEL, assert, __VA_ARGS__) }
    +

    Thus, any call like ASSERT(error, x > 3); will be declutchable with the same configuration than a call to CLUTCHLOG.

    +

    +(De)clutch any code section

    +

    The CLUTCHCODE macro allows to wrap any code within the current logger.

    +

    For instance:

    +
    std::clog << "We are clutched!\n";
    +
    );
    +

    Log level semantics

    Log levels use a classical semantics for a human skilled in the art, in decreasing order of importance:

      @@ -188,7 +258,7 @@ Log level semantics
    • XDebug: debugging information which would be heavy to read.

    Note: the log levels constants are lower case (for example: clutchlog::level::xdebug), but their string representation is not (e.g. "XDebug", this should be taken into account when using level_of).

    -

    +

    Limitations

    Because the call stack depth and program name access are system-dependent, the features relying on the depth of the call stack and the display of the program name are only available for operating systems having the following headers: execinfo.h, stdlib.h and libgen.h (so far, tested with Linux).

    Some colors/styles may not be supported by some exotic terminal emulators.

    @@ -207,17 +277,30 @@ Limitations
  • Automatic argument parser (please, use a dedicated lib).
  • Signal handling (WTF would you do that, anyway?).
  • -

    +

    Build and tests

    To use clutchlog, just include its header in your code and either ensure that the NDEBUG preprocessor variable is not set, either define the WITH_CLUTCHLOG preprocessor variable.

    If you're using CMake (or another modern build system), it will unset NDEBUG —and thus enable clutchlog— only for the "Debug" build type, which is usually what you want if you use clutchlog, anyway.

    -

    To build and run the tests, just use a classical CMake workflow:

    mkdir build
    cd build
    cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_CLUTCHLOG=ON ..
    make
    ctest

    There's a script which tests all the build types combinations: ./build_all.sh.

    -
    +

    To build and run the tests, just use a classical CMake workflow:

    mkdir build
    +
    cd build
    +
    cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_CLUTCHLOG=ON ..
    +
    make
    +
    ctest
    +

    There's a script which tests all the build types combinations: ./build_all.sh.

    + + +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:94
    +
    #define CLUTCHLOC
    Handy shortcuts to location.
    Definition: clutchlog.h:90
    +
    #define CLUTCHCODE(LEVEL,...)
    Run any code if the scope matches.
    Definition: clutchlog.h:149
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:202
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:223
    +
    #define CLUTCHLOG_DEFAULT_DEPTH_MARK
    Default mark for stack depth.
    Definition: clutchlog.h:76
    +
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:111
    diff --git a/docs/jquery.js b/docs/jquery.js index f5343ed..103c32d 100644 --- a/docs/jquery.js +++ b/docs/jquery.js @@ -1,71 +1,26 @@ +/*! 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)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
    a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
    ";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
    t
    ";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
    ";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

    ";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
    ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
    ","
    "]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
    ").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! - * jQuery UI 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */ -(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! - * jQuery UI Widget 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Widget - */ -(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! - * jQuery UI Mouse 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Mouse - * - * Depends: - * jquery.ui.widget.js - */ -(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
    ').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("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom: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({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{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"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
    ');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,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}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! - * jQuery hashchange event - v1.3 - 7/21/2010 - * http://benalman.com/projects/jquery-hashchange-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ -(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('