Archives manual 1.3

Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/667b57c3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/667b57c3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/667b57c3

Branch: refs/heads/master
Commit: 667b57c35894cecd6e0a63013055457282ffc692
Parents: 191fbba
Author: Francois Papon <[email protected]>
Authored: Thu Sep 13 21:54:06 2018 +0400
Committer: Francois Papon <[email protected]>
Committed: Thu Sep 13 21:54:06 2018 +0400

----------------------------------------------------------------------
 manual/src/archives/1.3/asciidoc/apache.css     | 2448 ++++++++++++++++++
 .../1.3/asciidoc/building-and-deploying.adoc    |  276 ++
 .../src/archives/1.3/asciidoc/clustering.adoc   |   83 +
 manual/src/archives/1.3/asciidoc/concepts.adoc  |  125 +
 .../archives/1.3/asciidoc/configuration.adoc    |  397 +++
 .../1.3/asciidoc/connectors/connectors.adoc     |   22 +
 .../connectors/salesforce-connector.adoc        |  224 ++
 .../src/archives/1.3/asciidoc/consent-api.adoc  |  139 +
 .../1.3/asciidoc/custom-extensions.adoc         |  419 +++
 .../1.3/asciidoc/extending-plugins.adoc         |  113 +
 .../archives/1.3/asciidoc/getting-started.adoc  |  121 +
 .../1.3/asciidoc/images/asf_logo_url.png        |  Bin 0 -> 21121 bytes
 .../1.3/asciidoc/images/incubator-logo.png      |  Bin 0 -> 8923 bytes
 .../1.3/asciidoc/images/unomi-request.png       |  Bin 0 -> 132731 bytes
 manual/src/archives/1.3/asciidoc/index.adoc     |   69 +
 .../1.3/asciidoc/samples/login-sample.adoc      |   73 +
 .../archives/1.3/asciidoc/samples/samples.adoc  |   19 +
 .../1.3/asciidoc/samples/twitter-sample.adoc    |  432 ++++
 .../asciidoc/samples/weather-update-sample.adoc |   14 +
 19 files changed, 4974 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/667b57c3/manual/src/archives/1.3/asciidoc/apache.css
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.3/asciidoc/apache.css 
b/manual/src/archives/1.3/asciidoc/apache.css
new file mode 100644
index 0000000..2872ec3
--- /dev/null
+++ b/manual/src/archives/1.3/asciidoc/apache.css
@@ -0,0 +1,2448 @@
+
+@import 
"https://fonts.googleapis.com/css?family=Open+Sans:400,700%7cDroid+Serif:400,700";;
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+    display: block
+}
+
+audio,
+canvas,
+video {
+    display: inline-block
+}
+
+audio:not([controls]) {
+    display: none;
+    height: 0
+}
+
+script {
+    display: none !important
+}
+
+html {
+    font-family: "Droid Serif";
+    -ms-text-size-adjust: 100%;
+    -webkit-text-size-adjust: 100%;
+}
+
+a {
+    background: transparent
+}
+
+a:focus {
+    outline: thin dotted
+}
+
+a:active,
+a:hover {
+    outline: 0
+}
+
+h1 {
+    font-size: 2em;
+    margin: .67em 0
+}
+
+abbr[title] {
+    border-bottom: 1px dotted
+}
+
+b,
+strong {
+    font-weight: bold
+}
+
+dfn {
+    font-style: italic
+}
+
+hr {
+    -moz-box-sizing: content-box;
+    box-sizing: content-box;
+    height: 0
+}
+
+mark {
+    background: #ff0;
+    color: #000
+}
+
+code,
+kbd,
+pre,
+samp {
+    font-family: monospace;
+    font-size: 1em
+}
+
+pre {
+    white-space: pre-wrap
+}
+
+q {
+    quotes: "\201C" "\201D" "\2018" "\2019"
+}
+
+small {
+    font-size: 80%
+}
+
+sub,
+sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline
+}
+
+sup {
+    top: -.5em
+}
+
+sub {
+    bottom: -.25em
+}
+
+img {
+    border: 0
+}
+
+svg:not(:root) {
+    overflow: hidden
+}
+
+figure {
+    margin: 0
+}
+
+fieldset {
+    border: 1px solid silver;
+    margin: 0 2px;
+    padding: .35em .625em .75em
+}
+
+legend {
+    border: 0;
+    padding: 0
+}
+
+button,
+input,
+select,
+textarea {
+    font-family: inherit;
+    font-size: 100%;
+    margin: 0
+}
+
+button,
+input {
+    line-height: normal
+}
+
+button,
+select {
+    text-transform: none
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+    -webkit-appearance: button;
+    cursor: pointer
+}
+
+button[disabled],
+html input[disabled] {
+    cursor: default
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+    box-sizing: border-box;
+    padding: 0
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+    border: 0;
+    padding: 0
+}
+
+textarea {
+    overflow: auto;
+    vertical-align: top
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0
+}
+
+*,
+*::before,
+*::after {
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box
+}
+
+html,
+body {
+    /*font-size: 100%*/
+}
+
+body {
+    background: #fff;
+    color: #333;
+    padding: 0;
+    margin: 0;
+    font-family: "Droid Serif", "DejaVu Serif", serif;
+    font-size: 14px;
+    font-style: normal;
+    line-height: 1.42857143;
+    position: relative;
+    cursor: auto;
+    tab-size: 4;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased
+}
+
+a:hover {
+    cursor: pointer
+}
+
+img,
+object,
+embed {
+    max-width: 100%;
+    height: auto
+}
+
+object,
+embed {
+    height: 100%
+}
+
+img {
+    -ms-interpolation-mode: bicubic
+}
+
+.left {
+    float: left !important
+}
+
+.right {
+    float: right !important
+}
+
+.text-left {
+    text-align: left !important
+}
+
+.text-right {
+    text-align: right !important
+}
+
+.text-center {
+    text-align: center !important
+}
+
+.text-justify {
+    text-align: justify !important
+}
+
+.hide {
+    display: none
+}
+
+img,
+object,
+svg {
+    display: inline-block;
+    vertical-align: middle
+}
+
+textarea {
+    height: auto;
+    min-height: 50px
+}
+
+select {
+    width: 100%
+}
+
+.center {
+    margin-left: auto;
+    margin-right: auto
+}
+
+.stretch {
+    width: 100%
+}
+
+.subheader,
+.admonitionblock td.content>.title,
+.audioblock>.title,
+.exampleblock>.title,
+.imageblock>.title,
+.listingblock>.title,
+.literalblock>.title,
+.stemblock>.title,
+.openblock>.title,
+.paragraph>.title,
+.quoteblock>.title,
+table.tableblock>.title,
+.verseblock>.title,
+.videoblock>.title,
+.dlist>.title,
+.olist>.title,
+.ulist>.title,
+.qlist>.title,
+.hdlist>.title {
+    line-height: 1.45;
+    color: #585ac2;
+    font-weight: 400;
+    margin-top: 0;
+    margin-bottom: .25em
+}
+
+div,
+dl,
+dt,
+dd,
+ul,
+ol,
+li,
+h1,
+h2,
+h3,
+#toctitle,
+.sidebarblock>.content>.title,
+h4,
+h5,
+h6,
+pre,
+form,
+p,
+blockquote,
+th,
+td {
+    margin: 0;
+    padding: 0;
+    direction: ltr
+}
+
+a {
+    color: #585ac2;
+    text-decoration: underline;
+    line-height: inherit
+}
+
+a:hover,
+a:focus {
+    color: #373997;
+}
+
+a img {
+    border: none
+}
+
+p {
+    font-family: inherit;
+    font-weight: 400;
+    font-size: 1em;
+    line-height: 1.6;
+    margin-bottom: 1.25em;
+    text-rendering: optimizeLegibility
+}
+
+p aside {
+    font-size: .875em;
+    line-height: 1.35;
+    font-style: italic
+}
+
+h1,
+h2,
+h3,
+#toctitle,
+.sidebarblock>.content>.title,
+h4,
+h5,
+h6 {
+    font-family: "Open Sans", "DejaVu Sans", sans-serif;
+    font-weight: bold;
+    /*font-style: bold;*/
+    color: #303284;
+    text-rendering: optimizeLegibility;
+    margin-top: 1em;
+    margin-bottom: .5em;
+    line-height: 1.0125em;
+    text-transform: uppercase;
+}
+
+h1 small,
+h2 small,
+h3 small,
+#toctitle small,
+.sidebarblock>.content>.title small,
+h4 small,
+h5 small,
+h6 small {
+    font-size: 60%;
+    color: #303284;
+    line-height: 0
+}
+
+h1 {
+    font-size: 2.125em
+}
+
+h2 {
+    font-size: 1.6875em
+}
+
+h3,
+#toctitle,
+.sidebarblock>.content>.title {
+    font-size: 1.375em
+}
+
+h4,
+h5 {
+    font-size: 1.125em
+}
+
+h6 {
+    font-size: 1em
+}
+
+hr {
+    border: solid #dddddd;
+    border-width: 1px 0 0;
+    clear: both;
+    margin: 1.25em 0 1.1875em;
+    height: 0
+}
+
+em,
+i {
+    font-style: italic;
+    line-height: inherit
+}
+
+strong,
+b {
+    font-weight: bold;
+    line-height: inherit
+}
+
+small {
+    font-size: 60%;
+    line-height: inherit
+}
+
+code {
+    font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
+    font-weight: 400;
+    color: #585ac2;
+}
+
+ul,
+ol,
+dl {
+    font-size: 1em;
+    line-height: 1.6;
+    margin-bottom: 1.25em;
+    list-style-position: outside;
+    font-family: inherit
+}
+
+ul,
+ol {
+    margin-left: 1.5em
+}
+
+ul li ul,
+ul li ol {
+    margin-left: 1.25em;
+    margin-bottom: 0;
+    font-size: 1em
+}
+
+ul.square li ul,
+ul.circle li ul,
+ul.disc li ul {
+    list-style: inherit
+}
+
+ul.square {
+    list-style-type: square
+}
+
+ul.circle {
+    list-style-type: circle
+}
+
+ul.disc {
+    list-style-type: disc
+}
+
+ol li ul,
+ol li ol {
+    margin-left: 1.25em;
+    margin-bottom: 0
+}
+
+dl dt {
+    margin-bottom: .3125em;
+    font-weight: bold
+}
+
+dl dd {
+    margin-bottom: 1.25em
+}
+
+abbr,
+acronym {
+    text-transform: uppercase;
+    font-size: 90%;
+    color: rgba(0, 0, 0, .8);
+    border-bottom: 1px dotted #ddd;
+    cursor: help
+}
+
+abbr {
+    text-transform: none
+}
+
+blockquote {
+    margin: 0 0 1.25em;
+    padding: .5625em 1.25em 0 1.1875em;
+    border-left: 1px solid #ddd
+}
+
+blockquote cite {
+    display: block;
+    font-size: .9375em;
+    color: rgba(0, 0, 0, .6)
+}
+
+blockquote cite::before {
+    content: "\2014 \0020"
+}
+
+blockquote cite a,
+blockquote cite a:visited {
+    color: rgba(0, 0, 0, .6)
+}
+
+blockquote,
+blockquote p {
+    line-height: 1.6;
+    color: rgba(0, 0, 0, .85)
+}
+
+@media screen and (min-width:768px) {
+    h1,
+    h2,
+    h3,
+    #toctitle,
+    .sidebarblock>.content>.title,
+    h4,
+    h5,
+    h6 {
+        line-height: 1.2
+    }
+
+    h1 {
+        font-size: 2.75em
+    }
+
+    h2 {
+        font-size: 2.3125em
+    }
+
+    h3,
+    #toctitle,
+    .sidebarblock>.content>.title {
+        font-size: 1.6875em
+    }
+
+    h4 {
+        font-size: 1.4375em
+    }
+
+}
+
+table {
+    background: #fff;
+    margin-bottom: 1.25em;
+    border: solid 1px #dddddd;
+}
+
+table thead,
+table tfoot {
+    background: #f7f8f7
+}
+
+table thead tr th,
+table thead tr td,
+table tfoot tr th,
+table tfoot tr td {
+    padding: .5em .625em .625em;
+    font-size: inherit;
+    color: rgba(0, 0, 0, .8);
+    text-align: left
+}
+
+table tr th,
+table tr td {
+    padding: .5625em .625em;
+    font-size: inherit;
+    color: rgba(0, 0, 0, .8)
+}
+
+table tr.even,
+table tr.alt,
+table tr:nth-of-type(even) {
+    background: #f8f8f7
+}
+
+table thead tr th,
+table tfoot tr th,
+table tbody tr td,
+table tr td,
+table tfoot tr td {
+    display: table-cell;
+    line-height: 1.6
+}
+
+h1,
+h2,
+h3,
+#toctitle,
+.sidebarblock>.content>.title,
+h4,
+h5,
+h6 {
+    line-height: 1.2;
+    word-spacing: -.05em
+}
+
+h1 strong,
+h2 strong,
+h3 strong,
+#toctitle strong,
+.sidebarblock>.content>.title strong,
+h4 strong,
+h5 strong,
+h6 strong {
+    font-weight: 400
+}
+
+.clearfix::before,
+.clearfix::after,
+.float-group::before,
+.float-group::after {
+    content: " ";
+    display: table
+}
+
+.clearfix::after,
+.float-group::after {
+    clear: both
+}
+
+*:not(pre)>code {
+    font-size: .9375em;
+    font-style: normal !important;
+    letter-spacing: 0;
+    padding: .1em .5ex;
+    word-spacing: -.15em;
+    background-color: #f7f7f8;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    line-height: 1.45;
+    text-rendering: optimizeSpeed;
+    word-wrap: break-word
+}
+
+*:not(pre)>code.nobreak {
+    word-wrap: normal
+}
+
+*:not(pre)>code.nowrap {
+    white-space: nowrap
+}
+
+pre,
+pre>code {
+    line-height: 1.45;
+    color: #585ac2;
+    font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
+    font-weight: 400;
+    text-rendering: optimizeSpeed
+}
+
+em em {
+    font-style: normal
+}
+
+strong strong {
+    font-weight: 400
+}
+
+.keyseq {
+    color: rgba(51, 51, 51, .8)
+}
+
+kbd {
+    font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
+    display: inline-block;
+    color: rgba(0, 0, 0, .8);
+    font-size: .65em;
+    line-height: 1.45;
+    background-color: #f7f7f7;
+    border: 1px solid #dddddd;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+    -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em white inset;
+    box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset;
+    margin: 0 .15em;
+    padding: .2em .5em;
+    vertical-align: middle;
+    position: relative;
+    top: -.1em;
+    white-space: nowrap
+}
+
+.keyseq kbd:first-child {
+    margin-left: 0
+}
+
+.keyseq kbd:last-child {
+    margin-right: 0
+}
+
+.menuseq,
+.menuref {
+    color: #000
+}
+
+.menuseq b:not(.caret),.menuref {
+    font-weight: inherit
+}
+
+.menuseq {
+    word-spacing: -.02em
+}
+
+.menuseq b.caret {
+    font-size: 1.25em;
+    line-height: .8
+}
+
+.menuseq i.caret {
+    font-weight: bold;
+    text-align: center;
+    width: .45em
+}
+
+b.button::before,
+b.button::after {
+    position: relative;
+    top: -1px;
+    font-weight: 400
+}
+
+b.button::before {
+    content: "[";
+    padding: 0 3px 0 2px
+}
+
+b.button::after {
+    content: "]";
+    padding: 0 2px 0 3px
+}
+
+p a>code:hover {
+    color: #585ac2;
+}
+
+#header,
+#content,
+#footnotes,
+#footer {
+    width: 100%;
+    margin-left: auto;
+    margin-right: auto;
+    margin-top: 0;
+    margin-bottom: 0;
+    max-width: 62.5em;
+    *zoom: 1;
+    position: relative;
+    padding-left: .9375em;
+    padding-right: .9375em
+}
+
+#header::before,
+#header::after,
+#content::before,
+#content::after,
+#footnotes::before,
+#footnotes::after,
+#footer::before,
+#footer::after {
+    content: " ";
+    display: table
+}
+
+#header::after,
+#content::after,
+#footnotes::after,
+#footer::after {
+    clear: both
+}
+
+#content {
+    margin-top: 1.25em
+}
+
+#content::before {
+    content: none
+}
+
+#header>h1:first-child {
+    color: #303284;
+    margin-top: 2.25rem;
+    margin-bottom: 0
+}
+
+#header>h1:first-child+#toc {
+    margin-top: 8px;
+    border-top: 1px solid #dddddd
+}
+
+#header>h1:only-child,
+body.toc2 #header>h1:nth-last-child(2) {
+    border-bottom: 1px solid #dddddd;
+    padding-bottom: 8px
+}
+
+#header .details {
+    border-bottom: 1px solid #dddddd;
+    line-height: 1.45;
+    padding-top: .25em;
+    padding-bottom: .25em;
+    padding-left: .25em;
+    color: rgba(0, 0, 0, .6);
+    display: -ms-flexbox;
+    display: -webkit-flex;
+    display: flex;
+    -ms-flex-flow: row wrap;
+    -webkit-flex-flow: row wrap;
+    flex-flow: row wrap
+}
+
+#header .details span:first-child {
+    margin-left: -.125em
+}
+
+#header .details span.email a {
+    color: rgba(0, 0, 0, .85)
+}
+
+#header .details br {
+    display: none
+}
+
+#header .details br+span::before {
+    content: "\00a0\2013\00a0"
+}
+
+#header .details br+span.author::before {
+    content: "\00a0\22c5\00a0";
+    color: rgba(0, 0, 0, .85)
+}
+
+#header .details br+span#revremark::before {
+    content: "\00a0|\00a0"
+}
+
+#header #revnumber {
+    text-transform: capitalize
+}
+
+#header #revnumber::after {
+    content: "\00a0"
+}
+
+#content>h1:first-child:not([class]) {
+    color: rgba(0, 0, 0, .85);
+    border-bottom: 1px solid #dddddd
+;
+    padding-bottom: 8px;
+    margin-top: 0;
+    padding-top: 1rem;
+    margin-bottom: 1.25rem
+}
+
+#toc {
+    border-bottom: 1px solid #dddddd;
+    padding-bottom: .5em
+}
+
+#toc>ul {
+    margin-left: .125em
+}
+
+#toc ul.sectlevel0>li>a {
+    font-style: italic
+}
+
+#toc ul.sectlevel0 ul.sectlevel1 {
+    margin: .5em 0
+}
+
+#toc ul {
+    font-family: "Droid Serif", "DejaVu Sans", sans-serif;
+    list-style-type: none
+}
+
+#toc li {
+    line-height: 1.3334;
+    margin-top: .3334em
+}
+
+#toc a {
+    text-decoration: none
+}
+
+#toc a:active {
+    text-decoration: underline
+}
+
+#toctitle {
+    color: #303284;
+    font-size: 1.2em
+}
+
+@media screen and (min-width:768px) {
+    #toctitle {
+        font-size: 1.375em
+    }
+
+    body.toc2 {
+        padding-left: 15em;
+        padding-right: 0
+    }
+
+    #toc.toc2 {
+        margin-top: 0 !important;
+        background-color: #eee;
+        position: fixed;
+        width: 15em;
+        left: 0;
+        top: 0;
+        border-right: 1px solid #dddddd;
+        border-top-width: 0 !important;
+        border-bottom-width: 0 !important;
+        z-index: 1000;
+        padding: 1.25em 1em;
+        height: 100%;
+        overflow: auto
+    }
+
+    #toc.toc2 #toctitle {
+        margin-top: 0;
+        margin-bottom: .8rem;
+        font-size: 1.2em
+    }
+
+    #toc.toc2>ul {
+        font-size: .9em;
+        margin-bottom: 0
+    }
+
+    #toc.toc2 ul ul {
+        margin-left: 0;
+        padding-left: 1em
+    }
+
+    #toc.toc2 ul.sectlevel0 ul.sectlevel1 {
+        padding-left: 0;
+        margin-top: .5em;
+        margin-bottom: .5em
+    }
+
+    body.toc2.toc-right {
+        padding-left: 0;
+        padding-right: 15em
+    }
+
+    body.toc2.toc-right #toc.toc2 {
+        border-right-width: 0;
+        border-left: 1px solid #dddddd;
+        left: auto;
+        right: 0
+    }
+
+}
+
+@media screen and (min-width:1280px) {
+    body.toc2 {
+        padding-left: 20em;
+        padding-right: 0
+    }
+
+    #toc.toc2 {
+        width: 20em
+    }
+
+    #toc.toc2 #toctitle {
+        font-size: 1.375em
+    }
+
+    #toc.toc2>ul {
+        font-size: .95em
+    }
+
+    #toc.toc2 ul ul {
+        padding-left: 1.25em
+    }
+
+    body.toc2.toc-right {
+        padding-left: 0;
+        padding-right: 20em
+    }
+
+}
+
+#content #toc {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #dddddd;
+    margin-bottom: 1.25em;
+    padding: 1.25em;
+    background: #f8f8f7;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+#content #toc>:first-child {
+    margin-top: 0
+}
+
+#content #toc>:last-child {
+    margin-bottom: 0
+}
+
+#footer {
+    max-width: 100%;
+    background-color: #303284;
+    padding: 1.25em
+}
+
+#footer-text {
+    color: #fff;
+    line-height: 1.44
+}
+
+#content {
+    margin-bottom: .625em
+}
+
+.sect1 {
+    padding-bottom: .625em
+}
+
+@media screen and (min-width:768px) {
+    #content {
+        margin-bottom: 1.25em
+    }
+
+    .sect1 {
+        padding-bottom: 1.25em
+    }
+
+}
+
+.sect1:last-child {
+    padding-bottom: 0
+}
+
+.sect1+.sect1 {
+    border-top: 1px solid #dddddd;
+}
+
+#content h1>a.anchor,
+h2>a.anchor,
+h3>a.anchor,
+#toctitle>a.anchor,
+.sidebarblock>.content>.title>a.anchor,
+h4>a.anchor,
+h5>a.anchor,
+h6>a.anchor {
+    position: absolute;
+    z-index: 1001;
+    width: 1.5ex;
+    margin-left: -1.5ex;
+    display: block;
+    text-decoration: none !important;
+    visibility: hidden;
+    text-align: center;
+    font-weight: 400
+}
+
+#content h1>a.anchor::before,
+h2>a.anchor::before,
+h3>a.anchor::before,
+#toctitle>a.anchor::before,
+.sidebarblock>.content>.title>a.anchor::before,
+h4>a.anchor::before,
+h5>a.anchor::before,
+h6>a.anchor::before {
+    content: "\00A7";
+    font-size: .85em;
+    display: block;
+    padding-top: .1em
+}
+
+#content h1:hover>a.anchor,
+#content h1>a.anchor:hover,
+h2:hover>a.anchor,
+h2>a.anchor:hover,
+h3:hover>a.anchor,
+#toctitle:hover>a.anchor,
+.sidebarblock>.content>.title:hover>a.anchor,
+h3>a.anchor:hover,
+#toctitle>a.anchor:hover,
+.sidebarblock>.content>.title>a.anchor:hover,
+h4:hover>a.anchor,
+h4>a.anchor:hover,
+h5:hover>a.anchor,
+h5>a.anchor:hover,
+h6:hover>a.anchor,
+h6>a.anchor:hover {
+    visibility: visible
+}
+
+#content h1>a.link,
+h2>a.link,
+h3>a.link,
+#toctitle>a.link,
+.sidebarblock>.content>.title>a.link,
+h4>a.link,
+h5>a.link,
+h6>a.link {
+    color: #ba3925;
+    text-decoration: none
+}
+
+#content h1>a.link:hover,
+h2>a.link:hover,
+h3>a.link:hover,
+#toctitle>a.link:hover,
+.sidebarblock>.content>.title>a.link:hover,
+h4>a.link:hover,
+h5>a.link:hover,
+h6>a.link:hover {
+    color: #a53221
+}
+
+.audioblock,
+.imageblock,
+.literalblock,
+.listingblock,
+.stemblock,
+.videoblock {
+    margin-bottom: 1.25em
+}
+
+.admonitionblock td.content>.title,
+.audioblock>.title,
+.exampleblock>.title,
+.imageblock>.title,
+.listingblock>.title,
+.literalblock>.title,
+.stemblock>.title,
+.openblock>.title,
+.paragraph>.title,
+.quoteblock>.title,
+table.tableblock>.title,
+.verseblock>.title,
+.videoblock>.title,
+.dlist>.title,
+.olist>.title,
+.ulist>.title,
+.qlist>.title,
+.hdlist>.title {
+    text-rendering: optimizeLegibility;
+    text-align: left;
+    font-family: "Droid Serif", "DejaVu Serif", serif;
+    font-size: 1rem;
+    font-style: italic
+}
+
+table.tableblock.fit-content>caption.title {
+    white-space: nowrap;
+    width: 0
+}
+
+.paragraph.lead>p,
+#preamble>.sectionbody>[class="paragraph"]:first-of-type p {
+    font-size: 1.21875em;
+    line-height: 1.6;
+    color: rgba(0, 0, 0, .85)
+}
+
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p {
+    font-size: inherit
+}
+
+.admonitionblock>table {
+    border-collapse: separate;
+    border: 0;
+    background: none;
+    width: 100%
+}
+
+.admonitionblock>table td.icon {
+    text-align: center;
+    width: 80px
+}
+
+.admonitionblock>table td.icon img {
+    max-width: none
+}
+
+.admonitionblock>table td.icon .title {
+    font-weight: bold;
+    font-family: "Open Sans", "DejaVu Sans", sans-serif;
+    text-transform: uppercase
+}
+
+.admonitionblock>table td.content {
+    padding-left: 1.125em;
+    padding-right: 1.25em;
+    border-left: 1px solid #dddddd;
+    color: rgba(0, 0, 0, .6)
+}
+
+.admonitionblock>table td.content>:last-child>:last-child {
+    margin-bottom: 0
+}
+
+.exampleblock>.content {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #dddddd;
+    margin-bottom: 1.25em;
+    padding: 1.25em;
+    background: #fff;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+.exampleblock>.content>:first-child {
+    margin-top: 0
+}
+
+.exampleblock>.content>:last-child {
+    margin-bottom: 0
+}
+
+.sidebarblock {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #dddddd;
+    margin-bottom: 1.25em;
+    padding: 1.25em;
+    background: #f8f8f7;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+.sidebarblock>:first-child {
+    margin-top: 0
+}
+
+.sidebarblock>:last-child {
+    margin-bottom: 0
+}
+
+.sidebarblock>.content>.title {
+    color: #303284;
+    margin-top: 0;
+    text-align: center
+}
+
+.exampleblock>.content>:last-child>:last-child,
+.exampleblock>.content .olist>ol>li:last-child>:last-child,
+.exampleblock>.content .ulist>ul>li:last-child>:last-child,
+.exampleblock>.content .qlist>ol>li:last-child>:last-child,
+.sidebarblock>.content>:last-child>:last-child,
+.sidebarblock>.content .olist>ol>li:last-child>:last-child,
+.sidebarblock>.content .ulist>ul>li:last-child>:last-child,
+.sidebarblock>.content .qlist>ol>li:last-child>:last-child {
+    margin-bottom: 0
+}
+
+.literalblock pre,
+.listingblock pre:not(.highlight),.listingblock 
pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock 
pre.CodeRay,.listingblock pre.prettyprint {
+    background: #f7f7f8
+}
+
+.sidebarblock .literalblock pre,
+.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock 
pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight 
"],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock 
pre.prettyprint {
+    background: #f2f1f1
+}
+
+.literalblock pre,
+.literalblock pre[class],
+.listingblock pre,
+.listingblock pre[class] {
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    word-wrap: break-word;
+    padding: 1em;
+    font-size: .8125em
+}
+
+.literalblock pre.nowrap,
+.literalblock pre[class].nowrap,
+.listingblock pre.nowrap,
+.listingblock pre[class].nowrap {
+    overflow-x: auto;
+    white-space: pre;
+    word-wrap: normal
+}
+
+@media screen and (min-width:768px) {
+    .literalblock pre,
+    .literalblock pre[class],
+    .listingblock pre,
+    .listingblock pre[class] {
+        font-size: .90625em
+    }
+
+}
+
+@media screen and (min-width:1280px) {
+    .literalblock pre,
+    .literalblock pre[class],
+    .listingblock pre,
+    .listingblock pre[class] {
+        font-size: 1em
+    }
+
+}
+
+.literalblock.output pre {
+    color: #f7f7f8;
+    background-color: rgba(0, 0, 0, .9)
+}
+
+.listingblock pre.highlightjs {
+    padding: 0
+}
+
+.listingblock pre.highlightjs>code {
+    padding: 1em;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+.listingblock pre.prettyprint {
+    border-width: 0
+}
+
+.listingblock>.content {
+    position: relative
+}
+
+.listingblock code[data-lang]::before {
+    display: none;
+    content: attr(data-lang);
+    position: absolute;
+    font-size: .75em;
+    top: .425rem;
+    right: .5rem;
+    line-height: 1;
+    text-transform: uppercase;
+    color: #999
+}
+
+.listingblock:hover code[data-lang]::before {
+    display: block
+}
+
+.listingblock.terminal pre .command::before {
+    content: attr(data-prompt);
+    padding-right: .5em;
+    color: #999
+}
+
+.listingblock.terminal pre .command:not([data-prompt])::before {
+    content: "$"
+}
+
+table.pyhltable {
+    border-collapse: separate;
+    border: 0;
+    margin-bottom: 0;
+    background: none
+}
+
+table.pyhltable td {
+    vertical-align: top;
+    padding-top: 0;
+    padding-bottom: 0;
+    line-height: 1.45
+}
+
+table.pyhltable td.code {
+    padding-left: .75em;
+    padding-right: 0
+}
+
+pre.pygments .lineno,
+table.pyhltable td:not(.code) {
+    color: #999;
+    padding-left: 0;
+    padding-right: .5em;
+    border-right: 1px solid #dddddd;
+}
+
+pre.pygments .lineno {
+    display: inline-block;
+    margin-right: .25em
+}
+
+table.pyhltable .linenodiv {
+    background: none !important;
+    padding-right: 0 !important
+}
+
+.quoteblock {
+    margin: 0 1em 1.25em 1.5em;
+    display: table
+}
+
+.quoteblock>.title {
+    margin-left: -1.5em;
+    margin-bottom: .75em
+}
+
+.quoteblock blockquote,
+.quoteblock blockquote p {
+    color: rgba(0, 0, 0, .85);
+    font-size: 1.05rem;
+    line-height: 1.75;
+    word-spacing: .1em;
+    letter-spacing: 0;
+    font-style: italic;
+    text-align: justify
+}
+
+.quoteblock blockquote {
+    margin: 0;
+    padding: 0;
+    border: 0
+}
+
+.quoteblock blockquote::before {
+    content: "\201c";
+    float: left;
+    font-size: 2.75em;
+    font-weight: bold;
+    line-height: .6em;
+    margin-left: -.6em;
+    color: #303284;
+    text-shadow: 0 1px 2px rgba(0, 0, 0, .1)
+}
+
+.quoteblock blockquote>.paragraph:last-child p {
+    margin-bottom: 0
+}
+
+.quoteblock .attribution {
+    margin-top: .5em;
+    margin-right: .5ex;
+    text-align: right
+}
+
+.quoteblock .quoteblock {
+    margin-left: 0;
+    margin-right: 0;
+    padding: .5em 0;
+    border-left: 3px solid rgba(0, 0, 0, .6)
+}
+
+.quoteblock .quoteblock blockquote {
+    padding: 0 0 0 .75em
+}
+
+.quoteblock .quoteblock blockquote::before {
+    display: none
+}
+
+.verseblock {
+    margin: 0 1em 1.25em
+}
+
+.verseblock pre {
+    font-family: "Open Sans", "DejaVu Sans", sans;
+    font-size: 1.15rem;
+    color: rgba(0, 0, 0, .85);
+    font-weight: 300;
+    text-rendering: optimizeLegibility
+}
+
+.verseblock pre strong {
+    font-weight: 400
+}
+
+.verseblock .attribution {
+    margin-top: 1.25rem;
+    margin-left: .5ex
+}
+
+.quoteblock .attribution,
+.verseblock .attribution {
+    font-size: .9375em;
+    line-height: 1.45;
+    font-style: italic
+}
+
+.quoteblock .attribution br,
+.verseblock .attribution br {
+    display: none
+}
+
+.quoteblock .attribution cite,
+.verseblock .attribution cite {
+    display: block;
+    letter-spacing: -.025em;
+    color: rgba(0, 0, 0, .6)
+}
+
+.quoteblock.abstract {
+    margin: 0 1em 1.25em;
+    display: block
+}
+
+.quoteblock.abstract>.title {
+    margin: 0 0 .375em;
+    font-size: 1.15em;
+    text-align: center
+}
+
+.quoteblock.abstract blockquote,
+.quoteblock.abstract blockquote p {
+    word-spacing: 0;
+    line-height: 1.6
+}
+
+.quoteblock.abstract blockquote::before,
+.quoteblock.abstract p::before {
+    display: none
+}
+
+table.tableblock {
+    max-width: 100%;
+    border-collapse: separate
+}
+
+p.tableblock:last-child {
+    margin-bottom: 0
+}
+
+td.tableblock>.content {
+    margin-bottom: -1.25em
+}
+
+table.tableblock,
+th.tableblock,
+td.tableblock {
+    border: 0 solid #dddddd;
+}
+
+table.grid-all>thead>tr>.tableblock,
+table.grid-all>tbody>tr>.tableblock {
+    border-width: 0 1px 1px 0
+}
+
+table.grid-all>tfoot>tr>.tableblock {
+    border-width: 1px 1px 0 0
+}
+
+table.grid-cols>*>tr>.tableblock {
+    border-width: 0 1px 0 0
+}
+
+table.grid-rows>thead>tr>.tableblock,
+table.grid-rows>tbody>tr>.tableblock {
+    border-width: 0 0 1px
+}
+
+table.grid-rows>tfoot>tr>.tableblock {
+    border-width: 1px 0 0
+}
+
+table.grid-all>*>tr>.tableblock:last-child,
+table.grid-cols>*>tr>.tableblock:last-child {
+    border-right-width: 0
+}
+
+table.grid-all>tbody>tr:last-child>.tableblock,
+table.grid-all>thead:last-child>tr>.tableblock,
+table.grid-rows>tbody>tr:last-child>.tableblock,
+table.grid-rows>thead:last-child>tr>.tableblock {
+    border-bottom-width: 0
+}
+
+table.frame-all {
+    border-width: 1px
+}
+
+table.frame-sides {
+    border-width: 0 1px
+}
+
+table.frame-topbot,
+table.frame-ends {
+    border-width: 1px 0
+}
+
+table.stripes-all tr,
+table.stripes-odd tr:nth-of-type(odd) {
+    background: #f8f8f7
+}
+
+table.stripes-none tr,
+table.stripes-odd tr:nth-of-type(even) {
+    background: none
+}
+
+th.halign-left,
+td.halign-left {
+    text-align: left
+}
+
+th.halign-right,
+td.halign-right {
+    text-align: right
+}
+
+th.halign-center,
+td.halign-center {
+    text-align: center
+}
+
+th.valign-top,
+td.valign-top {
+    vertical-align: top
+}
+
+th.valign-bottom,
+td.valign-bottom {
+    vertical-align: bottom
+}
+
+th.valign-middle,
+td.valign-middle {
+    vertical-align: middle
+}
+
+table thead th,
+table tfoot th {
+    font-weight: bold
+}
+
+tbody tr th {
+    display: table-cell;
+    line-height: 1.6;
+    background: #f7f8f7
+}
+
+tbody tr th,
+tbody tr th p,
+tfoot tr th,
+tfoot tr th p {
+    color: rgba(0, 0, 0, .8);
+    font-weight: bold
+}
+
+p.tableblock>code:only-child {
+    background: none;
+    padding: 0
+}
+
+p.tableblock {
+    font-size: 1em
+}
+
+td>div.verse {
+    white-space: pre
+}
+
+ol {
+    margin-left: 1.75em
+}
+
+ul li ol {
+    margin-left: 1.5em
+}
+
+dl dd {
+    margin-left: 1.125em
+}
+
+dl dd:last-child,
+dl dd:last-child>:last-child {
+    margin-bottom: 0
+}
+
+ol>li p,
+ul>li p,
+ul dd,
+ol dd,
+.olist .olist,
+.ulist .ulist,
+.ulist .olist,
+.olist .ulist {
+    margin-bottom: .625em
+}
+
+ul.checklist,
+ul.none,
+ol.none,
+ul.no-bullet,
+ol.no-bullet,
+ol.unnumbered,
+ul.unstyled,
+ol.unstyled {
+    list-style-type: none
+}
+
+ul.no-bullet,
+ol.no-bullet,
+ol.unnumbered {
+    margin-left: .625em
+}
+
+ul.unstyled,
+ol.unstyled {
+    margin-left: 0
+}
+
+ul.checklist {
+    margin-left: .625em
+}
+
+ul.checklist li>p:first-child>.fa-square-o:first-child,
+ul.checklist li>p:first-child>.fa-check-square-o:first-child {
+    width: 1.25em;
+    font-size: .8em;
+    position: relative;
+    bottom: .125em
+}
+
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child {
+    margin-right: .25em
+}
+
+ul.inline {
+    display: -ms-flexbox;
+    display: -webkit-box;
+    display: flex;
+    -ms-flex-flow: row wrap;
+    -webkit-flex-flow: row wrap;
+    flex-flow: row wrap;
+    list-style: none;
+    margin: 0 0 .625em -1.25em
+}
+
+ul.inline>li {
+    margin-left: 1.25em
+}
+
+.unstyled dl dt {
+    font-weight: 400;
+    font-style: normal
+}
+
+ol.arabic {
+    list-style-type: decimal
+}
+
+ol.decimal {
+    list-style-type: decimal-leading-zero
+}
+
+ol.loweralpha {
+    list-style-type: lower-alpha
+}
+
+ol.upperalpha {
+    list-style-type: upper-alpha
+}
+
+ol.lowerroman {
+    list-style-type: lower-roman
+}
+
+ol.upperroman {
+    list-style-type: upper-roman
+}
+
+ol.lowergreek {
+    list-style-type: lower-greek
+}
+
+.hdlist>table,
+.colist>table {
+    border: 0;
+    background: none
+}
+
+.hdlist>table>tbody>tr,
+.colist>table>tbody>tr {
+    background: none
+}
+
+td.hdlist1,
+td.hdlist2 {
+    vertical-align: top;
+    padding: 0 .625em
+}
+
+td.hdlist1 {
+    font-weight: bold;
+    padding-bottom: 1.25em
+}
+
+.literalblock+.colist,
+.listingblock+.colist {
+    margin-top: -.5em
+}
+
+.colist td:not([class]):first-child {
+    padding: .4em .75em 0;
+    line-height: 1;
+    vertical-align: top
+}
+
+.colist td:not([class]):first-child img {
+    max-width: none
+}
+
+.colist td:not([class]):last-child {
+    padding: .25em 0
+}
+
+.thumb,
+.th {
+    line-height: 0;
+    display: inline-block;
+    border: solid 4px #fff;
+    -webkit-box-shadow: 0 0 0 1px #ddd;
+    box-shadow: 0 0 0 1px #ddd
+}
+
+.imageblock.left,
+.imageblock[style*="float:left"] {
+    margin: .25em .625em 1.25em 0
+}
+
+.imageblock.right,
+.imageblock[style*="float:right"] {
+    margin: .25em 0 1.25em .625em
+}
+
+.imageblock>.title {
+    margin-bottom: 0
+}
+
+.imageblock.thumb,
+.imageblock.th {
+    border-width: 6px
+}
+
+.imageblock.thumb>.title,
+.imageblock.th>.title {
+    padding: 0 .125em
+}
+
+.image.left,
+.image.right {
+    margin-top: .25em;
+    margin-bottom: .25em;
+    display: inline-block;
+    line-height: 0
+}
+
+.image.left {
+    margin-right: .625em
+}
+
+.image.right {
+    margin-left: .625em
+}
+
+a.image {
+    text-decoration: none;
+    display: inline-block
+}
+
+a.image object {
+    pointer-events: none
+}
+
+sup.footnote,
+sup.footnoteref {
+    font-size: .875em;
+    position: static;
+    vertical-align: super
+}
+
+sup.footnote a,
+sup.footnoteref a {
+    text-decoration: none
+}
+
+sup.footnote a:active,
+sup.footnoteref a:active {
+    text-decoration: underline
+}
+
+#footnotes {
+    padding-top: .75em;
+    padding-bottom: .75em;
+    margin-bottom: .625em
+}
+
+#footnotes hr {
+    width: 20%;
+    min-width: 6.25em;
+    margin: -.25em 0 .75em;
+    border-width: 1px 0 0
+}
+
+#footnotes .footnote {
+    padding: 0 .375em 0 .225em;
+    line-height: 1.3334;
+    font-size: .875em;
+    margin-left: 1.2em;
+    margin-bottom: .2em
+}
+
+#footnotes .footnote a:first-of-type {
+    font-weight: bold;
+    text-decoration: none;
+    margin-left: -1.05em
+}
+
+#footnotes .footnote:last-of-type {
+    margin-bottom: 0
+}
+
+#content #footnotes {
+    margin-top: -.625em;
+    margin-bottom: 0;
+    padding: .75em 0
+}
+
+.gist .file-data>table {
+    border: 0;
+    background: #fff;
+    width: 100%;
+    margin-bottom: 0
+}
+
+.gist .file-data>table td.line-data {
+    width: 99%
+}
+
+div.unbreakable {
+    page-break-inside: avoid
+}
+
+.big {
+    font-size: larger
+}
+
+.small {
+    font-size: smaller
+}
+
+.underline {
+    text-decoration: underline
+}
+
+.overline {
+    text-decoration: overline
+}
+
+.line-through {
+    text-decoration: line-through
+}
+
+.aqua {
+    color: #00bfbf
+}
+
+.aqua-background {
+    background-color: #00fafa
+}
+
+.black {
+    color: #000
+}
+
+.black-background {
+    background-color: #000
+}
+
+.blue {
+    color: #0000bf
+}
+
+.blue-background {
+    background-color: #0000fa
+}
+
+.fuchsia {
+    color: #bf00bf
+}
+
+.fuchsia-background {
+    background-color: #fa00fa
+}
+
+.gray {
+    color: #606060
+}
+
+.gray-background {
+    background-color: #7d7d7d
+}
+
+.green {
+    color: #006000
+}
+
+.green-background {
+    background-color: #007d00
+}
+
+.lime {
+    color: #00bf00
+}
+
+.lime-background {
+    background-color: #00fa00
+}
+
+.maroon {
+    color: #600000
+}
+
+.maroon-background {
+    background-color: #7d0000
+}
+
+.navy {
+    color: #000060
+}
+
+.navy-background {
+    background-color: #00007d
+}
+
+.olive {
+    color: #606000
+}
+
+.olive-background {
+    background-color: #7d7d00
+}
+
+.purple {
+    color: #600060
+}
+
+.purple-background {
+    background-color: #7d007d
+}
+
+.red {
+    color: #bf0000
+}
+
+.red-background {
+    background-color: #fa0000
+}
+
+.silver {
+    color: #909090
+}
+
+.silver-background {
+    background-color: #bcbcbc
+}
+
+.teal {
+    color: #006060
+}
+
+.teal-background {
+    background-color: #007d7d
+}
+
+.white {
+    color: #bfbfbf
+}
+
+.white-background {
+    background-color: #fafafa
+}
+
+.yellow {
+    color: #bfbf00
+}
+
+.yellow-background {
+    background-color: #fafa00
+}
+
+span.icon>.fa {
+    cursor: default
+}
+
+a span.icon>.fa {
+    cursor: inherit
+}
+
+.admonitionblock td.icon [class^="fa icon-"] {
+    font-size: 2.5em;
+    text-shadow: 1px 1px 2px rgba(0, 0, 0, .5);
+    cursor: default
+}
+
+.admonitionblock td.icon .icon-note::before {
+    content: "\f05a";
+    color: #19407c
+}
+
+.admonitionblock td.icon .icon-tip::before {
+    content: "\f0eb";
+    text-shadow: 1px 1px 2px rgba(155, 155, 0, .8);
+    color: #111
+}
+
+.admonitionblock td.icon .icon-warning::before {
+    content: "\f071";
+    color: #bf6900
+}
+
+.admonitionblock td.icon .icon-caution::before {
+    content: "\f06d";
+    color: #bf3400
+}
+
+.admonitionblock td.icon .icon-important::before {
+    content: "\f06a";
+    color: #bf0000
+}
+
+.conum[data-value] {
+    display: inline-block;
+    color: #fff !important;
+    background-color: rgba(0, 0, 0, .8);
+    -webkit-border-radius: 100px;
+    border-radius: 100px;
+    text-align: center;
+    font-size: .75em;
+    width: 1.67em;
+    height: 1.67em;
+    line-height: 1.67em;
+    font-family: "Open Sans", "DejaVu Sans", sans-serif;
+    font-style: normal;
+    font-weight: bold
+}
+
+.conum[data-value] * {
+    color: #fff !important
+}
+
+.conum[data-value]+b {
+    display: none
+}
+
+.conum[data-value]::after {
+    content: attr(data-value)
+}
+
+pre .conum[data-value] {
+    position: relative;
+    top: -.125em
+}
+
+b.conum * {
+    color: inherit !important
+}
+
+.conum:not([data-value]):empty {
+    display: none
+}
+
+dt,
+th.tableblock,
+td.content,
+div.footnote {
+    text-rendering: optimizeLegibility
+}
+
+h1,
+h2,
+p,
+td.content,
+span.alt {
+    letter-spacing: -.01em
+}
+
+p strong,
+td.content strong,
+div.footnote strong {
+    letter-spacing: -.005em
+}
+
+p,
+blockquote,
+dt,
+td.content,
+span.alt {
+    /*font-size: 1.0625rem*/
+}
+
+p {
+    margin-bottom: 1.25rem
+}
+
+.sidebarblock p,
+.sidebarblock dt,
+.sidebarblock td.content,
+p.tableblock {
+    font-size: 1em
+}
+
+.exampleblock>.content {
+    background-color: #fffef7;
+    border-color: #dddddd;
+    -webkit-box-shadow: 0 1px 4px #e0e0dc;
+    box-shadow: 0 1px 4px #e0e0dc
+}
+
+.print-only {
+    display: none !important
+}
+
+@page {
+    margin: 1.25cm .75cm
+}
+
+@media print {
+    * {
+        -webkit-box-shadow: none !important;
+        box-shadow: none !important;
+        text-shadow: none !important
+    }
+
+    html {
+        font-size: 80%
+    }
+
+    a {
+        color: inherit !important;
+        text-decoration: underline !important
+    }
+
+    a.bare,
+    a[href^="#"],
+    a[href^="mailto:";] {
+        text-decoration: none !important
+    }
+
+    a[href^="http:"]:not(.bare)::after,
+    a[href^="https:"]:not(.bare)::after {
+        content: "("attr(href) ")";
+        display: inline-block;
+        font-size: .875em;
+        padding-left: .25em
+    }
+
+    abbr[title]::after {
+        content: " ("attr(title) ")"
+    }
+
+    pre,
+    blockquote,
+    tr,
+    img,
+    object,
+    svg {
+        page-break-inside: avoid
+    }
+
+    thead {
+        display: table-header-group
+    }
+
+    svg {
+        max-width: 100%
+    }
+
+    p,
+    blockquote,
+    dt,
+    td.content {
+        font-size: 1em;
+        orphans: 3;
+        widows: 3
+    }
+
+    h2,
+    h3,
+    #toctitle,
+    .sidebarblock>.content>.title {
+        page-break-after: avoid
+    }
+
+    #toc,
+    .sidebarblock,
+    .exampleblock>.content {
+        background: none !important
+    }
+
+    #toc {
+        border-bottom: 1px solid #dddddd !important;
+        padding-bottom: 0 !important
+    }
+
+    body.book #header {
+        text-align: center
+    }
+
+    body.book #header>h1:first-child {
+        border: 0 !important;
+        margin: 2.5em 0 1em
+    }
+
+    body.book #header .details {
+        border: 0 !important;
+        display: block;
+        padding: 0 !important
+    }
+
+    body.book #header .details span:first-child {
+        margin-left: 0 !important
+    }
+
+    body.book #header .details br {
+        display: block
+    }
+
+    body.book #header .details br+span::before {
+        content: none !important
+    }
+
+    body.book #toc {
+        border: 0 !important;
+        text-align: left !important;
+        padding: 0 !important;
+        margin: 0 !important
+    }
+
+    body.book #toc,
+    body.book #preamble,
+    body.book h1.sect0,
+    body.book .sect1>h2 {
+        page-break-before: always
+    }
+
+    .listingblock code[data-lang]::before {
+        display: block
+    }
+
+    #footer {
+        padding: 0 .9375em
+    }
+
+    .hide-on-print {
+        display: none !important
+    }
+
+    .print-only {
+        display: block !important
+    }
+
+    .hide-for-print {
+        display: none !important
+    }
+
+    .show-for-print {
+        display: inherit !important
+    }
+
+}
+
+@media print, amzn-kf8 {
+    #header>h1:first-child {
+        margin-top: 1.25rem
+    }
+
+    .sect1 {
+        padding: 0 !important
+    }
+
+    .sect1+.sect1 {
+        border: 0
+    }
+
+    #footer {
+        background: none
+    }
+
+    #footer-text {
+        color: rgba(0, 0, 0, .6);
+        font-size: .9em
+    }
+
+}
+
+@media amzn-kf8 {
+    #header,
+    #content,
+    #footnotes,
+    #footer {
+        padding: 0
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/667b57c3/manual/src/archives/1.3/asciidoc/building-and-deploying.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.3/asciidoc/building-and-deploying.adoc 
b/manual/src/archives/1.3/asciidoc/building-and-deploying.adoc
new file mode 100644
index 0000000..b285779
--- /dev/null
+++ b/manual/src/archives/1.3/asciidoc/building-and-deploying.adoc
@@ -0,0 +1,276 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+=== Building
+
+==== Initial Setup
+
+1) Install J2SE 8.0 SDK (or later), which can be downloaded from
+ 
http://www.oracle.com/technetwork/java/javase/downloads/index.html[http://www.oracle.com/technetwork/java/javase/downloads/index.html]
+
+2) Make sure that your JAVA_HOME environment variable is set to the newly 
installed
+ JDK location, and that your PATH includes %JAVA_HOME%\bin (windows) or
+ $JAVA_HOME$/bin (unix).
+
+3) Install Maven 3.0.3 (or later), which can be downloaded from
+ http://maven.apache.org/download.html[http://maven.apache.org/download.html]. 
Make sure that your PATH includes
+ the MVN_HOME/bin directory.
+
+==== Building
+
+1) Change to the top level directory of Apache Unomi source distribution.
+2) Run
+
+[source]
+----
+     $> mvn clean install
+----
+
+This will compile Apache Unomi and run all of the tests in the
+ Apache Unomi source distribution. Alternatively, you can run
+
+[source]
+----
+     $> mvn -P \!integration-tests,\!performance-tests clean install
+----
+
+This will compile Apache Unomi without running the tests and takes less
+ time to build.
+
+3) The distributions will be available under "package/target" directory.
+
+==== Installing an ElasticSearch server
+
+Starting with version 1.2, Apache Unomi no longer embeds an ElasticSearch 
server as this is no longer supported by
+the developers of ElasticSearch. Therefore you will need to install a 
standalone ElasticSearch using the following steps:
+
+. 
+
+Download an ElasticSearch version. Here's the version you will need depending
+on your version of Apache Unomi.
+
+Apache Unomi &lt;= 1.2 : 
https://www.elastic.co/downloads/past-releases/elasticsearch-5-1-2[https://www.elastic.co/downloads/past-releases/elasticsearch-5-1-2]
+Apache Unomi &gt;= 1.3 : 
https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-3[https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-3]
+
+. 
+
+Uncompress the downloaded package into a directory
+
+. 
+
+In the config/elasticsearch.yml file, uncomment and modify the following line :
+
+[source]
+----
+cluster.name: contextElasticSearch
+----
+
+. 
+
+Launch the server using
+
+[source]
+----
+bin/elasticsearch (Mac, Linux)
+bin\elasticsearch.bat (Windows)
+----
+
+. 
+
+Check that the ElasticSearch is up and running by accessing the following URL 
: 
+
+http://localhost:9200[http://localhost:9200] 
+
+==== Deploying the generated binary package
+
+The "package" sub-project generates a pre-configured Apache Karaf installation 
that is the simplest way to get started.
+Simply uncompress the package/target/unomi-VERSION.tar.gz (for Linux or Mac OS 
X) or
+ package/target/unomi-VERSION.zip (for Windows) archive into the directory of 
your choice.
+
+You can then start the server simply by using the command on UNIX/Linux/MacOS 
X : 
+
+[source]
+----
+./bin/karaf    
+----
+
+or on Windows shell : 
+
+[source]
+----
+bin\karaf.bat
+----
+
+You will then need to launch (only on the first Karaf start) the Apache Unomi 
packages using the following Apache Karaf
+shell command:
+
+[source]
+----
+unomi:start        
+----
+
+==== Deploying into an existing Karaf server
+
+This is only needed if you didn't use the generated package. Also, this is the 
preferred way to install a development
+environment if you intend to re-deploy the context server KAR iteratively.
+
+Additional requirements:
+* Apache Karaf 3.x, http://karaf.apache.org[http://karaf.apache.org]
+
+. 
+
+Before deploying, make sure that you have Apache Karaf properly installed. You 
will also have to increase the
+default maximum memory size and perm gen size by adjusting the following 
environment values in the bin/setenv(.bat)
+files (at the end of the file):
+
+[source]
+----
+   MY_DIRNAME=`dirname $0`
+   MY_KARAF_HOME=`cd "$MY_DIRNAME/.."; pwd`
+   export JAVA_MAX_MEM=3G
+   export JAVA_MAX_PERM_MEM=384M
+----
+
+. 
+
+Install the WAR support, CXF and Karaf Cellar into Karaf by doing the 
following in the Karaf command line:
+
+[source]
+----
+   feature:repo-add cxf 3.0.2
+   feature:repo-add cellar 3.0.3
+   feature:repo-add mvn:org.apache.unomi/unomi-kar/VERSION/xml/features
+   feature:install unomi-kar
+----
+
+. 
+
+Create a new $MY_KARAF_HOME/etc/org.apache.cxf.osgi.cfg file and put the 
following property inside :
+
+[source]
+----
+   org.apache.cxf.servlet.context=/cxs
+----
+
+. 
+
+If all went smoothly, you should be able to access the context script here : 
http://localhost:8181/cxs/cluster[http://localhost:8181/cxs/cluster] .
+ You should be able to login with karaf / karaf and see basic server 
information. If not something went wrong during the install.
+
+==== JDK Selection on Mac OS X
+
+You might need to select the JDK to run the tests in the itests subproject. In 
order to do so you can list the
+installed JDKs with the following command : 
+
+[source]
+----
+/usr/libexec/java_home -V
+----
+
+which will output something like this : 
+
+[source]
+----
+Matching Java Virtual Machines (7):
+    1.7.0_51, x86_64:   "Java SE 7"   
/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
+    1.7.0_45, x86_64:   "Java SE 7"   
/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
+    1.7.0_25, x86_64:   "Java SE 7"   
/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
+    1.6.0_65-b14-462, x86_64:   "Java SE 6"   
/Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home
+    1.6.0_65-b14-462, i386: "Java SE 6" 
/Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home
+    1.6.0_65-b14-462, x86_64:   "Java SE 6"   
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
+    1.6.0_65-b14-462, i386: "Java SE 6" 
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
+----
+
+You can then select the one you want using : 
+
+[source]
+----
+export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_51`
+----
+
+and then check that it was correctly referenced using: 
+
+[source]
+----
+java -version
+----
+
+which should give you a result such as this: 
+
+[source]
+----
+java version "1.7.0_51"
+Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
+Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
+----
+
+==== Running the integration tests
+
+The integration tests are not executed by default to make build time minimal, 
but it is recommended to run the
+integration tests at least once before using the server to make sure that 
everything is ok in the build. Another way
+to use these tests is to run them from a continuous integration server such as 
Jenkins, Apache Gump, Atlassian Bamboo or
+ others. 
+
+Note : the integration tests require a JDK 7 or more recent !
+
+To run the tests simply activate the following profile : 
+
+[source]
+----
+mvn -P integration-tests clean install
+----
+
+==== Running the performance tests
+
+Performance tests are based on Gatling. You need to have a running context 
server or cluster of servers before
+executing the tests.
+
+Test parameteres are editable in the 
performance-tests/src/test/scala/unomi/Parameters.scala file. baseUrls should
+contains the URLs of all your cluster nodes
+
+Run the test by using the gatling.conf file in 
performance-tests/src/test/resources :
+
+[source]
+----
+    export GATLING_CONF=<path>/performance-tests/src/test/resources
+    gatling.sh
+----
+
+Reports are generated in performance-tests/target/results.
+
+==== Testing with an example page
+
+A default test page is provided at the following URL:
+
+[source]
+----
+   http://localhost:8181/index.html
+----
+
+This test page will trigger the loading of the /context.js script, which will 
try to retrieving the user context
+or create a new one if it doesn't exist yet. It also contains an experimental 
integration with Facebook Login, but it
+doesn't yet save the context back to the context server.
+
+==== Integrating onto a page
+
+Simply reference the context script in your HTML as in the following example:
+
+[source,javascript]
+----
+<script type="text/javascript">
+    (function(){ var u=(("https:" ==== document.location.protocol) ? 
"https://localhost:8181/"; : "http://localhost:8181/";);
+    var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0]; g.type='text/javascript'; g.defer=true; 
g.async=true; g.src=u+'context.js';
+    s.parentNode.insertBefore(g,s); })();
+</script>
+----
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/667b57c3/manual/src/archives/1.3/asciidoc/clustering.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.3/asciidoc/clustering.adoc 
b/manual/src/archives/1.3/asciidoc/clustering.adoc
new file mode 100644
index 0000000..0abc1f5
--- /dev/null
+++ b/manual/src/archives/1.3/asciidoc/clustering.adoc
@@ -0,0 +1,83 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+=== Cluster setup
+
+Apache Karaf relies on Apache Karaf Cellar, which in turn uses Hazelcast to 
discover and configure its cluster.
+You just need to install multiple context servers on the same network, and 
then (optionally) change the Hazelcast
+ configuration in the following file :
+
+[source]
+----
+etc/hazelcast.xml
+----
+
+All nodes on the same network, sharing the same cluster name will be part of 
the same cluster.
+
+For the actual ElasticSearch configuration however, this must be done using 
the following file:
+
+[source]
+----
+etc/org.apache.unomi.persistence.elasticsearch.cfg
+----
+
+Depending on the cluster size, you will want to adjust the following 
parameters to make sure your setup is optimal in
+terms of performance and safety.
+
+==== 2 nodes configuration
+
+One node dedicated to context server, 1 node for elasticsearch storage.
+
+Node A :
+
+[source]
+----
+numberOfReplicas=0
+monthlyIndex.numberOfReplicas=0
+----
+
+Node B :
+
+[source]
+----
+numberOfReplicas=0
+monthlyIndex.numberOfReplicas=0
+----
+
+==== 3 nodes configuration
+
+One node dedicated to context server, 2 nodes for elasticsearch storage with 
fault-tolerance
+
+Node A :
+
+[source]
+----
+numberOfReplicas=1
+monthlyIndex.numberOfReplicas=1
+----
+
+Node B :
+
+[source]
+----
+numberOfReplicas=1
+monthlyIndex.numberOfReplicas=1
+----
+
+Node C :
+
+[source]
+----
+numberOfReplicas=1
+monthlyIndex.numberOfReplicas=1
+----
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/667b57c3/manual/src/archives/1.3/asciidoc/concepts.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.3/asciidoc/concepts.adoc 
b/manual/src/archives/1.3/asciidoc/concepts.adoc
new file mode 100644
index 0000000..0849fcc
--- /dev/null
+++ b/manual/src/archives/1.3/asciidoc/concepts.adoc
@@ -0,0 +1,125 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+Apache Unomi gathers information about users actions, information that is 
processed and stored by Unomi services. The collected information can then be 
used to personalize content, derive insights on user behavior, categorize the 
user profiles into segments along user-definable dimensions or acted upon by 
algorithms.
+
+=== Items and types
+
+Unomi structures the information it collects using the concept of `Item` which 
provides the base information (an identifier and a type) the context server 
needs to process and store the data. Items are persisted according to their 
type (structure) and identifier (identity). This base structure can be 
extended, if needed, using properties in the form of key-value pairs.
+
+These properties are further defined by the `Item`’s type definition which 
explicits the `Item`’s structure and semantics. By defining new types, users 
specify which properties (including the type of values they accept) are 
available to items of that specific type.
+
+Unomi defines default value types: `date`, `email`, `integer` and `string`, 
all pretty self-explanatory. While you can think of these value types as 
"primitive" types, it is possible to extend Unomi by providing additional value 
types.
+
+Additionally, most items are also associated to a scope, which is a concept 
that Unomi uses to group together related items. A given scope is represented 
in Unomi by a simple string identifier and usually represents an application or 
set of applications from which Unomi gathers data, depending on the desired 
analysis granularity. In the context of web sites, a scope could, for example, 
represent a site or family of related sites being analyzed. Scopes allow 
clients accessing the context server to filter data to only see relevant data.
+
+_Base `Item` structure:_
+
+[source,json]
+----
+{
+  "itemType": <type of the item>,
+  "scope": <scope>,
+  "itemId": <item identifier>,
+  "properties": <optional properties>
+}
+----
+
+Some types can be dynamically defined at runtime by calling to the REST API 
while other extensions are done via Unomi plugins. Part of extending Unomi, 
therefore, is a matter of defining new types and specifying which kind of Unomi 
entity (e.g. profiles) they can be affected to. For example, the following JSON 
document can be passed to Unomi to declare a new property type identified (and 
named) `tweetNb`, tagged with the `social` tag, targeting profiles and using 
the `integer` value type.
+
+_Example JSON type definition:_
+
+[source,json]
+----
+{
+    "itemId": "tweetNb",
+    "itemType": "propertyType",
+    "metadata": {
+        "id": "tweetNb",
+        "name": "tweetNb",
+        "systemTags": ["social"]
+    },
+    "target": "profiles",
+    "type": "integer"
+}
+----
+
+____
+
+Unomi defines a built-in scope (called `systemscope`) that clients can use to 
share data across scopes.
+____
+
+=== Events
+
+Users' actions are conveyed from clients to the context server using events. 
Of course, the required information depends on what is collected and users' 
interactions with the observed systems but events minimally provide a type, a 
scope and source and target items. Additionally, events are timestamped. 
Conceptually, an event can be seen as a sentence, the event's type being the 
verb, the source the subject and the target the object.
+
+_Event structure:_
+
+[source,json]
+----
+{
+    "eventType": <type of the event>,
+    "scope": <scope of the event>,
+    "source": <Item>,
+    "target": <Item>,
+    "properties": <optional properties>
+}
+----
+
+Source and target can be any Unomi item but are not limited to them. In 
particular, as long as they can be described using properties and Unomi’s 
type mechanism and can be processed either natively or via extension plugins, 
source and target can represent just about anything. Events can also be 
triggered as part of Unomi’s internal processes for example when a rule is 
triggered.
+
+Events are sent to Unomi from client applications using the JSON format and a 
typical page view event from a web site could look something like the following:
+
+_Example page view event:_
+
+[source,json]
+----
+{
+    "eventType": "view",
+    "scope": "ACMESPACE",
+    "source": {
+        "itemType": "site",
+        "scope": "ACMESPACE",
+        "itemId": "c4761bbf-d85d-432b-8a94-37e866410375"
+    },
+    "target": {
+        "itemType": "page",
+        "scope": "ACMESPACE",
+        "itemId": "b6acc7b3-6b9d-4a9f-af98-54800ec13a71",
+        "properties": {
+            "pageInfo": {
+            "pageID": "b6acc7b3-6b9d-4a9f-af98-54800ec13a71",
+            "pageName": "Home",
+            "pagePath": "/sites/ACMESPACE/home",
+            "destinationURL": 
"http://localhost:8080/sites/ACMESPACE/home.html";,
+            "referringURL": "http://localhost:8080/";,
+            "language": "en"
+        },
+        "category": {},
+        "attributes": {}
+      }
+    }
+}
+----
+
+=== Profiles
+
+By processing events, Unomi progressively builds a picture of who the user is 
and how they behave. This knowledge is embedded in `Profile` object. A profile 
is an `Item` with any number of properties and optional segments and scores. 
Unomi provides default properties to cover common data (name, last name, age, 
email, etc.) as well as default segments to categorize users. Unomi users are, 
however, free and even encouraged to create additional properties and segments 
to better suit their needs.
+
+Contrary to other Unomi items, profiles are not part of a scope since we want 
to be able to track the associated user across applications. For this reason, 
data collected for a given profile in a specific scope is still available to 
any scoped item that accesses the profile information.
+
+It is interesting to note that there is not necessarily a one to one mapping 
between users and profiles as users can be captured across applications and 
different observation contexts. As identifying information might not be 
available in all contexts in which data is collected, resolving profiles to a 
single physical user can become complex because physical users are not observed 
directly. Rather, their portrait is progressively patched together and made 
clearer as Unomi captures more and more traces of their actions. Unomi will 
merge related profiles as soon as collected data permits positive association 
between distinct profiles, usually as a result of the user performing some 
identifying action in a context where the user hadn’t already been positively 
identified.
+
+=== Sessions
+
+A session represents a time-bounded interaction between a user (via their 
associated profile) and a Unomi-enabled application. A session represents the 
sequence of actions the user performed during its duration. For this reason, 
events are associated with the session during which they occurred. In the 
context of web applications, sessions are usually linked to HTTP sessions.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/667b57c3/manual/src/archives/1.3/asciidoc/configuration.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.3/asciidoc/configuration.adoc 
b/manual/src/archives/1.3/asciidoc/configuration.adoc
new file mode 100644
index 0000000..d6103e8
--- /dev/null
+++ b/manual/src/archives/1.3/asciidoc/configuration.adoc
@@ -0,0 +1,397 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+=== Configuration
+
+==== Changing the default configuration
+
+If you want to change the default configuration, you can perform any 
modification you want in the $MY_KARAF_HOME/etc directory.
+
+The context server configuration is kept in the 
$MY_KARAF_HOME/etc/org.apache.unomi.cluster.cfg . It defines the
+addresses where it can be found :
+
+[source]
+----
+contextserver.publicAddress=https://localhost:9443
+contextserver.internalAddress=http://127.0.0.1:8181
+----
+
+If you need to specify an Elasticsearch cluster name, or a host and port that 
are different than the default,
+it is recommended to do this BEFORE you start the server for the first time, 
or you will loose all the data
+you have stored previously.
+
+To change these settings, you will need to modify a file called 
+
+[source]
+----
+$MY_KARAF_HOME/etc/org.apache.unomi.persistence.elasticsearch.cfg
+----
+
+with the following contents:
+
+[source]
+----
+cluster.name=contextElasticSearch
+# The elasticSearchAddresses may be a comma seperated list of host names and 
ports such as
+# hostA:9300,hostB:9300
+# Note: the port number must be repeated for each host.
+elasticSearchAddresses=localhost:9300
+index.name=context
+----
+
+==== Secured events configuration
+
+Unomi secures some events by default. You can find the default configuration 
in the following file (created after the
+first server startup):
+
+[source]
+----
+$MY_KARAF_HOME/etc/org.apache.unomi.thirdparty.cfg
+----
+
+Ususally, login events, which operate on profiles and do merge on protected 
properties, must be secured. For each
+trusted third party server, you need to add these 3 lines :
+
+[source]
+----
+thirdparty.provider1.key=secret-key
+thirdparty.provider1.ipAddresses=127.0.0.1,::1
+thirdparty.provider1.allowedEvents=login,updateProperties
+----
+
+The events set in allowedEvents will be secured and will only be accepted if 
the call comes from the specified IP
+address, and if the secret-key is passed in the X-Unomi-Peer header. 
+
+==== Installing the MaxMind GeoIPLite2 IP lookup database
+
+The Context Server requires an IP database in order to resolve IP addresses to 
user location.
+The GeoLite2 database can be downloaded from MaxMind here :
+http://dev.maxmind.com/geoip/geoip2/geolite2/[http://dev.maxmind.com/geoip/geoip2/geolite2/]
+
+Simply download the GeoLite2-City.mmdb file into the "etc" directory.
+
+==== Installing Geonames database
+
+Context server includes a geocoding service based on the geonames database ( 
http://www.geonames.org/[http://www.geonames.org/] ). It can be
+used to create conditions on countries or cities.
+
+In order to use it, you need to install the Geonames database into . Get the 
"allCountries.zip" database from here :
+http://download.geonames.org/export/dump/[http://download.geonames.org/export/dump/]
+
+Download it and put it in the "etc" directory, without unzipping it.
+Edit $MY_KARAF_HOME/etc/org.apache.unomi.geonames.cfg and set 
request.geonamesDatabase.forceImport to true, import should start right away.
+Otherwise, import should start at the next startup. Import runs in background, 
but can take about 15 minutes.
+At the end, you should have about 4 million entries in the geonames index.
+
+==== REST API Security
+
+The Context Server REST API is protected using JAAS authentication and using 
Basic or Digest HTTP auth.
+By default, the login/password for the REST API full administrative access is 
"karaf/karaf".
+
+The generated package is also configured with a default SSL certificate. You 
can change it by following these steps :
+
+. 
+
+Replace the existing keystore in $MY_KARAF_HOME/etc/keystore by your own 
certificate :
+
+http://wiki.eclipse.org/Jetty/Howto/Configure_SSL[http://wiki.eclipse.org/Jetty/Howto/Configure_SSL]
+
+. 
+
+Update the keystore and certificate password in 
$MY_KARAF_HOME/etc/custom.properties file :
+
+[source]
+----
+    org.osgi.service.http.secure.enabled = true
+    org.ops4j.pax.web.ssl.keystore=${karaf.etc}/keystore
+    org.ops4j.pax.web.ssl.password=changeme
+    org.ops4j.pax.web.ssl.keypassword=changeme
+    org.osgi.service.http.port.secure=9443
+----
+
+You should now have SSL setup on Karaf with your certificate, and you can test 
it by trying to access it on port 9443.
+
+. Changing the default Karaf password can be done by modifying the 
etc/users.properties file
+
+==== Automatic profile merging
+
+The context server is capable of merging profiles based on a common property 
value. In order to use this, you must
+add the MergeProfileOnPropertyAction to a rule (such as a login rule for 
example), and configure it with the name
+ of the property that will be used to identify the profiles to be merged. An 
example could be the "email" property,
+ meaning that if two (or more) profiles are found to have the same value for 
the "email" property they will be merged
+ by this action.
+
+Upon merge, the old profiles are marked with a "mergedWith" property that will 
be used on next profile access to delete
+the original profile and replace it with the merged profile (aka "master" 
profile). Once this is done, all cookie tracking
+will use the merged profile.
+
+To test, simply configure the action in the "login" or "facebookLogin" rules 
and set it up on the "email" property.
+Upon sending one of the events, all matching profiles will be merged.
+
+==== Securing a production environment
+
+Before going live with a project, you should _absolutely_ read the following 
section that will help you setup a proper
+secure environment for running your context server. 
+
+Step 1: Install and configure a firewall 
+
+You should setup a firewall around your cluster of context servers and/or 
Elasticsearch nodes. If you have an
+application-level firewall you should only allow the following connections 
open to the whole world : 
+
+* http://localhost:8181/context.js[http://localhost:8181/context.js]
+* http://localhost:8181/eventcollector[http://localhost:8181/eventcollector]
+
+All other ports should not be accessible to the world.
+
+For your Context Server client applications (such as the Jahia CMS), you will 
need to make the following ports
+accessible : 
+
+[source]
+----
+8181 (Context Server HTTP port) 
+9443 (Context Server HTTPS port)
+----
+
+The context server actually requires HTTP Basic Auth for access to the Context 
Server administration REST API, so it is
+highly recommended that you design your client applications to use the HTTPS 
port for accessing the REST API.
+
+The user accounts to access the REST API are actually routed through Karaf's 
JAAS support, which you may find the
+documentation for here : 
+
+* 
http://karaf.apache.org/manual/latest/users-guide/security.html[http://karaf.apache.org/manual/latest/users-guide/security.html]
+
+The default username/password is 
+
+[source]
+----
+karaf/karaf
+----
+
+You should really change this default username/password as soon as possible. 
To do so, simply modify the following
+file : 
+
+[source]
+----
+$MY_KARAF_HOME/etc/users.properties
+----
+
+For your context servers, and for any standalone Elasticsearch nodes you will 
need to open the following ports for proper
+node-to-node communication : 9200 (Elasticsearch REST API), 9300 
(Elasticsearch TCP transport)
+
+Of course any ports listed here are the default ports configured in each 
server, you may adjust them if needed.
+
+Step 2 : Follow industry recommended best practices for securing Elasticsearch
+
+You may find more valuable recommendations here : 
+
+* 
https://www.elastic.co/blog/found-elasticsearch-security[https://www.elastic.co/blog/found-elasticsearch-security]
+* 
https://www.elastic.co/blog/scripting-security[https://www.elastic.co/blog/scripting-security]
+
+Step 4 : Setup a proxy in front of the context server
+
+As an alternative to an application-level firewall, you could also route all 
traffic to the context server through
+a proxy, and use it to filter any communication.
+
+==== Integrating with an Apache HTTP web server
+
+If you want to setup an Apache HTTP web server in from of Apache Unomi, here 
is an example configuration using
+mod_proxy.
+
+In your Unomi package directory, in /etc/org.apache.unomi.cluster.cfg for 
unomi.apache.org
+
+contextserver.publicAddress=https://unomi.apache.org/
+ contextserver.internalAddress=http://192.168.1.1:8181
+
+and you will also need to change the contextserver.domain in the 
/etc/org.apache.unomi.web.cfg file
+
+contextserver.domain=apache.org
+
+Main virtual host config:
+
+[source]
+----
+<VirtualHost *:80>
+        Include /var/www/vhosts/unomi.apache.org/conf/common.conf
+</VirtualHost>
+
+<IfModule mod_ssl.c>
+    <VirtualHost *:443>
+        Include /var/www/vhosts/unomi.apache.org/conf/common.conf
+
+        SSLEngine on
+
+        SSLCertificateFile    
/var/www/vhosts/unomi.apache.org/conf/ssl/24d5b9691e96eafa.crt
+        SSLCertificateKeyFile 
/var/www/vhosts/unomi.apache.org/conf/ssl/apache.org.key
+        SSLCertificateChainFile 
/var/www/vhosts/unomi.apache.org/conf/ssl/gd_bundle-g2-g1.crt
+
+        <FilesMatch "\.(cgi|shtml|phtml|php)$">
+                SSLOptions +StdEnvVars
+        </FilesMatch>
+        <Directory /usr/lib/cgi-bin>
+                SSLOptions +StdEnvVars
+        </Directory>
+        BrowserMatch "MSIE [2-6]" \
+                nokeepalive ssl-unclean-shutdown \
+                downgrade-1.0 force-response-1.0
+        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
+
+    </VirtualHost>
+</IfModule>
+----
+
+common.conf:
+
+[source]
+----
+ServerName unomi.apache.org
+ServerAdmin [email protected]
+
+DocumentRoot /var/www/vhosts/unomi.apache.org/html
+CustomLog /var/log/apache2/access-unomi.apache.org.log combined
+<Directory />
+        Options FollowSymLinks
+        AllowOverride None
+</Directory>
+<Directory /var/www/vhosts/unomi.apache.org/html>
+        Options FollowSymLinks MultiViews
+        AllowOverride None
+        Order allow,deny
+        allow from all
+</Directory>
+<Location /cxs>
+    Order deny,allow
+    deny from all
+    allow from 88.198.26.2
+    allow from www.apache.org
+</Location>
+
+RewriteEngine On
+RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
+RewriteRule .* - [F]
+ProxyPreserveHost On
+ProxyPass /server-status !
+ProxyPass /robots.txt !
+
+RewriteCond %{HTTP_USER_AGENT} Googlebot [OR]
+RewriteCond %{HTTP_USER_AGENT} msnbot [OR]
+RewriteCond %{HTTP_USER_AGENT} Slurp
+RewriteRule ^.* - [F,L]
+
+ProxyPass / http://localhost:8181/ connectiontimeout=20 timeout=300 ttl=120
+ProxyPassReverse / http://localhost:8181/
+----
+
+==== Changing the default tracking location
+
+When performing localhost requests to Apache Unomi, a default location will be 
used to insert values into the session
+to make the location-based personalization still work. You can find the 
default location settings in the file : 
+
+[source]
+----
+org.apache.unomi.plugins.request.cfg
+----
+
+that contains the following default settings:
+
+[source]
+----
+# The following settings represent the default position that is used for 
localhost requests
+defaultSessionCountryCode=CH
+defaultSessionCountryName=Switzerland
+defaultSessionCity=Geneva
+defaultSessionAdminSubDiv1=2660645
+defaultSessionAdminSubDiv2=6458783
+defaultSessionIsp=Cablecom
+defaultLatitude=46.1884341
+defaultLongitude=6.1282508
+----
+
+You might want to change these for testing or for demonstration purposes.
+
+==== Apache Karaf SSH Console
+
+The Apache Karaf SSH console is available inside Apache Unomi, but the port 
has been changed from the default value of
+8101 to 8102 to avoid conflicts with other Karaf-based products. So to connect 
to the SSH console you should use:
+
+[source]
+----
+ssh -p 8102 karaf@localhost
+----
+
+or the user/password you have setup to protect the system if you have changed 
it.
+
+==== ElasticSearch X-Pack Support
+
+It is now possible to use X-Pack to connect to ElasticSearch. However, for 
licensing reasons this is not provided out
+of the box. Here is the procedure to install X-Pack with Apache Unomi:
+
+=== Important !
+
+Do not start Unomi directly with unomi:start, perform the following steps 
below first !
+
+=== Installation steps
+
+. Create a directory for all the JARs that you will download, we will call it 
XPACK_JARS_DIRECTORY
+. Download 
https://artifacts.elastic.co/maven/org/elasticsearch/client/x-pack-transport/5.6.3/x-pack-transport-5.6.3.jar[https://artifacts.elastic.co/maven/org/elasticsearch/client/x-pack-transport/5.6.3/x-pack-transport-5.6.3.jar]
 to XPACK_JARS_DIRECTORY
+. Download 
https://artifacts.elastic.co/maven/org/elasticsearch/plugin/x-pack-api/5.6.3/x-pack-api-5.6.3.jar[https://artifacts.elastic.co/maven/org/elasticsearch/plugin/x-pack-api/5.6.3/x-pack-api-5.6.3.jar]
 to XPACK_JARS_DIRECTORY
+. Download 
http://central.maven.org/maven2/com/unboundid/unboundid-ldapsdk/3.2.0/unboundid-ldapsdk-3.2.0.jar[http://central.maven.org/maven2/com/unboundid/unboundid-ldapsdk/3.2.0/unboundid-ldapsdk-3.2.0.jar]
 to XPACK_JARS_DIRECTORY
+. Download 
http://central.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.55/bcpkix-jdk15on-1.55.jar[http://central.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.55/bcpkix-jdk15on-1.55.jar]
 to XPACK_JARS_DIRECTORY
+. Download 
http://central.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.55/bcprov-jdk15on-1.55.jar[http://central.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.55/bcprov-jdk15on-1.55.jar]
 to XPACK_JARS_DIRECTORY
+. Download 
http://central.maven.org/maven2/com/sun/mail/javax.mail/1.5.3/javax.mail-1.5.3.jar[http://central.maven.org/maven2/com/sun/mail/javax.mail/1.5.3/javax.mail-1.5.3.jar]
 to XPACK_JARS_DIRECTORY
+. 
+
+Edit etc/org.apache.unomi.persistence.elasticsearch.cfg to add the following 
settings:
+
+[source]
+----
+transportClientClassName=org.elasticsearch.xpack.client.PreBuiltXPackTransportClient
+transportClientJarDirectory=XPACK_JARS_DIRECTORY
+transportClientProperties=xpack.security.user=elastic:changeme
+----
+
+You can setup more properties (for example for SSL/TLS support) by seperating 
the properties with commas,
+as in the following example:
+
+[source]
+----
+transportClientProperties=xpack.security.user=elastic:changeme,xpack.ssl.key=/home/user/elasticsearch-5.6.3/config/x-pack/localhost/localhost.key,xpack.ssl.certificate=/home/user/elasticsearch-5.6.3/config/x-pack/localhost/localhost.crt,xpack.ssl.certificate_authorities=/home/user/elasticsearch-5.6.3/config/x-pack/ca/ca.crt,xpack.security.transport.ssl.enabled=true
+----
+
+. 
+
+Launch Karaf and launch unomi using the command from the shell :
+
+[source]
+----
+unomi:start
+----
+
+Alternatively you could edit the configuration directly from the Karaf shell 
using the following commands:
+
+[source]
+----
+config:edit org.apache.unomi.persistence.elasticsearch
+config:property-set transportClientClassName 
org.elasticsearch.xpack.client.PreBuiltXPackTransportClient
+config:property-set transportClientJarDirectory XPACK_JARS_DIRECTORY
+config:property-set transportClientProperties 
xpack.security.user=elastic:changeme
+config:update
+unomi:start
+----
+
+You can setup more properties (for example for SSL/TLS support) by seperating 
the properties with commas,
+as in the following example:
+
+[source]
+----
+config:property-set transportClientProperties 
xpack.security.user=elastic:changeme,xpack.ssl.key=/home/user/elasticsearch-5.6.3/config/x-pack/localhost/localhost.key,xpack.ssl.certificate=/home/user/elasticsearch-5.6.3/config/x-pack/localhost/localhost.crt,xpack.ssl.certificate_authorities=/home/user/elasticsearch-5.6.3/config/x-pack/ca/ca.crt,xpack.security.transport.ssl.enabled=true
+----
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/667b57c3/manual/src/archives/1.3/asciidoc/connectors/connectors.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.3/asciidoc/connectors/connectors.adoc 
b/manual/src/archives/1.3/asciidoc/connectors/connectors.adoc
new file mode 100644
index 0000000..ee3551b
--- /dev/null
+++ b/manual/src/archives/1.3/asciidoc/connectors/connectors.adoc
@@ -0,0 +1,22 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+=== Connectors
+
+Apache Unomi provides the following connectors:
+
+* link:salesforce-connectors.html[Salesforce CRM connectors]
+
+==== Call for contributors
+
+We are looking for help with the development of additional connectors. Any 
contribution (large or small) is more than welcome. Feel free to discuss this 
in our link:../../mail-lists.html[mailing list].
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/667b57c3/manual/src/archives/1.3/asciidoc/connectors/salesforce-connector.adoc
----------------------------------------------------------------------
diff --git 
a/manual/src/archives/1.3/asciidoc/connectors/salesforce-connector.adoc 
b/manual/src/archives/1.3/asciidoc/connectors/salesforce-connector.adoc
new file mode 100644
index 0000000..23c0a22
--- /dev/null
+++ b/manual/src/archives/1.3/asciidoc/connectors/salesforce-connector.adoc
@@ -0,0 +1,224 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+=== Apache Unomi Salesforce Connector
+
+This connectors makes it possible to push and pull data to/from the Salesforce 
CRM. It can copy information between
+Apache Unomi profiles and Salesforce Leads.
+
+==== Getting started
+
+. 
+
+Create a new developer account here:
+
+[source]
+----
+https://developer.salesforce.com/signup
+----
+
+. 
+
+Create a new Connected App, by going into Setup -&gt; App Manager and click 
"Create Connected App"
+
+. 
+
+In the settings, make sure you do the following:
+
+[source]
+----
+Enable OAuth settings -> Activated
+Enable for device flow -> Activated (no need for a callback URL)
+Add all the selected OAuth scopes you want (or put all of them)
+Make sure Require Secret for Web Server flow is activated
+----
+
+. 
+
+Make sure you retrieve the following information once you have created the app 
in the API (Enable OAuth Settings):
+
+[source]
+----
+Consumer key
+Consumer secret (click to see it)
+----
+
+. 
+
+You must also retrieve your user's security token, or create it if you don't 
have one already. To do this simply
+click on your user at the top right, select "Settings", the click on "Reset my 
security token". You will receive an email
+with the security token.
+
+. 
+
+You are now ready to configure the Apache Unomi Salesforce Connector. In the 
etc/org.apache.unomi.sfdc.cfg file
+change the following settings:
+
+[source]
+----
+sfdc.user.username=YOUR_USER_NAME
+sfdc.user.password=YOUR_PASSWORD
+sfdc.user.securityToken=YOUR_USER_SECURITY_TOKEN
+sfdc.consumer.key=CONNECTED_APP_CONSUMER_KEY
+sfdc.consumer.secret=CONNECTED_APP_SECRET
+----
+
+. 
+
+Connected to the Apache Unomi Karaf Shell using : 
+
+[source]
+----
+ssh -p 8102 karaf@localhost (default password is karaf)
+----
+
+. 
+
+Deploy into Apache Unomi using the following commands from the Apache Karaf 
shell:
+
+[source]
+----
+feature:repo-add 
mvn:org.apache.unomi/unomi-salesforce-connectors-karaf-kar/${project.version}/xml/features
+feature:install unomi-salesforce-connectors-karaf-kar
+----
+
+. 
+
+You can then test the connection to Salesforce by accessing the following URLs:
+
+[source]
+----
+https://localhost:9443/cxs/sfdc/version
+https://localhost:9443/cxs/sfdc/limits
+----
+
+The first URL will give you information about the version of the connectors, 
so this makes it easy to check that the
+plugin is properly deployed, started and the correct version. The second URL 
will actually make a request to the
+Salesforce REST API to retrieve the limits of the Salesforce API.
+
+Both URLs are password protected by the Apache Unomi (Karaf) password. You can 
find this user and password information
+in the etc/users.properties file.
+
+. 
+
+You can now use the connectors's defined actions in rules to push or pull data 
to/from the Salesforce CRM. You can
+find more information about rules in the link:concepts.html[Concepts] and the 
link:getting-started.html[Getting Started] pages. 
+
+==== Upgrading the Salesforce connectors
+
+If you followed all the steps in the Getting Started section, you can upgrade 
the Salesforce connectors by using the following steps:
+
+. 
+
+Compile the connectors using:
+
+[source]
+----
+cd extensions/salesforce-connectors
+mvn clean install
+----
+
+. 
+
+Login to the Unomi Karaf Shell using:
+
+[source]
+----
+ssh -p 8102 karaf@localhost (password by default is karaf)
+----
+
+. 
+
+Execute the following commands in the Karaf shell
+
+[source]
+----
+feature:repo-refresh
+feature:uninstall unomi-salesforce-connectors-karaf-feature
+feature:install unomi-salesforce-connectors-karaf-feature
+----
+
+. 
+
+You can then check that the new version is properly deployed by accessing the 
following URL and checking the build date:
+
+[source]
+----
+https://localhost:9443/cxs/sfdc/version
+----
+
+(if asked for a password it's the same karaf/karaf default)
+
+==== Using the Salesforce Workbench for testing REST API
+
+The Salesforce Workbench contains a REST API Explorer that is very useful to 
test requests. You may find it here : 
+
+[source]
+----
+https://workbench.developerforce.com/restExplorer.php
+----
+
+==== Setting up Streaming Push queries
+
+Using the Salesforce Workbench, you can setting streaming push queries 
(Queries-&gt;Streaming push topics) such as the
+following example:
+
+[source]
+----
+Name: LeadUpdates
+Query : SELECT Id,FirstName,LastName,Email,Company FROM Lead
+----
+
+==== Executing the unit tests
+
+Before running the tests, make sure you have completed all the steps above, 
including the streaming push queries setup.
+
+By default the unit tests will not run as they need proper Salesforce 
credentials to run. To set this up create a
+properties file like the following one:
+
+test.properties
+
+[source]
+----
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+sfdc.user.username=YOUR_USER_NAME
+sfdc.user.password=YOUR_PASSWORD
+sfdc.user.securityToken=YOUR_USER_SECURITY_TOKEN
+sfdc.consumer.key=CONNECTED_APP_CONSUMER_KEY
+sfdc.consumer.secret=CONNECTED_APP_SECRET
+----
+
+and then use the following command line to reference the file:
+
+[source]
+----
+cd extensions/salesforce-connectors
+mvn clean install -DsfdcProperties=../test.properties
+----
+
+(in case you're wondering the ../ is because the test is located in the 
services sub-directory)
\ No newline at end of file

Reply via email to