barectf.git
8 years agoconfig: event object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 21:56:31 +0000 (17:56 -0400)] 
config: event object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: clock object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 21:30:47 +0000 (17:30 -0400)] 
config: clock object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: variant type object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 21:20:05 +0000 (17:20 -0400)] 
config: variant type object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: struct type object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 21:04:53 +0000 (17:04 -0400)] 
config: struct type object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: array type object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 21:02:20 +0000 (17:02 -0400)] 
config: array type object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: string type object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 21:00:00 +0000 (17:00 -0400)] 
config: string type object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: start from cur last value when updating enum type obj
Philippe Proulx [Thu, 17 Mar 2016 20:58:44 +0000 (16:58 -0400)] 
Fix: config: start from cur last value when updating enum type obj

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: enum type object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 20:47:57 +0000 (16:47 -0400)] 
config: enum type object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: float type object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 20:43:48 +0000 (16:43 -0400)] 
config: float type object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: int type object: null sets prop to default value
Philippe Proulx [Thu, 17 Mar 2016 07:49:06 +0000 (03:49 -0400)] 
config: int type object: null sets prop to default value

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoWrite log level name to metadata comment if available
Philippe Proulx [Wed, 16 Mar 2016 19:36:01 +0000 (15:36 -0400)] 
Write log level name to metadata comment if available

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years ago.gitignore: add virt and *.o
Philippe Proulx [Wed, 16 Mar 2016 17:10:56 +0000 (13:10 -0400)] 
.gitignore: add virt and *.o

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoUpdate copyright notices
Philippe Proulx [Wed, 16 Mar 2016 16:16:01 +0000 (12:16 -0400)] 
Update copyright notices

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoAdd tests
Philippe Proulx [Wed, 16 Mar 2016 01:28:49 +0000 (21:28 -0400)] 
Add tests

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check id (EH) and stream_id (PH) sizes
Philippe Proulx [Wed, 16 Mar 2016 01:07:48 +0000 (21:07 -0400)] 
Fix: config: check id (EH) and stream_id (PH) sizes

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: error reporting: "ts" -> "timestamp"
Philippe Proulx [Wed, 16 Mar 2016 00:50:06 +0000 (20:50 -0400)] 
config: error reporting: "ts" -> "timestamp"

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: timestamp_begin and timestamp_end must be mapped to the same clock
Philippe Proulx [Wed, 16 Mar 2016 00:44:27 +0000 (20:44 -0400)] 
Fix: config: timestamp_begin and timestamp_end must be mapped to the same clock

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check for content_size gt packet_size
Philippe Proulx [Wed, 16 Mar 2016 00:32:52 +0000 (20:32 -0400)] 
Fix: config: check for content_size gt packet_size

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: packet context type is mandatory and must be a struct
Philippe Proulx [Wed, 16 Mar 2016 00:29:03 +0000 (20:29 -0400)] 
Fix: config: packet context type is mandatory and must be a struct

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoREADME.md: move documentation to the project's wiki
Philippe Proulx [Tue, 15 Mar 2016 23:19:30 +0000 (19:19 -0400)] 
README.md: move documentation to the project's wiki

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agolinux-fs: zero packet buffer initially
Philippe Proulx [Tue, 15 Mar 2016 21:12:14 +0000 (17:12 -0400)] 
linux-fs: zero packet buffer initially

This fixes Valgrind warnings.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: fix comment
Philippe Proulx [Tue, 15 Mar 2016 20:12:07 +0000 (16:12 -0400)] 
config: fix comment

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agometadata: add is_dynamic to type objs and fix align
Philippe Proulx [Tue, 15 Mar 2016 19:41:57 +0000 (15:41 -0400)] 
metadata: add is_dynamic to type objs and fix align

The alignment of any type is None if it's not known statically,
i.e. if the type contains a variant containing more than one types
not having the same alignment, recursively.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: entity type: check for struct type
Philippe Proulx [Tue, 15 Mar 2016 19:38:09 +0000 (15:38 -0400)] 
Fix: config: entity type: check for struct type

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoAdd a few provided includable config files
Philippe Proulx [Tue, 15 Mar 2016 01:14:27 +0000 (21:14 -0400)] 
Add a few provided includable config files

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check for enum type member object value outside range
Philippe Proulx [Mon, 14 Mar 2016 22:57:39 +0000 (18:57 -0400)] 
Fix: config: check for enum type member object value outside range

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check for unknown props in enum type member object
Philippe Proulx [Mon, 14 Mar 2016 22:00:50 +0000 (18:00 -0400)] 
Fix: config: check for unknown props in enum type member object

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: "integer type" -> "value type" (for enum type)
Philippe Proulx [Mon, 14 Mar 2016 21:51:19 +0000 (17:51 -0400)] 
config: "integer type" -> "value type" (for enum type)

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: error reporting: type obj can be an assoc array or a string
Philippe Proulx [Mon, 14 Mar 2016 21:10:36 +0000 (17:10 -0400)] 
config: error reporting: type obj can be an assoc array or a string

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check unknown props in float type object size
Philippe Proulx [Mon, 14 Mar 2016 21:10:22 +0000 (17:10 -0400)] 
Fix: config: check unknown props in float type object size

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check for unknown "base" values in int type object
Philippe Proulx [Mon, 14 Mar 2016 20:55:24 +0000 (16:55 -0400)] 
Fix: config: check for unknown "base" values in int type object

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check for trace object's "byte-order" node type
Philippe Proulx [Mon, 14 Mar 2016 19:55:46 +0000 (15:55 -0400)] 
Fix: config: check for trace object's "byte-order" node type

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check PH "uuid" field's element type's signedness
Philippe Proulx [Mon, 14 Mar 2016 19:39:51 +0000 (15:39 -0400)] 
Fix: config: check PH "uuid" field's element type's signedness

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: do not allow negative log level values
Philippe Proulx [Sat, 12 Mar 2016 05:59:31 +0000 (00:59 -0500)] 
Fix: do not allow negative log level values

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: make event's log-level property accept integer
Philippe Proulx [Sat, 12 Mar 2016 05:56:23 +0000 (00:56 -0500)] 
config: make event's log-level property accept integer

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: prefer using $log-levels prop in 2.1
Philippe Proulx [Sat, 12 Mar 2016 05:55:56 +0000 (00:55 -0500)] 
config: prefer using $log-levels prop in 2.1

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check for unknown props in config object
Philippe Proulx [Sat, 12 Mar 2016 05:36:02 +0000 (00:36 -0500)] 
Fix: config: check for unknown props in config object

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoAdd include functionality
Philippe Proulx [Thu, 17 Mar 2016 06:50:05 +0000 (02:50 -0400)] 
Add include functionality

README.md is not modified because its content will be moved
to the project's wiki anyway.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: config: check for node type before checking props
Philippe Proulx [Fri, 11 Mar 2016 18:38:11 +0000 (13:38 -0500)] 
Fix: config: check for node type before checking props

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: prefer using $inherit prop in 2.1
Philippe Proulx [Fri, 11 Mar 2016 18:37:09 +0000 (13:37 -0500)] 
config: prefer using $inherit prop in 2.1

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: prefer using $return-ctype prop in 2.1
Philippe Proulx [Thu, 10 Mar 2016 23:06:51 +0000 (18:06 -0500)] 
config: prefer using $return-ctype prop in 2.1

All properties of config objects which do not end up in the
TSDL metadata, i.e. properties for barectf itself, should be
prefixed with $ in the future.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoconfig: convert config version to integer
Philippe Proulx [Thu, 10 Mar 2016 23:05:51 +0000 (18:05 -0500)] 
config: convert config version to integer

    '2.0' -> 200
    '2.1' -> 201
    '2.10' -> 210

This makes versions comparable.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: metadata: add missing return_ctype property
Philippe Proulx [Thu, 10 Mar 2016 23:05:18 +0000 (18:05 -0500)] 
Fix: metadata: add missing return_ctype property

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoREADME.md: add C99 compliance limitation
Philippe Proulx [Thu, 10 Mar 2016 22:50:18 +0000 (17:50 -0500)] 
README.md: add C99 compliance limitation

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: use unions to write floats to avoid aliasing warnings
Philippe Proulx [Thu, 10 Mar 2016 22:35:07 +0000 (17:35 -0500)] 
Fix: use unions to write floats to avoid aliasing warnings

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoExamples: add -Wall -pedantic to CFLAGS
Philippe Proulx [Thu, 10 Mar 2016 22:02:31 +0000 (17:02 -0500)] 
Examples: add -Wall -pedantic to CFLAGS

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agotemplates: add __extension__ before statement expressions
Philippe Proulx [Thu, 10 Mar 2016 21:58:52 +0000 (16:58 -0500)] 
templates: add __extension__ before statement expressions

This removes the warnings printed by GCC with -pedantic, since
statement expressions are a GCC extension.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agobarectf v2.1.0-dev
Philippe Proulx [Thu, 10 Mar 2016 21:31:53 +0000 (16:31 -0500)] 
barectf v2.1.0-dev

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoAdd CHANGELOG.md
Philippe Proulx [Thu, 10 Mar 2016 21:16:14 +0000 (16:16 -0500)] 
Add CHANGELOG.md

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agobarectf v2.0.2 v2.0.2
Philippe Proulx [Fri, 30 Oct 2015 03:50:11 +0000 (23:50 -0400)] 
barectf v2.0.2

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoFix: _split_version_suffix() may return 1 element
Philippe Proulx [Fri, 30 Oct 2015 03:46:47 +0000 (23:46 -0400)] 
Fix: _split_version_suffix() may return 1 element

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoREADME.md: fix Arch Linux install command-line
Philippe Proulx [Fri, 23 Oct 2015 20:56:36 +0000 (16:56 -0400)] 
README.md: fix Arch Linux install command-line

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoREADME.md: add PyPI badge
Philippe Proulx [Wed, 14 Oct 2015 16:18:56 +0000 (12:18 -0400)] 
README.md: add PyPI badge

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agobarectf v2.0.1 v2.0.1
Philippe Proulx [Wed, 14 Oct 2015 16:18:35 +0000 (12:18 -0400)] 
barectf v2.0.1

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoParallella plat.: close_packet(): fix array indexing
Philippe Proulx [Tue, 13 Oct 2015 18:08:20 +0000 (14:08 -0400)] 
Parallella plat.: close_packet(): fix array indexing

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoParallella platform: is_backend_full(): do not init. `full`
Philippe Proulx [Tue, 13 Oct 2015 18:05:08 +0000 (14:05 -0400)] 
Parallella platform: is_backend_full(): do not init. `full`

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agobarectf-platform-parallella.c: fix spacing
Philippe Proulx [Tue, 13 Oct 2015 18:04:42 +0000 (14:04 -0400)] 
barectf-platform-parallella.c: fix spacing

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
8 years agoEnhance the understandability of some actions in the parallella platform
Thomas Bertauld [Sat, 10 Oct 2015 23:41:00 +0000 (19:41 -0400)] 
Enhance the understandability of some actions in the parallella platform

8 years agoFixing the missing initialization of the field 'initialized' in the global context...
Thomas Bertauld [Sat, 10 Oct 2015 23:37:18 +0000 (19:37 -0400)] 
Fixing the missing initialization of the field 'initialized' in the global context of an eCore on the parallella platform

8 years agoplatforms/parallella/consumer: minor cleaning
Philippe Proulx [Wed, 22 Jul 2015 15:30:07 +0000 (11:30 -0400)] 
platforms/parallella/consumer: minor cleaning

8 years agobarectf v2.0.0 v2.0.0
Philippe Proulx [Tue, 2 Jun 2015 17:18:20 +0000 (13:18 -0400)] 
barectf v2.0.0

8 years agoDocs: Capitalize README.md section headers
Jérémie Galarneau [Fri, 5 Jun 2015 09:34:56 +0000 (11:34 +0200)] 
Docs: Capitalize README.md section headers

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 years agobarectf v0.3.1 v0.3.1
Philippe Proulx [Mon, 8 Jun 2015 21:21:48 +0000 (17:21 -0400)] 
barectf v0.3.1

9 years agoImprove quality of some error messages
Philippe Proulx [Mon, 8 Jun 2015 21:20:53 +0000 (17:20 -0400)] 
Improve quality of some error messages

9 years agobarectf v0.3.0 v0.3.0
Philippe Proulx [Fri, 29 May 2015 00:03:20 +0000 (20:03 -0400)] 
barectf v0.3.0

9 years agoAdd version argument
Philippe Proulx [Thu, 28 May 2015 23:58:00 +0000 (19:58 -0400)] 
Add version argument

9 years agoREADME.md: document events_discarded feature
Philippe Proulx [Tue, 26 May 2015 00:28:35 +0000 (20:28 -0400)] 
README.md: document events_discarded feature

9 years agobarectf v0.2.0 v0.2.0
Philippe Proulx [Tue, 26 May 2015 00:19:59 +0000 (20:19 -0400)] 
barectf v0.2.0

9 years agoAdd support for discarded events on packet close
Philippe Proulx [Tue, 26 May 2015 00:15:15 +0000 (20:15 -0400)] 
Add support for discarded events on packet close

If a stream's packet context has the "events_discarded" field,
its barectf_close_packet() function will accept an additional
parameter which indicates the number of discarded events
*so far for this stream* (free-running counter, i.e. not per packet).

9 years agoAdd bitfield functions wrapping actual macros
Philippe Proulx [Mon, 25 May 2015 23:44:23 +0000 (19:44 -0400)] 
Add bitfield functions wrapping actual macros

Not inlining macro expansions should save some space in
the program section.

9 years agobarectf 0.1.2
Philippe Proulx [Tue, 25 Nov 2014 23:29:56 +0000 (18:29 -0500)] 
barectf 0.1.2

9 years agoexamples -> doc/examples
Philippe Proulx [Tue, 25 Nov 2014 23:29:23 +0000 (18:29 -0500)] 
examples -> doc/examples

9 years agoAdd examples
Philippe Proulx [Tue, 25 Nov 2014 23:28:39 +0000 (18:28 -0500)] 
Add examples

9 years agoFix: write float/double floating point numbers
Philippe Proulx [Tue, 25 Nov 2014 23:22:28 +0000 (18:22 -0500)] 
Fix: write float/double floating point numbers

Casting them to unsigned integers does not keep the
IEEE 754 format.

9 years agoPrettify C output with newlines
Philippe Proulx [Tue, 25 Nov 2014 21:41:55 +0000 (16:41 -0500)] 
Prettify C output with newlines

9 years agoFix: _write_field_enum()
Philippe Proulx [Tue, 25 Nov 2014 21:39:16 +0000 (16:39 -0500)] 
Fix: _write_field_enum()

9 years agosetup.py/README.md: update after transfer, bump
Philippe Proulx [Fri, 21 Nov 2014 21:17:34 +0000 (16:17 -0500)] 
setup.py/README.md: update after transfer, bump

9 years agoREADME.md: fix comments in snippets
Philippe Proulx [Mon, 17 Nov 2014 23:20:38 +0000 (18:20 -0500)] 
README.md: fix comments in snippets

9 years agoREADME.md: fix spelling
Philippe Proulx [Fri, 14 Nov 2014 22:21:40 +0000 (17:21 -0500)] 
README.md: fix spelling

9 years agoREADME.md: add IPv4 header complex structure notes
Philippe Proulx [Fri, 14 Nov 2014 22:18:50 +0000 (17:18 -0500)] 
README.md: add IPv4 header complex structure notes

9 years agodoc: improve CTF packet anatomy diagram
Philippe Proulx [Fri, 14 Nov 2014 22:09:26 +0000 (17:09 -0500)] 
doc: improve CTF packet anatomy diagram

9 years agoREADME.md: fix C snippet indentation
Philippe Proulx [Fri, 14 Nov 2014 22:04:36 +0000 (17:04 -0500)] 
README.md: fix C snippet indentation

9 years agoAdd doc images
Philippe Proulx [Fri, 14 Nov 2014 21:59:03 +0000 (16:59 -0500)] 
Add doc images

9 years agoREADME.md: ANSI C -> C99
Philippe Proulx [Fri, 14 Nov 2014 21:57:36 +0000 (16:57 -0500)] 
README.md: ANSI C -> C99

9 years agoAdd README.md
Philippe Proulx [Fri, 14 Nov 2014 21:56:52 +0000 (16:56 -0500)] 
Add README.md

9 years agoFix _get_integer_param_ctype()
Philippe Proulx [Thu, 13 Nov 2014 22:43:34 +0000 (17:43 -0500)] 
Fix _get_integer_param_ctype()

9 years agoFix validation
Philippe Proulx [Thu, 13 Nov 2014 22:41:22 +0000 (17:41 -0500)] 
Fix validation

9 years agoFix a few CTF write bugs
Philippe Proulx [Thu, 13 Nov 2014 21:42:16 +0000 (16:42 -0500)] 
Fix a few CTF write bugs

9 years agoFix string write
Philippe Proulx [Thu, 13 Nov 2014 20:54:29 +0000 (15:54 -0500)] 
Fix string write

9 years agoFix sequence length from env.
Philippe Proulx [Thu, 13 Nov 2014 20:44:09 +0000 (15:44 -0500)] 
Fix sequence length from env.

9 years agoFix array/sequence write
Philippe Proulx [Thu, 13 Nov 2014 20:19:19 +0000 (15:19 -0500)] 
Fix array/sequence write

9 years agoSolve a few bugs
Philippe Proulx [Thu, 13 Nov 2014 00:21:00 +0000 (19:21 -0500)] 
Solve a few bugs

9 years agoCatch write errors
Philippe Proulx [Wed, 12 Nov 2014 20:23:36 +0000 (15:23 -0500)] 
Catch write errors

9 years agoComment a lot and output both headers
Philippe Proulx [Wed, 12 Nov 2014 20:22:35 +0000 (15:22 -0500)] 
Comment a lot and output both headers

9 years agoAdd event name validation
Philippe Proulx [Wed, 12 Nov 2014 07:47:59 +0000 (02:47 -0500)] 
Add event name validation

9 years agoAdd a few steps
Philippe Proulx [Wed, 12 Nov 2014 07:43:49 +0000 (02:43 -0500)] 
Add a few steps

9 years agoAdd some verbosity
Philippe Proulx [Wed, 12 Nov 2014 07:40:31 +0000 (02:40 -0500)] 
Add some verbosity

9 years agosetup.py: update keywords
Philippe Proulx [Wed, 12 Nov 2014 07:35:46 +0000 (02:35 -0500)] 
setup.py: update keywords

9 years agosetup.py: update description (C99)
Philippe Proulx [Wed, 12 Nov 2014 07:34:35 +0000 (02:34 -0500)] 
setup.py: update description (C99)

9 years agoImprove output
Philippe Proulx [Wed, 12 Nov 2014 07:33:31 +0000 (02:33 -0500)] 
Improve output

This page took 0.044996 seconds and 4 git commands to generate.