diff --git a/build-with/index.html b/build-with/index.html new file mode 100644 index 0000000..95aaef9 --- /dev/null +++ b/build-with/index.html @@ -0,0 +1,304 @@ + + + + + + + +OSVR Developer Portal +| +Build with OSVR + + + + + + + +
+ + +
+

Building with OSVR

+ + +
+

+If you haven't already, be sure to sign up for the Developer Newsletter, to learn when there are important changes that may affect you. +

+
+ + + + +
+

+Thank you for participating! +

+
+ +

NEW documentation github repository

+ + + +

Building an App with Unity

+ + + +

Building an App with Unreal

+ + + +

Building an App (or engine integration) with C++ or C

+ + + +

Building a Plugin

+ + + + +
+ + + + +
+ + + + + +
+ + diff --git a/compatibility/index.html b/compatibility/index.html new file mode 100644 index 0000000..e05228c --- /dev/null +++ b/compatibility/index.html @@ -0,0 +1,3044 @@ + + + + + + + +OSVR Developer Portal +| +Compatibility + + + + + + + +
+ + +
+

OSVR Device Compatibility

+

+This information is necessarily incomplete: there are always new devices being supported by OSVR, and not all development happens in a centralized location or is brought to the attention of the broader OSVR community. +If you notice an omission, you can submit a pull request for +the file/repo +that fetches the data to generate this page. +

+

+ +If you notice an error, let us know via the support portal, or by clicking the "Help" button in the lower-right corner of the page. + +

+

Operating System Compatibility

+

+OSVR has been officially ported to run on the following operating systems: +

+

+See more details at the list of projects +

Game Engine Support

+

+OSVR has plugins that bring its wealth of devices and peripherals into many engines: +

+ +

Display Compatibility

+

+This table only lists those displays whose display descriptor JSON ships with OSVR-Core or is otherwise known to the wider OSVR community. +Creating such a descriptor for an arbitrary display is straightforward, meaning this list is nowhere near all-encompassing. +

+

+Note that due to a temporary technical limitation, displays with multiple modes of operation are listed multiple times in the table, once for each mode. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VendorModelVersionNotes
VuzixWrap 1200dx1.0 + +(Data source: +display descriptor +) +
VuzixIWear 7201.0 + +(Data source: +display descriptor +) +
OSVRHDK1.2 +Suitable for HDK 1.0-1.2 +(Data source: +display descriptor +) +
OSVRHDK1.3 +Specific to the optics of 1.3, with Render Manager compatible distortion parameters +(Data source: +display descriptor +) +
OSVRHDK1.3 +Specific to the optics of 1.3, with a specialized distortion correction requiring apps to use RenderManager 0.6.40 or newer. +(Data source: +display descriptor +) +
OSVRHDK2.0 +OSVR HDK 2.0 +(Data source: +display descriptor +) +
OculusRiftDK1 + +(Data source: +display descriptor +) +
OculusRiftDK2 + +(Data source: +display descriptor +) +
SensicsdSight +1920x1080 landscape-mode video, 1 video input +(Data source: +display descriptor +) +
SensicsdSight +1920x1080 landscape-mode video, 2 video inputs +(Data source: +display descriptor +) +
SensicsdSight +1080x1920 portrait-mode video, 1 video input +(Data source: +display descriptor +) +
SensicsdSight +1080x1920 portrait-mode video, 2 video inputs +(Data source: +display descriptor +) +
SensicsxSight 6123 +Assumes xSight SVP is set for 1920x1080 full screen +(Data source: +display descriptor +) +
SensicszSight1.1 +1280x1024 resolution mode, 1 video input +(Data source: +display descriptor +) +
SensicszSight1.1 +1280x1024 resolution mode, 1 video input +(Data source: +display descriptor +) +
SensicszSight1.1 +1280x1024 resolution mode, 2 video inputs +(Data source: +display descriptor +) +
SensicszSight1.1 +1280x720 resolution mode, 1 video input +(Data source: +display descriptor +) +
SensicszSight1.1 +1280x720 resolution mode, 1 video input +(Data source: +display descriptor +) +
SensicszSight1.1 +1280x720 resolution mode, 2 video inputs +(Data source: +display descriptor +) +
SensicszSight 1920-100 +1920x1080, 1 video input +(Data source: +display descriptor +) +
SensicszSight 1920-100 +1920x1080, 1 video input +(Data source: +display descriptor +) +
SensicszSight 1920-100 +1920x1080, 2 video inputs +(Data source: +display descriptor +) +
SensicszSight 1920 +1920x1080, 1 video input +(Data source: +display descriptor +) +
SensicszSight 1920 +1920x1080, 1 video input +(Data source: +display descriptor +) +
SensicszSight 1920 +1920x1080, 2 video inputs +(Data source: +display descriptor +) +
VrvanaTotem1 + +(Data source: +display descriptor +) +
FOVEFOVE 0 + +(Data source: +display descriptor +) +
HTCVive/Vive PRE +This is a sample descriptor file only - please follow the instructions to use the ViveDisplayExtractor to generate a correct one for your device! +(Data source: +display descriptor +) +
LaputaVRHero1.0 +Specific to the optics of LaputaVR HMD, with a specialized distortion correction mesh requiring apps to use RenderManager 0.6.40 or newer. +(Data source: +display descriptor +) +
+

Interaction device compatibility

+This is in addition to +devices supported by VRPN +, which can be used in OSVR with some +additional configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Device VendorDevice NameInterface Classes ImplementedOther
OSVRHacker Development Kit (HDK) Integrated IMU Tracker +
    +
  • analog
  • +
  • tracker
  • +
+
+ +
RazerHydra motion controller +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+ +
YEI3Space Sensor +
    +
  • analog
  • +
  • tracker
  • +
+
+ +
GenericOpenCV Video Capture +
    +
  • imaging
  • +
+
+ +
3DconnexionSpacePilot Pro 3D Mouse +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpace Explorer 3D Mouse +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpace Navigator 3D Mouse +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpace Navigator 3D Mouse for Notebooks +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpace Traveller 3D Mouse +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpaceball 5000 +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpacemouse Plus XT +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpacemouse Pro +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
3DconnexionSpacemouse Wireless +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Fifth Dimension Technologies5DT Data Glove 14 Ultra +
    +
  • analog
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Fifth Dimension Technologies5DT Data Glove 16 +
    +
  • analog
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Fifth Dimension Technologies5DT Data Glove 5 Ultra +
    +
  • analog
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Advanced Realtime Tracking GmbHFlystick +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Performance Designed ProductsAfterglow Ax1 Controller for XBox 360 +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Arrington ResearchViewPoint EyeTracker +
    +
  • analog
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Ascension Technology CorporationFlock of Birds +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Atmel CorporationATmega32 +
    +
  • analog
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
BG Systems, Inc.CerealBox +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Bauhaus University WeimarInertia Mouse +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
CH ProductsFighterstick USB +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Contour Design, Inc.ShuttleXpress +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Crossbow Technology, Inc.RGA300CA +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Dream CheekyRoll-up Drum Kit USB +
    +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
FutabaInterLink Elite Controller +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
GenericGPS (serial NMEA protocol) tracker +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Global HapticsOrb +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Griffin TechnologyPowerMate Controller +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Hayden-KerkIDEA PCM4806X Motor Controller +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Hillcrest LabsFreespace +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
In2GamesGametrak +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
InterSenseIS-900 MicroTrax Hand tracker +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
InterSenseIS-900 MicroTrax Head tracker +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
InterSenseIS-900 MicroTrax Wand +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
LogiCad 3DMagellan controller +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
LogitechExtreme 3D Pro Joystick +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Solution Technologies, Inc.MicroScribe 3D +
    +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Mindtel LLCTotally Neat Gadget (TNG) 3 +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Motion WorkshopMotionNode +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Northern Digital IncPolaris Spectra +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Northern Digital IncPolaris Vicra +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
National InstrumentsDAQCard DIO 24 +
    +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
NintendoWiiMote +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Novint Technologies IncFalcon +
    +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Oculus VRRift DK1 +
    +
  • analog
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Oculus VRRift DK2 +
    +
  • analog
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Origin InstrumentsDynaSight +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
PNI Sensor CorporationSpacePoint Fusion +
    +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
PhaseSpaceMotion Capture +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Polhemus3Space +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
PolhemusG4 +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
PolhemusIsotrak tracker +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
PolhemusLIBERTY +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
PolhemusLIBERTY LATUS +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
PolhemusPowerTRAK 360 +
    +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Retrolink USBClassic GameCube-style Controller +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Retrolink USBClassic Genesis Controller +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
SaitekST290 Pro Joystick +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
MicrosoftSideWinder Precision (raw driver) +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
MicrosoftSideWinder Precision 2 (raw driver) +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
TRIVISIO Prototyping GmbHColibri +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Thalmic LabsMyo +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
US DigitalA2 Absolute Rotary Encoder +
    +
  • analog
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
VR-SpaceWinTrackerIII +
    +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Vinten RadamecSerial Port Interface (SPI) +
    +
  • analog
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys Desktop USB +
    +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys Jog and Shuttle +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys Joystick +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys Professional USB +
    +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys XK-12 Jog and Shuttle +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys XK-12 Joystick +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys XK-3 +
    +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
P.I. EngineeringX-keys XK-68 Jog and Shuttle +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
MicrosoftX-Box Controller 360 (and compatible - raw driver) +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
MicrosoftX-Box Controller S (and compatible - raw driver) +
    +
  • analog
  • +
  • button
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Yost Labs (YEI)3-Space Sensor +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
ZaberT-LA linear actuator +
    +
  • analog
  • +
+
+
    +
  • +Included with +OSVR-Core +
  • +
  • +

    External device supported using VRPN and descriptor/configuration files bundled with OSVR-Core

    + +
  • +
  • +Data source: +JSON device descriptor +
  • +
+
Leap MotionLeap Motion Controller +
    +
  • analog
  • +
  • imaging
  • +
  • skeleton
  • +
  • tracker
  • +
+
+ +
Hillcrest LabsFSM-9 Tracker +
    +
  • tracker
  • +
+
+ +
NodBackspin +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+ +
HTCVive PRE and Vive Controllers +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+ +
SMI Tracker +
    +
  • eyetracker
  • +
+
+ +
FOVEFove Eye Tracker Plugin +
    +
  • eyetracker
  • +
+
+ +
FOVEFove Head Tracker Plugin +
    +
  • tracker
  • +
+
+ +
Oculus VROculus Rift Tracker/Sensors (via Oculus SDK) +
    +
  • analog
  • +
  • tracker
  • +
+
+ +
OSVRStandardFirmata +
    +
  • analog
  • +
  • button
  • +
+
+ +
Oculus VROculus Rift Trackers/Sensors (via OpenHMD) +
    +
  • tracker
  • +
+
+ +
MicrosoftKinect for Windows +
    +
  • analog
  • +
  • tracker
  • +
+
+ +
MicrosoftKinect for Xbox ONE +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+ +
NintentoWiimote +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+ +
XimmerseXimmerse Outside/In Controllers +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+ +
OSVRComprehensive Plugin Example +
    +
  • tracker
  • +
+
+ +
OSVRComprehensive Plugin Example +
    +
  • analog
  • +
  • button
  • +
  • tracker
  • +
+
+ +
LaputaVRHero +
    +
  • analog
  • +
+
+ +
+ +
+ + + + +
+ + + + + +
+ + diff --git a/contributing/index.html b/contributing/index.html new file mode 100644 index 0000000..3a0b7ee --- /dev/null +++ b/contributing/index.html @@ -0,0 +1,2917 @@ + + + + + + + +OSVR Developer Portal +| +Contributing + + + + + + + +
+ + +
+

Contributing to OSVR

+

Getting Started and Tracking Development

+

+The + +OSVR waffle.io board + +contains an overview of issues currently in GitHub issue trackers for all OSVR framework projects. +It summarizes the issues in a number of lists: +

+ +

+Of course, the issue lists are not all-encompassing: if you've got a contribution you'd like to make, we'd love to see it! +Filing an issue on the right project would be a great first step. +

+

Directory of Projects

+ + + + + + + + + + + + + + + + + + + + + + Last update: + + + Jul 3, 2017 + + + + + + + + + + + + + + Documentation + + + + + + + + + + + + List of + supported + devices + + + + + + + + + + + + + + + EXPERIMENTAL: + Python binding + + + + + + + + + + + + + + + Managed-OSVR + + + + + + + + + + + + + + + RenderManager + NVIDIA | AMD | Intel + + + + + + + + + + + + + + + OSVR- + Hardware- + Accessories + + + + + + + + + + + + + + + + + OS-specific code + + + + + + + + + + + + + + + + Windows + + + + + + + + + + + + + + OSVR-HDK-Windows-Drivers + + + + + + + + + + + + + + + + + Android + + + + + + + + + + + + + + OSVR-Android-SDK + + + + + + + + + + + + + + + OSVR-Android-Build + + + + + + + + + + + + + + + OSVR-Android-Plugins + + + + + + + + + + + + + + + OSVR-AndroidServerLauncher + + + + + + + + + + + + + + + OSVR-Android-Samples + + + + + + + + + + + + + + + android-cmake + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OS X + + + + + + + + + + + + + + Homebrew Tap + + + + + + + + + + + + + + + + + Linux + + + + + + + + + + + + + + Build instructions + + + + + + + + + + + Plugins + + + + + + + + + + + + + + + + HMDs and devices + + + + + + + + + + + + + + OSVR-Vuzix + + + + + + + + + + + + + + + OSVR-Oculus-Rift + + + + + + + + + + + + + + + OSVR- + EmulatedDevices + + + + + + + + + + + + + + + OSVR-Vive + + + + + + + + + + + + + + + OSVR-LaputaVR + + + + + + + + + + + + + + + OSVR-ANTVR + + + + + + + + + + + + + + + + + Peripherals + + + + + + + + + + + + + + OSVR-SMI + + + + + + + + + + + + + + + OSVR-Leap-Motion + + + + + + + + + + + + + + + OSVR-Nod + + + + + + + + + + + + + + + OSVR-InertialLabs + + + + + + + + + + + + + + + OSVR-ART + + + + + + + + + + + + + + + OSVR-FOVE + + + + + + + + + + + + + + + OSVR-Ximmerse + + + + + + + + + + + + + + + OSVR-PSMoveAPI + + + + + + + + + + + + + + + OSVR-OpenHMD + + + + + + + + + + + + + + + OSVR-firmata + + + + + + + + + + + + + + + OSVR-Kinect + + + + + + + + + + + + + + + OSVR-wiimote + + + + + + + + + + + + + + + Alternate + OSVR-PSMove + + + + + + + + + + + + + + + Hydra-OSVR + + + + + + + + + + + + + + + Nolo-OSVR + + + + + + + + + + + + + + + + + Analysis + + + + + + + + + + + + + + OSVR-AR Toolkit + + + + + + + + + + + + + + + OSVR-Fusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + osvr_reset_yaw + + + + + + + + + + + + + + + osvr_print_tree + + + + + + + + + + + + + + + osvr_json_to_c + + + + + + + + + + + + + + + PathTreeExport + + + + + + + + + + + + + + + OSVR Core + + + + + + + + + + + + + + + + + Poser + + + + + + + + + + + + + + + Skeleton + + + + + + + + + + + + + + + Locomotion + + + + + + + + + + + + + + + Eye tracker + + + + + + + + + + + + + + + Config + + + + + + + + + + + + + + + Button + + + + + + + + + + + + + + + Analog + + + + + + + + + + + + + + + Gesture + + + + + + + + + + + + + + + Tracker + + + + + + + + + + + + + + + Imager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Game engine plugins and samples + + + + + + + + + + + + + + OSVR-Unreal + + + + + + + + + + + + + + + OSVR-Unity-Rendering + + + + + + + + + + + + + + + OSVR-Monogame + + + + + + + + + + + + + + + OSVR-Unity-Palace-Demo + + + + + + + + + + + + + + + SteamVR-OSVR + + + + + + + + + + + + + + + EXPERIMENTAL: + Blender-OSVR + + + + + + + + + + + + + + + OSVR-Unity + + + + + + + + + + + + + + + Unity-VR-Samples + + + + + + + + + + + + + + + WebVR-OSVR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + User tools + + + + + + + + + + + + + + OSVR- + Tracker-Viewer + + + + + + + + + + + + + + + OSVR-Central + + + + + + + + + + + + + + + OSVR-Config + + + + + + + + + + + + + + + SensicsTray + + + + + + + + + + + + + + + + + + + + + + + Developer tools + + + + + + + + + + + + + + Distortionizer + + + + + + + + + + + + + + + Latency-Test + + + + + + + + + + + + + + + LED + Encoding + + + + + + + + + + + + + + + OSVR- + Boxstarter + + + + + + + + + + + + + + + OSVR- + JSON-Editor + + + + + + + + + + + + + + + OSVR- + JSON-Schemas + + + + + + + + + + + + + + + OSVR-specs- + and-proposals + + + + + + + + + + + + + + + OSVR- + win-installer + + + + + + + + + + + + + + + OSVR-device-viewer + + + + + + + + + + + + + + + OSVR-HDK + Hardware + + + + + + + + + + + + + + + Libfunctionality + + + + + + + + + + + + + + + + + + + + + + +

+Note that in case you can't find the project you're looking for below, you can access a +full list of projects in the OSVR organization +(note that this link includes a filter to exclude projects forked by OSVR). +

+

Documentation and Community

+ +

General Guidelines

+ +

Core projects

+
+ +
+
+OSVR-Core README +

The core libraries, applications, and plugins of the OSVR software platform. Includes osvr_reset_yaw, which allows setting '0 heading', osvr_print_tree that exports the path tree and osvr_json_to_c which converts JSON files into C headers

+ +
+
+
+ +
+ +
+
+OSVR-General README +

Catch-all project for issues and information not specific to a single repo.

+ +
+
+
+ +
+ +
+
+sensics/OSVR-RenderManager README +

Provides distortion correction, time warp, direct mode (on Windows), overfill and oversampling services.

+ +
+
+
+ +
+ +
+
+OSVR-Docs README +

Documentation repository for OSVR

+ +
+
+
+ +

HMD Device Plugins

+
+ +
+
+OSVR-Vive README +

HTC Vive (HMD and controllers) plugin for OSVR.

+ +
+
+
+ +
+ +
+
+OSVR-Vuzix README +

Vuzix tracking plugin for OSVR.

+ +
+
+
+ + + +
+ +
+
+L-Tobi/OSVR-ANTVR README +

OSVR plugin for trackers of the ANTVR HMDs.

+ +
+
+
+ +
+ +
+
+OSVR-LaputaVR README +

LaputaVR Hero plugin for OSVR.

+ +
+
+
+ +

Other Device Plugins

+
+ +
+
+OSVR-SMI README +

SMI eye tracking plugin for OSVR.

+ +
+
+
+ +
+ +
+
+OSVR-Leap-Motion README +

OSVR Leap Motion plugin.

+ +
+
+
+ +
+ +
+
+OSVR-Nod README +

OSVR Nod ring plugin.

+ +
+
+
+ +
+ +
+
+OSVR-ART README +

OSVR Advanced Realtime Tracking plugin.

+ +
+
+
+ +
+ +
+
+OSVR-FOVE README +

OSVR plugin for FOVE eye-tracking headset.

+ +
+
+
+ +
+ +
+
+sensics/OSVR-EmulatedDevices README +

OSVR plugin for Sensics emulated binoculars and other optical devices.

+ +
+
+
+ + + +
+ +
+
+demonixis/OSVR-Ximmerse README +

OSVR plugin for Ximmerse outside/in controllers.

+ +
+
+
+ + + + + +
+ +
+
+simlrh/OSVR-OpenHMD README +

OSVR plugin providing Oculus Rift DK1 & DK2 orientation tracking via OpenHMD.

+ +
+
+
+ +
+ +
+
+simlrh/OSVR-Kinect README +

An OSVR plugin providing joint position and orientation data from the Kinect.

+ +
+
+
+ +
+ +
+
+simlrh/OSVR-firmata README +

An OSVR plugin providing analog and digital data from connected Arduinos running the StandardFirmata firmware.

+ +
+
+
+ +
+ +
+
+simlrh/OSVR-Wiimote README +

An OSVR plugin providing up to four Wii Remote + Nunchuk devices via the wiiuse library.

+ +
+
+
+ + + +
+ +
+
+lonetech/nolo-osvr README +

OSVR plugin for LYRobotix Nolo VR tracker system.

+ +
+
+
+ +

Analysis Plugins

+
+ +
+
+OSVR-ARToolKit README +

OSVR plugin for ARToolkit by DAQRI.

+ +
+
+
+ +
+ +
+
+simlrh/OSVR-fusion README +

An OSVR plugin that creates trackers by combining different sources of data.

+ +
+
+
+ +

Game engine integrations and language bindings

+ + +
+ +
+
+OSVR-Unity-Rendering README +

High-performance direct render plugin for Unity.

+ +
+
+
+ +
+ +
+
+OSVR-Unity-Palace-Demo README +

A simple example OSVR Unity 4/5 project.

+ +
+
+
+ +
+ +
+
+Unity-VR-Samples README +

Unity's VR Samples, converted to run on OSVR

+ +
+
+
+ + + +
+ +
+
+SteamVR-OSVR README +

An OSVR plugin for SteamVR, providing SteamVR support for OSVR HMDs.

+ +
+
+
+ +
+ +
+
+Managed-OSVR README +

Managed code (.NET) wrapper for OSVR ClientKit.

+ +
+
+
+ +
+ +
+
+JeroMiya/OSVR-MonoGame README +

Integration of OSVR with the MonoGame Engine.

+ +
+
+
+ +

Windows-specific

+
+ +
+
+OSVR-HDK-Windows-Drivers README +

Drivers and related code/data for improving the hardware experience for the HDK on Windows.

+ +
+
+
+ +

Android-specific

+
+ +
+
+OSVR-Android-Build README +

Automated build system and submodules to compile the OSVR framework for Android.

+ +
+
+
+ +
+ +
+
+OSVR-Android-SDK README +

Additional files used to generate an NDK-BUILD compatible OSVR Android build.

+ +
+
+
+ +
+ +
+
+OSVR-Android-Plugins README +

Android-specific plugins.

+ +
+
+
+ +
+ +
+
+OSVR-Android-Samples README +

A set of samples demonstrating basic OSVR usage on Android.

+ +
+
+
+ +
+ +
+
+OSVR-AndroidServerLauncher README +

An Android app that launches the OSVR server.

+ +
+
+
+ +
+ +
+
+android-cmake README +

A collection of CMake scripts that may be useful to the Android NDK community.

+ +
+
+
+ +

OS X–specific

+
+ +
+
+Homebrew-OSVR README +

Homebrew tap for OSVR Mac OSX

+ +
+
+
+ +

Tools and Utilities

+ + +
+ +
+
+OSVR-Central README +

Systray OSVR device utility

+ +
+
+
+ + + +
+ +
+
+sensics/SensicsTray README +

Tray utility for configuring OSVR.

+ +
+
+
+ +
+ +
+
+Distortionizer README +

Tool for determining distortion parameters of arbitrary HMDs, and a corresponding set of shaders to correct that distortion.

+ +
+
+
+ +
+ +
+
+OSVR-win-installer README +

Windows installer for OSVR server application built with NSIS.

+ +
+
+
+ +
+ +
+
+infinitellamas/OSVR-Device-Viewer README +

A program that displays all devices connected to your OSVR Server, and the data that they are providing.

+ +
+
+
+ +

Hardware

+
+ +
+
+OSVR-HDK README +

Production file for OSVR HDK.

+ +
+
+
+ +
+ +
+
+OSVR-Hardware-Accessories README +

Hardware accessories for OSVR products.

+ +
+
+
+ +
+ +
+
+sensics/Latency-Test README +

Software and hardware latency tester.

+ +
+
+
+ +

Other Projects

+
+ +
+
+OSVR-JSON-Editor README +

Browser-based tool for editing OSVR JSON files, based on JSON Schema.

+ +
+
+
+ +
+ +
+
+OSVR-JSON-Schemas README +

JSON Schemas related to OSVR interfaces.

+ +
+
+
+ +
+ +
+
+OSVR-Specs-and-Proposals README +

Interface specifications and device integration proposals.

+ +
+
+
+ +
+ +
+
+OSVR-Boxstarter README +

Boxstarter self-installer scripts to prepare user or developer environments using Chocolatey.

+ +
+
+
+ +
+ +
+
+libfunctionality README +

A minimal library for dynamically-loaded or statically-linked functionality modules.

+ +
+
+
+ + + + +
+ + + + + + +
+ + + + + +
+ + diff --git a/doc/client/index.html b/doc/client/index.html new file mode 100644 index 0000000..e4054e3 --- /dev/null +++ b/doc/client/index.html @@ -0,0 +1,155 @@ + + + + + + + +OSVR Developer Portal +| +Integrating OSVR into other applications + + + + + + + +
+ + +
+

Integrating OSVR into other applications

+ + + +
+ + + + +
+ + + + + +
+ + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..b4474d6 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,181 @@ + + + + + + + +OSVR Developer Portal +| +Documentation + + + + + + + +
+ + +
+

Developer Documentation

+

Getting started

+ +

Developing with OSVR

+ +

Integrating with game engines

+ + +
+ + + + +
+ + + + + +
+ + diff --git a/doc/installing/index.html b/doc/installing/index.html new file mode 100644 index 0000000..f31200f --- /dev/null +++ b/doc/installing/index.html @@ -0,0 +1,158 @@ + + + + + + + +OSVR Developer Portal +| +Installing OSVR + + + + + + + +
+ + +
+

Installing OSVR

+ +

OSVR is available for a number of operating systems:

+ + + +
+ + + + +
+ + + + + +
+ + diff --git a/doc/installing/linux/index.html b/doc/installing/linux/index.html new file mode 100644 index 0000000..481ecac --- /dev/null +++ b/doc/installing/linux/index.html @@ -0,0 +1,195 @@ + + + + + + + +OSVR Developer Portal +| +Installing OSVR for Linux + + + + + + + +
+ + +
+

Installing OSVR for Linux

+ +

Building OSVR from source

+ +

Note: full instructions for building OSVR from scratch on Ubuntu 14.4 can be found here

+ +
    +
  1. Prerequisites. Many of the prerequisites may be available in your Linux distributions repositories. If you prefer to install them manually, the list of prerequisites follows:

    + +
  2. +
  3. Acquire the source code. Check out the source code from the OSVR-Core repository.

  4. +
  5. Create a build directory. To keep the source repository clean of temporary and generated build files, create a separate directory to contain the build. We usually create a directory named build inside the OSVR-Core directory.

    + +
    $ mkdir build
    +$ cd build
    +
  6. +
  7. Generate a Makefile. Run CMake to generate a Makefile. Set the CMAKE_INSTALL_PREFIX variable to the location where you would like the OSVR files to be installed:

    + +
    $ cmake .. -DCMAKE_INSTALL_PREFIX=~/osvr
    +
  8. +
  9. Compile OSVR. Navigate to the build directory you created in step 3 and run make to build OSVR. Optionally run make install to install the OSVR programs, libraries, and sample configuration files.

    + +
    $ make
    +$ make install
    +
  10. +
+ +

Next steps

+ + + +

Support

+ +

If you need further assistance with installing OSVR, email us at support@osvr.com.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/doc/installing/osx/index.html b/doc/installing/osx/index.html new file mode 100644 index 0000000..2734ac0 --- /dev/null +++ b/doc/installing/osx/index.html @@ -0,0 +1,201 @@ + + + + + + + +OSVR Developer Portal +| +Installing OSVR for OS X + + + + + + + +
+ + +
+

Installing OSVR for OS X

+ +

Install using Homebrew

+ +

You may install OSVR for OS X using our Homebrew repository:

+ +
$ brew tap OSVR/osvr
+$ brew install osvr-core --HEAD
+
+ +

Building OSVR from source

+ +
    +
  1. Prerequisites. The prerequisites may be installed using Homebrew. If you prefer to install them manually, the list of prerequisites follows:

    + +
  2. +
  3. Acquire the source code. Check out the source code from the OSVR-Core repository.

  4. +
  5. Create a build directory. To keep the source repository clean of temporary and generated build files, create a separate directory to contain the build. We usually create a directory named build inside the OSVR-Core directory.

    + +
    $ mkdir build
    +$ cd build
    +
  6. +
  7. Generate a Makefile. Run CMake to generate a Makefile. Set the CMAKE_INSTALL_PREFIX variable to the location where you would like the OSVR files to be installed:

    + +
    $ cmake .. -DCMAKE_INSTALL_PREFIX=~/osvr
    +
  8. +
  9. Compile OSVR. Navigate to the build directory you created in step 3 and run make to build OSVR. Optionally run make install to install the OSVR programs, libraries, and sample configuration files.

    + +
    $ make
    +$ make install
    +
  10. +
+ +

Next steps

+ + + +

Support

+ +

If you need further assistance with installing OSVR, email us at support@osvr.com.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/doc/installing/windows/index.html b/doc/installing/windows/index.html new file mode 100644 index 0000000..2e8aab5 --- /dev/null +++ b/doc/installing/windows/index.html @@ -0,0 +1,184 @@ + + + + + + + +OSVR Developer Portal +| +Installing OSVR for Windows + + + + + + + +
+ + +
+

Installing OSVR for Windows

+ +

Install precompiled binaries

+ +

You may download precompiled binaries of OSVR for Windows from our snapshots page.

+ +

Building OSVR from source

+ +
    +
  1. Prerequisites. The prerequisites may be installed using the Boxstarter scripts found in the OSVR-Boxstarter Repository. If you prefer to install them manually, the list of prerequisites follows:

    + +
  2. +
  3. Acquire the source code. Check out the source code from the OSVR-Core repository.

  4. +
  5. Create a build directory. To keep the source repository clean of temporary and generated build files, create a separate directory to contain the build. We usually create a directory named build inside the OSVR-Core directory.

  6. +
  7. Generate a Microsoft Visual Studio project. Run CMake to generate a project file for your compuiler. Set the CMAKE_INSTALL_PREFIX variable to the location where you would like the OSVR files to be installed.

  8. +
  9. Compile OSVR. Navigate to the build directory you created in step 3 and load the project file. Build the ALL_BUILDS project and optionally "build" the INSTALL_FILES project.

  10. +
+ +

Next steps

+ + + +

Support

+ +

If you need further assistance with installing OSVR, email us at support@osvr.com.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/doc/plugin/index.html b/doc/plugin/index.html new file mode 100644 index 0000000..a172238 --- /dev/null +++ b/doc/plugin/index.html @@ -0,0 +1,161 @@ + + + + + + + +OSVR Developer Portal +| +Developing OSVR plugins + + + + + + + +
+ + +
+

Developing OSVR plugins

+ + + +
+ + + + +
+ + + + + +
+ + diff --git a/doc/server/index.html b/doc/server/index.html new file mode 100644 index 0000000..e7ea748 --- /dev/null +++ b/doc/server/index.html @@ -0,0 +1,158 @@ + + + + + + + +OSVR Developer Portal +| +OSVR Server + + + + + + + +
+ + +
+

OSVR Server

+ +

Running the OSVR server just requires passing it a configuration file:

+ +
$ osvr_server osvr_server_config.json
+
+ +

Support

+ +

If you need further assistance with OSVR, email us at support@osvr.com.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/doc/testing/index.html b/doc/testing/index.html new file mode 100644 index 0000000..f78ad60 --- /dev/null +++ b/doc/testing/index.html @@ -0,0 +1,163 @@ + + + + + + + +OSVR Developer Portal +| +Testing OSVR + + + + + + + +
+ + +
+

Testing OSVR

+ +

A number of utility programs have been developed for testing and debugging OSVR.

+ +

OSVR Tracker Viewer

+ +

The OSVR Tracker Viewer is a utility program which displays the positions and orientations of one or more tracker devices.

+ +

Viewing the path tree

+ +

While the OSVR server is running, you may run the osvr_print_tree program to emit the path tree, showing the detected devices and associated aliases.

+ +

Support

+ +

If you need further assistance with OSVR, email us at support@osvr.com.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/doc/tracker-viewer/index.html b/doc/tracker-viewer/index.html new file mode 100644 index 0000000..b9a6d3d --- /dev/null +++ b/doc/tracker-viewer/index.html @@ -0,0 +1,198 @@ + + + + + + + +OSVR Developer Portal +| +OSVR Tracker Viewer + + + + + + + +
+ + +
+

OSVR Tracker Viewer

+ +

The OSVR Tracker Viewer is a utility program which displays the positions and orientations of one or more tracker devices.

+ +

Installing OSVR Tracker Viewer

+ +

Prebuilt binaries of OSVR Tracker Viewer are available for Windows. +For other operating systems, check the app store or software repository. Otherwise, instructions for building from source follow.

+ +

Building OSVR Trackver Viewer

+ +
    +
  1. Install the prerequisites. Building the OSVR Tracker Viewer has the following prerequisites:

    + +
  2. +
  3. Checkout the source code. Check out the OSVR Tracker Viewer source code from the git repository.

  4. +
  5. Run CMake. Run CMake and set the CMAKE_PREFIX_PATH to point to the installation directories of OSVR-Core and OpenSceneGraph.

  6. +
  7. Build OSVR TrackerViewer. Run make and make install in Linux and OS X. In Windows, open the generated project file in Microsoft Visual Studio and build the project.

  8. +
+ +

Running OSVR Tracker Viewer

+ +

Running OSVR Tracker Viewer will display the following trackers (if available) by default:

+ + + +

If you wish to see other trackers, you may provide their paths on the command line:

+ +
OSVRTrackerView --pose /me/head
+OSVRTrackerView --orientation /me/head
+
+ +

Additional command-line options and usages are shown with the --help option.

+ +

You can zoom by dragging with the right mouse button or scrolling the scroll wheel. Clicking and dragging with the left button rotates your view of the data. Note that the tool starts up showing you the standard OSVR coordinate system and orientation, so rotation is rarely useful. Pressing the spacebar will reset the view to its default orientation.

+ +

The large set of axes is the world coordinates in OSVR—the viewer loads in the standard orientation. Each smaller set of axes is a tracker.

+ +

As is convention, the x-axis is red, y-axis is green, and z-axis is blue (xyz-RGB).

+ +

Support

+ +

If you need further assistance, email us at support@osvr.com.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/doc/unity/index.html b/doc/unity/index.html new file mode 100644 index 0000000..264868e --- /dev/null +++ b/doc/unity/index.html @@ -0,0 +1,170 @@ + + + + + + + +OSVR Developer Portal +| +Integrating OSVR with Unity + + + + + + + +
+ + +
+

Integrating OSVR with Unity

+ +
    +
  1. Install Unity. OSVR works with Unity 4.6 and 5.x.
  2. +
  3. Download OSVR-Unity. You may download prebuilt binaries and extract the files somewhere convenient. Note that while only limited information is shown on the download page, the compressed file and its contained folder have a long, meaningful filename. Keep the long folder name in place, since it uniquely identifies the build you're using and can help troubleshooting if there are issues. You can also download the plugin from the Unity Asset Store, though this version necessarily lags the binary snapshots due to the manual submission and review process involved.
  4. +
  5. Import the package into your project. This contains all the assets required for the OSVR client (game) interface. Make sure ClientKit.dll is in your plugins folder.
  6. +
  7. Start the OSVR server. A copy of the latest server is bundled in the same compressed file as the .unitypackage file. When you want to test your game, ensure your devices are plugged in and start the OSVR server before running your game.
  8. +
+ +

Further information

+ + + +

Support

+ +

If you need further assistance with integrating OSVR with your Unity game, email us at support@osvr.com.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/doc/unreal/index.html b/doc/unreal/index.html new file mode 100644 index 0000000..b010a1c --- /dev/null +++ b/doc/unreal/index.html @@ -0,0 +1,176 @@ + + + + + + + +OSVR Developer Portal +| +Integrating OSVR with Unreal Engine + + + + + + + +
+ + +
+

Integrating OSVR with Unreal Engine

+ + + +
+ + + + +
+ + + + + +
+ + diff --git a/fonts/bootstrap/glyphicons-halflings-regular.eot b/fonts/bootstrap/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/fonts/bootstrap/glyphicons-halflings-regular.eot differ diff --git a/fonts/bootstrap/glyphicons-halflings-regular.svg b/fonts/bootstrap/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/fonts/bootstrap/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/bootstrap/glyphicons-halflings-regular.ttf b/fonts/bootstrap/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/fonts/bootstrap/glyphicons-halflings-regular.ttf differ diff --git a/fonts/bootstrap/glyphicons-halflings-regular.woff b/fonts/bootstrap/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/fonts/bootstrap/glyphicons-halflings-regular.woff differ diff --git a/fonts/bootstrap/glyphicons-halflings-regular.woff2 b/fonts/bootstrap/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/fonts/bootstrap/glyphicons-halflings-regular.woff2 differ diff --git a/images/20150419-osvr-intro.242x200.png b/images/20150419-osvr-intro.242x200.png new file mode 100644 index 0000000..832a9d5 Binary files /dev/null and b/images/20150419-osvr-intro.242x200.png differ diff --git a/images/20150419-osvr-intro.png b/images/20150419-osvr-intro.png new file mode 100644 index 0000000..c0ef30e Binary files /dev/null and b/images/20150419-osvr-intro.png differ diff --git a/images/20150419-osvr-software-framework-path-tree.242x200.png b/images/20150419-osvr-software-framework-path-tree.242x200.png new file mode 100644 index 0000000..4cdffc0 Binary files /dev/null and b/images/20150419-osvr-software-framework-path-tree.242x200.png differ diff --git a/images/20150419-osvr-software-framework-path-tree.png b/images/20150419-osvr-software-framework-path-tree.png new file mode 100644 index 0000000..6320361 Binary files /dev/null and b/images/20150419-osvr-software-framework-path-tree.png differ diff --git a/images/20150729-intro-osvr-boston-meetup.242x200.png b/images/20150729-intro-osvr-boston-meetup.242x200.png new file mode 100644 index 0000000..d9c0c0e Binary files /dev/null and b/images/20150729-intro-osvr-boston-meetup.242x200.png differ diff --git a/images/20150729-intro-osvr-boston-meetup.png b/images/20150729-intro-osvr-boston-meetup.png new file mode 100644 index 0000000..379d38d Binary files /dev/null and b/images/20150729-intro-osvr-boston-meetup.png differ diff --git a/images/20150809-Client-App-Design.242x200.png b/images/20150809-Client-App-Design.242x200.png new file mode 100644 index 0000000..46c02ee Binary files /dev/null and b/images/20150809-Client-App-Design.242x200.png differ diff --git a/images/20150809-Client-App-Design.png b/images/20150809-Client-App-Design.png new file mode 100644 index 0000000..85cbefe Binary files /dev/null and b/images/20150809-Client-App-Design.png differ diff --git a/images/20150809-Operating-Systems-Portability-Android.242x200.png b/images/20150809-Operating-Systems-Portability-Android.242x200.png new file mode 100644 index 0000000..fd6d504 Binary files /dev/null and b/images/20150809-Operating-Systems-Portability-Android.242x200.png differ diff --git a/images/20150809-Operating-Systems-Portability-Android.png b/images/20150809-Operating-Systems-Portability-Android.png new file mode 100644 index 0000000..eef1e09 Binary files /dev/null and b/images/20150809-Operating-Systems-Portability-Android.png differ diff --git a/images/20150809-Path-tree.png b/images/20150809-Path-tree.png new file mode 100644 index 0000000..dc6a0e7 Binary files /dev/null and b/images/20150809-Path-tree.png differ diff --git a/images/20150809-Plugin-Design.242x200.png b/images/20150809-Plugin-Design.242x200.png new file mode 100644 index 0000000..f7b37ea Binary files /dev/null and b/images/20150809-Plugin-Design.242x200.png differ diff --git a/images/20150809-Plugin-Design.png b/images/20150809-Plugin-Design.png new file mode 100644 index 0000000..a85ce8e Binary files /dev/null and b/images/20150809-Plugin-Design.png differ diff --git a/images/20150809-VR-API-evolution-Factoring.242x200.png b/images/20150809-VR-API-evolution-Factoring.242x200.png new file mode 100644 index 0000000..d68e630 Binary files /dev/null and b/images/20150809-VR-API-evolution-Factoring.242x200.png differ diff --git a/images/20150809-VR-API-evolution-Factoring.png b/images/20150809-VR-API-evolution-Factoring.png new file mode 100644 index 0000000..8f0940b Binary files /dev/null and b/images/20150809-VR-API-evolution-Factoring.png differ diff --git a/images/20150901-Intro-ETW-OSVR.242x200.png b/images/20150901-Intro-ETW-OSVR.242x200.png new file mode 100644 index 0000000..15a6ed8 Binary files /dev/null and b/images/20150901-Intro-ETW-OSVR.242x200.png differ diff --git a/images/20150901-Intro-ETW-OSVR.png b/images/20150901-Intro-ETW-OSVR.png new file mode 100644 index 0000000..0a5580f Binary files /dev/null and b/images/20150901-Intro-ETW-OSVR.png differ diff --git a/images/20160211-Support-Any-Device-Vision-Summit.242x200.png b/images/20160211-Support-Any-Device-Vision-Summit.242x200.png new file mode 100644 index 0000000..0ff1466 Binary files /dev/null and b/images/20160211-Support-Any-Device-Vision-Summit.242x200.png differ diff --git a/images/20160211-Support-Any-Device-Vision-Summit.png b/images/20160211-Support-Any-Device-Vision-Summit.png new file mode 100644 index 0000000..8177962 Binary files /dev/null and b/images/20160211-Support-Any-Device-Vision-Summit.png differ diff --git a/images/github-overview.graphml b/images/github-overview.graphml new file mode 100644 index 0000000..d66a6af --- /dev/null +++ b/images/github-overview.graphml @@ -0,0 +1,2060 @@ + + + + + + + + + + + + + + + + + + + + + + + Last update: +Jul 3, 2017 + + + + + + + + + + + + + + + + + + Documentation + + + + + + + + + + + + + + + + + + List of +supported +devices + + + + + + + + + + + + + + + + + + EXPERIMENTAL: +Python binding + + + + + + + + + + + + + + + + + + Managed-OSVR + + + + + + + + + + + + + + + + + + RenderManager +NVIDIA | AMD | Intel + + + + + + + + + + + + + + + + + + OSVR- +Hardware- +Accessories + + + + + + + + + + + + + + + + + + + + OS-specific code + + + + + + + + + + Folder 9 + + + + + + + + + + + + + + + + + + + Windows + + + + + + + + + + Folder 7 + + + + + + + + + + + + + + + + + OSVR-HDK-Windows-Drivers + + + + + + + + + + + + + + + + + + + + + + Android + + + + + + + + + + Folder 7 + + + + + + + + + + + + + + + + + OSVR-Android-SDK + + + + + + + + + + + + + + + + + + OSVR-Android-Build + + + + + + + + + + + + + + + + + + OSVR-Android-Plugins + + + + + + + + + + + + + + + + + + OSVR-AndroidServerLauncher + + + + + + + + + + + + + + + + + + OSVR-Android-Samples + + + + + + + + + + + + + + + + + + android-cmake + + + + + + + + + + + + + + + + + + + + + + OS X + + + + + + + + + + Folder 8 + + + + + + + + + + + + + + + + + Homebrew Tap + + + + + + + + + + + + + + + + + + + + + + Linux + + + + + + + + + + Folder 10 + + + + + + + + + + + + + + + + + Build instructions + + + + + + + + + + + + + + + + + + + + + + + + Plugins + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + + + + HMDs and devices + + + + + + + + + + Folder 11 + + + + + + + + + + + + + + + + + OSVR-Vuzix + + + + + + + + + + + + + + + + + + OSVR-Oculus-Rift + + + + + + + + + + + + + + + + + + OSVR- +EmulatedDevices + + + + + + + + + + + + + + + + + + OSVR-Vive + + + + + + + + + + + + + + + + + + OSVR-LaputaVR + + + + + + + + + + + + + + + + + + OSVR-ANTVR + + + + + + + + + + + + + + + + + + + + + + Peripherals + + + + + + + + + + Folder 12 + + + + + + + + + + + + + + + + + OSVR-SMI + + + + + + + + + + + + + + + + + + OSVR-Leap-Motion + + + + + + + + + + + + + + + + + + OSVR-Nod + + + + + + + + + + + + + + + + + + OSVR-InertialLabs + + + + + + + + + + + + + + + + + + OSVR-ART + + + + + + + + + + + + + + + + + + OSVR-FOVE + + + + + + + + + + + + + + + + + + OSVR-Ximmerse + + + + + + + + + + + + + + + + + + OSVR-PSMoveAPI + + + + + + + + + + + + + + + + + + OSVR-OpenHMD + + + + + + + + + + + + + + + + + + OSVR-firmata + + + + + + + + + + + + + + + + + + OSVR-Kinect + + + + + + + + + + + + + + + + + + OSVR-wiimote + + + + + + + + + + + + + + + + + + Alternate +OSVR-PSMove + + + + + + + + + + + + + + + + + + Hydra-OSVR + + + + + + + + + + + + + + + + + + Nolo-OSVR + + + + + + + + + + + + + + + + + + + + + + Analysis + + + + + + + + + + Folder 13 + + + + + + + + + + + + + + + + + OSVR-AR Toolkit + + + + + + + + + + + + + + + + + + OSVR-Fusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Folder 6 + + + + + + + + + + + + + + + + + osvr_reset_yaw + + + + + + + + + + + + + + + + + + osvr_print_tree + + + + + + + + + + + + + + + + + + osvr_json_to_c + + + + + + + + + + + + + + + + + + PathTreeExport + + + + + + + + + + + + + + + + + + OSVR Core + + + + + + + + + + + + + + + + + + + + + Poser + + + + + + + + + + + + + + + + + + Skeleton + + + + + + + + + + + + + + + + + + Locomotion + + + + + + + + + + + + + + + + + + Eye tracker + + + + + + + + + + + + + + + + + + Config + + + + + + + + + + + + + + + + + + Button + + + + + + + + + + + + + + + + + + Analog + + + + + + + + + + + + + + + + + + Gesture + + + + + + + + + + + + + + + + + + Tracker + + + + + + + + + + + + + + + + + + Imager + + + + + + + + + + + + + + + + + + + + + + Game engine plugins and samples + + + + + + + + + + Folder 5 + + + + + + + + + + + + + + + + + OSVR-Unreal + + + + + + + + + + + + + + + + + + OSVR-Unity-Rendering + + + + + + + + + + + + + + + + + + OSVR-Monogame + + + + + + + + + + + + + + + + + + OSVR-Unity-Palace-Demo + + + + + + + + + + + + + + + + + + SteamVR-OSVR + + + + + + + + + + + + + + + + + + EXPERIMENTAL: +Blender-OSVR + + + + + + + + + + + + + + + + + + OSVR-Unity + + + + + + + + + + + + + + + + + + Unity-VR-Samples + + + + + + + + + + + + + + + + + + WebVR-OSVR + + + + + + + + + + + + + + + + + + + + + + User tools + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + + OSVR- +Tracker-Viewer + + + + + + + + + + + + + + + + + + OSVR-Central + + + + + + + + + + + + + + + + + + OSVR-Config + + + + + + + + + + + + + + + + + + SensicsTray + + + + + + + + + + + + + + + + + + + + + + Developer tools + + + + + + + + + + Folder 10 + + + + + + + + + + + + + + + + + Distortionizer + + + + + + + + + + + + + + + + + + Latency-Test + + + + + + + + + + + + + + + + + + LED +Encoding + + + + + + + + + + + + + + + + + + OSVR- +Boxstarter + + + + + + + + + + + + + + + + + + OSVR- +JSON-Editor + + + + + + + + + + + + + + + + + + OSVR- +JSON-Schemas + + + + + + + + + + + + + + + + + + OSVR-specs- +and-proposals + + + + + + + + + + + + + + + + + + OSVR- +win-installer + + + + + + + + + + + + + + + + + + OSVR-device-viewer + + + + + + + + + + + + + + + + + + + + OSVR-HDK +Hardware + + + + + + + + + + + + + + + + + + Libfunctionality + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/github-overview.jpg b/images/github-overview.jpg new file mode 100644 index 0000000..ab3258a Binary files /dev/null and b/images/github-overview.jpg differ diff --git a/images/github-overview.svg b/images/github-overview.svg new file mode 100644 index 0000000..cf7406d --- /dev/null +++ b/images/github-overview.svg @@ -0,0 +1,1517 @@ + + + + + + + + + + + + + + + + + + + + + + Last update: + + + Jul 3, 2017 + + + + + + + + + + + + + + Documentation + + + + + + + + + + + + List of + supported + devices + + + + + + + + + + + + + + + EXPERIMENTAL: + Python binding + + + + + + + + + + + + + + + Managed-OSVR + + + + + + + + + + + + + + + RenderManager + NVIDIA | AMD | Intel + + + + + + + + + + + + + + + OSVR- + Hardware- + Accessories + + + + + + + + + + + + + + + + + OS-specific code + + + + + + + + + + + + + + + + Windows + + + + + + + + + + + + + + OSVR-HDK-Windows-Drivers + + + + + + + + + + + + + + + + + Android + + + + + + + + + + + + + + OSVR-Android-SDK + + + + + + + + + + + + + + + OSVR-Android-Build + + + + + + + + + + + + + + + OSVR-Android-Plugins + + + + + + + + + + + + + + + OSVR-AndroidServerLauncher + + + + + + + + + + + + + + + OSVR-Android-Samples + + + + + + + + + + + + + + + android-cmake + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OS X + + + + + + + + + + + + + + Homebrew Tap + + + + + + + + + + + + + + + + + Linux + + + + + + + + + + + + + + Build instructions + + + + + + + + + + + Plugins + + + + + + + + + + + + + + + + HMDs and devices + + + + + + + + + + + + + + OSVR-Vuzix + + + + + + + + + + + + + + + OSVR-Oculus-Rift + + + + + + + + + + + + + + + OSVR- + EmulatedDevices + + + + + + + + + + + + + + + OSVR-Vive + + + + + + + + + + + + + + + OSVR-LaputaVR + + + + + + + + + + + + + + + OSVR-ANTVR + + + + + + + + + + + + + + + + + Peripherals + + + + + + + + + + + + + + OSVR-SMI + + + + + + + + + + + + + + + OSVR-Leap-Motion + + + + + + + + + + + + + + + OSVR-Nod + + + + + + + + + + + + + + + OSVR-InertialLabs + + + + + + + + + + + + + + + OSVR-ART + + + + + + + + + + + + + + + OSVR-FOVE + + + + + + + + + + + + + + + OSVR-Ximmerse + + + + + + + + + + + + + + + OSVR-PSMoveAPI + + + + + + + + + + + + + + + OSVR-OpenHMD + + + + + + + + + + + + + + + OSVR-firmata + + + + + + + + + + + + + + + OSVR-Kinect + + + + + + + + + + + + + + + OSVR-wiimote + + + + + + + + + + + + + + + Alternate + OSVR-PSMove + + + + + + + + + + + + + + + Hydra-OSVR + + + + + + + + + + + + + + + Nolo-OSVR + + + + + + + + + + + + + + + + + Analysis + + + + + + + + + + + + + + OSVR-AR Toolkit + + + + + + + + + + + + + + + OSVR-Fusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + osvr_reset_yaw + + + + + + + + + + + + + + + osvr_print_tree + + + + + + + + + + + + + + + osvr_json_to_c + + + + + + + + + + + + + + + PathTreeExport + + + + + + + + + + + + + + + OSVR Core + + + + + + + + + + + + + + + + + Poser + + + + + + + + + + + + + + + Skeleton + + + + + + + + + + + + + + + Locomotion + + + + + + + + + + + + + + + Eye tracker + + + + + + + + + + + + + + + Config + + + + + + + + + + + + + + + Button + + + + + + + + + + + + + + + Analog + + + + + + + + + + + + + + + Gesture + + + + + + + + + + + + + + + Tracker + + + + + + + + + + + + + + + Imager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Game engine plugins and samples + + + + + + + + + + + + + + OSVR-Unreal + + + + + + + + + + + + + + + OSVR-Unity-Rendering + + + + + + + + + + + + + + + OSVR-Monogame + + + + + + + + + + + + + + + OSVR-Unity-Palace-Demo + + + + + + + + + + + + + + + SteamVR-OSVR + + + + + + + + + + + + + + + EXPERIMENTAL: + Blender-OSVR + + + + + + + + + + + + + + + OSVR-Unity + + + + + + + + + + + + + + + Unity-VR-Samples + + + + + + + + + + + + + + + WebVR-OSVR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + User tools + + + + + + + + + + + + + + OSVR- + Tracker-Viewer + + + + + + + + + + + + + + + OSVR-Central + + + + + + + + + + + + + + + OSVR-Config + + + + + + + + + + + + + + + SensicsTray + + + + + + + + + + + + + + + + + + + + + + + Developer tools + + + + + + + + + + + + + + Distortionizer + + + + + + + + + + + + + + + Latency-Test + + + + + + + + + + + + + + + LED + Encoding + + + + + + + + + + + + + + + OSVR- + Boxstarter + + + + + + + + + + + + + + + OSVR- + JSON-Editor + + + + + + + + + + + + + + + OSVR- + JSON-Schemas + + + + + + + + + + + + + + + OSVR-specs- + and-proposals + + + + + + + + + + + + + + + OSVR- + win-installer + + + + + + + + + + + + + + + OSVR-device-viewer + + + + + + + + + + + + + + + OSVR-HDK + Hardware + + + + + + + + + + + + + + + Libfunctionality + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ircamera-updater.png b/images/ircamera-updater.png new file mode 100644 index 0000000..da9cf8a Binary files /dev/null and b/images/ircamera-updater.png differ diff --git a/images/osvr-logo-menu.png b/images/osvr-logo-menu.png new file mode 100644 index 0000000..d61b570 Binary files /dev/null and b/images/osvr-logo-menu.png differ diff --git a/images/osvr-logo-square-128.png b/images/osvr-logo-square-128.png new file mode 100644 index 0000000..6193bfe Binary files /dev/null and b/images/osvr-logo-square-128.png differ diff --git a/images/osvr-logo-square-16.png b/images/osvr-logo-square-16.png new file mode 100644 index 0000000..ed90c79 Binary files /dev/null and b/images/osvr-logo-square-16.png differ diff --git a/images/osvr-logo-square-256.png b/images/osvr-logo-square-256.png new file mode 100644 index 0000000..b4137ed Binary files /dev/null and b/images/osvr-logo-square-256.png differ diff --git a/images/osvr-logo-square-32.png b/images/osvr-logo-square-32.png new file mode 100644 index 0000000..45617f6 Binary files /dev/null and b/images/osvr-logo-square-32.png differ diff --git a/images/osvr-logo-square-48.png b/images/osvr-logo-square-48.png new file mode 100644 index 0000000..37e23bf Binary files /dev/null and b/images/osvr-logo-square-48.png differ diff --git a/images/osvr-logo-square-64.png b/images/osvr-logo-square-64.png new file mode 100644 index 0000000..e3ff352 Binary files /dev/null and b/images/osvr-logo-square-64.png differ diff --git a/images/osvr_server_icon_48.png b/images/osvr_server_icon_48.png new file mode 100644 index 0000000..4319123 Binary files /dev/null and b/images/osvr_server_icon_48.png differ diff --git a/images/tracker-view-48.png b/images/tracker-view-48.png new file mode 100644 index 0000000..80a0ac9 Binary files /dev/null and b/images/tracker-view-48.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..104a0ad --- /dev/null +++ b/index.html @@ -0,0 +1,216 @@ + + + + + + + +OSVR Developer Portal +| +Home + + + + + + + +
+ + +
+

Welcome to OSVR.

+

+ OSVR is an open-source software platform for virtual and augmented reality. It allows discovery, configuration and operation of hundreds of VR/AR devices and peripherals. OSVR supports multiple game engines, and operating systems and provides services such as asynchronous time warp and direct mode in support of low-latency rendering. OSVR software is provided free under Apache 2.0 license and is maintained by Sensics. +

+Please consider supporting the OSVR movement by +donating to OSVR +. +

+ +

+
+ +
+ +
+
+

+ Documentation, Videos and White Papers +

+ +

+ Getting support +

+

+ Free support +

+ +

+ Premium support +

+ +

+ Slides and Speaker Notes from Presentations +

+

+ Includes new presentation from February '16 +

+

+ Mailing Lists and Newsletters +

+ + + + +
+ + + + + +
+ + diff --git a/javascripts/all.js b/javascripts/all.js new file mode 100644 index 0000000..2e67258 --- /dev/null +++ b/javascripts/all.js @@ -0,0 +1,2471 @@ + +// inspired by http://stackoverflow.com/questions/17147821/how-to-make-a-whole-row-in-a-table-clickable-as-a-link +jQuery(document).ready(function($) { + $('.clickable_row tr').filter('[data-url]').click(function() { + var target = $(this).data('url'); + // Send this javascript-based link behavior to analytics. + ga('send', { + 'hitType': 'pageview', + 'location': target + }); + window.document.location = target; + }); +}); +jQuery(document).ready(function($) { + $("#mailSignup").on('show.bs.modal', function (e) { + // Submit an event when the dialog box is shown + ga('send', 'event', 'newsletter', 'show-subscribe', 'Developer Newsletter'); + }); + $("form", $("#mailSignup")).submit(function(e) { + // Submit an event when the form is submitted: + // can't check for success with this newsletter API, though we do have HTML5 + // 'required' attributes added, whatever good that might do. + ga('send', 'event', 'newsletter', 'complete-subscribe', 'Developer Newsletter'); + }); +}); +jQuery(document).ready(function($) { + $("#osvrMailSignup").on('show.bs.modal', function (e) { + // Submit an event when the dialog box is shown + ga('send', 'event', 'newsletter', 'show-subscribe', 'OSVR Newsletter'); + }); + $("#newsletter-submit").click(function(e) { + e.preventDefault(); + $(".loader").show(); + $("#error-newsletter").addClass("hide"); + $(this).addClass("hide"); + + $.ajax({ + url: "http://razerlb-ee-ep-1440848885.us-west-1.elb.amazonaws.com/?ACT=34&action=process_osvr_newsletter", + dataType: 'json', + data: { + email: $("#formSubmitNewsletter input[name='emailNewsletter']").val() + }, + type: 'POST', + success: function(data) { + if (data.return_status === "success") { + $('#success-newsletter').html('Thank you for your submission'); + $("#error-newsletter").removeClass("hide"); + $(".loader").hide(); + $("#error-newsletter").removeClass('red'); + $("#error-newsletter").addClass('lime'); + $("#formSubmitNewsletter").hide(); + + // Submit an event when the form is submitted successfully + ga('send', 'event', 'newsletter', 'complete-subscribe', 'OSVR Newsletter'); + } else { + var obj = ""; + if ("return_email" in data) + obj = 'Invalid Email Address'; + + $('#error-newsletter').html(obj); + $("#error-newsletter").removeClass("hide"); + $("#error-newsletter").removeClass('lime'); + $("#error-newsletter").addClass('red'); + $(".loader").hide(); + $("#newsletter-submit").removeClass("hide"); + } + } + }); + }); +}); +jQuery(document).ready(function($) { + // See if we might have been an attempt to navigate directly to a project directory entry. + var locHash = window.location.hash; + if (locHash) { + // remove # + var project = locHash.substr(1); + var needNav = false; + if (project.match(/^collapse/)) { + // remove collapse prefix and indicate we want to navigate to the updated hash. + project = locHash.substr(9); + needNav = true; + }; + if (projectAnchors[project]) { + // OK, we've got a valid project anchor. Expand and scroll. + $('#collapse' + project).collapse('show'); + if (needNav) { + window.location.hash = '#' + project; + } + } + } +}); +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ + + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.7 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.7' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector === '#' ? [] : selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.7 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.7' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d).prop(d, true) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d).prop(d, false) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target).closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.7 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.7' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.7 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + +/* jshint latedef: false */ + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.7' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.7 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.7' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.7 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.7' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.7 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.7' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.7 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.7' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.7 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.7' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); + + diff --git a/javascripts/project_directory.js b/javascripts/project_directory.js new file mode 100644 index 0000000..215f796 --- /dev/null +++ b/javascripts/project_directory.js @@ -0,0 +1,21 @@ +jQuery(document).ready(function($) { + // See if we might have been an attempt to navigate directly to a project directory entry. + var locHash = window.location.hash; + if (locHash) { + // remove # + var project = locHash.substr(1); + var needNav = false; + if (project.match(/^collapse/)) { + // remove collapse prefix and indicate we want to navigate to the updated hash. + project = locHash.substr(9); + needNav = true; + }; + if (projectAnchors[project]) { + // OK, we've got a valid project anchor. Expand and scroll. + $('#collapse' + project).collapse('show'); + if (needNav) { + window.location.hash = '#' + project; + } + } + } +}); diff --git a/mailing-lists/etiquette/index.html b/mailing-lists/etiquette/index.html new file mode 100644 index 0000000..3848390 --- /dev/null +++ b/mailing-lists/etiquette/index.html @@ -0,0 +1,223 @@ + + + + + + + +OSVR Developer Portal +| +Mailing List Etiquette + + + + + + + +
+ + +
+

These guidelines are based on the mozilla.org Forum Guidelines, used and modified under a CC BY-SA Unported 3.0+ license. Note that civil community conduct is of the utmost importance, and these guidelines are not intended to be taken as the only bounds on acceptable conduct.

+ +

Ground Rules

+ +

There are a few ground rules for participation in community communication (mailing lists, issues, etc) in the OSVR project. Offenses may result in removal of the conduct from archives, if applicable, and can result in a temporary or permanent ban of the offending member from the community. Please respect these rules, and each other.

+ +

Be civil.

+ +

No personal attacks. Do not feel compelled to defend your honor in public. Personal attacks and/or harassment of any kind are not tolerated, and have consequences as discussed above.

+ +

Stay on topic.

+ +

Community members are busy people, so please pay attention to the topic of your messages, and check that it still relates to the charter of the forum (issue, mailing list, etc) to which you are posting. Off-topic discussion not taken to private email or any place where it is not considered off-topic, by someone who knows they should be taking it elsewhere, may be removed from archives, with patterns of such behavior resulting in more serious consequences as discussed above..

+ +

Be kind to newcomers.

+ +

Newcomers may be annoying. They ask the wrong questions, including ones that seem obvious (or whose answers seem easy to find). But lots of valued contributors start out this way, and treating newcomers kindly makes them more likely to turn into the valuable community members we all know and love (and cut some slack when they mess up).

+ +

So while you don’t have to humor them or suffer them gladly, and it’s fine to point out when they make mistakes, point newcomers in the right direction in addition to turning them away from the wrong ones, and be kind to them in the process of correcting their transgressions.

+ +

Let sleeping dogs lie.

+ +

It’s tempting to revisit controversial decisions you disagree with, but it’s rarely productive to do so, since it almost always results in the same heated, lengthy, and time/energy draining discussions leading to the same conclusion that was reached in the last round.

+ +

Therefore, for issues already raised, discussed, and decided upon, reopen the discussion only if you have significant new information that would reasonably prompt reconsideration of the original decision.

+ +

No crossposting.

+ +

It is almost never appropriate to send the same message to two mailing lists, forums, or newsgroups. Please don’t do it.

+ +

No advocacy.

+ +

These community venues are for discussions about the OSVR software ecosystem and OSVR HDK design. As such, discussions about which operating system is better, or whether one toolkit is better than another, or whether (insert VR entity here) is the root of all evil, are not relevant. There are many forums for discussing such issues on the internet; please have such discussions there instead of in the OSVR community venues.

+ +

Ignore spammers.

+ +

Spam is a blight upon the face of the net. Nobody likes it. However, it is hard to avoid. Despite our best efforts, you will occasionally see spam on the OSVR mailing lists and newsgroups. If you feel the need to flame the spammer, do not CC the list. Complaining about spam in public increases noise, but not signal. It may make you feel better, but it doesn’t help. (For info on fighting spam effectively, check out spam.abuse.net.)

+ +

No large attachments.

+ +

Do not send binary attachments, including screen shots, and especially including screen shots of textual dialog boxes. Many people read these messages through slow network connections; try to be respectful of them. If you have a large file that you would like to distribute, put it on a Web page and announce the URL instead of attaching it.

+ +

Trim your follow-ups.

+ +

Do not quote the entire content of the message to which you are replying. Include only as much as is necessary for context. Remember that if someone wants to read the original message, they can; it is easily accessible. A good rule of thumb is, don’t include more quoted text than new text.

+ +

There is always a need for some trimming - either a salutation, a signature, some blank lines or whatever. If you are doing no trimming whatsoever of the quoted text, then you aren’t trimming enough.

+ +

Top-posting vs bottom-posting.

+ +

Some people like to put reply after the quoted text, some like it the other way around, and still some prefer interspersed style. Debates about which posting style is better have led to many flame wars in the checkered history of the internet. To keep forum discussion friendly, please do interspersion with trimming (see above for trimming rules). For a simple reply, this is equivalent to bottom-posting. So, remove extraneous material, and place your comments in logical order, after the text you are commenting upon.

+ +

Post HTML at your own risk.

+ +

Keep in mind that not everyone uses mail or news readers that can easily display HTML messages. Consequently, you will reach a larger audience if you post in plain-text. Many people simply ignore HTML messages, because it takes a nontrivial amount of effort to read them.

+ +

Report bugs in GitHub issues, not in mailing lists, forums, etc.

+ +

If you encounter a bug, please take the time to file a report in the appropriate GitHub issues tracker about it. OSVR developers do not all have time to follow all the OSVR-related forums on a regular basis, and if you just post a bug report to a forum or mailing list then it may not reach anyone who can actually do anything about the bug. By reporting the bug through GitHub you ensure that it will receive a higher level of attention, and will be tracked along with other bugs.

+ +

Identify your subject matter.

+ +

Not everyone has time reading all forum postings. To ensure that your message reach the right people at timely manner, identify your subject matter clearly in the subject line. Subjects like "a question" and "OSVR problem" are not very helpful.

+ +

No unsubscribe messages.

+ +

Unfortunately, this bears repeating. Find out more about unsubscribing in the Mailing Lists section.

+ +

No test messages.

+ +

Please do not send test messages to the mailing lists.

+ +

devel is not support.

+ +

OSVR is a large effort with many potential audiences. There are specific channels for "support" requests - see support.osvr.com - that get different kinds of attention than the development discussion media. When deciding whether a message is a support request or suitable for a devel post, err on the side of sending it to support: support will let you know if your question might be better suited to another venue.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/mailing-lists/index.html b/mailing-lists/index.html new file mode 100644 index 0000000..d4982b8 --- /dev/null +++ b/mailing-lists/index.html @@ -0,0 +1,253 @@ + + + + + + + +OSVR Developer Portal +| +Mailing lists and newsletters + + + + + + + +
+ + +
+

Mailing lists and newsletters

+

Newsletters

+

These are low-volume announcement lists, recommended for those using OSVR.

+
+
+ + + + +
+
+ + +
+
+

Gitter chat rooms

+

Provide developer chat rooms on a variety of topics such as OSVR-Core, OSVR-Unity, SteamVR-OSVR and more.

+

See the Documentation and Community section

+ +

Mailing list - OSVR-devel

+

We expect that community members participating in mailing lists, as well as other community venues (forums, issue trackers, etc.), will hold themselves to a high standard of conduct, so that our community actively encourages participation from a wide audience. Please see our etiquette guidelines for basic ground rules.

+

The OSVR project currently has one main development discussion mailing list.

+ + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150419-osvr-intro.pdf b/presentations/20150419-osvr-intro.pdf new file mode 100644 index 0000000..164026c Binary files /dev/null and b/presentations/20150419-osvr-intro.pdf differ diff --git a/presentations/20150419-osvr-intro/index.html b/presentations/20150419-osvr-intro/index.html new file mode 100644 index 0000000..9b61137 --- /dev/null +++ b/presentations/20150419-osvr-intro/index.html @@ -0,0 +1,191 @@ + + + + + + + +OSVR Developer Portal +| +Introduction to OSVR + + + + + + + +
+ + + +
+

+Introduction to OSVR +

+

Originally presented by Yuval Boger (CEO, Sensics, Inc.) as an invited tech talk in the CONVRGE social VR platform, April 2015.

+ +

OSVR - open source virtual reality - is a popular open-source project that includes both a wide-field open-source virtual reality goggle as well as a free and open-source software framework. This presentation, created by Sensics - founding contributor to OSVR - introduces the key components of OSVR.

+ + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150419-osvr-software-framework-path-tree.pdf b/presentations/20150419-osvr-software-framework-path-tree.pdf new file mode 100644 index 0000000..893c3b8 Binary files /dev/null and b/presentations/20150419-osvr-software-framework-path-tree.pdf differ diff --git a/presentations/20150419-osvr-software-framework-path-tree/index.html b/presentations/20150419-osvr-software-framework-path-tree/index.html new file mode 100644 index 0000000..4921f82 --- /dev/null +++ b/presentations/20150419-osvr-software-framework-path-tree/index.html @@ -0,0 +1,195 @@ + + + + + + + +OSVR Developer Portal +| +OSVR Software Framework - Core/Path Tree + + + + + + + +
+ + + +
+

+OSVR Software Framework - Core/Path Tree +

+

Originally presented by Ryan A. Pavlik (Senior Software Engineer, Sensics, Inc.) as an invited tech talk in the CONVRGE social VR platform, April 2015.

+ +
+

The OSVR (Open Source Virtual Reality) framework is a fully open-source framework facilitating the connection between virtual reality hardware, algorithms, and applications. I presented this talk in my role as senior software engineer at Sensics, the founding contributor of OSVR.

+ +

Originally presented in CONVRGE on 19 April 2015, this talk gives a birds-eye view of the architecture of OSVR, then proceeds to a deep dive into the "path tree", semantic names, and aliases, from the perspective of the OSVR Core.

+
+ + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150729-intro-osvr-boston-meetup.pdf b/presentations/20150729-intro-osvr-boston-meetup.pdf new file mode 100644 index 0000000..d912e9b Binary files /dev/null and b/presentations/20150729-intro-osvr-boston-meetup.pdf differ diff --git a/presentations/20150729-intro-osvr-boston-meetup/index.html b/presentations/20150729-intro-osvr-boston-meetup/index.html new file mode 100644 index 0000000..0f68995 --- /dev/null +++ b/presentations/20150729-intro-osvr-boston-meetup/index.html @@ -0,0 +1,189 @@ + + + + + + + +OSVR Developer Portal +| +OSVR Overview at Boston VR + + + + + + + +
+ + + +
+

+OSVR Overview at Boston VR +

+

A talk presented by Yuval Boger (CEO, Sensics, Inc.) at the Boston VR Meetup in July 2015.

+ + + + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150809-Client-App-Design.pdf b/presentations/20150809-Client-App-Design.pdf new file mode 100644 index 0000000..33a4e5c Binary files /dev/null and b/presentations/20150809-Client-App-Design.pdf differ diff --git a/presentations/20150809-Client-App-Design/index.html b/presentations/20150809-Client-App-Design/index.html new file mode 100644 index 0000000..0776651 --- /dev/null +++ b/presentations/20150809-Client-App-Design/index.html @@ -0,0 +1,189 @@ + + + + + + + +OSVR Developer Portal +| +OSVR Client App Design + + + + + + + +
+ + + +
+

+OSVR Client App Design +

+

July 2015

+ +

Covers the "ground-up" details of writing an OSVR-Core client application or a new engine integration using the OSVR ClientKit API. (More low-level than required to use most engine integrations.)

+ + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150809-Operating-Systems-Portability-Android.pdf b/presentations/20150809-Operating-Systems-Portability-Android.pdf new file mode 100644 index 0000000..315bf0d Binary files /dev/null and b/presentations/20150809-Operating-Systems-Portability-Android.pdf differ diff --git a/presentations/20150809-Operating-Systems-Portability-Android/index.html b/presentations/20150809-Operating-Systems-Portability-Android/index.html new file mode 100644 index 0000000..55dc7fe --- /dev/null +++ b/presentations/20150809-Operating-Systems-Portability-Android/index.html @@ -0,0 +1,189 @@ + + + + + + + +OSVR Developer Portal +| +OSVR Operating System Platforms and Portability + + + + + + + +
+ + + +
+

+OSVR Operating System Platforms and Portability +

+

July 2015

+ +

Discusses the current porting status of the OSVR software framework, as well as the steps taken to design for portability. Includes discussion of an early Android deployment plan, though this plan continues to evolve.

+ + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150809-Path-tree.pdf b/presentations/20150809-Path-tree.pdf new file mode 100644 index 0000000..e0941d8 Binary files /dev/null and b/presentations/20150809-Path-tree.pdf differ diff --git a/presentations/20150809-Path-tree/index.html b/presentations/20150809-Path-tree/index.html new file mode 100644 index 0000000..3a29880 --- /dev/null +++ b/presentations/20150809-Path-tree/index.html @@ -0,0 +1,171 @@ + + + + + + + +OSVR Developer Portal +| +The OSVR Path Tree + + + + + + + +
+ + + +
+

+The OSVR Path Tree +

+

July 2015

+ + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150809-Plugin-Design.pdf b/presentations/20150809-Plugin-Design.pdf new file mode 100644 index 0000000..40874cc Binary files /dev/null and b/presentations/20150809-Plugin-Design.pdf differ diff --git a/presentations/20150809-Plugin-Design/index.html b/presentations/20150809-Plugin-Design/index.html new file mode 100644 index 0000000..abccfc3 --- /dev/null +++ b/presentations/20150809-Plugin-Design/index.html @@ -0,0 +1,189 @@ + + + + + + + +OSVR Developer Portal +| +OSVR Plugin Design + + + + + + + +
+ + + +
+

+OSVR Plugin Design +

+

July 2015

+ +

An overview of the PluginKit API of OSVR-Core suitable for writing device or other plugins.

+ + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150809-VR-API-evolution-Factoring.pdf b/presentations/20150809-VR-API-evolution-Factoring.pdf new file mode 100644 index 0000000..2a672cf Binary files /dev/null and b/presentations/20150809-VR-API-evolution-Factoring.pdf differ diff --git a/presentations/20150809-VR-API-evolution-Factoring/index.html b/presentations/20150809-VR-API-evolution-Factoring/index.html new file mode 100644 index 0000000..1b41919 --- /dev/null +++ b/presentations/20150809-VR-API-evolution-Factoring/index.html @@ -0,0 +1,191 @@ + + + + + + + +OSVR Developer Portal +| +VR API Evolution, Generic Interfaces, and Factoring + + + + + + + +
+ + + +
+

+VR API Evolution, Generic Interfaces, and Factoring +

+

July 2015

+ +

Summarizes a number of "developmental stages" seen in the wild and in academic/industrial research with VR APIs (not naming names!) and their associated, varying levels of hardware abstraction. Discusses the concept of "factoring" devices into generic interfaces and guidelines used in the OSVR project.

+ +

This can serve as an introduction to the OSVR Core and Path Tree presentation.

+ + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20150901-Intro-ETW-OSVR.pdf b/presentations/20150901-Intro-ETW-OSVR.pdf new file mode 100644 index 0000000..2a112f1 Binary files /dev/null and b/presentations/20150901-Intro-ETW-OSVR.pdf differ diff --git a/presentations/20150901-Intro-ETW-OSVR/index.html b/presentations/20150901-Intro-ETW-OSVR/index.html new file mode 100644 index 0000000..23a9b05 --- /dev/null +++ b/presentations/20150901-Intro-ETW-OSVR/index.html @@ -0,0 +1,191 @@ + + + + + + + +OSVR Developer Portal +| +An Introduction to ETW Tracing and OSVR + + + + + + + +
+ + + +
+

+An Introduction to ETW Tracing and OSVR +

+

August/September 2015

+ +

This slide deck contains information, a number of annotated screenshots, as well as links, to walk you through getting started using Event Tracing for Windows and the OSVR custom providers/events.

+ +

Viewing the slides in PDF format is recommended so you can zoom in and see the screenshots clearly.

+ + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/20160211-Support-Any-Device-Vision-Summit.pdf b/presentations/20160211-Support-Any-Device-Vision-Summit.pdf new file mode 100644 index 0000000..a0b8736 Binary files /dev/null and b/presentations/20160211-Support-Any-Device-Vision-Summit.pdf differ diff --git a/presentations/20160211-Support-Any-Device-Vision-Summit/index.html b/presentations/20160211-Support-Any-Device-Vision-Summit/index.html new file mode 100644 index 0000000..53183de --- /dev/null +++ b/presentations/20160211-Support-Any-Device-Vision-Summit/index.html @@ -0,0 +1,189 @@ + + + + + + + +OSVR Developer Portal +| +Using OSVR to Support Any Device in VR/AR + + + + + + + +
+ + + +
+

+Using OSVR to Support Any Device in VR/AR +

+

Presentation given by Yuval Boger (CEO, Sensics, Inc.) at the Unity Vision 2016 summit. Discussed OSVR software framework as a cross-platform middleware to support display, input and output devices in VR and AR applications

+ + + + + + + +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/README.html b/presentations/README.html new file mode 100644 index 0000000..b115ad7 --- /dev/null +++ b/presentations/README.html @@ -0,0 +1,252 @@ + + + + + + + +OSVR Developer Portal + + + + + + + +
+ + + +
+

Presentations

+ +

To add a presentation:

+ + + +

SlideShare

+ +

It's recommended for the person who created/gave the presentation to upload their slides to SlideShare.

+ + + +

Presentation Post

+ +

The file /source/presentations/stub/index.html.md starts from this template:

+ +
---
+
+title: Enter the title here
+
+# slideshare_embed: HhzKtg9HoVwgmt
+# slideshare_url: http://www.slideshare.net/rpavlik/intro-to-etw-tracing-and-osvr-52175205
+
+# Uncomment the following line if your PDF has speaker notes in it.
+# has_speaker_notes: true
+
+layout: presentation
+
+---
+Date (month is enough) and description goes here.
+
+This is the "body" of the page, and can be any markdown or HTML you like. (For instance, you can paste a YouTube embed snippet here.
+
+ +

Fill in the title in the front matter, leave the layout as presentation (that's what will automatically create PDF links and SlideShare embeds, etc), and fill in the body of the page - the part that follows the second ---. The body is formatted as Markdown, use that knowledge as you like.

+ +

If you've uploaded the presentation to SlideShare, you can uncomment the two slideshare lines in the front-matter and fill them in:

+ + + +

If your PDF added to this web site includes speaker notes, be sure to uncomment the appropriate line in the "front matter" - this will change the text of the links.

+ +

If your presentation relates to other presentations, be sure to link (in both directions). A presentation post's "permalink" is http://osvr.github.io/presentations/stub/, or relative to another presentation post, ../otherstub/.

+ +

Presentation Index Page

+ +

The file /source/presentations/index.html.erb links to (essentially) all presentations, in reverse-chronological (newest first) order, grouped into sections by month.

+ +

A given month section starts with a line like this:

+ +
<%= presentation_index_section 'September 2015' do |s|
+
+ +

which opens a block (here, titled "September 2015") that contains one or more entries like this, one for each presentation:

+ +
  s.entry stub: '20150901-Intro-ETW-OSVR',
+    description: 'Slide deck with instructions and annotated screen shots showing how to analyze your VR system and software with ETW.'
+
+ +

and finally closes with a simple

+ +
end %>
+
+ +

If you're adding a new section, you'll need to add all three parts (which just directly follow each other), while if you're adding a presentation to an existing section, you'll just add a s.entry chunk.

+ +

The parameters for the entry function used there are pretty simple, and almost all required. stub is the stub, and description is a brief description to show on the link button. The corresponding image will automatically be added to the entry (on non-small-screens), except if you add , skip_image: true to the entry call. (This should be considered a short-term measure: it looks much better with a thumbnail, but this will let you preview things without one first.) The title of the link will be pulled from the front-matter of the presentation post.

+ +

And yes, at least on Windows, the developer-mode thumbnails don't show up right. Rest assured, if the page actually renders (even though it'll have broken images), it'll deploy correctly to the live web site.

+ +
+ + + + +
+ + + + + +
+ + diff --git a/presentations/index.html b/presentations/index.html new file mode 100644 index 0000000..ae728bc --- /dev/null +++ b/presentations/index.html @@ -0,0 +1,323 @@ + + + + + + + +OSVR Developer Portal +| +Presentations + + + + + + + +
+ + + +
+

Slides and Notes from Presentations

+Presentations are in reverse chronological order (that is, newest first). + +

February 2016

+ + + + +

September 2015

+ + + + +

August 2015

+ + + + +

July 2015

+ + + + +

April 2015

+ + + + +
+ + + + +
+ + + + + +
+ + diff --git a/stylesheets/styles.css b/stylesheets/styles.css new file mode 100644 index 0000000..7dec655 --- /dev/null +++ b/stylesheets/styles.css @@ -0,0 +1 @@ +@import url(https://fonts.googleapis.com/css?family=Titillium+Web:300,400,700,400italic|Anonymous+Pro:400,400italic);/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}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}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url("../fonts/bootstrap/glyphicons-halflings-regular.eot");src:url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"),url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"),url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"),url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Titillium Web", Helvetica, Arial;font-size:14px;line-height:1.42857;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#ff7f27;text-decoration:none}a:hover,a:focus{color:#da5900;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:300;line-height:1.1;color:inherit}h1 small,h1 .small,h2 small,h2 .small,h3 small,h3 .small,h4 small,h4 .small,h5 small,h5 .small,h6 small,h6 .small,.h1 small,.h1 .small,.h2 small,.h2 .small,.h3 small,.h3 .small,.h4 small,.h4 .small,.h5 small,.h5 .small,.h6 small,.h6 .small{font-weight:normal;line-height:1;color:#777777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width: 768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase,.initialism{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777777}.text-primary{color:#ff7f27}a.text-primary:hover,a.text-primary:focus{color:#f36300}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff}.bg-primary{background-color:#ff7f27}a.bg-primary:hover,a.bg-primary:focus{background-color:#f36300}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857}dt{font-weight:bold}dd{margin-left:0}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}@media (min-width: 768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777777}.initialism{font-size:90%}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857;color:#777777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857}code,kbd,pre,samp{font-family:"Anonymous Pro", Consolas, "Courier New", monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 768px){.container{width:750px}}@media (min-width: 992px){.container{width:970px}}@media (min-width: 1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-15px;margin-right:-15px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-1{width:8.33333%}.col-xs-2{width:16.66667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333%}.col-xs-5{width:41.66667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333%}.col-xs-8{width:66.66667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333%}.col-xs-11{width:91.66667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333%}.col-xs-pull-2{right:16.66667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333%}.col-xs-pull-5{right:41.66667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333%}.col-xs-pull-8{right:66.66667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333%}.col-xs-pull-11{right:91.66667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333%}.col-xs-push-2{left:16.66667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333%}.col-xs-push-5{left:41.66667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333%}.col-xs-push-8{left:66.66667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333%}.col-xs-push-11{left:91.66667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.33333%}.col-xs-offset-2{margin-left:16.66667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333%}.col-xs-offset-5{margin-left:41.66667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333%}.col-xs-offset-8{margin-left:66.66667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333%}.col-xs-offset-11{margin-left:91.66667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333%}.col-sm-pull-2{right:16.66667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333%}.col-sm-pull-5{right:41.66667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333%}.col-sm-pull-8{right:66.66667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333%}.col-sm-pull-11{right:91.66667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333%}.col-sm-push-2{left:16.66667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333%}.col-sm-push-5{left:41.66667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333%}.col-sm-push-8{left:66.66667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333%}.col-sm-push-11{left:91.66667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333%}.col-md-pull-2{right:16.66667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333%}.col-md-pull-5{right:41.66667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333%}.col-md-pull-8{right:66.66667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333%}.col-md-pull-11{right:91.66667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333%}.col-md-push-2{left:16.66667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333%}.col-md-push-5{left:41.66667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333%}.col-md-push-8{left:66.66667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333%}.col-md-push-11{left:91.66667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.33333%}.col-md-offset-2{margin-left:16.66667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333%}.col-md-offset-5{margin-left:41.66667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333%}.col-md-offset-8{margin-left:66.66667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333%}.col-md-offset-11{margin-left:91.66667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333%}.col-lg-pull-2{right:16.66667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333%}.col-lg-pull-5{right:41.66667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333%}.col-lg-pull-8{right:66.66667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333%}.col-lg-pull-11{right:91.66667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333%}.col-lg-push-2{left:16.66667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333%}.col-lg-push-5{left:41.66667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333%}.col-lg-push-8{left:66.66667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333%}.col-lg-push-11{left:91.66667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-offset-12{margin-left:100%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>th,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857;color:#555555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857;color:#555555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,.input-group-sm input[type="date"],input[type="time"].input-sm,.input-group-sm input[type="time"],input[type="datetime-local"].input-sm,.input-group-sm input[type="datetime-local"],input[type="month"].input-sm,.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,.input-group-lg input[type="date"],input[type="time"].input-lg,.input-group-lg input[type="time"],input[type="datetime-local"].input-lg,.input-group-lg input[type="datetime-local"],input[type="month"].input-lg,.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,fieldset[disabled] .radio-inline,.checkbox-inline.disabled,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,fieldset[disabled] .radio label,.checkbox.disabled label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label ~ .form-control-feedback{top:25px}.has-feedback label.sr-only ~ .form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width: 768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}@media (min-width: 768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width: 768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default:active:focus,.btn-default:active.focus,.btn-default.active:hover,.btn-default.active:focus,.btn-default.active.focus,.open>.btn-default.dropdown-toggle:hover,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#ff7f27;border-color:#ff700e}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#f36300;border-color:#8d3900}.btn-primary:hover{color:#fff;background-color:#f36300;border-color:#cf5400}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#f36300;border-color:#cf5400}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#cf5400;border-color:#8d3900}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary.focus{background-color:#ff7f27;border-color:#ff700e}.btn-primary .badge{color:#ff7f27;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#ff7f27;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#da5900;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#777777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#ff7f27}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#777777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#ff7f27}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#ff7f27}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:65px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width: 480px) and (orientation: landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width: 768px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:22.5px 15px;font-size:18px;line-height:20px;height:65px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:15.5px;margin-bottom:15.5px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width: 768px){.navbar-toggle{display:none}}.navbar-nav{margin:11.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width: 767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width: 768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:22.5px;padding-bottom:22.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:15.5px;margin-bottom:15.5px}@media (min-width: 768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width: 767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width: 768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:15.5px;margin-bottom:15.5px}.navbar-btn.btn-sm{margin-top:17.5px;margin-bottom:17.5px}.navbar-btn.btn-xs{margin-top:21.5px;margin-bottom:21.5px}.navbar-text{margin-top:22.5px;margin-bottom:22.5px}@media (min-width: 768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width: 768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right ~ .navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:hover,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#090909}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#090909;color:#fff}@media (max-width: 767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:hover,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/ ";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777777}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#777777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#ff7f27}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#f36300}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#ff7f27;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width: 768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border 0.2s ease-in-out;-o-transition:border 0.2s ease-in-out;transition:border 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#333}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#ff7f27}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus,button.list-group-item:hover,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#777777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#ff7f27;border-color:#ff7f27}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fff8f3}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:hover,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active,button.list-group-item-success.active:hover,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:hover,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active,button.list-group-item-info.active:hover,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:hover,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active,button.list-group-item-warning.active:hover,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:hover,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active,button.list-group-item-danger.active:hover,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#ff7f27}.panel-primary>.panel-heading{color:#fff;background-color:#ff7f27;border-color:#ff7f27}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ff7f27}.panel-primary>.panel-heading .badge{color:#ff7f27;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ff7f27}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header:before,.modal-header:after{content:" ";display:table}.modal-header:after{clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{content:" ";display:table}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width: 992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Titillium Web", Helvetica, Arial;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Titillium Web", Helvetica, Arial;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs{display:none !important}.visible-sm{display:none !important}.visible-md{display:none !important}.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width: 767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width: 767px){.visible-xs-block{display:block !important}}@media (max-width: 767px){.visible-xs-inline{display:inline !important}}@media (max-width: 767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width: 1200px){.visible-lg-block{display:block !important}}@media (min-width: 1200px){.visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md{display:none !important}}@media (min-width: 1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}html{overflow-y:scroll}a:link{color:#ff7f27}a:visited{color:#ff7f27}a:hover{color:#ff7f27}a:active{color:#ff7f27}.f22{font:300 22px/26px "Titillium Web", Helvetica, Arial}.grey{color:#888}.lime{color:lime}.active{border-top:2px solid #ff7f27}.clickable_row tbody tr{cursor:pointer}.gsc-results-wrapper-overlay,.gsc-results-wrapper-visible,.gsc-search-button,.gsc-search-button-v2,.gcse-osvrnavbar *{box-sizing:content-box}.gsc-input-box{padding-bottom:4px}.gscb_a{padding-top:5px}.gcse-osvrnavbar{padding-bottom:-8px;padding-top:4px}@media (min-width: 992px){.gsc-search-button-v2{padding:6px 10px !important}}@media (min-width: 768px) and (max-width: 991px){.gsc-search-button-v2{padding:6px 4px !important}}.gcse-osvrnavbar{width:100%}@media (min-width: 992px){.gcse-osvrnavbar{width:30%}}@media (min-width: 768px) and (max-width: 991px){.gcse-osvrnavbar{width:20%}}.gsc-input{font-family:"Titillium Web", Helvetica, Arial;font-size:12px}.navbar-brand>img{display:inline;margin-right:18px;margin-top:-6.5px}.footer{margin:20px;text-align:center}ul.arrows{list-style:none}ul.arrows li:before{content:"\2192 \0020"} \ No newline at end of file diff --git a/using/index.html b/using/index.html new file mode 100644 index 0000000..29837be --- /dev/null +++ b/using/index.html @@ -0,0 +1,342 @@ + + + + + + + +OSVR Developer Portal +| +Get OSVR + + + + + + + +
+ + +
+

Get OSVR

+
+
+HDK Unboxing and Getting Started +
+
+While you don't need an OSVR HDK to take advantage of the OSVR software framework (which is the point!), if you do have one, this wiki page is likely to be useful to you. + + +View instructions + +
+
+
+
+OSVR Runtime for Windows +Osvr server icon 48 +
+
+OSVR Runtime installer includes everything you need to get OSVR up and running. It installs the latest OSVR-Core, Render Manager, OSVR Tracker Viewer, and other necessary utilities. +Note: OSVR HDK Windows Driver Pack needs to be installed separately + + +Download + +
+
+
+
+OSVR SDK for Windows +Osvr server icon 48 +
+
+OSVR SDK installer includes the latest OSVR-Core, Render Manager, OSVR Tracker Viewer and other tools necessary to begin OSVR development. +Note: OSVR HDK Windows Driver Pack needs to be installed separately + + +Download + +
+
+
+
+OSVR-Core +Osvr server icon 48 +
+
+OSVR-Core binary snapshots include the OSVR Server, an application that you start on your machine before running an OSVR-based app. +It is responsible for communicating with the VR devices on your computer and presenting a generic interface to applications. +OSVR-Core snapshots also include some plugins by default for hardware support, as well as sample configuration files. + + +Download + +
+
+
+
+OSVR HDK Windows Driver Pack +
+
+While no drivers are required to be installed system-wide for tracking and display functionality, a driver is required on Windows 8.1 and earlier to be able to upgrade firmware, and these drivers provide more descriptive names for the hardware in the HDK in the device manager. +The installer also installs "device metadata" on Windows 7 and newer providing for a better experience in the "Devices and Printers" control panel. + + +Download + +
+
+
+
+OSVR Tracker View +Tracker view 48 +
+
+The Tracker View tool is a simple graphical application showing the OSVR world coordinate system and the positions and/or orientations of any trackers in the OSVR setup. +It is useful for troubleshooting and for verifying correct functioning of your hardware and OSVR Server. + + +Download + +
+
+
+
+Firmware update tool for HDK IR Camera +Ircamera updater +
+
+Updates IR Camera firmware to version 7. The upgrade from version 5 to 6 is required for reliable tracking performance, and the upgrade from 6 to 7 improves compatibility with Linux, OS X, and other software. +
+ + +Download + +
+
+
+
+OSVR HDK control software and firmware upgrade tool +
+
+Windows utility to upgrade HDK firmware, set 3D video mode + + +Download + +
+
+
+
+OSVR Vive Plugin +
+
+This optional plugin allows you to use your HTC Vive HMD and controllers with OSVR applications. The plugin provides +access to Lighthouse tracking, controller buttons, and headset display for your Vive. + + +Download + +
+
+
+
+OSVR LaputaVR Plugin +
+
+This optional plugin allows you to use your LaputaVR Hero hardware's tracker with OSVR applications. + + +Download + +
+
+
+
+OSVR Vuzix Plugin +
+
+This optional plugin allows you to use your Vuzix hardware's tracker with OSVR applications. + + +Download + +
+
+
+
+OSVR FOVE Plugin +
+
+This optional plugin allows you to use your FOVE eye tracker and HMD with OSVR applications. + + +Download + +
+
+
+
+OSVR SMI Plugin +
+
+This optional plugin allows you to use your SMI eye tracker with OSVR applications. + + +Download + +
+
+
+
+OSVR Leap Motion Plugin +
+
+This optional plugin allows you to use your Leap Motion hand tracker with OSVR applications. + + +Download + +
+
+
+
+OSVR Oculus Rift Plugin +
+
+This optional plugin allows you to use your Oculus Rift hardware's tracker with OSVR applications and perform appropriate distortion as required/configured. + + +Download + +
+
+ +
+ + + + +
+ + + + + +
+ + diff --git a/whitepapers/introduction_to_osvr/base-game-flow.png b/whitepapers/introduction_to_osvr/base-game-flow.png new file mode 100644 index 0000000..3f9fb0e Binary files /dev/null and b/whitepapers/introduction_to_osvr/base-game-flow.png differ diff --git a/whitepapers/introduction_to_osvr/fuller-game-flow.png b/whitepapers/introduction_to_osvr/fuller-game-flow.png new file mode 100644 index 0000000..e9bdbc8 Binary files /dev/null and b/whitepapers/introduction_to_osvr/fuller-game-flow.png differ diff --git a/whitepapers/introduction_to_osvr/high-level-overview.png b/whitepapers/introduction_to_osvr/high-level-overview.png new file mode 100644 index 0000000..ec07fee Binary files /dev/null and b/whitepapers/introduction_to_osvr/high-level-overview.png differ diff --git a/whitepapers/introduction_to_osvr/high-level-overview.svg b/whitepapers/introduction_to_osvr/high-level-overview.svg new file mode 100644 index 0000000..7a763f8 --- /dev/null +++ b/whitepapers/introduction_to_osvr/high-level-overview.svg @@ -0,0 +1,17785 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/whitepapers/introduction_to_osvr/index.html b/whitepapers/introduction_to_osvr/index.html new file mode 100644 index 0000000..703a342 --- /dev/null +++ b/whitepapers/introduction_to_osvr/index.html @@ -0,0 +1,350 @@ + + + + + + + +OSVR Developer Portal + + + + + + + +
+ + +
+

An Introduction to OSVR

+ +

Yuval Boger1 and Ryan A. Pavlik2, December 2014, revised March 2015

+ +

What is OSVR?

+ +

OSVR™ is an open-source software platform for VR/AR applications.

+ +

OSVR provides an easy and standardized way to discover, configure and operate hundreds of devices: VR goggles, position trackers, depth cameras, game controllers and more. OSVR supports multiple operating systems, plugs into leading game engines and is freely available under a permissive Apache 2.0 license.

+ +

OSVR can be extended with open- or closed-source plugins. Plugins can provide support for new devices or add analysis capabilities such as a gesture engine, sensor fusion and data logging and eye tracking.

+ +

OSVR was started by experts in gaming and virtual reality and is supported by an ever-growing list of hardware vendors, game studios, universities and software companies.

+ +

This white paper provides a high-level overview of the motivation behind OSVR, its structure and key attributes.

+ +

Why is OSVR useful?

+ +

Twenty years ago, if you wanted to print a document from WordPerfect, you needed to install the corresponding WordPerfect driver for your printer. Then, operating systems (such as Windows) introduced a standardized printer abstraction layer so that any Windows application could print to any printer that had a Windows driver.

+ +

OSVR standardizes the interface between input devices, games and output devices. It provides abstraction layers for VR devices and peripherals so that a game developer does not need to hardcode support for particular hardware. Instead, just like a Windows application prints to the Windows print services, the game developer connects to the OSVR abstraction layer. If a new VR goggle was introduced in 2016, an OSVR-based game published in 2015 could support this new goggle as soon as the goggle had an OSVR driver.

+ +

To a game developer, OSVR provides interfaces – pipes of data – as opposed to an API tied to a specific piece of hardware. If there are multiple devices that provide the same type of information (for instance: hand position), these devices can be interchanged. Today, you might get hand position from a Microsoft Kinect. Tomorrow, you might get hand position from a Razer Hydra. You can reconfigure the OSVR "plumbing" so that the game can continue to work well regardless of where hand position is coming from. With OSVR, game developers can focus on what they want to do with the data, as opposed to how to obtain it.

+ +

OSVR lets you mix and match hardware and software packages. For instance, if you use an eye tracking camera, you might use the software provided by the camera vendor to calculate gaze direction, but you might also use alternative gaze detection packages. This means that companies or research groups that focus on a particular software or hardware component (e.g. gaze detection module or eye tracking camera) are not left out of the VR eco-system: their expertise can be interconnected with components from others.

+ +

For game and application developers OSVR reduces risk:

+ + + +

For hardware manufacturers OSVR:

+ + + +

For software developers OSVR provides the ability to:

+ + + +

For end users OSVR provides freedom and choice, promotes innovation through its open design and eliminates the dependency on any single vendor.

+ +

High-level OSVR Architecture

+ +

The diagram below shows the conceptual architecture for OSVR.

+ +

High level overview

+ +

Applications written on game engines can interact with OSVR via dedicated game engine plugins. Alternatively, an application can directly access the OSVR "ClientKit" interface.

+ +

Analysis plugins are software modules that convert data from lower-level device plugins into higher-level information. For instance, a gesture engine plugin can convert a stream of XYZ coordinates to a recognized gesture.

+ +

Device plugins connect to physical devices and expose interfaces – pipes of data – to higher layers. For instance, a plugin for a VR goggle can expose a display interface as well as an orientation tracker interface corresponding to an embedded head-tracker. Many device types and dozens of devices are supported.

+ +

The adaptation layer provides OS-specific implementation (e.g. Android vs. Windows vs. iOS) as well as allows OSVR devices to be accessed through a network interface such as WiFi or Bluetooth.

+ +

The management layer stores and loads system and user-specific configuration locally and in the cloud. It also provides services to download device plugins on-demand, detect when software updates are available and other utility functions.

+ +

Source code and well-defined interfaces are provided for all these components. Device and analysis plugins can easily be added by interested parties, and examples of how to do so are provided as part of the OSVR source-code distribution.

+ +

OSVR Technical Concepts

+ +

Prior to explaining how applications interface with OSVR and how to write plugins for OSVR, we need to touch on a few OSVR technical concepts:

+ +

A device is a physical entity such as an orientation sensor or the Razer Hydra controller.

+ +

An interface is a pipe of data. A device exposes one or more interfaces. For instance, a Razer Hydra controller exposes several interfaces:

+ + + +

An interface is an instance of an interface class. An interface class defines properties that can be set or queried as well as a set of events that the class generates. A property might be the last obtained XYZ position from an XYZ position interface. An event could be the press of a particular button in a button set interface.

+ +

A plugin is a software module that can be dynamically identified, loaded and connected to OSVR. Drivers contained in plugins implement interface classes. There are two types of drivers in plugins:

+ + + +

From the OSVR perspective, both types of plugins are identical, and the distinction is made for human consumption.

+ +

OSVR Resource Naming

+ +

OSVR maintains a "path tree" – similar to a URL or file system path – in which all the sensing and rendering data is made available. Aliases are configured in the server to essentially redirect from a semantic path (a path with a meaningful name) all the way back to the system-specific hardware details. Thus, while direct device access by name is possible, it is not recommended: instead, we recommend accessing semantic paths. This accommodates use cases where the hardware is not immediately available at startup or is changed during operation without any impact to the application developer. Some examples:

+ + + +

Just like a game allows mapping of various buttons to various game actions, OSVR allows defining the connection between interfaces, analysis plugins and actions. For instance:

+ + + +

The connection between interfaces can be pre-loaded or can be changed dynamically. 3

+ +

The list of available resources is specified in JSON files as part of the OSVR distribution and is part of the OSVR documentation.

+ +

Synchronous and Asynchronous Calls

+ +

An application can communicate with a plugin in two ways:

+ + + +

An application can use either or both methods. For instance, some applications much choose to query the orientation tracker state in the main loop using a synchronous call whereas they might register for callbacks on certain game controller button presses. Please see examples in the OSVR documentation.

+ +

OSVR for Game Developers

+ +

There are three pieces of a minimal application:

+ + + +

These are illustrated in the message state diagram below:

+ +

Base game flow

+ +

Of course, such an application doesn't really use OSVR in a very productive sense. A sample flow of a more realistic application would also:

+ + + +

These are illustrated in the message state diagram below:

+ +

Fuller game flow

+ +

OSVR for Plugin Developers

+ +

Device and analysis plugins are dynamically loaded by OSVR. Plugins provide support for new types of hardware or analysis functions such as gesture engines.

+ +

The OSVR documentation contains example plugins. If you are a hardware or software developer that wants to create an OSVR plugin, please contact us for additional details.

+ +

To support a new game engine beyond those already supported in OSVR, the best place to start is "OSVR for game developers" since from an OSVR perspective, a game engine is an application that uses OSVR rather than an OSVR plugin.

+ +

OSVR Roadmap

+ +

As an open-source project, the OSVR community will have a very strong influence on future directions. At present, planned improvements include the following:

+ + + +

We are excited to work with you and see what we can build together with OSVR!

+ +
+
+
    + +
  1. +

    Yuval Boger is the CEO of Sensics. Sensics is the founding contributor of OSVR. 

    +
  2. + +
  3. +

    Ryan A. Pavlik is a senior software engineer at Sensics. 

    +
  4. + +
  5. +

    Dynamic connection changes are not yet implemented as of Dec 2014. 

    +
  6. + +
+
+ +
+ + + + +
+ + + + + +
+ + diff --git a/whitepapers/vrpn_in_osvr/index.html b/whitepapers/vrpn_in_osvr/index.html new file mode 100644 index 0000000..31eed56 --- /dev/null +++ b/whitepapers/vrpn_in_osvr/index.html @@ -0,0 +1,320 @@ + + + + + + + +OSVR Developer Portal + + + + + + + +
+ + +
+

Using External VRPN Devices in OSVR

+ +

Ryan A. Pavlik1, April 27, 2015

+ +

Introduction and Requirements

+ +

In order to provide both proven performance and wide compatibility, portions of OSVR use and extend the VRPN (Virtual Reality Peripheral Network) software and device model. Early releases of OSVR provided an experimental way to integrate external VRPN trackers into OSVR, but the 0.2 release removed that experimental support in favor of complete support for using tracker, button, and analog devices from an external (local or remote) VRPN server.

+ +

The change was required to integrate these devices into the metadata-rich "path tree" model used by OSVR. Native OSVR device drivers provide not only access to the device data, but also a JSON "device descriptor" that describes the device capabilities and the semantic meaning of the numbered sensors. As standard VRPN servers lack this additional data, using a VRPN device in OSVR requires that the user supply this information, through the configuration file, to properly integrate the device.

+ +

As mentioned above, the methods described in this note require a version of OSVR-Core 0.2 or newer. Both client (application) DLLs and the server package must be 0.2 or newer, as that release broke protocol compatibility for metadata to enable greater functionality.

+ +

With regards to the external VRPN server, it may be any 07.XX release (newer preferred, particularly for button devices), running locally or remotely. (This support does includes devices that integrate the VRPN server as their native reporting protocol, as long as the protocol is version 7.)

+ +

If you run a vrpn_server process on the same machine as the OSVR server, you will have to pass an alternate port number (such as 3884) as a command line argument to vrpn_server to avoid collision with the embedded VRPN server in OSVR. Configuration of such an external server is beyond the scope of this document: it is assumed that you know the device name (often something like Tracker0) and the server (commonly just a hostname like trackerserver, but may be hostname and port localhost:3884 for the suggested local vrpn_server, or even include transport tcp://trackerserver:3884). These two parts are typically specified with the @ symbol separating them, e.g. Tracker0@localhost:3884.

+ +

For the purposes of this document, we'll assume you are using some device similar in functionality to a tracker wand or a Razer Hydra. That is, a device that provides tracking, button, and analog data on a single name. This process may be repeated to add any number of external VRPN device names to the system.

+ +

Tips

+ +

You may wish to consult or start with the osvr_server_config.externalvrpn.sample.json sample config file as you create your own. The documentation below walks through construction of this config file section by section.

+ +

A text editor with support for JSON can be very helpful in editing these configuration files, for syntax checking, code folding, and automatic indentation.

+ + + +

Setting Up the Configuration

+ +

Step 1: Importing and describing the VRPN device

+ +

The first step is to create the path tree node representing your external device, with the device name, server, and descriptor data. This is done in a top-level element of the config file (osvr_server_config.json by default) object called externalDevices. A sample excerpt showing this section follows.

+ +
  "externalDevices": {
+    "/myExternalDevice": {
+      "deviceName": "Tracker0",
+      "server": "localhost:3884",
+      "descriptor": /* can also provide a file path here, or this is the minimal */ {
+        "interfaces": {
+          "tracker": {},
+          "button": {},
+          "analog": {}
+        }
+      }
+    }
+  }
+
+ +

The key externalDevices refers to a JSON object, where each key is the "path" where a device node will be created, and the value is an object containing the information required to create that node. (In the case of a native OSVR device, this path would have two levels: first the plugin name then the device name, like /com_osvr_Multiserver/OSVRHackerDevKit0. Once this externalDevices section is set up, you'll be able to refer to your external device just as you would a native OSVR device.)

+ +

In the example above, we've arbitrarily chosen /myExternalDevice as the path. The deviceName key contains our VRPN device name (Tracker0), while the server key contains the server info (localhost:3884). The last element of the object, labeled descriptor, is the metadata that OSVR makes use of but that VRPN does not provide. On the most basic level, it can be what is shown here: just an embedded JSON object with an interfaces member, that contains an object with members for each interface type you want to access. Instead of an object, you could also supply a string, which would be interpreted as a filename containing a JSON device descriptor. This is useful particularly if you're using the same device in multiple places: you can share the device descriptor file separately from the server config.

+ +

Variations of the minimal descriptor embedded and described above is sufficient to follow the rest of these instructions and use your device in OSVR. As such, further explanation of the full device descriptor format is beyond the scope of this document. However, if you wish (for instance, if you might distribute your descriptor file), you can provide a fully-featured device descriptor like those embedded in OSVR plugins. Some examples of full device descriptors follow:

+ + + +

You may use the OSVR JSON Editor web app to help you compose this section: it is a single-page application that uses the device descriptor JSON Schema to automatically generate an editor interface.

+ +

Verifying your results

+ +

At this point, you may stop and test your config file. You should see a line resembling the following when you run osvr_server with your config file:

+ +
[OSVR Server] External devices found and parsed from config file.
+
+ +

Running the osvr_print_tree utility should also show you something like this:

+ +
[   DeviceElement] /myExternalDevice
+                     - corresponds to Tracker0@localhost:3884
+[InterfaceElement] /myExternalDevice/analog
+[InterfaceElement] /myExternalDevice/button
+[InterfaceElement] /myExternalDevice/tracker
+
+ +

If you see the DeviceElement lines, but not the InterfaceElement lines, then there was an issue parsing your descriptor and it didn't find an interfaces section. You might find more information in the output of osvr_server.

+ +

Step 2: Setting up aliases

+ +

The OSVR system strongly discourages the use of hardware-specific paths, and instead recommends your application use "semantic paths" that can be set up to point to different hardware resources on different systems. (In older versions of OSVR, you may have seen mention of "routes" - that is the old name for the same concept. The old routes-based config file syntax is deprecated, with the new aliases syntax preferred.) On devices with OSVR plugins, their device descriptor usually sets up a /semantic tree underneath the device node, and may also include an automaticAliases section that provides suggestions for global alias paths. Unless you've added all these features to the device descriptor you provided in step 1, you'll have to set up the appropriate aliases in the config file.

+ +

Common paths include:

+ + + +

There is also a convention of placing "controller" inputs (buttons, triggers, joysticks) under /controller, and further /controller/left and /controller/right when the inputs are so associated with a tracker. Fewer specific paths are "well-known" in this portion of the path tree, and you are encouraged to create and use other semantic paths as aliases (/actions/jump as an alias for /controller/a) in your application and configuration.

+ +

The aliases, like the external devices, are configured with a JSON object in the config file, this time under the key aliases. An excerpt might look like this:

+ +
  "aliases": {
+    "/controller/trigger": "/myExternalDevice/analog/0",
+    "/controller/a": "/myExternalDevice/button/0",
+    "/me/head": {
+      "rotate": {
+        "axis": "-x",
+        "degrees": 180
+      },
+      "child": {
+        "changeBasis": {
+          "x": "x",
+          "y": "-z",
+          "z": "-y"
+        },
+        "child": "/myExternalDevice/tracker/0"
+      }
+    },
+    "/me/hands/right": {
+      "rotate": {
+        "axis": "-x",
+        "degrees": 180
+      },
+      "child": {
+        "changeBasis": {
+          "x": "x",
+          "y": "-z",
+          "z": "-y"
+        },
+        "child": "/myExternalDevice/tracker/1"
+      }
+    }
+  }
+
+ +

This example shows two different syntaxes. The simplest, used for analog and button devices, as well as for trackers that do not need any transformation applied to align with the OSVR global coordinate system, is to simply have the alias path to create as the key, and the path the alias points to as the string value. The first two entries in the example above take this form.

+ +

The second syntax (used by the second two entries) is more complex because it enables application of a transformation tree to tracker data. The key, as before, is the alias path to create. However, in this case, the value is a JSON object. This object can have arbitrary levels of nesting, with each internal level specified by the key child. The final level must terminate with a child key whose value is a string: the path that the alias transforms and points to. Each level may contain transformation objects (like changeBasis and rotate shown here) - see other example files and/or separate documentation on supported transformations.

+ +

In all cases, the alias terminates at a path under the device path you set up in step 1. The syntax is /devicename/interfacename/sensornumber (or occasionally /devicename/interfacename for all sensors). Of course, if you set up a device descriptor that contains semantic paths, you can reference those instead of the raw device path in this step.

+ +

Verifying your results

+ +

At this point, you can run osvr_server again with your config file. The server output will not change, but theh output of running osvr_print_tree will reflect the changes to the path tree that your aliases made. For the example aliases above, you'll see something like this:

+ +
[   DeviceElement] /myExternalDevice
+                     - corresponds to Tracker0@localhost:3664
+[InterfaceElement] /myExternalDevice/analog
+[   SensorElement] /myExternalDevice/analog/0
+[InterfaceElement] /myExternalDevice/button
+[   SensorElement] /myExternalDevice/button/0
+[InterfaceElement] /myExternalDevice/tracker
+[   SensorElement] /myExternalDevice/tracker/1
+[   SensorElement] /myExternalDevice/tracker/0
+[    AliasElement] /controller/a
+                     -> /myExternalDevice/button/0
+[    AliasElement] /controller/trigger
+                     -> /myExternalDevice/analog/0
+[    AliasElement] /me/hands/right
+                     -> {"child":{"changeBasis":{"x":"x","y":"-z","z":"-y"},"child":"/myExternalDevice/tracker/1"},"rotate":{"axis":"-x","degrees":180}}
+[    AliasElement] /me/head
+                     -> {"child":{"changeBasis":{"x":"x","y":"-z","z":"-y"},"child":"/myExternalDevice/tracker/0"},"rotate":{"axis":"-x","degrees":180}}
+
+ +

There are a few changes to notice. First, you'll see there are now AliasElement entries for each alias we configured, and the default settings of osvr_print_tree enable printing the target of each alias, whether a string or the compact version of your JSON transform. Additionally, each path representing a sensor that is a valid target of an alias that you've specified is now explicitly mentioned as a SensorElement. These sensor elements are automatically generated when resolving aliases. If you don't see a SensorElement you were trying to target, then you've likely made a mistake in specifying the corresponding alias.

+ +

As a further test of any tracker aliases you've set up, use the OSVR Tracker Viewer application (distributed separately from the core/server - click here for binary downloads for the tracker viewer). Run it with the -h command line argument to see how to specify which paths in the path tree you want to visualize. The application opens in the standard OSVR coordinate system, so you can verify that your transformations are correct.

+ +
+
+
    + +
  1. +

    Ryan A. Pavlik, PhD is a senior software engineer at Sensics. 

    +
  2. + +
+
+ +
+ + + + +
+ + + + + +
+ +