Merge branch 'master' into App-CAM360

This commit is contained in:
Julian Groß 2023-01-14 20:21:31 +01:00 committed by GitHub
commit eb19f5e576
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
77 changed files with 10011 additions and 0 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,37 @@
//This file is just used for the superclass
function AnimatedBrushClass() {}
/**
* Called on every frame draw after the user stops painting
*
* @abstract
* @param deltaSeconds, the number of seconds past since the last frame was rendered
* @param entityID: the id of the polyline being drawn
* @param fingerOverlayID: the id of the overlay that shows over the finger when using fingerpaint
*/
AnimatedBrushClass.prototype.onUpdate = function(deltaSeconds, entityID) {
//To be implemented on the child
throw "Abstract method onUpdate not implemented";
}
/**
* This function updates the user data so in the next frame the animation gets the previous values.\
*
* @param entityID: the id of the polyline being animated
* @param animatedBrushObject: the animation object (should be a subclass of animatedBrush)
*/
AnimatedBrushClass.prototype.updateUserData = function(entityID, animatedBrushObject) {
var prevUserData = Entities.getEntityProperties(entityID).userData;
if (prevUserData) {
prevUserData = prevUserData == "" ? new Object() : JSON.parse(prevUserData); //preserve other possible user data
if (prevUserData.animations != null && prevUserData.animations[animatedBrushObject.NAME] != null) {
delete prevUserData.animations[animatedBrushObject.NAME];
prevUserData.animations[animatedBrushObject.NAME] = animatedBrushObject;
}
prevUserData.timeFromLastAnimation = Date.now();
Entities.editEntity(entityID, {userData: JSON.stringify(prevUserData)});
}
}
AnimatedBrush = AnimatedBrushClass;

View file

@ -0,0 +1,37 @@
(function() {
Script.include("animatedBrushesList.js?v1");
var UPDATE_TIME = 33; //run at aproximatelly 30fps
var MIN_PLAY_DISTANCE = 6; //Minimum distance from player to entity in order to play animation
var self = this;
this.preload = function(entityID) {
print("After adding script 2 : " + JSON.stringify(Entities.getEntityProperties(entityID).color));
self.intervalID = Script.setInterval(function() {
if (MyAvatar.sessionUUID != Entities.getEntityProperties(entityID).lastEditedBy) {
Script.clearInterval(self.intervalID);
return;
}
if (Vec3.withinEpsilon(MyAvatar.position, Entities.getEntityProperties(entityID).position, MIN_PLAY_DISTANCE)) {
var userData = Entities.getEntityProperties(entityID).userData;
if (userData) {
var userDataObject = JSON.parse(userData);
var animationObject = userDataObject.animations;
var newAnimationObject = null;
if (!userDataObject.timeFromLastAnimation) {
userDataObject.timeFromLastAnimation = Date.now();
}
Object.keys(animationObject).forEach(function(animationName) {
newAnimationObject = animationObject[animationName];
//print("Proto 0001: " + JSON.stringify(newAnimationObject));
newAnimationObject.__proto__ = AnimatedBrushesInfo[animationName].proto;
//print("time from last draw " + (Date.now() - userDataObject.animations.timeFromLastDraw));
newAnimationObject.onUpdate(Date.now() - userDataObject.timeFromLastAnimation, entityID);
});
}
}
}, UPDATE_TIME);
};
this.unload = function() {
Script.clearInterval(self.intervalID);
}
});

View file

@ -0,0 +1,36 @@
Script.include("animatedHueBrush.js?v1");
Script.include("animatedRotationBrush.js?v1");
Script.include("animatedTranslationBrush.js?v1");
AnimatedBrushesInfo = {
animatedHueBrush: {
isEnabled: false,
proto: AnimatedHueBrush.prototype,
settings: null,
},
animatedRotationBrush: {
isEnabled: false,
proto: AnimatedRotationBrush.prototype,
settings: null,
},
animatedTranslationBrush: {
isEnabled: false,
proto: AnimatedTranslationBrush.prototype,
settings: null,
},
}
animatedBrushFactory = function(animatedBrushName, settings, entityID) {
switch (animatedBrushName) {
case "animatedHueBrush":
return new AnimatedHueBrush(settings, entityID);
case "animatedRotationBrush":
return new AnimatedRotationBrush(settings, entityID);
case "animatedTranslationBrush":
return new AnimatedTranslationBrush(settings, entityID);
default:
throw new Error("Invalid Brush Name. Could not instantiate " + animatedBrushName);
}
}

View file

@ -0,0 +1,27 @@
//Superclass
Script.include("animatedBrush.js");
Script.include("../js/ColorUtils.js");
function AnimatedHueBrushClass(settings, entityID) {
AnimatedBrush.call(this);
this.hsvColor = rgb2hsv(Entities.getEntityProperties(entityID).color);// {hue: 0, saturation: 1.0, value: 1.0};
this.animatedColor = {red: 0, green: 0, blue: 0};
}
AnimatedHueBrushClass.prototype.ANIMATED_BRUSH_TIME = 10; //inteval in milliseconds to update the brush width;
AnimatedHueBrushClass.prototype.ANIMATED_BRUSH_INCREMENT = 0.5; //linear increment of brush size;
AnimatedHueBrushClass.prototype.NAME = "animatedHueBrush";
AnimatedHueBrushClass.prototype.onUpdate = function(deltaSeconds, entityID) {
print( "My animation brushes are updating ");
this.hsvColor.hue = this.hsvColor.hue + ((deltaSeconds * this.ANIMATED_BRUSH_INCREMENT)/this.ANIMATED_BRUSH_TIME);
this.hsvColor.hue = this.hsvColor.hue >= 360 ? 0 : this.hsvColor.hue; //restart hue cycle
this.animatedColor = hsv2rgb(this.hsvColor);
Entities.editEntity(entityID, { color : this.animatedColor});
this.parent.updateUserData(entityID, this);
}
AnimatedHueBrushClass.prototype.constructor = AnimatedHueBrushClass;
AnimatedHueBrushClass.prototype.parent = AnimatedBrush.prototype;
AnimatedHueBrush = AnimatedHueBrushClass;

View file

@ -0,0 +1,25 @@
//Superclass
Script.include("animatedBrush.js");
function AnimatedRotationBrushClass(settings, entityID) {
AnimatedBrush.call(this);
this.angle = 0;
this.activeAxis = settings.axis;
}
AnimatedRotationBrushClass.prototype.constructor = AnimatedRotationBrushClass;
AnimatedRotationBrushClass.prototype.parent = AnimatedBrush.prototype;
AnimatedRotationBrushClass.prototype.ANIMATED_BRUSH_TIME = 100; //inteval in milliseconds to update the entity rotation;
AnimatedRotationBrushClass.prototype.ANIMATED_BRUSH_INCREMENT = 5; //linear increment of brush size;
AnimatedRotationBrushClass.prototype.NAME = "animatedRotationBrush"; //linear increment of brush size;
AnimatedRotationBrushClass.prototype.onUpdate = function(deltaSeconds, entityID) {
this.angle = this.angle + ((deltaSeconds * this.ANIMATED_BRUSH_INCREMENT)/this.ANIMATED_BRUSH_TIME);
this.angle = this.angle >= 360 ? 0 : this.angle; //restart hue cycle
var rotation = Vec3.multiply(this.angle, this.activeAxis);
Entities.editEntity(entityID, {rotation : Quat.fromPitchYawRollDegrees(rotation.x, rotation.y, rotation.z)});
this.parent.updateUserData(entityID, this);
}
AnimatedRotationBrush = AnimatedRotationBrushClass;

View file

@ -0,0 +1,41 @@
//Superclass
Script.include("animatedBrush.js");
function AnimatedTranslationBrushClass(settings, entityID) {
AnimatedBrush.call(this);
this.startingPosition = null;
this.translation = 0;
this.activeAxis = settings.axis;
}
AnimatedTranslationBrushClass.prototype.constructor = AnimatedTranslationBrushClass;
AnimatedTranslationBrushClass.prototype.parent = AnimatedBrush.prototype;
AnimatedTranslationBrushClass.prototype.ANIMATED_BRUSH_TIME = 10; //inteval in milliseconds to update the brush width;
AnimatedTranslationBrushClass.prototype.ANIMATED_BRUSH_INCREMENT = 0.005; //linear increment of brush size;
AnimatedTranslationBrushClass.prototype.MAX_TRANSLATION = 2;
AnimatedTranslationBrushClass.prototype.NAME = "animatedTranslationBrush"; //linear increment of brush size;
AnimatedTranslationBrushClass.prototype.onUpdate = function(deltaSeconds, entityID) {
var currentPosition = Entities.getEntityProperties(entityID).position;
if (this.startingPosition == null) {
this.startingPosition = currentPosition;
}
this.translation = this.translation + ((deltaSeconds * this.ANIMATED_BRUSH_INCREMENT)/this.ANIMATED_BRUSH_TIME);
var translationVec = Vec3.multiply(this.translation, this.activeAxis);
var nextPosition = {
x: this.startingPosition.x + translationVec.x,
y: this.startingPosition.y + translationVec.y,
z: this.startingPosition.z + translationVec.z
};
if (Vec3.distance(nextPosition, this.startingPosition) > this.MAX_TRANSLATION) {
this.translation = 0;
nextPosition = this.startingPosition;
}
Entities.editEntity(entityID, {position : nextPosition});
this.parent.updateUserData(entityID, this);
}
AnimatedTranslationBrush = AnimatedTranslationBrushClass;

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 50 50"
style="enable-background:new 0 0 50 50;"
xml:space="preserve"
sodipodi:docname="body-paint-a.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
id="metadata28"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs26"><inkscape:path-effect
effect="spiro"
id="path-effect844"
is_visible="true" /><inkscape:path-effect
effect="simplify"
id="path-effect842"
is_visible="true"
steps="1"
threshold="0.00243902"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" /></defs><sodipodi:namedview
pagecolor="#ff0000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3440"
inkscape:window-height="1377"
id="namedview24"
showgrid="false"
inkscape:zoom="12.558216"
inkscape:cx="12.089986"
inkscape:cy="26.79681"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style10">
.st0{fill:#FFFFFF;}
</style><g
id="Layer_2" /><g
id="g15"
style="fill:#000000;fill-opacity:1"
transform="rotate(67.884692,20.045098,26.136933)"><path
class="st0"
d="m 18.3,19.6 c 0.7,0.1 1.2,0.5 1.4,1.1 0.4,1.3 2,5.6 2.4,6.9 2.2,0 7.9,0.1 9.9,0.1 0.2,0 0.6,0 0.8,0.1 0.5,0.1 0.8,0.4 1.1,0.9 0.1,0.2 0.2,0.4 0.2,0.6 0.8,2.9 0.7,2 1.5,4.9 0.8,3 0.1,5.7 -2.3,7.7 -1.9,1.6 -3.6,2.3 -5.7,1.9 C 27,43.7 26.4,43.5 25.8,43.3 22.2,41.8 18.5,40.4 14.9,39 14,38.6 13.5,37.8 13.6,37 c 0.1,-0.9 0.9,-1.5 1.8,-1.6 0.1,0 0.3,0 0.4,0 0.2,0 0.4,0.1 0.7,0.2 1.6,0.6 2.6,1.4 4.2,2 0,0 0,0 0,0 0,0 0.1,0 0.2,0 -0.1,-0.2 -0.1,-0.4 -0.2,-0.6 -1.4,-4.9 -2.9,-9.8 -4.3,-14.7 -0.2,-0.7 -0.3,-1.4 0.2,-2 0.4,-0.6 1,-0.8 1.7,-0.8 -0.1,0 -0.1,0 0,0.1 m 0.6,-3.3 c -0.1,0 -0.3,0 -0.4,-0.1 -1.9,-0.2 -3.6,0.6 -4.7,2.1 -1.5,2 -0.9,4.1 -0.7,4.8 0.9,3 1.8,6 2.6,9 -0.1,0 -0.3,0 -0.4,0 -2.5,0 -4.6,1.9 -5,4.3 -0.2,1.2 0.1,2.4 0.7,3.4 0.6,1 1.5,1.7 2.7,2.2 1.2,0.5 2.4,0.9 3.6,1.4 2.4,0.9 4.9,1.9 7.3,2.9 0.9,0.4 1.7,0.6 2.5,0.7 3.9,0.7 6.7,-1.2 8.5,-2.7 3.4,-2.8 4.6,-6.7 3.4,-11.1 -0.5,-1.7 -0.6,-2.1 -0.8,-2.7 -0.1,-0.4 -0.3,-1 -0.7,-2.2 -0.1,-0.4 -0.2,-0.7 -0.4,-1.1 -0.7,-1.5 -1.8,-2.5 -3.4,-2.7 -0.6,-0.1 -1.2,-0.1 -1.8,-0.1 -1.2,0 -3.4,0 -5.4,0 -0.6,0 -1.3,-0.1 -1.9,-0.1 -0.2,-0.6 -0.5,-1.3 -0.7,-2 -0.4,-1.1 -0.7,-2.1 -0.9,-2.6 -0.7,-1.8 -2.2,-3 -4.1,-3.4 z"
id="path13"
style="fill:#000000;fill-opacity:1"
inkscape:connector-curvature="0" /></g><path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 20.916488,1.4932427 c -1.880852,0.027698 -3.758288,0.1823998 -5.595704,0.4375 -2.080992,0.2889174 -4.471558,0.9355587 -6.3554687,2.2773437 -0.9419551,0.6708925 -1.7724878,1.5471862 -2.2324218,2.6875 -0.4599341,1.1403138 -0.481885,2.5059559 -0.00781,3.8613276 0.4909627,1.403662 1.7602392,2.188114 3.0273438,2.587891 1.2671057,0.399776 2.6520157,0.26074 4.0988007,0.262247 3.259561,-0.194072 3.79548,-0.240098 7.421734,-0.701032 1.26474,-0.160761 2.785103,-0.326085 3.926732,-0.205746 1.141628,0.120338 2.039262,0.298519 2.669587,1.092799 0.414067,0.521772 0.808506,1.568173 0.423914,2.51705 -0.384589,0.948877 -1.025057,2.022576 -1.025057,2.022576 l 1.096391,1.115674 c 0,0 0.958068,-1.113164 1.527483,-2.518053 0.569415,-1.404888 0.90963,-2.852518 -0.461413,-4.580184 -1.219168,-1.536288 -2.44202,-1.935578 -4.113527,-1.958562 -2.507051,-0.03447 -2.929944,0.01769 -4.773912,0.170119 -1.513505,0.125111 -4.123831,0.301381 -6.659876,0.29874 -1.268022,-0.0013 -2.444735,-0.129668 -3.228515,-0.376953 C 9.8709884,10.236191 9.629171,9.9707429 9.5571122,9.7647271 9.2807458,8.974596 9.3277238,8.4788701 9.5141435,8.0166802 9.7005631,7.5544903 10.091559,7.0887511 10.70555,6.6514458 c 1.227982,-0.8746107 3.283229,-1.505629 5.029297,-1.7480469 6.89964,-0.9579211 14.1815,-0.3429868 19.615234,3.1289063 3.763529,2.4047128 4.614896,5.8266378 5.058489,10.0466988 0.251792,2.395391 -0.818041,6.124804 -3.163728,9.233864 -1.590881,2.108644 -5.037708,5.779685 -5.037708,5.779685 3.665783,-0.419849 7.406394,-1.073939 9.394425,3.758304 0,0 1.717219,-4.194846 2.558471,-5.934983 1.752831,-3.625751 2.079671,-8.394617 1.680286,-12.194116 C 45.264988,13.24845 42.062645,7.7569565 37.612839,4.9137452 32.881879,1.8908915 26.559043,1.4101486 20.916488,1.4932427 Z"
id="path846"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssscscssccccssssscsssssssccssss" /></svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 50 50"
style="enable-background:new 0 0 50 50;"
xml:space="preserve"
sodipodi:docname="body-paint-i.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
id="metadata28"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs26"><inkscape:path-effect
effect="spiro"
id="path-effect844"
is_visible="true" /><inkscape:path-effect
effect="simplify"
id="path-effect842"
is_visible="true"
steps="1"
threshold="0.00243902"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" /></defs><sodipodi:namedview
pagecolor="#ff0000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3440"
inkscape:window-height="1377"
id="namedview24"
showgrid="false"
inkscape:zoom="17.76"
inkscape:cx="29.272782"
inkscape:cy="17.418582"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style10">
.st0{fill:#FFFFFF;}
</style><g
id="Layer_2" /><g
id="g15"
style="fill:#ffffff;fill-opacity:1"
transform="rotate(67.884692,20.045098,26.136933)"><path
style="fill:#ffffff;fill-opacity:1"
d="m 18.3,19.6 c 1.702472,0.228207 1.602654,2.305326 2.229687,3.511719 0.52585,1.495178 1.082705,2.979958 1.570313,4.488281 3.505693,0.03842 7.016721,0.0444 10.51875,0.142188 1.508725,0.242085 1.527623,1.994911 1.940625,3.139062 0.887116,2.622207 2.036086,5.542451 0.837335,8.261487 -0.968675,2.168257 -2.990633,3.817017 -5.219903,4.56737 -2.672449,0.749953 -5.177079,-0.845141 -7.604264,-1.722221 -2.650234,-1.083969 -5.361762,-2.029346 -7.990902,-3.155855 -1.499022,-0.72667 -1.178352,-3.115528 0.486718,-3.371484 1.372011,-0.286343 2.590741,0.740045 3.775684,1.270605 0.623425,0.260939 2.710918,1.706496 1.79026,0.03916 -1.417068,-5.007968 -2.990368,-9.972901 -4.35774,-14.99375 C 15.943188,20.550591 17.115016,19.473573 18.3,19.6 Z m 0.6,-3.3 c -2.322229,-0.202595 -5.028895,0.965627 -5.809079,3.311154 -0.840444,2.321479 0.489249,4.635086 1.016306,6.863846 0.551898,1.868961 1.090605,3.741997 1.592773,5.625 -3.034144,-0.287912 -5.8556372,2.611461 -5.424609,5.639453 0.223273,2.117952 1.887578,3.824676 3.874609,4.44375 3.830016,1.440308 7.629371,2.964381 11.425586,4.487695 2.830342,0.903026 6.041248,0.509613 8.485352,-1.217773 2.763956,-1.74562 5.043904,-4.568309 5.333905,-7.917242 0.352918,-3.124971 -0.959365,-6.084809 -1.822162,-9.017817 C 37.128789,26.546285 35.644038,24.571231 33.475,24.466992 30.521354,24.288212 27.552946,24.525875 24.6,24.3 23.843543,22.475748 23.464594,20.492633 22.525112,18.749112 21.736972,17.461078 20.380092,16.569641 18.9,16.3 Z"
id="path13"
inkscape:connector-curvature="0" /></g><path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 20.916488,1.4932427 c -1.880852,0.027698 -3.758288,0.1823998 -5.595704,0.4375 -2.080992,0.2889174 -4.471558,0.9355587 -6.3554687,2.2773437 -0.9419551,0.6708925 -1.7724878,1.5471862 -2.2324218,2.6875 -0.4599341,1.1403138 -0.481885,2.5059559 -0.00781,3.8613276 0.4909627,1.403662 1.7602392,2.188114 3.0273438,2.587891 1.2671057,0.399776 2.6520157,0.26074 4.0988007,0.262247 3.259561,-0.194072 3.79548,-0.240098 7.421734,-0.701032 1.26474,-0.160761 2.785103,-0.326085 3.926732,-0.205746 1.141628,0.120338 2.039262,0.298519 2.669587,1.092799 0.414067,0.521772 0.808506,1.568173 0.423914,2.51705 -0.384589,0.948877 -1.025057,2.022576 -1.025057,2.022576 l 1.096391,1.115674 c 0,0 0.958068,-1.113164 1.527483,-2.518053 0.569415,-1.404888 0.90963,-2.852518 -0.461413,-4.580184 -1.219168,-1.536288 -2.44202,-1.935578 -4.113527,-1.958562 -2.507051,-0.03447 -2.929944,0.01769 -4.773912,0.170119 -1.513505,0.125111 -4.123831,0.301381 -6.659876,0.29874 -1.268022,-0.0013 -2.444735,-0.129668 -3.228515,-0.376953 C 9.8709884,10.236191 9.629171,9.9707429 9.5571122,9.7647271 9.2807458,8.974596 9.3277238,8.4788701 9.5141435,8.0166802 9.7005631,7.5544903 10.091559,7.0887511 10.70555,6.6514458 c 1.227982,-0.8746107 3.283229,-1.505629 5.029297,-1.7480469 6.89964,-0.9579211 14.1815,-0.3429868 19.615234,3.1289063 3.763529,2.4047128 4.614896,5.8266378 5.058489,10.0466988 0.251792,2.395391 -0.818041,6.124804 -3.163728,9.233864 -1.590881,2.108644 -5.037708,5.779685 -5.037708,5.779685 3.665783,-0.419849 7.406394,-1.073939 9.394425,3.758304 0,0 1.717219,-4.194846 2.558471,-5.934983 1.752831,-3.625751 2.079671,-8.394617 1.680286,-12.194116 C 45.264988,13.24845 42.062645,7.7569565 37.612839,4.9137452 32.881879,1.8908915 26.559043,1.4101486 20.916488,1.4932427 Z"
id="path846"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssscscssccccssssscsssssssccssss" /></svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,157 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by Fontastic.me</metadata>
<defs>
<font id="hifi-glyphs" horiz-adv-x="512">
<font-face font-family="hifi-glyphs" units-per-em="512" ascent="480" descent="-32"/>
<missing-glyph horiz-adv-x="512" />
<glyph glyph-name="hmd" unicode="&#98;" d="M381 139l-70 0c-18 0-30 17-40 33-4 6-11 16-15 18-4-2-10-12-15-18-11-15-23-33-43-33l-67 0c-53 0-97 42-97 95l0 45c0 53 44 96 97 96l250 0c53 0 96-43 96-96l0-45c0-52-43-95-96-95z m-125 77c16 0 26-15 36-30 5-7 15-22 19-22l70 0c39 0 71 32 71 70l0 45c0 39-32 70-71 70l-250 0c-39 0-71-31-71-70l0-45c0-38 32-70 71-70l67 0c6 0 16 14 22 23 10 14 20 29 35 29 1 0 1 0 1 0z"/>
<glyph glyph-name="2d-screen" unicode="&#99;" d="M395 386l-276 0c-33 0-60-28-60-61l0-116c0-33 27-62 60-62l127 0 0-27-80 0c-8 0-14-5-14-13 0-8 7-13 14-13l186 0c7 0 13 5 13 13 0 8-6 13-13 13l-81 0 0 27 124 0c33 0 60 29 60 62l0 116c0 33-27 61-60 61z m32-177c0-18-14-33-32-33l-134 0c-1 0-1 0-2 0-1 0-2 0-2 0l-138 0c-18 0-32 15-32 33l0 116c0 18 14 33 32 33l276 0c18 0 32-15 32-33z"/>
<glyph glyph-name="keyboard" unicode="&#100;" d="M375 250l-26 0 0 25 26 0z m-35 0l-27 0 0 25 27 0z m-36 0l-26 0 0 25 26 0z m-36 0l-26 0 0 25 26 0z m-35 0l-27 0 0 25 27 0z m-36 0l-26 0 0 25 26 0z m-36 0l-26 0 0 25 26 0z m225-1l17 0c7 0 13 6 13 13 0 8-6 14-13 14l-18 0m-262 0l-17 0c-7 0-13-6-13-14 0-7 6-13 13-13l18 0m251 39l-31 0 0 25 31 0z m-41 0l-32 0 0 25 32 0z m-42 0l-32 0 0 25 32 0z m-42 0l-32 0 0 25 32 0z m-42 0l-31 0 0 25 31 0z m-41 0l-32 0 0 25 32 0z m219 0l17 0c7 0 13 6 13 13 0 7-6 13-13 13l-18 0m-262 0l-17 0c-7 0-13-6-13-13 0-7 6-13 13-13l18 0m287-124l-315 0c-32 0-59 27-59 60l0 77c0 33 27 60 59 60l315 0c33 0 60-27 60-60l0-77c0-33-27-60-60-60z m-315 171c-18 0-33-15-33-34l0-77c0-19 15-34 33-34l315 0c19 0 34 16 34 34l0 77c0 19-15 34-34 34z m249-99l32 0 0-25-32 0z m-42 0l32 0 0-25-32 0z m-42 0l32 0 0-25-32 0z m-42 0l32 0 0-25-32 0z m-42 0l32 0 0-25-32 0z m-42 0l32 0 0-25-32 0z m251-25l17 0c7 0 13 6 13 13 0 7-6 13-13 13l-18 0m-262 0l-17 0c-7 0-13-6-13-13 0-7 6-13 13-13l18 0"/>
<glyph glyph-name="hand-controllers" unicode="&#101;" d="M141 268l-3 0c-7 0-13 5-13 13 0 7 6 13 13 13l3 0c7 0 13-6 13-13 0-8-6-13-13-13z m28 26l-3 0c-7 0-13 6-13 13 0 7 6 13 13 13l3 0c7 0 13-6 13-13 0-7-6-13-13-13z m-12-169l-11 0c-31 0-50 23-50 60l-10 143c0 34 27 61 60 61l11 0c33 0 60-27 60-60l0-1-10-144c0-36-20-59-50-59z m-11 238c-19 0-34-15-34-34l10-143c0-14 3-35 24-35l11 0c21 0 24 21 24 34l10 144c-1 19-16 34-34 34z m203-69c-7 0-13 5-13 13l0 2c0 8 6 13 13 13 7 0 13-5 13-13l0-2c0-7-6-13-13-13z m27-29c-8 0-13 6-13 13l0 3c0 7 5 13 13 13 7 0 13-6 13-13l0-3c0-7-6-13-13-13z m-11-140l-10 0c-31 0-51 23-51 60l-9 143c0 34 27 61 60 61l10 0c33 0 60-27 60-60l0-1-9-144c0-36-20-59-51-59z m-10 238c-19 0-34-15-34-34l9-143c0-14 4-35 25-35l11 0c21 0 24 21 24 34l9 144c0 19-15 34-33 34z"/>
<glyph glyph-name="headphones-mic" unicode="&#102;" d="M419 348l-22 0c-3 48-42 83-89 83l-105 0c-47 0-86-35-89-83l-20 0c-25 0-45-19-45-44l0-71c0-25 20-45 45-45l19 0c1-27 14-50 33-66-3-17 5-35 20-45l41-25c7-4 15-7 23-7 3 0 6 1 10 2 11 2 21 9 27 19 13 21 6 48-14 60l-41 26c-10 6-21 8-33 5-8-2-15-6-20-11-12 11-20 27-20 45l0 152c0 34 29 62 64 62l105 0c35 0 64-28 64-62l0-152c0-1-1-3-1-3l48 0c25 0 46 20 46 45l0 71c0 25-21 44-46 44z m-306-134l-19 0c-10 0-19 9-19 19l0 71c0 10 9 19 19 19l19 0z m61-90c3 4 7 6 11 7 2 1 3 1 4 1 4 0 7-1 9-3l41-25c8-5 11-16 6-24-3-4-7-7-11-8-5-1-10 0-14 2l-40 25c-8 6-11 16-6 25z m264 109c0-10-8-19-19-19l-22 0 0 109 22 0c11 0 19-9 19-19z"/>
<glyph glyph-name="gamepad" unicode="&#103;" d="M107 136c-10 0-20 3-29 10-46 37-8 131-4 141l1 1c1 4 3 7 5 11 16 30 37 73 81 73l182 0c51 0 71-47 87-85 5-10 44-101 4-138-28-26-67-1-102 22-21 13-42 26-56 26l-39 0c-13 0-33-13-53-27-25-16-52-34-77-34z m-10 141c-10-24-30-90-3-112 17-13 47 7 76 26 24 16 47 31 67 31l40 0c20 0 44-15 68-30 28-18 59-37 72-25 23 22 0 89-10 110-17 42-31 70-64 70l-182 0c-29 0-45-33-59-60-2-3-3-7-5-10z m247-36l-3 0c-7 0-13 6-13 13 0 7 6 13 13 13l3 0c7 0 13-6 13-13 0-7-6-13-13-13z m0 55l-3 0c-7 0-13 6-13 13 0 7 6 13 13 13l3 0c7 0 13-6 13-13 0-7-6-13-13-13z m-29-29l-2 0c-8 0-13 6-13 13 0 8 5 13 13 13l2 0c8 0 13-5 13-13 0-7-5-13-13-13z m57 0l-3 0c-7 0-13 6-13 13 0 8 6 13 13 13l3 0c7 0 13-5 13-13 0-7-6-13-13-13z m-172 26l-12 0 0 13c0 7-6 13-13 13-7 0-13-6-13-13l0-13-13 0c-7 0-13-6-13-13 0-7 6-13 13-13l13 0 0-12c0-8 6-14 13-14 7 0 13 6 13 14l0 12 12 0c8 0 13 6 13 13 0 7-5 13-13 13z"/>
<glyph glyph-name="headphones" unicode="&#104;" d="M141 168l0 152c0 35 28 65 63 65l106 0c34 0 62-30 62-65l0-151c0-1 1-3 0-4l48 0c25 0 47 21 47 46l0 70c0 25-22 45-47 45l-21 0c-4 47-42 83-89 83l-106 0c-47 0-86-36-89-83l-19 0c-25 0-45-20-45-45l0-70c0-25 20-46 45-46l45 0z m-63 43l0 70c0 11 7 19 18 19l19 0 0-108-19 0c-11 0-18 8-18 19z m362 0c0-11-9-19-20-19l-20 0 0 108 20 0c11 0 20-8 20-19z"/>
<glyph glyph-name="mic" unicode="&#105;" d="M318 370c0 33-26 59-59 59l-6 0c-33 0-59-26-59-59l0-105c0-33 26-59 59-59l6 0c33 0 59 26 59 59z m-25-103c0-19-15-34-34-34l-7 0c-19 0-34 15-34 34l0 104c0 19 15 34 34 34l7 0c19 0 34-15 34-34z m82 8c0 7-6 13-12 13-7 0-13-6-13-13 0-51-42-93-93-93-52 0-93 42-93 93 0 7-6 13-13 13-7 0-12-6-12-13 0-60 46-110 104-117l0-34-80 0c-8 0-14-6-14-14 0-7 6-13 14-13l186 0c7 0 13 6 13 13 0 8-6 14-13 14l-80 0 0 34c60 6 106 56 106 117z"/>
<glyph glyph-name="upload" unicode="&#106;" d="M330 193l-83 86-84-86 52 0 0-141 61 23 0 118z m-12 247c-39 0-76-15-105-41-23-21-40-49-47-80-9 3-19 4-29 4-53 0-97-43-97-97 0-54 44-98 97-98 1 0 19 0 45 0l0 29c-26 0-44 0-45 0-37 0-68 31-68 69 0 37 31 68 68 68 12 0 23-3 34-9l19-11 2 23c3 31 18 59 41 81 23 21 54 33 85 33 70 0 127-57 127-127 0-70-57-127-127-127 0 0-5 0-10 0l0-29c5 0 10 0 10 0 86 0 156 70 156 156 0 86-70 156-156 156z"/>
<glyph glyph-name="script" unicode="&#107;" d="M283 80l-150 0c-30 0-56 15-73 44-13 21-17 42-17 42l-3 15 91 0 0 252 315 0 0-238c1-7 5-58-21-87-13-14-29-21-50-21-42 0-63 23-73 41-6 11-9 21-10 29l-220 0c2-6 5-13 9-20 13-21 31-32 52-32l150 0c7 0 13-6 13-13 0-6-6-12-13-12z m-127 101l158 0 1-12c0 0 1-15 9-30 10-18 27-28 51-28 13 0 23 5 31 13 10 11 14 29 15 42 1 15 0 27 0 27l0 1 0 214-265 0z m225 168l-185 0c-8 0-14 6-14 13 0 8 6 14 14 14l185 0c8 0 14-6 14-14 0-7-6-13-14-13z m0-61l-185 0c-8 0-14 7-14 14 0 8 6 14 14 14l185 0c8 0 14-6 14-14 0-7-6-14-14-14z m0-60l-185 0c-8 0-14 6-14 14 0 7 6 13 14 13l185 0c8 0 14-6 14-13 0-8-6-14-14-14z"/>
<glyph glyph-name="text" unicode="&#108;" d="M220 134l-81 232c-1 2-3 4-6 4l-10 0c-3 0-5-2-6-4l-83-233c-1-2 0-5 1-7 1-1 3-3 6-3l16 0c3 0 5 3 6 5l27 79 74 0 27-79c1-2 4-5 7-5l16 0c2 0 4 2 5 4 2 1 2 4 1 7z m-120 102l26 73c1 2 1 3 2 5 0-2 1-3 2-4l24-74z m252 60c-10 12-25 18-44 18-17 0-35-5-53-14-3-2-4-6-3-9l5-14c1-2 2-3 4-4 2-1 4 0 6 1 14 8 28 12 41 12 11 0 19-3 23-10 5-7 8-18 8-33l0-4-23-1c-25 0-44-6-58-16-14-11-21-26-21-45 0-17 4-31 14-40 10-10 23-16 40-16 12 0 23 3 32 8 6 4 11 8 17 14l1-13c1-4 4-7 7-7l10 0c4 0 8 4 8 8l0 115c0 23-5 39-14 50z m-87-119c0 11 4 19 11 24 8 5 22 9 42 10l19 1 0-10c0-17-4-30-12-39-8-9-19-13-33-13-9 0-16 2-20 7-5 4-7 11-7 20z m186-105c-10 0-15 8-15 18 0 22 0 298 0 320 0 10 5 19 15 19 0 0 0 0 0 0 10 0 15-8 15-18 1-22 1-299 1-321 0-10-6-18-16-18 0 0 0 0 0 0z"/>
<glyph glyph-name="cube" unicode="&#109;" d="M452 421l-263 26c-3 0-6 0-8-2l0 0-126-88c-1-1-1-1-1-1-3-3-4-7-4-10l0-263c0-7 5-12 12-13l262-26c0 0 1 0 1 0 3 0 5 1 8 2l126 89c0 0 0 0 0 1 3 2 4 6 4 9l0 263c0 7-5 12-11 13z m-22-274l-2-1c0 0 0 0 0-1 0 0 0 0 0 0l-89-62 0 230 98 69 0-222c-1-6-2-9-7-13z m-227 272l211-21-92-65-222 22 86 61c1 0 1 0 1 0 0 0 0 0 0 0 3 2 7 4 11 4 2 0 4-1 5-1z m110-347l-237 23 0 236 237-23z"/>
<glyph glyph-name="sphere" unicode="&#110;" d="M418 415c-91 91-237 91-327 0-44-43-68-101-68-163 0-62 24-120 68-164 45-45 104-67 163-67 59 0 119 22 164 67 43 44 68 102 68 164-1 62-25 120-68 163z m-305-22c30 30 67 49 106 55-8-11-14-26-20-44-13-41-20-96-20-154 0-3 0-7 0-10 6-1 12-2 19-3 2 0 4 0 6 0 0 4 0 8 0 13 0 117 30 193 52 200 1 0 1 1 1 1 51 0 100-20 138-58 37-37 58-85 59-137-5-22-82-53-200-53-116 0-192 29-200 52 1 52 22 101 59 138z m283-283c-40-39-92-59-144-58-14 9-30 43-40 97l-25 1c3-19 7-39 12-54 5-16 11-30 17-40-38 7-74 25-103 54-30 30-49 67-56 107 11-7 25-13 42-18 42-14 97-21 155-21 58 0 113 7 154 21 18 5 32 12 43 19-7-41-26-78-55-108z"/>
<glyph glyph-name="zone" unicode="&#111;" d="M381 372c-3 7-9 11-17 11l-72 0 0-34 30 0-163-163 0 36-36 0 0-79 1 0c0-2 1-4 2-6 2-7 9-11 16-11l83 0 0 35-41 0 162 161 0-25 35 0 0 62c1 4 1 9 0 13z m-43-298c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-21-22-21-12 0-22 9-22 21z m-71 0c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-21-21-21-12 0-22 9-22 21z m-72 0c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-21-22-21-12 0-22 9-22 21z m-71 0c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-21-21-21-12 0-22 9-22 21z m-50-21c-6 0-11 2-15 6-4 4-7 10-7 15 0 6 3 12 7 16 4 4 9 6 15 6 6 0 11-2 15-6 4-4 7-10 7-16 0-5-2-11-7-15-4-4-9-6-15-6z m-22 93c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-22-22-22-12 0-22 10-22 22z m0 71c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-21-22-21-12 0-22 9-22 21z m0 72c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-22-22-22-12 0-22 10-22 22z m0 71c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-21-22-21-12 0-22 9-22 21z m286 72c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-22-22-22-12 0-22 10-22 22z m-71 0c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-22-21-22-12 0-22 10-22 22z m-72 0c0 12 10 22 22 22 12 0 22-10 22-22 0-12-10-22-22-22-12 0-22 10-22 22z m-71 0c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-22-21-22-12 0-22 10-22 22z m308-22c-6 0-12 3-16 7-4 4-6 9-6 15 0 6 2 11 6 15 4 4 10 7 16 7 5 0 11-3 15-7 4-4 6-9 6-15 0-6-2-11-6-15-4-4-10-7-15-7z m-22-264c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-22-21-22-12 0-22 10-22 22z m0 71c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-21-21-21-12 0-22 9-22 21z m0 72c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-22-21-22-12 0-22 10-22 22z m0 71c0 12 10 22 22 22 12 0 21-10 21-22 0-12-9-21-21-21-12 0-22 9-22 21z"/>
<glyph glyph-name="light" unicode="&#112;" d="M298 259c0-21-18-38-39-38-21 0-38 17-38 38 0 22 17 39 38 39 21 0 39-17 39-39z m-39-109c-60 0-109 49-109 109 0 61 49 110 109 110 61 0 110-49 110-110 0-60-50-109-110-109z m0 190c-44 0-80-36-80-81 0-44 36-80 80-80 45 0 81 36 81 80 0 45-36 81-81 81z m155-97c-8 0-14 7-14 15 0 8 6 14 14 14 17 0 35 0 52 0 0 0 0 0 0 0 8 0 14-6 14-14 0-8-6-14-14-14-17 0-35 0-52-1 0 0 0 0 0 0z m-308 0c-17 1-35 1-52 1-8 0-14 6-14 14 0 8 7 14 14 14 0 0 0 0 1 0 17 0 34 0 51 0 8 0 14-7 14-14 0-8-6-15-14-15z m263 109c-3 0-7 2-10 5-5 5-5 14 0 20 12 12 24 24 36 36 6 6 15 6 21 1 5-6 5-15 0-21-12-12-25-24-37-36-3-3-6-5-10-5z m-255-254c-3 0-7 2-10 5-5 5-5 14 0 20 13 12 25 24 37 36 6 5 15 5 20 0 6-6 6-15 0-20-12-13-24-25-37-37-2-2-6-4-10-4z m146 300c-8 0-14 6-14 14 0 17 0 34 0 52 0 7 6 14 14 14 0 0 0 0 0 0 8 0 14-6 14-14 0-18 1-35 1-52 0-8-7-14-15-14z m0-360c0 0 0 0 0 0-8 0-14 6-14 14 0 17 0 35 0 52 0 8 6 14 14 14 0 0 0 0 0 0 8 0 15-7 15-14 0-18-1-35-1-52 0-8-6-14-14-14z m-109 315c-3 0-7 1-10 4-12 12-24 24-36 36-6 6-6 15-1 20 6 6 15 6 21 0 12-12 24-24 36-36 6-6 6-15 0-20-2-3-6-4-10-4z m254-255c-3 0-7 1-10 4-12 12-24 25-36 37-5 6-5 15 0 20 6 6 15 6 20 0 13-12 25-25 37-37 5-5 5-14-1-20-2-3-6-4-10-4z"/>
<glyph glyph-name="web" unicode="&#113;" d="M438 390c0 8-6 15-14 15l-333 0c-8 0-15-7-15-15l0-298c0-8 7-14 15-14l333 0c8 0 14 6 14 14z m-219-8l172 0c8 0 15-7 15-16 0-9-7-16-15-16l-172 0c-8 0-15 7-15 16 0 9 7 16 15 16z m-47 1c9 0 16-7 16-16 0-10-7-17-16-17-10 0-17 7-17 17 0 9 7 16 17 16z m-51 0c9 0 17-7 17-16 0-10-8-17-17-17-9 0-17 7-17 17 0 9 8 16 17 16z m291-276l-308 0 0 219 308 0z m-250 84l-15 0-20 60 13 0 14-45 15 45 13 0 15-45 14 45 13 0-20-60-14 0-14 41z m137 25l-46 0c0-5 2-8 6-11 3-2 8-4 12-4 8 0 13 3 17 7l7-8c-6-6-14-9-25-9-8 0-15 2-21 8-6 5-9 13-9 22 0 9 3 17 9 22 6 6 13 9 21 9 8 0 15-3 21-8 6-5 8-11 8-20z m-46 9l34 0c0 5-2 9-5 12-3 3-7 4-11 4-5 0-9-1-13-4-3-3-5-7-5-12z m101 27c8 0 14-3 20-9 6-5 9-12 9-22 0-9-3-16-9-22-5-6-12-8-19-8-8 0-15 3-21 9l0-9-12 0 0 83 12 0 0-34c5 8 12 12 20 12z m-20-31c0-6 2-10 5-14 4-4 8-5 13-5 5 0 9 1 13 5 3 4 5 8 5 14 0 6-2 10-5 14-4 4-8 6-13 6-5 0-9-2-13-6-3-4-5-8-5-14z"/>
<glyph glyph-name="web-2" unicode="&#114;" d="M438 390c0 8-6 15-14 15l-333 0c-8 0-15-7-15-15l0-298c0-8 7-14 15-14l333 0c8 0 14 6 14 14z m-219-8l172 0c8 0 15-7 15-16 0-9-7-16-15-16l-172 0c-8 0-15 7-15 16 0 9 7 16 15 16z m-47 1c9 0 16-7 16-16 0-10-7-17-16-17-10 0-17 7-17 17 0 9 7 16 17 16z m-51 0c9 0 17-7 17-16 0-10-8-17-17-17-9 0-17 7-17 17 0 9 8 16 17 16z m291-276l-308 0 0 219 308 0z"/>
<glyph glyph-name="edit" unicode="&#115;" d="M196 214c-27-27-54-54-81-81-6 6-13 13-19 19 27 27 54 54 81 81l-22 21c-31-31-61-62-92-92-7-7-11-13-12-22-3-25-7-50-11-76 3 0 4 0 6 0 24 5 48 10 72 15 5 1 10 4 13 7 32 32 64 64 96 96z m126 207c10 10 21 21 33 32 4 4 10 4 14 0 19-19 38-38 57-57 4-5 4-10 0-15-11-11-22-22-34-33-23 24-46 48-70 73z m23-181c-5-1-8 0-11 3-8 8-15 15-23 23 18 18 37 37 55 55 2 2 4 4 4 4-24 25-47 49-71 74-2-2-3-4-5-6-18-18-37-37-55-55-34 34-67 67-101 101-2 2-5 5-8 7-18 14-42 12-57-5-15-17-14-42 2-58 50-51 101-101 151-151 17-16 33-33 50-49 2-3 3-5 2-8-2-8-4-15-4-23-4-48 27-90 73-102 20-5 39-4 58 4-1 2-3 3-5 4-14 14-28 28-42 42-10 11-11 26-2 36 8 8 16 16 24 24 11 10 24 10 35 0 2-1 4-4 6-6 15-14 29-28 43-42 0 0 1 0 2 1 1 8 3 16 4 24 7 69-59 123-125 103z m-243 162c-7 0-14 6-14 14 0 8 6 14 14 14 8 0 15-6 15-14 0-7-7-14-15-14z m198-46c6-6 13-12 19-19-13-13-26-26-39-39-7 6-13 12-20 19 14 13 27 26 40 39z"/>
<glyph glyph-name="directory" unicode="&#117;" d="M432 451l-99-38c-2 0-3-1-4-1-3 1-5 2-8 2l-116 38c-8 3-15 6-30-1l-91-35c-17-5-32-16-32-31l0-303c0-15 14-27 32-27l99 38c3 1 6 2 9 4 1-1 3-2 4-2 3-1 5-2 7-3 0 0 1 0 1-1 0 0 1 0 1 0l116-38 0 0c8-1 12-1 21 3l90 34c13 6 32 16 32 31l0 304c0 14-14 26-32 26z m-351-371c-1 0-1 1-1 2l0 303c0 2 5 6 14 9l1 0 1 1 89 34c1-1 0-1 0-2l0-303c0-1-3-4-16-10z m356 42c-1-2-5-5-17-11l-90-34c0 1-1 1-1 2l0 304c0 1 5 5 14 8l1 0 1 1 91 34c0 0 1-1 1-1z"/>
<glyph glyph-name="menu" unicode="&#118;" d="M257 22c-60 0-119 22-164 67-44 44-68 102-68 164 0 62 24 120 68 163 90 91 237 91 327 0 44-43 68-101 68-163 0-62-24-120-68-164-45-45-104-67-163-67z m0 431c-52 0-103-20-142-59-38-38-58-88-58-141 0-54 20-104 58-142 78-78 205-78 283 0 38 38 59 88 59 142 0 53-21 103-59 141-39 39-90 59-141 59z m101-133l-203 0c-8 0-15 7-15 15 0 8 7 15 15 15l203 0c8 0 14-7 14-15 0-8-6-15-14-15z m0-84l-203 0c-8 0-15 7-15 15 0 8 7 15 15 15l203 0c8 0 14-7 14-15 0-8-6-15-14-15z m0-81l-203 0c-8 0-15 7-15 15 0 8 7 14 15 14l203 0c8 0 14-6 14-14 0-8-6-15-14-15z"/>
<glyph glyph-name="close" unicode="&#119;" d="M258 19c-59 0-118 23-163 68-44 43-68 101-68 163 0 62 24 120 68 164 90 90 237 90 327 0 44-44 68-102 68-164 0-62-24-120-68-163-45-45-104-68-164-68z m0 431c-51 0-102-19-141-58-38-38-59-88-59-142 0-53 21-103 59-141 78-78 205-78 283 0 38 38 58 88 58 141 0 54-20 104-58 142-39 39-90 58-142 58z m25-200l67 67c7 7 7 18 0 25-7 7-18 7-25 0l-67-67-66 67c-7 7-18 7-25 0-7-7-7-18 0-25l66-67-66-66c-7-7-7-18 0-25 7-7 18-7 25 0l66 66 67-66c7-7 18-7 25 0 7 7 7 18 0 25z"/>
<glyph glyph-name="close-inverted" unicode="&#120;" d="M400 388c-39 39-90 59-142 59-51 0-102-20-141-59-38-37-59-88-59-141 0-53 21-104 59-141 78-78 205-78 283 0 38 37 58 88 58 141 0 53-20 104-58 141z m-45-208c8-9 8-22 0-30-8-8-21-8-29 0l-68 67-67-67c-8-8-21-8-29 0-9 8-9 21 0 30l67 67-67 67c-9 8-9 22 0 30 8 8 21 8 29 0l67-68 68 68c8 8 21 8 29 0 8-9 8-22 0-30l-67-67z"/>
<glyph glyph-name="pin" unicode="&#121;" d="M304 144c1 16-2 31-8 45l97 115 25-8c14-4 29 2 36 14 8 13 6 29-5 39l-116 116c-10 11-26 13-39 5-12-8-18-23-13-37l8-25-115-102c-33 11-72 2-98-24-12-12-12-33 0-45l65-65-83-82c-6-7-6-17 0-23 6-6 16-6 23 0l82 83 66-66c13-13 33-13 45 0 17 17 28 38 30 60z m-205 115c21 22 55 26 81 9l145 130-14 45 116-116-45 13-126-149c25-28 18-62-4-85z"/>
<glyph glyph-name="pin-inverted" unicode="&#122;" d="M297 160c2 14 0 27-6 39l92 106 21-5c13-4 26 2 33 13 8 12 6 26-3 35l-98 99c-9 8-24 10-35 2-11-7-17-21-13-33l6-22-106-96c-30 9-64 0-88-24-12-12-13-30-2-41l55-55-77-76c-5-6-6-15-1-20 6-6 15-5 20 1l77 76 56-56c11-11 29-10 41 2 15 15 25 35 28 55z"/>
<glyph glyph-name="resize-handle" unicode="&#65;" d="M262 175l70 71c7 7 18 7 25 0 7-7 7-18 0-25l-70-71c-7-7-18-7-25 0-7 7-7 18 0 25m-101 0l175 175c7 7 18 7 25 0 7-7 7-18 0-25l-175-175c-7-7-18-7-25 0-7 7-7 18 0 25"/>
<glyph glyph-name="diclosure-expand" unicode="&#66;" d="M239 187c-3 0-6 1-8 3-5 5-5 12 0 17l42 42-43 44c-5 4-5 12 0 17 4 4 12 4 17 0l60-61-60-59c-2-2-5-3-8-3z"/>
<glyph glyph-name="reload-small" unicode="&#97;" d="M334 253c-9 0-18-7-18-16-3-27-25-47-52-47-29 0-52 24-52 52 0 11 2 27 14 38 6 5 14 9 24 12-5-7-4-16 2-22 3-3 8-4 12-4 5 0 9 1 13 5l28 28c1 2 3 4 3 7 3 6 1 13-3 18l-29 29c-3 3-7 5-12 5-5 0-9-2-12-5-4-3-5-8-5-12 0-5 1-9 5-13l0 0c-20-3-37-11-50-23-16-16-25-38-25-63 0-47 39-86 86-86 45 0 82 33 87 78 1 9-6 18-16 19z"/>
<glyph glyph-name="close-small" unicode="&#67;" d="M291 259l43 44c8 7 8 19 0 27-7 7-19 7-26 0l-44-44-44 44c-7 7-19 7-26 0-8-8-8-20 0-27l43-44-43-43c-8-8-8-20 0-27 7-7 19-7 26 0l44 44 44-44c7-7 19-7 26 0 8 8 8 19 0 27z"/>
<glyph glyph-name="minimize" unicode="&#73;" d="M154 282l198 0c10 0 18-8 18-18 0-10-8-18-18-18l-198 0c-10 0-18 8-18 18 0 10 8 18 18 18"/>
<glyph glyph-name="maximize" unicode="&#74;" d="M157 244l77 0 0-75c0-9 8-17 17-17 9 0 17 8 17 17l0 75 75 0c10 0 17 8 17 17 0 10-7 18-17 18l-75 0 0 76c0 10-8 17-17 17-9 0-17-7-17-17l0-76-77 0c-10 0-17-8-17-18 0-9 8-17 17-17z"/>
<glyph glyph-name="maximize-inverted" unicode="&#75;" d="M251 434c-96 0-173-78-173-173 0-96 77-173 173-173 95 0 173 77 173 173 0 95-78 173-173 173z m93-190l-77 0 0-76c0-10-7-17-16-17-9 0-16 7-16 17l0 76-77 0c-10 0-17 8-17 17 0 9 7 17 17 17l77 0 0 76c0 9 7 17 16 17 9 0 16-8 16-17l0-76 77 0c9 0 17-8 17-17 0-9-8-17-17-17z"/>
<glyph glyph-name="disclosure-button-expand" unicode="&#76;" d="M264 202l-60 59c-4 5-4 12 0 17 5 4 13 4 17 0l43-43 43 44c4 4 12 4 17 0 4-5 4-13 0-17z m90-79l-188 0c-16 0-29 13-29 29l0 188c0 16 13 29 29 29l188 0c16 0 29-13 29-29l0-188c0-16-13-29-29-29z m-188 222c-3 0-5-2-5-5l0-188c0-3 2-5 5-5l188 0c3 0 5 2 5 5l0 188c0 3-2 5-5 5z"/>
<glyph glyph-name="disclosure-button-collapse" unicode="&#77;" d="M264 290l-60-59c-4-5-4-12 0-17 5-4 13-4 17 0l43 43 43-44c4-4 12-4 17 0 4 5 4 13 0 17z m119 50l0-188c0-16-13-29-29-29l-188 0c-16 0-29 13-29 29l0 188c0 16 13 29 29 29l188 0c16 0 29-13 29-29z m-29-193c3 0 5 2 5 5l0 188c0 3-2 5-5 5l-188 0c-3 0-5-2-5-5l0-188c0-3 2-5 5-5z"/>
<glyph glyph-name="script-stop" unicode="&#78;" d="M298 79l-145 0c-29 0-54 14-71 42-13 20-17 41-17 41l-3 16 267 0 1-13c0 0 1-15 9-29 9-17 26-26 48-26 13 0 23 4 30 12 16 18 16 54 15 66l0 1 0 205-270 0c-7 0-13 7-13 14 0 7 6 14 13 14l294 0 0-232c1-7 5-57-20-86-13-13-29-20-49-20-41 0-61 22-71 41-6 9-9 18-10 27l-211 0c2-7 5-12 9-18 12-20 29-31 49-31l145 0c8 0 13-5 13-12 0-7-5-12-13-12z m95 258l-112 0c-7 0-14 7-14 14 0 8 7 15 14 15l112 0c8 0 14-7 14-15 0-8-6-14-14-14z m0-58l-143 0c-7 0-14 6-14 14 0 8 7 14 14 14l143 0c8 0 14-6 14-14 0-8-6-14-14-14z m0-58l-112 0c-7 0-14 6-14 14 0 8 7 14 14 14l112 0c8 0 14-6 14-14 0-8-6-14-14-14z m-204 72l42 42c7 7 7 19 0 26-7 7-18 7-25 0l-43-42-42 42c-7 7-18 7-26 0-7-7-7-19 0-26l43-42-43-42c-7-7-7-19 0-26 8-7 19-7 26 0l42 42 43-42c7-7 18-7 25 0 7 7 7 19 0 26z"/>
<glyph glyph-name="script-reload" unicode="&#79;" d="M236 295c-10 1-18-6-19-15-2-26-24-45-50-45-28 0-50 22-50 50 0 10 2 25 14 36 5 6 13 10 23 12-4-7-4-15 2-21 3-3 7-5 12-5 4 0 9 2 12 5l27 28c1 2 3 4 3 6 3 7 2 14-3 18l-28 28c-3 3-7 5-11 5-5 0-9-2-12-5-3-3-5-7-5-12 0-4 2-9 5-12l1-1c-20-2-37-10-49-22-16-14-25-36-25-60 0-46 38-84 84-84 43 0 79 33 83 76 1 9-5 17-14 18z m62-216l-145 0c-30 0-55 15-72 43-12 20-16 40-16 41l-3 15 267 0 0-12c0 0 1-15 9-29 10-18 26-26 49-26 13 0 22 4 29 11 16 19 16 55 14 67l0 1 0 207-215 0c-7 0-12 5-12 12 0 8 5 13 12 13l241 0 0-231c1-7 5-57-21-86-12-13-28-20-48-20-41 0-62 22-72 40-5 10-8 20-10 27l-210 0c2-5 5-11 8-17 13-20 29-29 50-29l145 0c7 0 13-6 13-14 0-7-6-13-13-13z m95 259l-139 0c-8 0-14 6-14 14 0 8 6 14 14 14l139 0c7 0 14-6 14-14 0-8-7-14-14-14z m0-58l-103 0c-7 0-14 6-14 14 0 8 7 14 14 14l103 0c7 0 14-6 14-14 0-8-7-14-14-14z m0-58l-111 0c-7 0-14 6-14 14 0 8 7 14 14 14l111 0c7 0 14-6 14-14 0-8-7-14-14-14z"/>
<glyph glyph-name="script-run" unicode="&#80;" d="M209 309l-79 60c-5 3-11 4-16 1-4-2-8-7-8-13l0-126c0-6 4-11 9-14 2-1 4-1 6-1 3 0 7 1 9 3l80 68c3 3 5 7 5 11 0 5-2 9-6 11m89-232l-145 0c-30 0-55 16-72 44-12 20-16 40-16 41l-3 16 267 0 0-13c0 0 1-14 9-29 10-17 26-26 49-26 13 0 22 4 29 12 16 18 16 54 14 66l0 1 0 206-269 0c-7 0-13 6-13 13 0 7 6 13 13 13l295 0 0-230c1-8 5-57-21-86-12-14-28-21-48-21-41 0-62 23-72 41-5 10-8 19-10 28l-210 0c2-7 5-12 8-18 13-20 29-31 50-31l145 0c7 0 13-7 13-14 0-7-6-13-13-13z m95 261l-180 0c-7 0-14 6-14 14 0 8 7 14 14 14l180 0c7 0 14-6 14-14 0-8-7-14-14-14z m0-59l-135 0c-8 0-14 7-14 15 0 7 6 14 14 14l135 0c7 0 14-7 14-14 0-8-7-15-14-15z m0-58l-180 0c-7 0-14 7-14 14 0 8 7 15 14 15l180 0c7 0 14-7 14-15 0-8-7-14-14-14z"/>
<glyph glyph-name="script-new" unicode="&#81;" d="M298 80l-145 0c-30 0-55 15-72 43-12 20-16 40-16 41l-3 16 267 0 0-12c0-1 1-15 9-29 10-18 26-27 49-27 13 0 22 4 29 12 16 18 16 54 14 66l0 1 0 206-269 0c-7 0-13 6-13 13 0 7 6 13 13 13l295 0 0-230c1-8 5-57-21-86-12-14-28-21-48-21-41 0-62 23-72 41-5 10-8 19-10 28l-210 0c2-7 5-12 8-18 13-20 29-30 50-30l145 0c7 0 13-7 13-14 0-7-6-13-13-13z m95 260l-180 0c-7 0-14 6-14 14 0 8 7 14 14 14l180 0c7 0 14-6 14-14 0-8-7-14-14-14z m0-59l-135 0c-8 0-14 7-14 15 0 7 6 14 14 14l135 0c7 0 14-7 14-14 0-8-7-15-14-15z m0-58l-180 0c-7 0-14 7-14 14 0 8 7 15 14 15l180 0c7 0 14-7 14-15 0-7-7-14-14-14z m-250 90l0 53c0 9-7 16-16 16-9 0-16-7-16-16l0-53-54 0c-9 0-16-8-16-17 0-9 8-17 16-17l54 0 0-53c0-9 7-16 16-16 9 0 16 8 16 17l0 52 54 0c9 0 16 8 16 17 0 9-8 16-17 16z"/>
<glyph glyph-name="hifi-forum" unicode="&#50;" d="M265 410c-83 0-150-68-150-150 0-24 6-47 16-67l-27-79 80 20c23-16 51-25 81-25 83 0 150 68 150 150 0 83-67 151-150 151z m38-248c-9 0-17 7-17 17 0 7 4 14 12 16l0 46-74 33 0-56c7-2 12-8 12-16 0-10-7-18-17-18-10 0-19 8-19 18 0 7 6 13 10 16l0 111c-4 2-10 9-10 16 0 10 9 17 19 17 9 0 17-7 17-17 0-8-5-14-12-16l0-41 74-33 0 51c-8 3-12 9-12 16 0 10 7 18 17 18 10 0 17-8 17-18 0-7-5-14-12-16l0-110c7-3 12-9 12-17 0-10-7-17-17-17z"/>
<glyph glyph-name="hifi-logo-small" unicode="&#83;" d="M374 374c-32 32-74 49-119 49-46 0-88-17-120-49-32-32-49-74-49-119 0-45 17-87 49-118 32-32 74-49 119-49 45 0 88 17 119 49 32 32 49 73 49 118 1 45-17 87-48 119z m-17-221c-28-28-65-43-103-43-39 0-75 15-103 43-27 27-42 64-42 102 0 39 15 75 42 103 28 28 64 43 103 43 38 0 75-15 103-43 27-28 42-64 42-103 0-39-15-76-42-102z m-145 47c-5 0-9 3-9 6l0 126c0 3 4 7 9 7 6 0 10-4 10-7l0-125c0-4-4-7-10-7z m0 118c-5 0-10 2-14 6-7 7-7 20 0 27 5 5 9 6 14 6 6 0 11-2 14-6 4-4 5-8 5-14 0-5-2-10-5-13-4-4-8-6-14-6z m0-144c-5 0-10 2-14 5-4 5-5 9-5 14 0 6 2 11 5 14 5 4 9 5 14 5 6 0 11-2 14-5 4-4 5-8 5-14 0-5-2-10-5-14-4-3-8-5-14-5z m85 2c-6 0-10 3-10 7l0 121c0 4 4 7 10 7 5 0 9-3 9-7l0-121c0-5-4-7-9-7z m0 120c-6 0-11 2-14 5-8 8-8 20 0 28 4 4 8 5 14 5 5 0 10-2 14-5 4-4 5-9 5-14 0-5-2-11-5-14-4-3-9-5-14-5z m0-144c-6 0-11 2-14 5-8 7-8 20 0 28 4 4 8 5 14 5 5 0 10-2 14-5 4-5 5-9 5-14 0-5-2-11-5-14-4-3-9-5-14-5z m1 73l-85 40 1 18 86-40z"/>
<glyph glyph-name="placemark" unicode="&#85;" d="M134 98c31-32 73-49 119-49l1 0c45 0 86 16 117 47 31 30 48 71 48 114 1 46-16 88-46 120-9 9-20 17-31 24-3-7-6-15-10-22 5-4 11-8 16-13 15-14 28-32 33-46l1-1c0-1 0-2-1-3l-1 0c-12-7-25-10-38-12-2-1-4-1-7-2l-1 0c0 0-1 0-2 1 0 0-1 1-1 1l0 1c-3 15-6 31-12 46l-7-15c4-11 6-21 8-32l0-1c0-1 0-1 0-2-1-1-1-1-2-1l-1 0-55-3-4 0c0 0-1 0-1 0-1 1-1 2-1 2l0 74c-5 9-8 17-11 26 0-1 0-1 0-1l-1 0 0-97c0 0 0-1 0-2 0-1-1-2-2-2l-1 0c0 0-1 0-1 0l-51 3c-1 0-2 0-2 1-1 1-1 2 0 2l0 1c5 27 13 58 35 83 6 6 12 13 20 16 0 0 1 0 1 0-3 7-6 15-9 22-37-4-71-20-99-47-30-30-47-70-48-113-1-46 16-88 47-120z m198 72c0 4 1 7 1 10l0 0c0 7 1 14 1 21 0 9 0 18 0 27 0 3 0 6 0 9l0 1c-1 1-1 6 5 7 11 3 23 5 34 8l1 0c3 1 7 2 11 2l1 1c1 0 3-1 3-2l0-1c0-1 1-1 1-2 1-3 1-5 2-8 3-14 4-27 3-40-2-12-8-21-18-25-8-3-17-5-25-8-3 0-7-1-10-2-1-1-3-1-4-1-1 0-1 0-2 0l-1-1c0 0 0 0 0 0-1 0-2 1-2 1-1 1-1 1-1 2z m2-17c12 4 23 7 35 10l14 4c1 0 2 0 2-1 1 0 1-2 1-2l-1-2c-7-18-17-34-30-47-13-13-28-24-46-31l-2-1c0 0-1 0-1 0-1 0-1 0-2 0 0 1-1 2-1 3l1 1c0 1 0 1 0 1 0 1 0 2 1 3 6 9 15 24 22 55 1 3 2 6 7 7z m-78 83c0 1 1 3 2 3l3 0 41 2 13 1c0 0 1 0 1 0l1 0c0 0 0-1 1-1l1 0c1 0 2-1 2-3 0-1 0-3 0-5 0-2 0-4 0-6l0-5c1-7 1-15 0-22l0-4c0-5 0-11-1-17 0-1 0-3 0-5 0-1 0-3 0-4 0-2-1-7-7-8-10 0-20-1-30-2l-2 0c-3-1-8-1-12-1-5-1-7-1-8-1-1 0-1 0-2 0l-2 1c-1 1-1 2-1 3l0 74z m0-92c0 1 1 3 2 3l3 0 51 3c1 0 2 0 2-1 1 0 1-1 1-2l0-1c0 0 0-1 0-1 0 0 0 0-1-1 0 0 0-1 0-1l0-1c0-1-1-3-1-4-1-2-2-5-3-7l-1-3c-3-9-7-18-11-27-4-8-9-14-14-19-5-6-13-9-23-10l-3 0c-1 0-1 0-2 1 0 0 0 1 0 2l0 69z m-52-59c-1-1-1-2-2-2 0 0-1 1-1 1l-2 1c-27 6-64 40-78 79l-1 1c0 1 0 2 1 3 1 1 2 1 3 1l13-4c12-4 24-7 36-11 3-1 6-2 7-7 5-24 12-42 23-57l1-2c1-1 1-3 0-3z m40-10c0-1-1-1-1-2-1 0-2 0-2 0 0 0-1 0-1 0-1 0-14 4-20 11-15 19-23 41-29 61 0 0 0 0 0 1l0 1c0 1 0 1 1 2 0 1 1 1 2 1l1 0 29-2 17-1c2-1 3-2 3-3l0-69z m-21 165l18-2c2 0 3-1 3-2l0-75c0-1-1-2-1-2-1-1-2-1-2-1 0 0 0 0-1 0 0 0-14 2-21 2-8 1-17 2-26 3-4 0-6 4-6 7-2 18-3 35-3 47 0 5-1 22-1 22 0 1 1 2 1 2 1 1 1 1 2 1z m-98 32l1 1c12 31 42 59 76 71l3 1c1 0 2 0 3-1 0-1 0-2 0-3l-2-3c-18-25-25-53-31-79l0-1c0-1 0-2-1-2 0 0-1-1-1-1-1 0-1 0-1 0l-1 1c-5 1-11 3-17 4-8 2-18 4-27 8l0 1c-2 0-2 2-2 3z m-8-18l1 1c0 1 1 2 3 2l49-13c1 0 2-1 2-3l2-71c0-1 0-2-1-2-1-1-1-1-2-1 0 0 0 0 0 0l-1 0c-1 0-2 1-3 1l0 0c-2 0-4 1-7 1-16 4-29 9-39 17-6 4-9 8-9 15-1 19 1 37 5 53z m178 42c-8 16-14 31-21 46-8 17-17 35-24 52-14 31 3 65 36 71 28 5 56-16 59-44 0-9-1-18-5-26-14-32-29-64-44-97 0 0-1-1-1-2z m27 117c0 15-12 28-27 28-15 0-27-12-28-27 0-16 13-28 28-28 15 0 27 12 27 27z"/>
<glyph glyph-name="box" unicode="&#86;" d="M318 74l126 89 15-22-126-88z m-137 101l0-99 27 0 0 96z m145-125c-1 0-1 0-2 0l-262 26c-7 1-12 7-12 13l0 263c0 4 1 7 4 10 3 2 7 4 10 3l263-26c7 0 12-6 12-13l0-262c0-4-2-8-4-10-3-3-6-4-9-4z m-250 51l236-23 0 236-236 23z m377 326l-263 26c-3 1-7-1-10-3-3-3-4-6-4-10l0-21c3 2 7 3 11 3 0 0 0 0 1 0 3 2 7 4 11 4 2 0 3 0 5-1l234-23 0-236c0-7-3-10-10-14 1-2 1-5 1-7 1-2 0-3 0-5l21-2c1 0 1 0 2 0 3 0 6 1 8 4 3 2 5 6 5 10l0 262c0 7-5 13-12 13z m-397-64l125 88 16-22-126-88z m262-26l126 88 15-22-126-88z m-256-123l2 27 263-26-3-26z m146 37l0 91-27 0 0-88c9-1 18-2 27-3z"/>
<glyph glyph-name="community" unicode="&#48;" d="M50 175c-4 0-8 2-11 6-4 6-2 14 4 18l24 16 69 48 89-64c6-4 7-13 3-19-5-6-13-7-19-3l-74 53-53-37-24-16c-3-1-5-2-8-2z m130-10l-44 32-47-32-22-14 0-63 135 0 0 60z m120 10c-4 0-9 2-11 6-4 6-3 14 3 18l25 16 68 48 89-64c6-4 7-13 3-19-4-6-13-7-19-3l-73 53-54-37-24-16c-2-1-5-2-7-2z m129-10l-46 32-45-32-22-14 0-63 135 0 0 60z m-256 202c-4 0-9 2-11 5-4 7-3 15 4 19l24 16 68 48 89-65c6-4 7-12 3-18-4-6-12-7-18-3l-74 53-53-37-25-16c-2-2-5-2-7-2z m129-11l-46 32-45-31-22-15 0-62 135 0 0 60z"/>
<glyph glyph-name="grab-handle" unicode="&#88;" d="M280 318c0 10 9 19 20 19 10 0 19-9 19-19 0-11-9-20-19-20-11 0-20 9-20 20z m-46-20c-5 0-10 2-14 6-3 4-5 8-5 14 0 5 2 10 5 13 4 4 9 6 14 6 5 0 10-2 13-6 4-3 6-8 6-13 0-5-2-10-6-14-3-4-8-6-13-6z m46-42c0 10 9 19 20 19 10 0 19-9 19-19 0-11-9-20-19-20-11 0-20 9-20 20z m-46-20c-5 0-10 3-14 6-3 4-5 9-5 14 0 5 2 10 5 13 4 4 9 6 14 6 5 0 10-2 13-6 4-3 6-8 6-13 0-5-2-10-6-14-3-3-8-6-13-6z m46-42c0 10 9 19 20 19 10 0 19-9 19-19 0-11-9-19-19-19-11 0-20 8-20 19z m-46-19c-5 0-10 2-14 5-3 4-5 9-5 14 0 5 2 10 5 13 4 4 9 6 14 6 5 0 10-2 13-6 4-3 6-8 6-13 0-5-2-10-6-14-3-3-8-5-13-5z"/>
<glyph glyph-name="search" unicode="&#89;" d="M277 185c-48 0-88 40-88 88 0 49 40 89 88 89 49 0 89-40 89-89 0-48-40-88-89-88z m0 159c-38 0-70-32-70-71 0-38 32-70 70-70 39 0 71 32 71 70 0 39-32 71-71 71z m-112-205c-2 0-4 1-6 2-4 4-4 9 0 13l61 64c3 4 9 4 12 0 4-3 4-9 1-12l-61-64c-2-2-5-3-7-3z"/>
<glyph glyph-name="disclosure-collapse" unicode="&#90;" d="M264 198l-60 59c-4 5-4 12 0 17 5 4 13 4 17 0l43-43 43 44c4 4 12 4 17 0 4-5 4-13 0-17z"/>
<glyph glyph-name="script-upload" unicode="&#82;" d="M260 91l-117 0c-29 0-54 15-71 43-13 20-17 40-17 41l-3 16 157 0c7 0 13-5 13-12 0-7-6-12-13-12l-124 0c2-8 5-12 9-18 12-20 29-31 49-31l117 0c7 0 13-6 13-14 0-7-6-13-13-13z m117 7c-7 0-12 6-12 13 0 7 5 13 12 13 13 0 23 4 30 11 16 19 16 55 14 67l1 1 0 0 0 206-257 0 0-226c0-7-5-13-12-13-8 0-13 6-13 13l0 251 306 0 0-230c1-7 5-57-20-86-13-13-28-20-49-20z m6 253l-179 0c-8 0-14 6-14 14 0 8 6 14 14 14l179 0c8 0 14-6 14-14 0-8-6-14-14-14z m0-58l-179 0c-8 0-14 6-14 14 0 8 6 14 14 14l179 0c8 0 14-6 14-14 0-8-6-14-14-14z m0-58l-16 0c-8 0-14 6-14 14 0 8 6 14 14 14l16 0c8 0 14-6 14-14 0-8-6-14-14-14z m-110 0l-69 0c-8 0-14 6-14 14 0 8 6 14 14 14l69 0c8 0 14-6 14-14 0-8-6-14-14-14z m127-71l-80 83-81-83 49 0 0-136 62 22 0 114z"/>
<glyph glyph-name="code" unicode="&#87;" d="M92 242l74 73c6 6 15 6 21 0 6-5 6-15 0-21l-53-52 54-54c6-6 6-16 0-21-5-6-15-6-21 0z m347 0l-74 73c-5 6-15 6-21 0-5-5-5-15 0-21l53-52-54-54c-6-6-6-16 0-21 6-6 15-6 21 0z m-223-137c-1 0-2 0-4 1-5 2-8 8-6 14l98 254c3 6 9 8 15 6 5-2 8-8 6-14l-99-254c-1-4-5-7-10-7z"/>
<glyph glyph-name="avatar" unicode="&#60;" d="M256 88c-93 0-169 75-169 168 0 93 76 169 169 169 93 0 169-76 169-169 0-93-76-168-169-168z m0 316c-81 0-148-66-148-148 0-81 67-147 148-147 81 0 148 66 148 147 0 82-67 148-148 148z m97-90l-1 1c-3 3-7 4-10 4-1 0-61-9-86-9-1 0-1 0-2 0-25 0-87 10-87 10-5 0-10-2-13-6l-1-2c-2-3-2-7-1-10 1-4 3-6 6-8 12-5 49-20 60-22 2 0 5 0 6-7 1-8-3-46-7-65-5-17-13-40-13-41-2-6 1-13 7-15l8-3c3-1 6-1 9 1 3 1 5 4 6 7l21 65 20-67c1-3 3-6 6-7 2-1 4-1 5-1 2 0 3 0 5 0l7 3c5 2 8 8 7 14 0 0-6 24-11 44-3 12-4 30-5 45 0 9-1 16-2 22 0 1 0 4 5 5 0 0 1 0 2 0l55 22c4 2 6 5 7 9 1 4 0 8-3 11z m-68 37c0-16-13-29-29-29-16 0-29 13-29 29 0 16 13 29 29 29 16 0 29-13 29-29z"/>
<glyph glyph-name="arrows-h" unicode="&#58;" d="M512 256c0-5-2-9-5-13l-74-73c-3-4-7-5-12-5-5 0-10 1-13 5-4 4-6 8-6 13l0 36-292 0 0-36c0-5-2-9-6-13-3-4-8-5-13-5-5 0-9 1-12 5l-74 73c-3 4-5 8-5 13 0 5 2 9 5 13l74 73c3 4 7 5 12 5 5 0 10-1 13-5 4-4 6-8 6-13l0-36 292 0 0 36c0 5 2 9 6 13 3 4 8 5 13 5 5 0 9-1 12-5l74-73c3-4 5-8 5-13z"/>
<glyph glyph-name="arrows-v" unicode="&#59;" d="M347 421c0-5-1-10-5-13-4-4-8-6-13-6l-36 0 0-292 36 0c5 0 9-2 13-6 4-3 5-8 5-13 0-5-1-9-5-12l-73-74c-4-3-8-5-13-5-5 0-9 2-13 5l-73 74c-4 3-5 7-5 12 0 5 1 10 5 13 4 4 8 6 13 6l36 0 0 292-36 0c-5 0-9 2-13 6-4 3-5 8-5 13 0 5 1 9 5 12l73 74c4 3 8 5 13 5 5 0 9-2 13-5l73-74c4-3 5-7 5-12z"/>
<glyph glyph-name="arrows" unicode="&#96;" d="M512 256c0-5-2-9-5-13l-74-73c-3-4-7-5-12-5-5 0-10 1-13 5-4 4-6 8-6 13l0 36-109 0 0-109 36 0c5 0 9-2 13-6 4-3 5-8 5-13 0-5-1-9-5-12l-73-74c-4-3-8-5-13-5-5 0-9 2-13 5l-73 74c-4 3-5 7-5 12 0 5 1 10 5 13 4 4 8 6 13 6l36 0 0 109-109 0 0-36c0-5-2-9-6-13-3-4-8-5-13-5-5 0-9 1-12 5l-74 73c-3 4-5 8-5 13 0 5 2 9 5 13l74 73c3 4 7 5 12 5 5 0 10-1 13-5 4-4 6-8 6-13l0-36 109 0 0 109-36 0c-5 0-9 2-13 6-4 3-5 8-5 13 0 5 1 9 5 12l73 74c4 3 8 5 13 5 5 0 9-2 13-5l73-74c4-3 5-7 5-12 0-5-1-10-5-13-4-4-8-6-13-6l-36 0 0-109 109 0 0 36c0 5 2 9 6 13 3 4 8 5 13 5 5 0 9-1 12-5l74-73c3-4 5-8 5-13z"/>
<glyph glyph-name="compress" unicode="&#33;" d="M256 238l0-128c0-5-2-10-5-13-4-4-8-6-13-6-5 0-10 2-13 6l-41 41-95-95c-2-2-4-3-7-3-2 0-4 1-6 3l-33 33c-2 2-3 4-3 6 0 3 1 5 3 7l95 95-41 41c-4 3-6 8-6 13 0 5 2 9 6 13 3 3 8 5 13 5l128 0c5 0 9-2 13-5 3-4 5-8 5-13z m216 192c0-3-1-5-3-7l-95-95 41-41c4-3 6-8 6-13 0-5-2-9-6-13-3-3-8-5-13-5l-128 0c-5 0-9 2-13 5-3 4-5 8-5 13l0 128c0 5 2 10 5 13 4 4 8 6 13 6 5 0 10-2 13-6l41-41 95 95c2 2 4 3 7 3 2 0 4-1 6-3l33-33c2-2 3-4 3-6z"/>
<glyph glyph-name="expand" unicode="&#34;" d="M252 210c0-2-1-4-3-6l-94-95 41-41c3-4 5-8 5-13 0-5-2-9-5-13-4-4-8-5-13-5l-128 0c-5 0-9 1-13 5-4 4-5 8-5 13l0 128c0 5 1 9 5 13 4 3 8 5 13 5 5 0 9-2 13-5l41-41 95 94c2 2 4 3 6 3 3 0 5-1 7-3l32-32c2-2 3-4 3-7z m223 247l0-128c0-5-1-9-5-13-4-3-8-5-13-5-5 0-9 2-13 5l-41 41-95-94c-2-2-4-3-6-3-3 0-5 1-7 3l-32 32c-2 2-3 4-3 7 0 2 1 4 3 6l94 95-41 41c-3 4-5 8-5 13 0 5 2 9 5 13 4 4 8 5 13 5l128 0c5 0 9-1 13-5 4-4 5-8 5-13z"/>
<glyph glyph-name="placemark-1" unicode="&#35;" d="M475 213l0 176c-32-17-61-26-87-26-16 0-29 3-41 10-19 9-37 16-53 21-16 6-33 8-51 8-33 0-71-12-115-36l0-171c47 21 88 32 124 32 10 0 20-1 29-2 10-1 19-4 28-7 10-4 17-7 22-9 6-3 13-6 24-12l8-4c8-4 18-6 29-6 23 0 50 9 83 26z m-384 226c0-7-1-13-5-18-3-6-7-10-13-14l0-361c0-3-1-5-2-7-2-2-4-2-7-2l-18 0c-3 0-5 0-7 2-2 2-2 4-2 7l0 361c-6 4-10 8-14 14-3 5-5 11-5 18 0 10 4 19 11 26 7 7 16 10 26 10 10 0 19-3 26-10 7-7 10-16 10-26z m421-18l0-218c0-8-3-13-10-17-2-1-4-2-5-2-41-22-77-33-105-33-17 0-32 3-45 10l-8 4c-13 6-22 10-29 13-6 3-15 6-26 9-10 2-21 4-32 4-20 0-42-5-68-13-25-8-47-18-65-29-3-2-6-3-9-3-3 0-6 1-9 3-7 3-10 9-10 16l0 212c0 6 3 11 9 15 7 4 14 8 23 12 8 5 19 9 32 15 14 6 28 11 44 14 15 4 30 6 44 6 21 0 41-3 60-9 18-6 38-14 60-25 7-3 15-5 25-5 23 0 53 11 89 32 4 2 7 4 8 5 6 3 12 3 18-1 6-4 9-9 9-15z"/>
<glyph glyph-name="circle" unicode="&#36;" d="M366 238c0 35-13 65-38 90-25 25-55 38-90 38-36 0-66-13-91-38-25-25-37-55-37-90 0-36 12-66 37-91 25-25 55-37 91-37 35 0 65 12 90 37 25 25 38 55 38 91z m36 0c0-23-4-44-13-64-8-20-20-38-35-53-15-14-32-26-52-35-21-9-42-13-64-13-23 0-44 4-64 13-20 9-38 21-53 35-14 15-26 33-35 53-9 20-13 41-13 64 0 22 4 43 13 64 9 20 21 37 35 52 15 15 33 27 53 35 20 9 41 13 64 13 22 0 43-4 64-13 20-8 37-20 52-35 15-15 27-32 35-52 9-21 13-42 13-64z"/>
<glyph glyph-name="hand-pointer" unicode="&#57;" d="M183 475c-10 0-19-3-26-10-7-7-11-16-11-26l0-256-43 58c-8 10-18 15-30 15-10 0-19-4-26-11-7-7-10-16-10-26 0-8 2-15 7-22l110-146c7-10 17-14 29-14l205 0c4 0 8 1 11 3 4 3 6 6 7 10l26 105c5 19 7 37 7 56l0 62c0 8-3 14-8 20-5 6-12 9-20 9-7 0-14-3-19-8-5-6-8-12-8-20l-9 0 0 18c0 9-3 17-9 23-6 6-14 10-23 10-9 0-16-4-23-10-6-6-9-14-9-22l0-19-9 0 0 26c0 10-4 19-11 27-7 8-16 11-26 11-10 0-19-3-26-10-7-8-10-16-10-26l0-28-10 0 0 163c0 11-3 20-10 27-7 8-16 11-26 11z m0 37c20 0 38-7 52-22 14-15 21-32 21-53l0-63c4 1 7 1 9 1 19 0 35-7 50-20 9 4 18 6 28 6 21 0 39-8 52-25 6 2 11 2 16 2 18 0 33-6 46-19 12-13 18-28 18-46l0-62c0-22-2-44-8-64l-26-106c-3-12-9-22-19-29-10-8-21-12-34-12l-205 0c-12 0-22 3-33 8-10 5-19 12-26 21l-109 146c-10 13-15 28-15 44 0 20 7 38 21 52 14 14 32 22 52 22 13 0 25-4 37-10l0 156c0 20 7 37 21 52 14 14 32 21 52 21z m36-402l0 109-9 0 0-109z m74 0l0 109-10 0 0-109z m73 0l0 109-9 0 0-109z"/>
<glyph glyph-name="plus-square-o" unicode="&#37;" d="M384 283l0-18c0-3-1-5-3-6-1-2-3-3-6-3l-101 0 0-101c0-2-1-4-2-6-2-2-4-3-7-3l-18 0c-3 0-5 1-7 3-1 2-2 4-2 6l0 101-101 0c-3 0-5 1-6 3-2 1-3 3-3 6l0 18c0 3 1 5 3 7 1 2 3 3 6 3l101 0 0 100c0 3 1 5 2 7 2 1 4 2 7 2l18 0c3 0 5-1 7-2 1-2 2-4 2-7l0-100 101 0c3 0 5-1 6-3 2-2 3-4 3-7z m37-128l0 238c0 13-5 23-14 32-9 9-20 14-32 14l-238 0c-12 0-23-5-32-14-9-9-14-19-14-32l0-238c0-12 5-23 14-32 9-9 20-13 32-13l238 0c12 0 23 4 32 13 9 9 14 20 14 32z m36 238l0-238c0-22-8-42-24-58-16-16-35-24-58-24l-238 0c-23 0-42 8-58 24-16 16-24 36-24 58l0 238c0 23 8 42 24 58 16 16 35 24 58 24l238 0c23 0 42-8 58-24 16-16 24-35 24-58z"/>
<glyph glyph-name="square" unicode="&#39;" d="M375 439l-238 0c-12 0-23-5-32-14-9-9-14-19-14-32l0-238c0-12 5-23 14-32 9-9 20-13 32-13l238 0c12 0 23 4 32 13 9 9 14 20 14 32l0 238c0 13-5 23-14 32-9 9-20 14-32 14z m82-46l0-238c0-22-8-42-24-58-16-16-35-24-58-24l-238 0c-23 0-42 8-58 24-16 16-24 36-24 58l0 238c0 23 8 42 24 58 16 16 35 24 58 24l238 0c23 0 42-8 58-24 16-16 24-35 24-58z"/>
<glyph glyph-name="align-center" unicode="&#56;" d="M416 434l-320 0c-10 0-17-7-17-17l0-16c0-10 7-17 17-17l320 0c10 0 17 7 17 17l0 16c0 10-7 17-17 17z m-26-135l0 16c0 10-8 17-17 17l-234 0c-9 0-17-7-17-17l0-16c0-10 8-17 17-17l234 0c9 0 17 7 17 17z m8-171l-284 0c-10 0-18-7-18-17l0-16c0-10 8-17 18-17l284 0c10 0 18 7 18 17l0 0 0 16 0 0c0 10-8 17-18 17z m-25 85c0 10-8 17-18 17l-198 0c-10 0-18-7-18-17l0-16c0-10 8-17 18-17l198 0c10 0 18 7 18 17 0 0 0 0 0 0z"/>
<glyph glyph-name="align-justify" unicode="&#41;" d="M416 433l-320 0c-10 0-17-8-17-17l0-16c0-10 7-18 17-18l320 0c10 0 17 8 17 18l0 16c0 9-7 17-17 17z m0-101l-320 0c-10 0-17-8-17-17l0-16c0-10 7-18 17-18l320 0c10 0 17 8 17 18l0 16c0 9-7 17-17 17z m0-101l-320 0c-10 0-17-8-17-18l0-16c0-9 7-17 17-17l320 0c10 0 17 8 17 17l0 16c0 10-7 18-17 18z m0-101l-320 0c-10 0-17-8-17-18l0-16c0-9 7-17 17-17l320 0c10 0 17 8 17 17l0 16c0 10-7 18-17 18z"/>
<glyph glyph-name="align-left" unicode="&#42;" d="M416 434l-320 0c-10 0-17-7-17-17l0-16c0-10 7-17 17-17l320 0c10 0 17 7 17 17l0 16c0 10-7 17-17 17z m-320-152l234 0c9 0 17 7 17 17l0 16c0 10-8 18-17 18l-234 0c-10 0-17-8-17-18l0-16c0-10 7-17 17-17z m285-154l-285 0c-10 0-17-7-17-17l0-16c0-10 7-17 17-17l285 0c10 0 17 7 17 17l0 0 0 16 0 0c0 10-7 17-17 17z m-285 52l199 0c9 0 17 7 17 17 0 0 0 0 0 0l0 16c0 10-8 17-17 17l-199 0c-10 0-17-7-17-17l0-16c0-10 7-17 17-17z"/>
<glyph glyph-name="align-right" unicode="&#94;" d="M416 434l-320 0c-10 0-17-7-17-17l0-16c0-10 7-17 17-17l320 0c10 0 17 7 17 17l0 16c0 10-7 17-17 17z m0-102l-234 0c-9 0-17-7-17-17l0-16c0-10 8-17 17-17l234 0c10 0 17 7 17 17l0 16c0 10-7 17-17 17z m0-204l-285 0c-10 0-17-7-17-17l0-16c0-10 7-17 17-17l285 0c9 0 17 7 17 17l0 0 0 16 0 0c0 10-8 17-17 17z m17 85c0 10-7 17-17 17l-199 0c-9 0-17-7-17-17l0-16c0-10 8-17 17-17l199 0c10 0 17 7 17 17 0 0 0 0 0 0z"/>
<glyph glyph-name="bars" unicode="&#55;" d="M475 128l0-37c0-5-1-9-5-12-4-4-8-6-13-6l-402 0c-5 0-9 2-13 6-4 3-5 7-5 12l0 37c0 5 1 9 5 13 4 3 8 5 13 5l402 0c5 0 9-2 13-5 4-4 5-8 5-13z m0 146l0-36c0-5-1-10-5-13-4-4-8-6-13-6l-402 0c-5 0-9 2-13 6-4 3-5 8-5 13l0 36c0 5 1 10 5 13 4 4 8 6 13 6l402 0c5 0 9-2 13-6 4-3 5-8 5-13z m0 147l0-37c0-5-1-9-5-13-4-3-8-5-13-5l-402 0c-5 0-9 2-13 5-4 4-5 8-5 13l0 37c0 5 1 9 5 12 4 4 8 6 13 6l402 0c5 0 9-2 13-6 4-3 5-7 5-12z"/>
<glyph glyph-name="circle-slash" unicode="&#44;" d="M256 416c-88 0-160-72-160-160 0-88 72-160 160-160 88 0 160 72 160 160 0 88-72 160-160 160z m0-64c14 0 27-3 39-8l-127-127c-5 12-8 25-8 39 0 53 43 96 96 96z m0-192c-14 0-27 3-39 9l127 126c5-12 8-25 8-39 0-53-43-96-96-96z"/>
<glyph glyph-name="sync" unicode="&#40;" d="M392 275c6-41-7-84-39-115-47-47-119-52-173-17l38 36-138 19 19-134 42 40c76-55 183-50 251 18 40 39 58 91 56 142z m-233 77c47 46 119 52 173 17l-38-36 138-19-19 134-42-40c-76 55-183 50-251-18-40-39-58-91-56-142l56-11c-6 41 7 84 39 115z"/>
<glyph glyph-name="key" unicode="&#45;" d="M479 282c-1 2-1 4-3 6-2 2-5 3-7 3l-202 0c-13 51-60 89-115 89-65 0-119-54-119-119 0-66 54-119 119-119 59 0 107 43 117 99l45 0 0-65 0 0c0-5 5-9 10-9 0 0 0 0 0 0l0 0 31 0 0 0c5 0 10 4 10 9l0 0 0 65 26 0 0-100 0 0c0-5 4-9 9-9 0 0 0 0 0 0l32 0c0 0 0 0 0 0 5 0 9 4 10 9l0 0 0 100 27 0 0 0c2 0 5 0 7 2 2 2 3 5 3 7l0 0 0 32 0 0z m-327-90c-37 0-68 30-68 68 0 38 31 68 68 68 38 0 68-30 68-68 0-38-30-68-68-68z"/>
<glyph glyph-name="link" unicode="&#46;" d="M202 136c5 5 10 7 17 7 7 0 13-2 19-7 10-11 10-23 0-36 0 0-22-20-22-20-19-19-42-29-68-29-26 0-49 10-68 29-19 19-29 42-29 67 0 27 10 50 29 69 0 0 76 76 76 76 24 23 48 36 73 39 26 3 47-4 66-22 5-5 8-11 8-18 0-7-3-13-8-19-12-11-24-11-36 0-17 17-40 11-68-17 0 0-75-75-75-75-9-9-14-20-14-33 0-13 5-23 14-31 9-9 19-14 32-14 13 0 23 5 32 14 0 0 22 20 22 20m230 294c19-19 29-42 29-68 0-26-10-49-29-68 0 0-81-81-81-81-25-25-51-37-77-37-21 0-40 9-57 26-5 5-7 10-7 17 0 7 2 13 7 19 5 4 11 7 18 7 7 0 13-3 18-7 17-17 38-13 62 12 0 0 81 80 81 80 10 9 15 20 15 32 0 13-5 24-15 32-8 9-17 14-28 16-11 2-22-2-31-11 0 0-26-25-26-25-5-5-11-7-18-7-7 0-13 2-18 7-11 11-11 23 0 36 0 0 26 25 26 25 18 19 40 27 65 26 25-1 47-11 66-31"/>
<glyph glyph-name="location" unicode="&#47;" d="M256 512c-88 0-160-72-160-160 0-89 80-208 160-352 80 144 160 263 160 352 0 88-71 160-160 160z m0-224c-35 0-64 28-64 64 0 35 29 64 64 64 36 0 64-29 64-64 0-36-28-64-64-64z"/>
<glyph glyph-name="carat-r" unicode="&#51;" d="M304 249l-55-43 0 86z"/>
<glyph glyph-name="carat-l" unicode="&#52;" d="M225 250l55 43 0-87z"/>
<glyph glyph-name="folder-lg" unicode="&#62;" d="M203 385l38-51 185 0 0-206-333 0 0 257 110 0m0 30l-110 0c-17 0-30-14-30-30l0-257c0-17 13-30 30-30l333 0c17 0 30 13 30 30l0 206c0 16-13 30-30 30l-170 0-29 39c-6 7-15 12-24 12z"/>
<glyph glyph-name="folder-sm" unicode="&#63;" d="M226 324l20-27 98 0 0-109-176 0 0 136 58 0m0 24l-58 0c-13 0-24-11-24-24l0-136c0-13 11-24 24-24l176 0c13 0 24 11 24 24l0 109c0 13-11 24-24 24l-86 0-12 17c-5 6-12 10-20 10z"/>
<glyph glyph-name="level-up" unicode="&#49;" d="M331 274c-9 9-21 14-37 14l-68 0 32 32c5 4 5 12 0 17-2 2-5 3-8 3-3 0-6-1-9-3l-59-60 60-60c5-4 13-4 17 0 5 5 5 12 0 17l-31 31 66 0c9 0 16-2 19-7 6-6 5-15 5-16l0 0 0-75c0-6 5-12 12-12 6 0 11 6 11 12l0 73c0 5 1 21-10 34z"/>
<glyph glyph-name="info" unicode="&#91;" d="M267 218c-1-7 0-10 7-10l8 0-3-15c-7-3-13-4-18-4-11 0-22 6-19 24l8 56c-3 0-7 1-11 2l2 17 36 0z m15 94c-1-7-8-11-15-11-8 0-14 6-13 14 1 7 8 11 15 11 8 0 14-5 13-14z m65 29c-23 23-53 35-85 35-33 0-63-12-86-35-23-23-35-53-35-85 0-33 12-63 35-85 23-23 53-35 85-35 33 0 63 12 85 35 23 23 35 53 35 85 1 31-11 61-34 85z m18-85c0-28-11-55-31-73-19-20-45-31-73-31-28 0-54 11-73 31-20 19-31 45-31 73 0 27 11 53 31 73 19 20 45 31 73 31 28 0 54-11 73-31 20-20 31-46 31-73z"/>
<glyph glyph-name="question" unicode="&#93;" d="M360 346c1 0 3-1 3-3l0-181c0-2-2-3-3-3l-182 0c-1 0-3 1-3 3l0 181c0 2 2 3 3 3l182 0m0 17l-182 0c-11 0-20-9-20-20l0-181c0-11 9-20 20-20l182 0c11 0 20 9 20 20l0 181c0 11-9 20-20 20z m-133-55c20 7 29 9 47 9 28 0 40-10 40-34l0-5c0-17-6-24-17-28-8-3-16-5-25-8l0-17-20 0-3 30c12 3 22 7 30 9 8 3 11 7 11 13l0 4c0 13-4 16-18 16-10 0-16-1-24-4l-2-12-19 0z m21-110c0 9 5 13 14 13 10 0 15-4 15-13 0-9-5-13-15-13-9 0-14 4-14 13z"/>
<glyph glyph-name="alert" unicode="&#43;" d="M267 369l120-207-240 0 120 207m0 18c-6 0-12-3-16-9l-119-207c-4-6-4-12 0-18 3-6 9-9 15-9l240 0c6 0 12 3 15 9 4 6 4 12 0 18l-119 207c-4 6-10 9-16 9z m-15-195c0 9 5 13 15 13 9 0 14-4 14-13 0-9-5-13-14-13-10 0-15 4-15 13z m28 96l-6-67-15 0-6 67 0 21 27 0z"/>
<glyph glyph-name="home" unicode="&#95;" d="M265 376l133-122-49 0 0-112-169 0 0 112-49 0 134 122m0 20c-5 0-10-2-14-5l-134-122c-6-5-8-14-5-22 3-8 11-13 19-13l29 0 0-92c0-11 9-20 20-20l169 0c11 0 20 9 20 20l0 92 29 0c9 0 16 5 19 13 3 8 1 17-5 22l-134 122c-4 3-9 5-13 5z"/>
<glyph glyph-name="error" unicode="&#61;" d="M258 143c-29 0-58 11-80 33-21 22-33 50-33 80 0 30 12 59 33 80 44 44 116 44 160 0 22-21 34-50 34-80 0-30-12-58-34-80-22-22-51-33-80-33z m0 211c-25 0-50-9-69-29-18-18-29-43-29-69 0-26 11-50 29-69 38-38 100-38 139 0 18 19 28 43 28 69 0 26-10 51-28 69-20 20-45 29-70 29z m13-98l32 33c4 3 4 9 0 12-3 3-9 3-12 0l-33-33-32 33c-4 3-9 3-12 0-4-3-4-9 0-12l32-33-32-32c-4-4-4-9 0-13 3-3 8-3 12 0l32 33 33-33c3-3 9-3 12 0 4 4 4 9 0 13z"/>
<glyph glyph-name="settings" unicode="&#64;" d="M352 276c-3 0-6-1-8-2-1 0-1 0-1 0-3 0-6-1-8-2-2 9-6 17-11 25 3 1 6 2 8 4 0 0 0 0 0 0 3 1 5 3 7 5 8 8 8 20 0 28-7 7-20 7-27-1-2-2-4-4-5-7 0 0 0 0 0 0-2-2-4-5-4-8-8 5-16 9-25 11 1 2 2 5 2 8 0 0 0 1 0 1 1 2 2 5 2 8 0 11-9 19-20 19-10 0-19-8-19-19 0-3 1-6 2-8 0-1 0-1 0-1 0-3 1-6 2-8-9-2-18-6-25-11-1 3-2 6-5 8 0 0 0 0 0 0-1 3-2 5-4 7-8 8-20 8-28 0-7-7-7-20 0-27 2-2 5-4 7-5 1 0 1 0 1 0 2-2 4-4 7-4-5-8-8-16-10-25-3 1-6 2-9 2 0 0 0 0 0 0-2 1-5 2-8 2-11 0-20-9-20-20 0-10 9-19 20-19 3 0 6 0 8 2 0 0 0-1 0-1 4 0 6 1 9 3 2-9 5-18 10-25-2-1-5-2-7-5 0 0 0 0 0 0-3-1-6-2-8-4-7-8-7-20 0-28 4-4 9-5 14-5 5 0 10 1 14 5 2 2 4 5 4 7 1 1 1 1 1 1 2 2 3 4 4 7 8-5 16-8 25-10-1-3-2-6-2-9 0 0 0 0 0 0-1-2-2-5-2-8 0-11 9-20 20-20 10 0 19 9 19 20 0 3-1 6-2 8 0 0 0 0 0 0 0 3-1 6-2 9 9 2 17 5 25 10 1-3 2-5 4-7 1 0 1 0 1-1 1-2 2-5 4-7 4-4 9-5 14-5 5 0 10 1 14 5 7 8 7 20 0 28-2 2-5 3-7 4-1 0-1 0-1 0-2 3-4 4-7 5 5 7 8 16 10 25 3-1 6-2 9-2 0 0 0 0 0 0 2-1 5-2 8-2 11 0 19 9 19 19 0 0 0 0 0 0 0 0 0 1 0 1 0 10-9 19-19 19z m-90-61c-22 0-41 19-41 41 0 23 19 41 41 41 23 0 41-18 41-41 0-22-18-41-41-41z"/>
<glyph glyph-name="trash" unicode="&#123;" d="M201 302l0-165c0-3-1-5-2-6-2-2-4-3-7-3l-18 0c-3 0-5 1-7 3-2 1-2 3-2 6l0 165c0 2 0 5 2 6 2 2 4 3 7 3l18 0c3 0 5-1 7-3 1-1 2-4 2-6z m73 0l0-165c0-3-1-5-2-6-2-2-4-3-7-3l-18 0c-3 0-5 1-7 3-1 1-2 3-2 6l0 165c0 2 1 5 2 6 2 2 4 3 7 3l18 0c3 0 5-1 7-3 1-1 2-4 2-6z m73 0l0-165c0-3 0-5-2-6-2-2-4-3-7-3l-18 0c-3 0-5 1-7 3-1 1-2 3-2 6l0 165c0 2 1 5 2 6 2 2 4 3 7 3l18 0c3 0 5-1 7-3 2-1 2-4 2-6z m37-207l0 271-256 0 0-271c0-4 1-8 2-12 1-3 3-6 4-7 2-2 3-3 3-3l238 0c0 0 1 1 3 3 1 1 3 4 4 7 1 4 2 8 2 12z m-192 307l128 0-14 34c-1 1-3 2-5 3l-90 0c-2-1-4-2-5-3z m265-9l0-18c0-3-1-5-2-7-2-1-4-2-7-2l-27 0 0-271c0-16-5-30-14-41-9-12-20-17-32-17l-238 0c-12 0-23 5-32 16-9 11-14 25-14 41l0 272-27 0c-3 0-5 1-7 2-1 2-2 4-2 7l0 18c0 3 1 5 2 7 2 1 4 2 7 2l88 0 20 48c3 7 8 13 16 18 7 5 15 7 22 7l92 0c7 0 15-2 22-7 8-5 13-11 16-18l20-48 88 0c3 0 5-1 7-2 1-2 2-4 2-7z"/>
<glyph glyph-name="object-group" unicode="&#57344;" d="M549 402l-37 0 0-292 37 0 0-110-110 0 0 37-366 0 0-37-110 0 0 110 37 0 0 292-37 0 0 110 110 0 0-37 366 0 0 37 110 0z m-74 73l0-36 37 0 0 36z m-475 0l0-36 37 0 0 36z m37-438l0 36-37 0 0-36z m402 36l0 37 36 0 0 292-36 0 0 37-366 0 0-37-36 0 0-292 36 0 0-37z m73-36l0 36-37 0 0-36z m-183 292l110 0 0-219-256 0 0 73-110 0 0 219 256 0z m-219-110l183 0 0 147-183 0z m292-73l0 147-73 0 0-110-110 0 0-37z"/>
<glyph glyph-name="cm" unicode="&#125;" d="M202 207c-5 0-10 1-14 4-4 2-8 5-11 10-2 4-4 9-6 15-1 6-2 12-2 20 0 7 1 13 2 19 2 6 4 11 6 16 3 4 7 7 11 10 4 2 9 3 14 3 5 0 9-1 12-2 4-2 6-4 8-6l-8-11c-1 1-3 3-5 4-2 1-4 2-7 2-3 0-5-1-7-3-3-2-4-4-6-7-1-3-2-7-3-11-1-5-1-9-1-14 0-5 0-10 1-14 1-4 2-8 3-11 2-3 3-5 6-7 2-2 5-3 8-3 3 0 5 1 7 2 2 1 4 2 5 4l7-12c-5-5-11-8-20-8z m55 92c4 3 9 5 15 5 4 0 6 0 9-2 2-1 4-2 6-4 1-2 3-4 4-6 1-2 1-4 2-7l0 0c1 2 2 5 4 7 1 2 3 4 5 6 2 2 4 3 7 4 2 1 5 2 8 2 5 0 9-1 12-3 3-2 6-5 7-8 2-4 3-7 4-12 0-4 1-9 1-13l0-58-16 0 0 58c0 3 0 5 0 8-1 3-1 5-2 7-1 2-2 4-4 6-2 1-4 2-7 2-2 0-5-1-7-3-2-1-4-3-5-5-2-3-3-6-4-9-1-4-1-7-1-12l0-52-15 0 0 58c0 3 0 5-1 8 0 3-1 5-1 7-1 3-3 4-4 6-2 1-4 2-7 2-3 0-5-1-7-2-2-2-4-4-6-6-1-3-2-6-3-9-1-3-1-7-1-11l0-53-15 0 0 68c0 4-1 7-1 12 0 4 0 8 0 11l15 0c0-3 0-6 0-9 1-3 1-5 1-7l0 0c1 6 4 10 7 14z"/>
<glyph glyph-name="msvg" unicode="&#126;" d="M228 299c4 3 8 5 15 5 3 0 6 0 8-2 2-1 4-2 6-4 2-2 3-4 4-6 1-2 2-4 2-7l1 0c0 2 2 5 3 7 1 2 3 4 5 6 2 2 4 3 7 4 2 1 5 2 9 2 4 0 8-1 12-3 3-2 5-5 7-8 1-4 2-7 3-12 1-4 1-9 1-13l0-58-16 0 0 58c0 3 0 5 0 8 0 3-1 5-2 7-1 2-2 4-4 6-1 1-4 2-7 2-2 0-5-1-7-3-2-1-4-3-5-5-2-3-3-6-4-9 0-4-1-7-1-12l0-52-15 0 0 58c0 3 0 5 0 8-1 3-1 5-2 7-1 3-2 4-4 6-2 1-4 2-7 2-2 0-5-1-7-2-2-2-4-4-5-6-2-3-3-6-4-9-1-3-1-7-1-11l0-53-15 0 0 68c0 4 0 7 0 12 0 4-1 8-1 11l15 0c0-3 0-6 1-9 0-3 0-5 0-7l0 0c1 6 4 10 8 14z"/>
<glyph glyph-name="deg" unicode="&#92;" d="M199 210l0 14-1 0c-1-4-4-9-7-12-3-3-8-5-14-5-5 0-9 1-12 4-4 2-7 6-9 10-3 4-5 9-6 15-1 6-2 13-2 20 0 7 1 13 2 19 1 6 3 11 5 16 3 4 6 7 10 10 3 2 7 3 12 3 5 0 10-1 13-4 4-3 7-7 8-12l0 0 0 59 16 0 0-137z m0 45c0 5-1 10-1 14-1 5-2 8-4 11-1 3-3 6-5 8-2 2-5 2-8 2-3 0-5 0-8-2-2-2-3-5-5-8-1-3-2-6-3-11-1-4-1-9-1-14 0-4 0-9 1-13 1-4 2-8 3-11 2-3 3-6 5-8 3-1 5-2 8-2 3 0 6 1 8 2 2 2 4 5 5 8 2 3 3 7 4 11 0 4 1 9 1 13z m49-3c0-5 1-9 1-13 1-3 2-7 4-9 1-3 3-5 5-7 3-2 5-2 8-2 5 0 8 1 10 3 3 3 5 6 6 9l12-6c-3-6-6-11-11-15-4-3-10-5-17-5-10 0-19 4-24 13-6 8-9 20-9 35 0 8 0 14 2 20 2 6 4 11 7 16 3 4 6 7 10 10 4 2 9 3 14 3 5 0 10-1 14-3 4-3 7-6 9-10 3-4 5-9 6-14 1-6 1-12 1-18l0-7-48 0z m33 12c0 8-2 14-4 19-3 5-6 7-12 7-3 0-6 0-8-2-2-2-3-4-5-7-1-3-2-6-3-9 0-3-1-6-1-8z m79 37l15 0 0-91c0-6-1-12-2-17-1-5-3-10-6-14-2-4-6-7-10-9-5-2-10-3-16-3-7 0-12 1-18 4-5 2-10 6-13 10l9 11c3-3 6-6 10-8 3-2 8-3 12-3 4 0 7 0 9 2 3 1 5 3 6 6 1 3 2 6 3 9 1 4 1 8 1 12l0 14-1 0c-1-5-3-9-7-12-3-3-7-5-14-5-4 0-8 1-12 4-4 2-7 6-9 10-3 4-4 9-6 15-1 6-2 13-2 20 0 7 1 13 2 19 1 6 3 11 6 15 2 5 5 8 9 10 3 3 8 4 12 4 6 0 10-2 14-5 3-3 6-6 7-11l1 0 0 13z m0-45c0 4 0 9-1 13-1 5-2 8-3 11-2 4-4 6-6 8-2 2-5 3-8 3-3 0-5-1-7-3-2-2-4-4-5-8-2-3-3-6-4-11 0-4-1-9-1-13 0-5 1-10 1-14 1-4 2-8 4-11 1-3 3-6 5-8 2-1 4-2 7-2 3 0 6 1 8 2 2 2 4 5 6 8 1 3 2 7 3 11 1 4 1 9 1 14z"/>
<glyph glyph-name="px" unicode="&#124;" d="M206 301l0-14 1 0c1 5 3 9 7 12 3 3 8 5 14 5 4 0 9-1 12-4 4-2 7-6 9-10 3-4 5-9 6-15 1-6 2-13 2-20 0-7-1-13-2-19-1-6-3-11-6-15-2-5-5-8-9-10-3-3-7-4-12-4-5 0-10 1-14 5-3 3-6 7-7 11l0 0 0-56-16 0 0 134z m0-45c0-5 1-10 1-14 1-4 2-8 4-11 1-3 3-6 5-8 2-1 5-2 8-2 3 0 5 1 7 2 3 2 4 5 6 8 1 3 2 7 3 11 0 4 1 9 1 14 0 4-1 9-1 13-1 5-2 8-3 11-2 3-3 6-6 8-2 2-4 2-7 2-3 0-6 0-8-2-2-2-4-5-5-8-2-3-3-6-4-11 0-4-1-9-1-13z m86 2l-23 43 17 0 15-32 13 32 17 0-22-43 24-48-17 0-16 36-16-36-17 0z"/>
<glyph glyph-name="m-sq" unicode="&#57345;" d="M204 299c4 3 8 5 15 5 3 0 6 0 8-2 2-1 4-2 6-4 2-2 3-4 4-6 1-2 2-4 2-7l1 0c0 2 2 5 3 7 1 2 3 4 5 6 2 2 4 3 7 4 2 1 5 2 9 2 4 0 8-1 12-3 3-2 5-5 7-8 1-4 2-7 3-12 1-4 1-9 1-13l0-58-16 0 0 58c0 3 0 5 0 8 0 3-1 5-2 7-1 2-2 4-4 6-1 1-4 2-7 2-2 0-5-1-7-3-2-1-4-3-5-5-2-3-3-6-4-9 0-4-1-7-1-12l0-52-15 0 0 58c0 3 0 5 0 8-1 3-1 5-2 7-1 3-2 4-4 6-2 1-4 2-7 2-2 0-5-1-7-2-2-2-4-4-5-6-2-3-3-6-4-9-1-3-1-7-1-11l0-53-15 0 0 68c0 4 0 7 0 12 0 4-1 8-1 11l15 0c0-3 0-6 1-9 0-3 0-5 0-7l0 0c1 6 4 10 8 14z m129 44c0-2-1-4-1-5-1-2-1-4-2-6-1-1-2-3-3-5-2-2-3-3-4-5l-14-20 23 0 0-7-32 0 0 8 18 24c2 3 3 6 4 8 2 3 2 5 2 8 0 3-1 5-2 7-1 3-3 4-6 4-2 0-4-1-6-3-2-2-3-4-3-7l-8 1c1 5 3 9 6 12 3 2 7 4 12 4 2 0 4-1 6-2 2-1 4-2 5-3 2-2 3-4 3-6 1-2 2-4 2-7z"/>
<glyph glyph-name="m-cubed" unicode="&#57346;" d="M204 299c4 3 8 5 15 5 3 0 6 0 8-2 2-1 4-2 6-4 2-2 3-4 4-6 1-2 2-4 2-7l1 0c0 2 2 5 3 7 1 2 3 4 5 6 2 2 4 3 7 4 2 1 5 2 9 2 4 0 8-1 12-3 3-2 5-5 7-8 1-4 2-7 3-12 1-4 1-9 1-13l0-58-16 0 0 58c0 3 0 5 0 8 0 3-1 5-2 7-1 2-2 4-4 6-1 1-4 2-7 2-2 0-5-1-7-3-2-1-4-3-5-5-2-3-3-6-4-9 0-4-1-7-1-12l0-52-15 0 0 58c0 3 0 5 0 8-1 3-1 5-2 7-1 3-2 4-4 6-2 1-4 2-7 2-2 0-5-1-7-2-2-2-4-4-5-6-2-3-3-6-4-9-1-3-1-7-1-11l0-53-15 0 0 68c0 4 0 7 0 12 0 4-1 8-1 11l15 0c0-3 0-6 1-9 0-3 0-5 0-7l0 0c1 6 4 10 8 14z m130 14c0-3-1-5-2-7 0-3-2-5-3-7-2-1-3-3-6-4-2-1-4-1-7-1-5 0-8 1-11 3-4 2-6 6-7 10l7 2c1-2 2-4 4-6 2-1 4-2 7-2 1 0 3 0 4 1 1 1 2 2 3 3 1 1 2 2 2 4 1 1 1 3 1 4 0 4-1 7-3 9-3 2-5 3-9 3l-2 0 0 7 2 0c3 0 6 1 8 3 1 2 2 5 2 8 0 2 0 3 0 4 0 1-1 2-2 3 0 1-1 2-2 3-1 1-3 1-4 1-2 0-4-1-5-2-2-1-3-2-4-4l-7 2c1 2 2 3 3 5 1 1 3 2 4 3 1 1 3 2 4 2 2 1 4 1 5 1 3 0 5-1 7-1 2-1 3-2 5-4 1-1 2-3 3-5 1-2 1-4 1-7 0-2 0-3 0-5-1-2-1-3-2-4-1-2-2-3-3-4-1-1-3-1-4-2l0 0c3-1 6-3 8-6 2-2 3-6 3-10z"/>
<glyph glyph-name="acceleration" unicode="&#57347;" d="M207 350c3 2 8 3 14 3 3 0 5 0 8-1 2 0 4-1 5-2 2-1 3-2 4-4 1-1 2-3 2-4l0 0c1 1 2 3 3 4 2 1 3 3 5 4 2 1 4 2 7 2 2 1 5 1 8 1 5 0 8 0 11-1 3-2 5-3 7-5 1-2 2-5 3-7 1-3 1-6 1-8l0-35-15 0 0 35c0 1 0 3 0 4 0 2-1 4-2 5-1 1-2 2-3 3-2 1-4 1-7 1-2 0-4 0-6-1-2-1-4-2-6-4-1-1-2-3-3-5-1-2-1-4-1-7l0-31-14 0 0 35c0 1-1 3-1 4 0 2-1 3-1 5-1 1-2 2-4 3-2 1-4 1-7 1-2 0-4 0-6-1-2-1-4-2-5-4-2-1-3-3-3-5-1-2-2-4-2-7l0-32-14 0 0 41c0 3 0 5 0 8 0 2 0 4-1 6l14 0c0-1 1-3 1-5 0-2 0-3 0-4l0 0c2 3 4 6 8 8z m112-92c0-2 0-4-1-5 0-1-1-3-2-4 0-2-1-3-2-4-1-2-2-3-3-5l-11-15 18 0 0-6-25 0 0 6 14 20c2 2 3 4 4 6 1 2 1 4 1 6 0 3 0 5-1 6-1 2-3 3-5 3-2 0-4-1-5-2-1-2-2-3-2-6l-7 1c1 4 3 7 5 9 2 2 5 3 9 3 2 0 4 0 6-1 1 0 3-1 4-3 1-1 2-2 2-4 1-2 1-3 1-5z m-112-18c-1 1-2 2-3 3-1 1-3 1-5 1-1 0-3 0-4-2-1-1-2-3-2-5 0-2 1-3 2-4 1-1 3-2 6-3 1-1 2-1 3-2 2-1 3-2 4-3 1-1 2-2 2-4 1-1 1-3 1-5 0-2 0-4-1-6-1-2-2-3-3-5-1-1-3-2-4-2-2-1-4-1-6-1-3 0-5 0-7 1-3 1-4 3-6 5l5 5c1-2 2-3 3-4 2 0 3-1 5-1 2 0 4 1 5 2 1 2 2 3 2 6 0 1 0 2-1 3 0 1-1 2-2 2 0 1-1 1-2 2-1 0-2 1-3 1-2 1-3 1-4 2-1 0-2 1-3 2-1 1-1 2-2 4 0 1-1 3-1 5 0 2 1 4 1 5 1 2 2 3 3 5 1 1 3 2 4 2 2 1 4 1 6 1 2 0 5 0 7-1 2-1 3-2 5-4z m18-16c0-2 0-4 0-6 1-2 1-4 2-5 1-1 2-3 3-3 1-1 3-2 4-2 2 0 4 1 5 2 1 2 2 3 3 5l6-3c-2-3-3-6-6-8-2-1-5-2-8-2-5 0-10 2-13 6-3 4-4 10-4 18 0 4 0 7 1 10 1 3 2 6 4 8 1 2 3 3 5 5 2 1 4 1 7 1 2 0 5 0 7-1 2-2 3-3 5-5 1-2 2-5 2-7 1-3 1-6 1-9l0-4-24 0z m16 6c0 4 0 7-2 10-1 2-3 4-6 4-1 0-3-1-4-2-1-1-2-2-2-3-1-2-1-3-2-5 0-1 0-2 0-4l16 0z m31-28c-3 0-5 0-7 1-2 2-4 3-5 5-2 3-3 5-3 8-1 3-1 6-1 10 0 4 0 7 1 10 0 3 1 5 3 8 1 2 3 3 5 5 2 1 5 1 7 1 3 0 5 0 6-1 2-1 3-1 4-2l-4-6c0 1-1 1-2 2-1 0-2 1-4 1-1 0-2-1-3-2-1-1-2-2-3-3-1-2-1-4-2-6 0-2 0-4 0-7 0-2 0-5 0-7 1-2 1-4 2-5 1-2 2-3 3-4 1-1 2-1 4-1 1 0 3 0 4 1 1 0 1 1 2 2l4-6c-3-3-6-4-11-4z m17 74l-107 0c-2 0-4 2-4 4 0 2 2 4 4 4l107 0c2 0 4-2 4-4 0-2-2-4-4-4z"/>
<glyph glyph-name="particles" unicode="&#57348;" d="M332 229c0 12 10 23 23 23 13 0 23-11 23-23 0-13-10-24-23-24-13 0-23 11-23 24z m-54-68c0 13 10 23 23 23 13 0 23-10 23-23 0-13-10-23-23-23-13 0-23 10-23 23z m-62-18c0 13 11 23 24 23 12 0 23-10 23-23 0-13-11-23-23-23-13 0-24 10-24 23z m-46 60c0 13 10 23 23 23 13 0 23-10 23-23 0-13-10-23-23-23-13 0-23 10-23 23z m81-138c-5 3-8 9-9 15-1 6 1 12 4 17 4 5 9 8 15 9 6 1 13 0 18-4 5-4 8-9 9-15 1-6-1-13-4-18-4-4-9-8-16-9-6-1-12 1-17 5z m-183 201c0 13 10 23 23 23 13 0 23-10 23-23 0-13-10-23-23-23-13 0-23 10-23 23z m111 46c0 13 10 24 23 24 13 0 23-11 23-24 0-12-10-23-23-23-13 0-23 11-23 23z m71-94c0 13 11 23 24 23 12 0 23-10 23-23 0-13-11-23-23-23-13 0-24 10-24 23z m163 52c0 13 10 23 23 23 13 0 23-10 23-23 0-13-10-23-23-23-12 0-23 10-23 23z m-111 38c0 13 11 23 23 23 13 0 24-10 24-23 0-13-11-23-24-23-12 0-23 10-23 23z m-170 90c0 13 11 24 24 24 12 0 23-11 23-24 0-12-11-23-23-23-13 0-24 11-24 23z m235-23c0 13 10 23 23 23 13 0 23-10 23-23 0-13-10-23-23-23-13 0-23 10-23 23z"/>
<glyph glyph-name="voxels" unicode="&#57349;" d="M434 379l-85 49c-4 2-10 2-14 0l-77-45-79 46c-4 2-10 2-14 0l-85-49c-4-3-7-7-7-12l0-98c0-5 3-10 7-13l78-45 0-89c0-5 3-10 7-12l85-49c2-2 5-2 7-2 2 0 5 0 7 2l85 49c4 2 7 7 7 12l0 88 78 45c5 3 7 7 7 12l0 99c0 5-2 9-7 12z m-21-88l-59 34 0 68 59-35z m-69-55l-73 42 0 80 59 35 0-68-29-17c-6-3-8-11-4-16 2-4 6-6 10-6 2 0 4 0 6 1l29 17 60-34z m-75-57l0 66 59-34 0-66z m-26 113l-59 34 0 68 59-34z m-142 68l59 34 0-68-31-18c-6-3-8-11-5-17 2-3 7-6 11-6 2 0 4 1 6 2l31 18 59-34-60-34-70 41z m156-270l-71 41 0 81 59 34 0-67-28-16c-6-3-8-11-5-17 3-3 7-6 11-6 2 0 4 1 6 2l28 16 59-34z"/>
<glyph glyph-name="lock" unicode="&#57350;" d="M389 233l0 62c0 68-55 124-123 124-69 0-124-56-124-124l0-62c-24-4-44-26-44-52l0-74c0-29 24-52 52-52l230 0c29 0 53 23 53 52l0 74c0 26-18 48-44 52z m-123 129c37 0 67-30 67-67l0-61-135 0 0 61c0 37 31 67 68 67z"/>
<glyph glyph-name="visible" unicode="&#57351;" d="M258 116c-55 0-106 17-147 51-31 25-47 51-47 52-4 7-4 16 1 23 2 4 66 98 195 96 133-3 192-93 195-97 4-6 4-15 0-22 0-1-15-27-46-53-29-23-79-50-151-50 0 0 0 0 0 0z m-148 113c7-7 17-18 30-29 34-27 73-40 118-40 0 0 0 0 0 0 47 0 88 13 122 40 13 10 23 21 29 29-7 7-16 16-30 26-34 25-74 38-119 38-81 2-130-42-150-64z m-27 1z m227-4c0-25-21-46-47-46-26 0-47 21-47 46 0 26 21 47 47 47 26 0 47-21 47-47z"/>
<glyph glyph-name="model" unicode="&#57352;" d="M494 395c-2 5-8 8-13 7l-90-16 45 72c3 5 2 11-1 15-4 4-10 5-15 3l-213-98c-15 5-72 27-111 43 0 0-1 0-1 0 0 0 0 0 0 0 0 0-1 0-1 1 0 0-1 0-1 0 0 0-1 0-1 0 0 0 0 0 0 0-1 0-1 0-2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-1 0-1 0 0 0 0 0 0-1-1 0-1 0-2 0 0 0 0 0 0 0 0 0-1 0-1 0 0 0 0-1 0-1-1 0-2 0-3-1 0 0 0 0 0 0 0-1-1-1-1-1 0 0 0 0 0 0 0 0 0-1 0-1-1 0-1 0-1 0 0 0 0 0 0-1 0 0 0 0-1-1l-27-52-33-40c-3-4-3-10 0-15 2-3 6-5 10-5 1 0 2 0 4 1l50 17 40 2-26-51c-3-4-2-9 1-13 1-1 26-30 52-58 15-17 28-30 38-40 6-6 11-11 15-14l-16-61-46-18c-6-3-9-10-6-16 2-5 6-8 11-8 1 0 3 1 4 1l45 18 17-15c2-3 5-4 8-4 4 0 7 2 9 5 5 5 4 12-1 17l-17 15 16 61 76-90c2-2 6-4 9-4 1 0 2 0 3 0l85 23c5 2 8 6 9 11 0 5-2 9-7 12l-136 72 45 91 178 123c5 3 6 9 4 15z m-200-117l-122 55 41 21 181 83z m-148 73l-24 33c16-6 39-15 54-21z m-59-6l-9 13 15 29 27-38 2-2z m36-77l23 44c18-45 35-91 47-121-19 20-45 49-70 77z m194-194l-57 68 105-55z m-94 101c-5 14-42 104-30 77 0-2-21 49-28 66l121-59-48-95z m108 120l43 63 70 16z"/>
<glyph glyph-name="avatar-2" unicode="&#57353;" d="M256 88c-93 0-169 75-169 168 0 93 76 169 169 169 93 0 169-76 169-169 0-93-76-168-169-168z m0 316c-81 0-148-66-148-148 0-81 67-147 148-147 81 0 148 66 148 147 0 82-67 148-148 148z m97-90l-1 1c-3 3-7 4-10 4-1 0-61-9-86-9-1 0-1 0-2 0-25 0-87 10-87 10-5 0-10-2-13-6l-1-2c-2-3-2-7-1-10 1-4 3-6 6-8 12-5 49-20 60-22 2 0 5 0 6-7 1-8-3-46-7-65-5-17-13-40-13-41-2-6 1-13 7-15l8-3c3-1 6-1 9 1 3 1 5 4 6 7l21 65 20-67c1-3 3-6 6-7 2-1 4-1 5-1 2 0 3 0 5 0l7 3c5 2 8 8 7 14 0 0-6 24-11 44-3 12-4 30-5 45 0 9-1 16-2 22 0 1 0 4 5 5 0 0 1 0 2 0l55 22c4 2 6 5 7 9 1 4 0 8-3 11z m-68 37c0-16-13-29-29-29-16 0-29 13-29 29 0 16 13 29 29 29 16 0 29-13 29-29z"/>
<glyph glyph-name="arrow-dn" unicode="&#53;" d="M258 219l-43 55 86 0z"/>
<glyph glyph-name="arrow-up" unicode="&#54;" d="M258 283l43-55-86 0z"/>
<glyph glyph-name="time" unicode="&#57354;" d="M256 390c-73 0-132-59-132-132 0-73 59-132 132-132 73 0 132 59 132 132 0 73-59 132-132 132z m60-162l1 0-64 0c-2 0-4 0-6 1-8 2-15 10-15 19l0 0 2 92c0 11 9 20 19 20 11 0 20-9 20-20l-1-72 44 0c11 0 20-9 20-20 0-10-9-20-20-20z"/>
<glyph glyph-name="transparency" unicode="&#57355;" d="M349 349c1 0 3-1 3-3l0-181c0-2-2-3-3-3l-182 0c-1 0-3 1-3 3l0 181c0 2 2 3 3 3l182 0m0 17l-182 0c-11 0-20-9-20-20l0-181c0-11 9-20 20-20l182 0c11 0 20 9 20 20l0 181c0 11-9 20-20 20z m-187-108l96 0 0-96-96 0z m94 94l96 0 0-95-96 0z"/>
<glyph glyph-name="unmuted" unicode="&#71;" d="M298 255c-1-8-2-17-3-25-2-7-4-15-6-22-2-6-1-11 3-14 7-6 16-3 19 6 8 23 12 47 9 71-1 14-4 27-9 40-3 7-12 10-18 5-5-3-7-8-4-14 5-15 8-31 9-47m-35 81c0 12-5 20-16 24-7 3-19 2-27-7-11-12-22-24-34-37-1-1-3-1-5-2-4 0-7 0-11 0-3 0-5 0-8 0-15 0-26-10-26-23 0-28 0-42 0-71 0-11 10-22 21-23 4 0 9 0 14 0 3-1 7-1 10-1 2 0 4-1 5-2 10-11 22-23 33-36 6-6 12-9 20-9 3 0 5 1 8 2 11 3 16 12 16 24 0 22 0 39 0 59l0 43c0 19 0 59 0 59m-26-3l0-155-1 1c-3 3-5 5-7 7l-8 9c-8 9-16 17-23 25-2 2-4 2-6 2-4 1-9 1-13 1-2 0-4 0-7 0l-9 0 0 65 2 0c3 0 5 0 8 0 6 0 12 0 18 0 0 0 0 0 0 0 3 0 5 1 8 4 10 10 20 21 30 32z m140-78c0 3-1 6-1 10-1 7-1 14-2 22-3 15-7 31-14 47-2 4-5 7-9 8-4 1-8 0-11-3-5-4-6-10-4-16 9-22 13-42 14-64 1-24-4-49-14-72-1-4-2-8 0-11 1-3 4-6 7-7 2-1 4-1 5-1 6 0 10 3 13 9 10 25 15 51 16 78z"/>
<glyph glyph-name="user" unicode="&#57356;" d="M257 406c-83 0-151-68-151-151 0-83 68-150 151-150 83 0 150 67 150 150 0 83-67 151-150 151z m0-282c-73 0-132 59-132 131 0 73 59 132 132 132 73 0 132-59 132-132 0-72-59-131-132-131z m45 179c0-24-19-43-42-43-24 0-43 19-43 43 0 23 19 42 43 42 23 0 42-19 42-42z m-10-71l-62 0c-25 0-53-12-53-37l0-18c26-23 50-32 77-32 32 0 69 14 85 33l0 17c0 25-22 37-47 37z"/>
<glyph glyph-name="edit-pencil" unicode="&#57357;" d="M341 403c9 9 18 19 28 28 4 4 9 3 12-1 17-16 33-32 50-49 3-4 4-8 0-12-10-10-20-19-29-29-20 21-41 42-61 63z m-25-23c-1-2-2-4-3-5-9-9-17-17-26-26-49-49-153-152-175-175-5-5-9-11-10-19-3-22-6-43-10-66 3 1 4 1 6 1 20 4 41 8 62 13 4 1 8 3 11 6 21 21 109 108 163 162 13 14 27 28 41 42 2 1 3 3 4 3-21 21-41 42-63 64z m-158-231c-6 6-12 12-17 17 21 21 137 137 177 177 5-5 11-11 16-17-7-7-14-14-21-22-50-50-138-137-155-155z"/>
<glyph glyph-name="muted" unicode="&#72;" d="M377 274l-57-57c-5-5-13-5-18 0-5 5-5 13 0 18l57 57c5 5 13 5 18 0 5-5 5-13 0-18m-18-57l-57 57c-5 5-5 13 0 18 5 5 13 5 18 0l57-57c5-5 5-13 0-18-5-5-13-5-18 0m-95 120c0 12-6 21-17 25-8 3-20 3-29-7-11-12-23-25-35-37-1-2-3-2-4-3-4 0-8 0-12 0-3 0-6 0-8 0-15 0-27-11-27-24 0-29 0-42 0-73 0-11 10-22 21-23 5-1 10-1 15-1 4 0 7 0 11 0 1 0 3-1 4-2 11-12 23-24 35-37 5-7 12-10 20-10 3 0 6 1 9 2 11 4 17 13 17 25 0 22 0 40 0 60l0 45c0 20 0 60 0 60m-28-3l0-159-1 1c-3 3-5 5-7 8l-9 9c-8 9-16 17-24 26-1 1-3 2-5 2-5 0-9 0-14 0-2 0-5 0-7 0l-10 0 0 67 3 0c3 0 5 0 8 0 6 0 12 0 19 0 0 0 0 0 0 0 3 0 5 1 8 4 10 11 20 22 31 34z"/>
<glyph glyph-name="vol-0" unicode="&#57358;" d="M109 352c-2-2-5-4-8-4-7 0-13 0-18 0-2 0-4 0-7 0-2 0-4 0-6 0-23 0-41-16-41-37 0-44 0-65 0-113 1-17 15-33 32-35 8-1 16-1 23-1l1 0c5 0 11 0 16 0 3 0 6-2 8-4 15-15 35-37 54-58 8-9 18-14 30-14 4 0 8 1 12 2 16 6 23 19 23 39l0 162c0 31 2 94 2 95 0 19-9 31-25 37-11 5-29 4-42-10-20-23-37-42-54-59z m66 14l15 18 0-259-4 7c-2 2-4 4-6 6-1 2-3 4-5 6l-13 14c-3 3-6 6-9 10-9 10-18 20-27 30-2 2-6 3-8 3-6 0-13 0-21 0l-29 0 0 106 7 0c3 0 5 0 8 0 1 0 2 0 4 0 5 0 11 0 16 0 4 0 9 0 13 0l1 0c4 0 7 2 11 6 7 8 14 16 21 23 8 10 17 20 26 30z"/>
<glyph glyph-name="vol-1" unicode="&#57359;" d="M109 352c-2-2-5-4-8-4-7 0-13 0-18 0-2 0-4 0-7 0-2 0-4 0-6 0-23 0-41-16-41-37 0-44 0-65 0-113 1-17 15-33 32-35 8-1 16-1 23-1l1 0c5 0 11 0 16 0 3 0 6-2 8-4 15-15 35-37 54-58 8-9 18-14 30-14 4 0 8 1 12 2 16 6 23 19 23 39l0 162c0 31 2 94 2 95 0 19-9 31-25 37-11 5-29 4-42-10-20-23-37-42-54-59z m66 14l15 18 0-259-4 7c-2 2-4 4-6 6-1 2-3 4-5 6l-13 14c-3 3-6 6-9 10-9 10-18 20-27 30-2 2-6 3-8 3-6 0-13 0-21 0l-29 0 0 106 7 0c3 0 5 0 8 0 1 0 2 0 4 0 5 0 11 0 16 0 4 0 9 0 13 0l1 0c4 0 7 2 11 6 7 8 14 16 21 23 8 10 17 20 26 30z m89-110c0 32-15 58-34 58-19 0-34-26-34-58 0-32 15-58 34-58 19 0 34 26 34 58z"/>
<glyph glyph-name="vol-2" unicode="&#57360;" d="M304 254c-2-13-3-26-5-39-2-12-6-24-10-36-3-10-1-17 5-22 12-9 26-5 31 9 14 37 19 75 15 115-3 21-8 43-16 63-4 12-18 16-28 9-8-5-10-13-7-24 9-24 14-49 15-75m-195 98c-2-2-5-4-8-4-7 0-13 0-18 0-2 0-4 0-7 0-2 0-4 0-6 0-23 0-41-16-41-37 0-44 0-65 0-113 1-17 15-33 32-35 8-1 16-1 23-1l1 0c5 0 11 0 16 0 3 0 6-2 8-4 15-15 35-37 54-58 8-9 18-14 30-14 4 0 8 1 12 2 16 6 23 19 23 39l0 162c0 31 2 94 2 95 0 19-9 31-25 37-11 5-29 4-42-10-20-23-37-42-54-59z m66 14l15 18 0-259-4 7c-2 2-4 4-6 6-1 2-3 4-5 6l-13 14c-3 3-6 6-9 10-9 10-18 20-27 30-2 2-6 3-8 3-6 0-13 0-21 0l-29 0 0 106 7 0c3 0 5 0 8 0 1 0 2 0 4 0 5 0 11 0 16 0 4 0 9 0 13 0l1 0c4 0 7 2 11 6 7 8 14 16 21 23 8 10 17 20 26 30z m89-110c0 32-15 58-34 58-19 0-34-26-34-58 0-32 15-58 34-58 19 0 34 26 34 58z"/>
<glyph glyph-name="vol-3" unicode="&#57361;" d="M304 254c-2-13-3-26-5-39-2-12-6-24-10-36-3-10-1-17 5-22 12-9 26-5 31 9 14 37 19 75 15 115-3 21-8 43-16 63-4 12-18 16-28 9-8-5-10-13-7-24 9-24 14-49 15-75m-195 98c-2-2-5-4-8-4-7 0-13 0-18 0-2 0-4 0-7 0-2 0-4 0-6 0-23 0-41-16-41-37 0-44 0-65 0-113 1-17 15-33 32-35 8-1 16-1 23-1l1 0c5 0 11 0 16 0 3 0 6-2 8-4 15-15 35-37 54-58 8-9 18-14 30-14 4 0 8 1 12 2 16 6 23 19 23 39l0 162c0 31 2 94 2 95 0 19-9 31-25 37-11 5-29 4-42-10-20-23-37-42-54-59z m66 14l15 18 0-259-4 7c-2 2-4 4-6 6-1 2-3 4-5 6l-13 14c-3 3-6 6-9 10-9 10-18 20-27 30-2 2-6 3-8 3-6 0-13 0-21 0l-29 0 0 106 7 0c3 0 5 0 8 0 1 0 2 0 4 0 5 0 11 0 16 0 4 0 9 0 13 0l1 0c4 0 7 2 11 6 7 8 14 16 21 23 8 10 17 20 26 30z m245-112c-1 6-1 11-2 16-1 11-2 23-3 35-4 25-12 51-22 76-3 6-8 11-14 12-7 2-13 1-19-4-8-6-10-15-5-26 13-34 21-67 21-102 1-39-6-78-22-116-2-6-3-13 0-18 2-5 6-9 12-11 2-1 5-2 8-2 8 0 16 6 20 16 16 39 25 81 26 124z m-156 2c0 32-15 58-34 58-19 0-34-26-34-58 0-32 15-58 34-58 19 0 34 26 34 58z"/>
<glyph glyph-name="vol-4" unicode="&#57362;" d="M304 254c-2-13-3-26-5-39-2-12-6-24-10-36-3-10-1-17 5-22 12-9 26-5 31 9 14 37 19 75 15 115-3 21-8 43-16 63-4 12-18 16-28 9-8-5-10-13-7-24 9-24 14-49 15-75m-195 98c-2-2-5-4-8-4-7 0-13 0-18 0-2 0-4 0-7 0-2 0-4 0-6 0-23 0-41-16-41-37 0-44 0-65 0-113 1-17 15-33 32-35 8-1 16-1 23-1l1 0c5 0 11 0 16 0 3 0 6-2 8-4 15-15 35-37 54-58 8-9 18-14 30-14 4 0 8 1 12 2 16 6 23 19 23 39l0 162c0 31 2 94 2 95 0 19-9 31-25 37-11 5-29 4-42-10-20-23-37-42-54-59z m66 14l15 18 0-259-4 7c-2 2-4 4-6 6-1 2-3 4-5 6l-13 14c-3 3-6 6-9 10-9 10-18 20-27 30-2 2-6 3-8 3-6 0-13 0-21 0l-29 0 0 106 7 0c3 0 5 0 8 0 1 0 2 0 4 0 5 0 11 0 16 0 4 0 9 0 13 0l1 0c4 0 7 2 11 6 7 8 14 16 21 23 8 10 17 20 26 30z m245-112c-1 6-1 11-2 16-1 11-2 23-3 35-4 25-12 51-22 76-3 6-8 11-14 12-7 2-13 1-19-4-8-6-10-15-5-26 13-34 21-67 21-102 1-39-6-78-22-116-2-6-3-13 0-18 2-5 6-9 12-11 2-1 5-2 8-2 8 0 16 6 20 16 16 39 25 81 26 124z m-156 2c0 32-15 58-34 58-19 0-34-26-34-58 0-32 15-58 34-58 19 0 34 26 34 58z m173-186c-4 0-7 1-10 3-10 5-13 18-8 27 45 79 61 208-4 322-6 9-3 22 7 27 10 6 22 2 27-7 74-127 55-273 5-362-4-6-10-10-17-10z"/>
<glyph glyph-name="vol-x-0" unicode="&#57363;" d="M209 196l-57 58 56 57c9 9 9 22 0 31-8 8-22 8-30-1l-57-57-57 58c-8 8-22 8-30-1-9-8-9-22 0-30l57-58-53-58c-9-9-9-22 0-31 8-8 22-8 30 0l54 58 57-57c8-8 22-8 30 0 9 9 8 23 0 31z"/>
<glyph glyph-name="vol-x-1" unicode="&#57364;" d="M248 305l-48-48 48-50c10 10 16 28 16 49 0 21-6 39-16 49z m-39-109l-57 58 56 57c9 9 9 22 0 31-8 8-22 8-30-1l-57-57-57 58c-8 8-22 8-30-1-9-8-9-22 0-30l57-58-53-58c-9-9-9-22 0-31 8-8 22-8 30 0l54 58 57-57c8-8 22-8 30 0 9 9 8 23 0 31z"/>
<glyph glyph-name="vol-x-2" unicode="&#57365;" d="M304 254c-2-13-3-26-5-39-2-12-6-24-10-36-3-10-1-17 5-22 12-9 26-5 31 9 14 37 19 75 15 115-3 21-8 43-16 63-4 12-18 16-28 9-8-5-10-13-7-24 9-24 14-49 15-75m-56 51l-48-48 48-50c10 10 16 28 16 49 0 21-6 39-16 49z m-39-109l-57 58 56 57c9 9 9 22 0 31-8 8-22 8-30-1l-57-57-57 58c-8 8-22 8-30-1-9-8-9-22 0-30l57-58-53-58c-9-9-9-22 0-31 8-8 22-8 30 0l54 58 57-57c8-8 22-8 30 0 9 9 8 23 0 31z"/>
<glyph glyph-name="vol-x-3" unicode="&#57366;" d="M304 254c-2-13-3-26-5-39-2-12-6-24-10-36-3-10-1-17 5-22 12-9 26-5 31 9 14 37 19 75 15 115-3 21-8 43-16 63-4 12-18 16-28 9-8-5-10-13-7-24 9-24 14-49 15-75m116 0c-1 6-1 11-2 16-1 11-2 23-3 35-4 25-12 51-22 76-3 6-8 11-14 12-7 2-13 1-19-4-8-6-10-15-5-26 13-34 21-67 21-102 1-39-6-78-22-116-2-6-3-13 0-18 2-5 6-9 12-11 2-1 5-2 8-2 8 0 16 6 20 16 16 39 25 81 26 124z m-172 51l-48-48 48-50c10 10 16 28 16 49 0 21-6 39-16 49z m-39-109l-57 58 56 57c9 9 9 22 0 31-8 8-22 8-30-1l-57-57-57 58c-8 8-22 8-30-1-9-8-9-22 0-30l57-58-53-58c-9-9-9-22 0-31 8-8 22-8 30 0l54 58 57-57c8-8 22-8 30 0 9 9 8 23 0 31z"/>
<glyph glyph-name="vol-x-4" unicode="&#57367;" d="M304 254c-2-13-3-26-5-39-2-12-6-24-10-36-3-10-1-17 5-22 12-9 26-5 31 9 14 37 19 75 15 115-3 21-8 43-16 63-4 12-18 16-28 9-8-5-10-13-7-24 9-24 14-49 15-75m116 0c-1 6-1 11-2 16-1 11-2 23-3 35-4 25-12 51-22 76-3 6-8 11-14 12-7 2-13 1-19-4-8-6-10-15-5-26 13-34 21-67 21-102 1-39-6-78-22-116-2-6-3-13 0-18 2-5 6-9 12-11 2-1 5-2 8-2 8 0 16 6 20 16 16 39 25 81 26 124z m17-184c-4 0-7 1-10 3-10 5-13 18-8 27 45 79 61 208-4 322-6 9-3 22 7 27 10 6 22 2 27-7 74-127 55-273 5-362-4-6-10-10-17-10z m-189 235l-48-48 48-50c10 10 16 28 16 49 0 21-6 39-16 49z m-39-109l-57 58 56 57c9 9 9 22 0 31-8 8-22 8-30-1l-57-57-57 58c-8 8-22 8-30-1-9-8-9-22 0-30l57-58-53-58c-9-9-9-22 0-31 8-8 22-8 30 0l54 58 57-57c8-8 22-8 30 0 9 9 8 23 0 31z"/>
<glyph glyph-name="share-ext" unicode="&#57368;" d="M135 133c0 71 0 127 0 198 51 0 85 0 136 0 1 0 1-1 1-1-4-3-7-7-11-10-4-4-8-10-13-12-5-2-11 0-17 0-28 0-39 0-67 0-2 0-3 0-5 0 0-56 0-96 0-151 55 0 94 0 149 0 0 2 0 3 0 5 0 32 0 50 0 82 0 3 1 5 3 7 7 7 14 13 20 20 0-51 0-87 0-138-71 0-125 0-196 0z m202 222c-21 0-42 0-64 0 0 8 0 16 0 24 35 0 71 0 106 0 0-36 0-71 0-107-8 0-15 0-23 0 0 22 0 43 0 65-49-49-97-97-145-145-6 7-12 12-17 17 48 48 96 97 144 145 0 0 0 1-1 1z"/>
<glyph glyph-name="ellipsis" unicode="&#57369;" d="M174 232c-14 0-25 10-25 24 0 13 11 24 25 24 13 0 24-11 24-24 0-14-11-24-24-24z m78 0c-14 0-25 10-25 24 0 13 11 24 25 24 13 0 24-11 24-24 0-14-11-24-24-24z m78 0c-14 0-25 10-25 24 0 13 11 24 25 24 13 0 24-11 24-24 0-14-11-24-24-24z"/>
<glyph glyph-name="check" unicode="&#57370;" d="M256 426c95 0 172-77 171-173 0-93-77-169-171-169-95 0-171 77-171 173 0 93 78 169 171 169z m-23-192c-2 3-3 5-4 6-13 13-26 26-39 39-10 11-26 12-36 2-10-10-10-25 1-36 20-21 40-41 60-61 11-10 26-10 36 0 36 35 71 71 106 107 4 3 7 9 8 14 2 10-3 21-13 26-10 4-21 3-29-5-28-29-57-57-85-86-2-1-3-3-5-6z"/>
<glyph glyph-name="sliders" unicode="&#38;" d="M185 371l-35 0c-9 0-17-8-17-16 0-9 8-16 17-16l35 0z m190 0l-99 0 0-32 99 0c9 0 17 7 17 16 0 8-8 16-17 16m-163-195l-62 0c-9 0-17-8-17-17 0-9 8-16 17-16l62 0z m163 0l-71 0 0-33 71 0c9 0 17 7 17 16 0 9-8 17-17 17m-63 95l-162 0c-9 0-17-6-17-15 0-9 8-16 17-16l162 0z m-63 120c2 0 4-1 6-4 2-1 2-4 2-8l0-48c0-4 0-7-2-8-2-3-4-4-6-4l-36 0c-2 0-4 1-6 4-2 2-2 5-2 8l0 48c0 4 0 6 2 8 2 3 4 4 6 4z m126-100c2 0 4-1 6-4 2-2 2-5 2-8l0-48c0-2-1-5-2-8-2-2-4-4-6-4l-34 0c-2 0-4 2-6 4-2 2-3 5-3 8l0 48c0 4 1 7 3 8 2 3 4 4 6 4z m-100-96c2 0 5-1 7-3 2-3 2-6 2-9l0-48c0-2 0-5-2-8-2-3-4-4-7-4l-36 0c-3 0-5 1-6 4-2 2-3 5-3 8l0 48c0 4 1 6 3 9 1 2 4 3 6 3z"/>
<glyph glyph-name="polyline" unicode="&#57371;" d="M150 90c1 0 3 0 5-1 4-1 8 0 12 2 3 1 6 5 7 9 1 3 0 8-2 11-2 3-5 6-9 7-2 1-4 1-5 1-4 1-8 1-12-1-3-2-6-6-7-9-1-4-1-8 2-12 2-3 5-6 9-7z m-55 36c1-2 2-3 3-5 1 0 1-1 2-1 0-1 1-2 2-2 3-3 6-5 10-5 2 0 4 1 6 2 2 0 4 1 5 3 2 3 4 6 4 10 0 4-1 8-4 11-1 1-3 2-4 4 1-1 2-2 3-3-1 0-1 1-1 1-2 3-6 6-9 7-2 1-4 1-6 0-2 0-4 0-6-2-3-2-6-5-7-9-1-4 0-7 2-11z m-15 64c0-3 0-6 0-8 0-4 1-8 4-11 3-3 7-5 11-4 8 0 15 6 15 15 0 2 0 5 0 8 0 4-2 8-5 10-2 3-6 5-10 5-9-1-15-7-15-15z m22 87c-5-10-9-21-12-32-2-8 3-17 10-19 9-1 16 3 19 11 2 8 5 17 9 25 3 7 2 16-6 20-6 4-17 2-20-5z m59 82c-12-12-23-24-33-38-5-6-2-16 5-20 8-5 16-1 20 5 8 11 19 22 29 32 6 5 6 15 0 21-6 6-15 5-21 0z m104-63c-19-8-25-31-20-50 4-21 23-33 43-34 21-2 40 10 52 26 12 18 14 41 8 62-7 20-21 37-40 47-19 9-42 11-63 4-39-12-65-49-69-89-3-38 15-77 45-100 33-27 78-34 119-23 80 23 131 113 109 193-10 37-37 66-72 81-40 16-88 11-128-3-10-3-21-8-31-13-7-3-9-13-5-20 4-7 13-9 20-5 32 15 68 24 104 20 15-1 30-6 42-14 3-1 6-3 9-6 2-1-2 2 0 0 1 0 2-1 2-2 2-1 4-2 5-4 3-2 5-5 7-7 0 0 4-5 2-3 1-1 2-3 3-4 2-3 4-6 6-9 1-2 2-4 2-6 1 0 1-1 1-2-1 3 1-1 1-1 3-8 5-16 6-25 0 2 0-1 0-1 1-1 1-2 1-3 0-2 0-4 0-6 0-5 0-10 0-15-1-7-2-14-4-23-4-16-10-29-20-43-1-2-2-4-4-5 0-1-1-3 0-1-1-1-1-2-2-2-2-3-5-7-8-9-2-3-5-5-8-8-1-1-3-2-4-4 0 0-2-2-1 0-1-1-2-2-3-3-14-10-26-15-41-19-9-2-14-3-23-3-9-1-17 0-23 1-16 3-31 9-43 19-1 1-5 4-7 7-3 2-6 5-8 8 0 1-2 3-1 1 0 0 0 1-1 2-1 1-2 3-3 5-2 3-4 6-6 10 0 1-2 5-1 3-1 1-2 3-2 5-2 4-3 8-3 12-1 1-1 3-1 5-1 2 0-2 0 0 0 1 0 2-1 3 0 4 0 8 0 12 0 2 1 4 1 6 0 3 0 1 0 0 0 1 0 2 0 3 1 4 2 8 3 11 1 2 1 4 2 5 0 0 1 3 0 2 0-2 1 1 1 1 2 4 4 7 6 11 1 1 2 2 3 4-1-2 0 0 0 0 1 1 2 2 2 2 3 3 6 6 9 9 0 0 2 1 0 0 1 1 2 1 3 2 1 1 3 2 5 3 3 2 7 4 10 5 8 3 14 4 22 4 2 0 5 0 7-1-2 1 2 0 3 0 2-1 4-1 5-2 1 0 2-1 3-1-2 1 1 0 1-1 4-1 7-3 10-5-1 1 2-2 3-2 1-2 3-4 4-5 1-1 2-2 2-3 0 1-1 2 1 0 1-2 2-3 3-5 1-2 2-3 3-5 1-3 0-2 0-1 0-1 1-3 1-4 1-2 1-4 2-5 0-1 0-2 0-4 0 2 1 0 1 0 0-3 0-5 0-7 0-1 0-2 0-2 0-1 0-1 0 0 0-1 0-2-1-2 0-2 0-4-1-6 0-1-1-2-1-3-1-2 1 2 0 0-1-2-2-3-3-5 0-1-1-1-1-2-3-4 1 1-1-1-1-1-2-3-3-4-1 0-5-4-3-2-2-1-3-2-5-3 0 0-1-1-2-1-1-1 2 0-1-1-2 0-4-1-6-1 3 1-1 0-2 0-1 0-3 0-4 0 3 0 0 0 0 0-1 1-3 1-4 1 0 0-3 1-1 1 2-1 0 0 0 0-2 1-4 2-5 3 2-2-1 1-2 2 2-2-1 1-1 2-2 2 0 1 0 0 0 1-1 2-1 2 0 1 0 2 0 2-1 2 0-2 0 0 0 1-1 3-1 4 0 1 1 2 1 3 0-3 0-1 0 0 0 1 0 2 1 3 0 0 1 3 0 1-1-2 1 2 2 2-2-2 0 1 1 2-2-2 2 0 3 1 7 3 9 14 5 20-5 8-13 10-21 6z"/>
<glyph glyph-name="source" unicode="&#57372;" d="M397 222c-40 0-73-28-76-67-41 9-57 54-59 60-16 47-46 69-90 69-4 0-7 0-10-1l-3 0c-1 0-1 0-2 0l-2-2c-7-4-27-13-42-13-27 0-49 22-49 49 0 26 22 48 49 48 27 0 49-22 49-48 0-3 0-8 0-8 0-1 0-1 0-2 1-1 2-1 2-1l181-1c1 0 2 1 2 1 1 1 1 2 1 2 0 0 0 6 0 9 0 26 22 48 49 48 27 0 49-22 49-48 0-27-22-49-49-49-11 0-21 4-30 10 0 1-1 1-1 1-1 0-1 0-1 0-1 0-1-1-2-1l-14-19c0-1-1-1-1-2 1-1 1-1 1-2 14-10 31-16 48-16 43 0 78 35 78 77 0 43-35 77-78 77-41 0-74-26-77-65l-131 0c-3 39-36 66-76 66-43 0-78-35-78-77 0-43 35-77 78-77 21 0 45 9 54 15 2 0 3 0 4 0 31 0 51-14 63-49 1-3 26-79 101-79l0 0 12 0c1 0 2 1 2 1 1 1 1 1 1 2 0 0-1 16-1 18 0 26 21 45 48 45 27 0 49-21 49-48 0-26-22-48-49-48-11 0-21 3-30 10 0 0-1 0-1 0 0 0-1 0-1 0 0 0-1 0-2-1l-14-18c0-1-1-2 0-2 0-1 0-2 1-2 13-10 30-16 47-16 43 0 78 35 78 77 0 43-35 77-78 77z"/>
<glyph glyph-name="playback-play" unicode="&#57373;" d="M128 416l256-160-256-160z"/>
<glyph glyph-name="stop-square" unicode="&#57374;" d="M384 128l-256 0 0 256 256 0z"/>
<glyph glyph-name="avatar-t-pose" unicode="&#57375;" d="M274 70c-1 0-1 0-1 0-12-1-14 2-14 12 0 0 0 133 0 135-3 0-6 0-9 0-2-10 1-140 1-140-1-7-2-8-9-8-2 0-5 0-7 0-8 109-16 188-16 188 0 24 0 46 0 66-1-1-33 0-44 1-15 0-62 1-79 1-8 0-14 3-18 10-1 2-2 4-4 6 8 1 15 1 22 1 35 2 99 9 100 13 14 10 23 10 36 10 15 0 31 0 46-1 11-1 24 3 37-10 20-10 81-11 123-11 0 0 1 0 1-1-4-11-12-17-25-16-29-1-77-3-127-1 1-20 1-42 2-66 0 0-6-59-15-189z m-13 372c16-6 14-20 13-32 0-5-1-10-1-14-2-11-10-18-20-18-11 0-19 8-20 18-1 6-1 13-2 20-1 7 3 13 11 15 10 3 10 3 19 11z"/>
<glyph glyph-name="check-1" unicode="&#57376;" d="M233 234c-2 3-3 5-4 6-13 13-26 26-39 39-10 11-26 12-36 2-10-10-10-25 1-36 20-21 40-41 60-61 11-10 26-10 36 0 36 35 71 71 106 107 4 3 7 9 8 14 2 10-3 21-13 26-10 4-21 3-29-5-28-29-57-57-85-86-2-1-3-3-5-6z"/>
<glyph glyph-name="exchange" unicode="&#57377;" d="M315 344c0 8 0 15 0 22 0 7 0 13 1 20 0 2 2 5 3 6 3 1 6 0 8-1 1 0 2-1 2-1 21-21 41-42 62-62 5-5 5-8 0-13-21-21-42-42-62-63-5-4-11-4-13 1-1 1-1 3-1 5 0 11 0 22 0 33 0 2 0 3 0 6-2 0-4 0-5 0-61 0-122 0-183 0-9 0-10 1-10 10 0 10 0 19 0 29 0 6 2 8 8 9 1 0 2 0 4 0 60 0 120 0 180 0 2-1 4-1 6-1z m-116-121c2 0 4 0 6 0 61 0 122 0 182 0 9 0 11-1 11-10 0-10 0-19 0-29 0-6-3-8-9-9-1 0-3 0-4 0-60 0-120 0-180 0-2 0-4 0-6 0 0-2 0-3 0-5 0-11 0-23 0-34 0-4-1-6-4-8-4-1-6 0-9 2-21 22-42 43-64 64-4 4-4 7 1 12 21 21 42 42 63 63 3 3 6 4 9 2 3-1 4-4 4-7 0-12 0-24 0-35 0-2 0-3 0-6z"/>
<glyph glyph-name="hfc" unicode="&#57378;" d="M370 142c-12-23-30-42-51-55-12-8-25-14-39-18-38-12-79-7-115 12-35 19-61 51-72 90-12 38-7 79 12 114 12 23 29 42 50 55 7 5 14 8 22 12l1-229c10-6 22-11 34-14l-1 251c13 2 31 2 50 2l1-254c12 2 24 6 34 11l0 244c37 0 72-1 84-1l7 33c-15 0-52 1-91 1l0 57 166 1 0 34-201-1 1-91c-19 0-37-1-51-2l-1 93-34-1 1-98c-44-15-80-45-102-86-24-44-29-94-15-141 14-47 46-86 89-110 44-23 94-29 141-15 17 6 33 13 48 22 26 17 47 40 62 68 8 14 13 28 17 44-11 2-22 4-33 7-3-12-8-24-14-35z"/>
<glyph glyph-name="home-1" unicode="&#57379;" d="M155 273c-5 0-10 2-14 7-5 7-3 17 5 23l29 19 84 59 109-79c8-5 9-15 4-22-5-8-16-9-23-4l-90 65-65-46-30-19c-3-2-6-3-9-3z m84-78c0 12 10 21 21 21 11 0 21-10 21-21l0-60 75 0 0 89-32 24-64 46-68-46-33-21 0-92 80 0 0 60z"/>
<glyph glyph-name="private-key" unicode="&#57380;" d="M238 263c-30 43-16 96 20 121 34 25 82 21 112-8 30-31 33-79 8-114-25-34-77-48-120-18-21-21-41-41-61-61 2-3 5-6 7-8 6-6 12-12 18-18 3-3 3-5 0-7-3-3-6-6-9-9-3-3-5-3-7 0-5 5-9 9-14 14-5-5-9-10-14-15 4-4 9-9 14-14 2-2 2-4 0-6-4-3-7-7-10-10-3-2-4-2-6 0-14 14-28 28-42 42-4 3-2 5 0 7 33 33 67 66 100 99 1 2 3 3 4 5z m131 51c0 34-26 61-61 61-33 0-60-27-61-60 0-35 27-61 62-62 33 0 60 28 60 61z"/>
<glyph glyph-name="security-pic" unicode="&#57382;" d="M365 406l-212 0c-18 0-33-14-33-32l0-91c9 5 18 11 27 15l0 76c0 3 3 5 6 5l212 0c3 0 5-2 5-5l0-212c0-3-2-6-5-6l-106 0 0-27 106 0c18 0 32 15 32 33l0 212c0 18-14 32-32 32z m-153-209l0 16c0 28-23 51-51 51-28 0-51-23-51-51l0-16c-10-2-18-11-18-22l0-39c0-12 9-22 21-22l95 0c12 0 21 10 21 22l0 39c1 11-7 20-17 22z m-51 44c15 0 27-12 27-28l0-16-55 0 0 16c0 16 13 28 28 28z m183 49l-66 49-83-50c7-4 14-10 19-17l62 37 68-50 0 31z m-114-44l114 0 0-26-114 0z"/>
<glyph glyph-name="wallet" unicode="&#57383;" d="M400 400c-3 10-8 19-15 24-7 5-15 8-24 7l-227 0c-19 0-35-15-35-34l0-58c-19-2-34-18-34-37l0-95c0-19 15-35 34-37l0-53c0-19 16-34 35-34l228 0c20 0 30 16 38 31l0 1c1 2 21 53 21 139 0 83-19 140-21 146z m-309-193l0 95c0 6 5 11 11 11l86 0c6 0 11-5 11-11l0-95c0-6-5-11-11-11l-86 0c-6 0-11 5-11 11z m285-82c-8-16-11-16-14-16l-228 0c-5 0-9 4-9 8l0 53 63 0c21 0 37 17 37 37l0 95c0 20-16 37-37 37l-63 0 0 58c0 4 4 8 9 8l228 0c3 0 10 1 13-13l0 0 0-1c1 0 20-55 20-137 0-77-17-124-19-129z"/>
<glyph glyph-name="send" unicode="&#57384;" d="M391 376c4-4 4-10 2-16-7-21-14-42-22-63-21-63-43-125-65-188-1-4-4-7-6-10-8-6-17-4-22 5-15 28-30 56-44 85-1 1 0 3 0 4 18 21 35 43 53 64 5 6 10 12 15 18 4 6 5 10 1 14-4 4-8 3-14-1-18-15-36-30-54-44-9-8-19-16-28-24-1-1-3-1-4 0-29 14-57 29-85 44-6 3-8 8-8 14 1 7 5 11 11 13 36 13 72 25 107 37 49 17 97 34 145 51 7 2 13 2 18-3z"/>
<glyph glyph-name="password" unicode="&#57385;" d="M104 267l0 41 22 0 0-41 35 20 11-19-35-20 35-20-11-20-35 20 0-40-22 0 0 40-35-20-11 20 35 20-35 20 11 19z m136 0l0 41 23 0 0-41 35 20 11-19-35-20 35-20-11-20-35 20 0-40-23 0 0 40-35-20-11 20 35 20-35 20 11 19z m137 0l0 41 23 0 0-41 34 20 12-19-35-20 35-20-12-20-35 20 0-40-22 0 0 40-35-20-11 20 35 20-35 20 11 19z"/>
<glyph glyph-name="rez" unicode="&#57381;" d="M373 321c-2 5-6 8-11 8l-49 8 55 61c4 4 5 9 3 14-2 5-7 8-12 8 0 0 0 0 0 0l-114-1c-5-1-10-4-12-9l-54-136c-1-4-1-8 1-11 2-4 6-6 9-7l38-5-54-136c-2-6 0-13 6-16 2-1 4-2 7-2 3 0 7 2 10 5l175 206c3 4 3 9 2 13z"/>
<glyph glyph-name="keyboard-collapse" unicode="&#57387;" d="M373 249l-26 0 0 25 26 0z m-35 0l-27 0 0 25 27 0z m-36 0l-27 0 0 25 27 0z m-36 0l-26 0 0 25 26 0z m-35 0l-27 0 0 25 27 0z m-36 0l-27 0 0 25 27 0z m-36 0l-26 0 0 25 26 0z m224-1l18 0c7 0 13 6 13 13 0 7-6 13-13 13l-18 0m-262 0l-17 0c-7 0-13-6-13-13 0-7 6-13 13-13l17 0m252 39l-31 0 0 25 31 0z m-42 0l-31 0 0 25 31 0z m-41 0l-32 0 0 25 32 0z m-42 0l-32 0 0 25 32 0z m-42 0l-32 0 0 25 32 0z m-41 0l-32 0 0 25 32 0z m218-1l18 0c7 0 13 6 13 13 0 8-6 14-13 14l-18 0m-262 0l-17 0c-7 0-13-6-13-14 0-7 6-13 13-13l17 0m288-124l-315 0c-33 0-59 28-59 61l0 76c0 34 26 61 59 61l315 0c33 0 59-27 59-61l0-76c1-33-26-61-59-61z m-315 172c-18 0-33-16-33-34l0-77c0-19 15-34 33-34l315 0c18 0 33 15 33 34l0 77c0 19-15 34-33 34z m248-99l32 0 0-25-32 0z m-41 0l31 0 0-25-31 0z m-42 0l31 0 0-25-31 0z m-43 0l32 0 0-25-32 0z m-42 0l32 0 0-25-32 0z m-41 0l31 0 0-25-31 0z m250-26l18 0c7 0 13 6 13 14 0 7-6 13-13 13l-18 0m-262 0l-17 0c-7 0-13-6-13-13 0-8 6-13 13-13l17 0m81-82l50-50 53 54-107 0"/>
<glyph glyph-name="image" unicode="&#57386;" d="M257 428c52 0 104 0 156 0 24 0 37-13 37-37 1-90 1-179 0-269 0-25-13-38-39-38-103 0-207 0-311 0-26 0-39 13-39 40 0 88 0 176 0 263 0 28 13 41 41 41 51 0 103 0 155 0z m167-263c0 7 0 10 0 14 0 69 0 138 0 206 0 17 0 17-17 17-101 0-202 0-303 0-16 0-17-1-17-17 0-58 0-115 0-173 0-3 0-7 0-12 8 3 14 6 19 9 17 8 30 7 44-6 5-5 10-10 15-15 5-7 11-8 19-4 40 21 81 41 121 61 19 10 31 8 46-7 9-9 18-18 27-27 15-15 29-29 46-46z m-328-54c7 0 11-1 15-1 98 0 197 0 296 0 6 0 14 2 16 6 5 7 0 14-6 20-27 26-54 53-80 80-8 9-15 9-26 4-67-35-135-68-203-102-3-2-6-4-12-7z m-8 26c21 10 40 20 63 31-8 7-14 12-20 17-2 2-7 3-10 3-30-9-36-17-34-48 0 0 0-1 1-3z m134 169c1-25-21-46-46-46-25-1-46 20-47 46 0 25 21 46 47 47 25 0 46-21 46-47z m-46 22c-12 0-22-9-22-21 0-13 9-22 21-23 13 0 23 9 23 22 0 13-10 22-22 22z"/>
<glyph glyph-name="environments" unicode="&#57388;" d="M256 454c-110 0-199-89-199-199 0-110 89-199 199-199 0 0 0 0 0 0l2-1 0 1c109 1 197 90 197 199 0 110-89 199-199 199z m114-204l0 0 0 5c0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 2l0 4 0 0c-1 22-4 43-10 63 21 5 36 11 46 15 15-26 24-56 24-87 0-30-8-59-23-85-8 4-23 11-47 16 6 21 9 42 10 64z m-19 102c-13 30-30 53-46 69 34-10 64-30 86-57-9-4-22-8-40-12z m-6-95c0-23-4-45-11-66-20 4-42 6-65 6l0 120c23 1 45 3 66 6 6-21 10-43 10-66z m-46-170c17 17 37 41 52 75 20-5 34-10 42-13-24-31-57-53-94-62z m-30 256l0 77c17-14 40-37 56-73-17-2-36-4-56-4z m0-248l0 77c20-1 39-3 56-5-16-35-40-59-56-72z m-83 252c17 35 40 59 56 73l0-77c-19 0-38 1-56 4z m-19-90c0 23 4 45 10 65 20-3 42-5 65-5l0-120c-23 0-45-1-65-4-6 20-10 42-10 64z m-47 106c22 28 52 48 86 58-15-16-33-39-46-70-18 4-31 8-40 12z m40-199c15-36 37-61 53-77-38 10-72 32-96 64 9 4 24 9 43 13z m82 8l0-77c-16 13-39 37-56 73 18 2 37 3 56 4z m-100 92l-1 0 0-4c0-1 0-1 0-2 0 0 0 0 0-1 0 0 0 0 0-1 0 0 0-1 0-1l0-5 1 0c0-21 4-42 10-62-23-5-39-10-49-15-14 25-21 53-21 82 0 30 8 60 23 86 10-4 25-10 47-14-6-20-10-41-10-63z"/>
<glyph glyph-name="wand" unicode="&#57389;" d="M438 107l-80 78c-5 5-12 7-18 6l-77 78c-5 5-14 5-19 0-5-5-6-14 0-19l77-79c0-6 2-12 7-17l80-78c5-4 10-6 15-6 6 0 12 2 16 6 8 9 8 22-1 31z m-185 209l-28 0 0 27c0 6-5 11-12 11-6 0-11-5-11-11l0-27-27 0c-6 0-11-5-11-12 0-6 5-11 11-11l27 0 0-28c0-6 5-11 11-11 7 0 12 5 12 11l0 28 28 0c6 0 11 5 11 11 0 7-5 12-11 12z m51-22c-6 0-10 4-10 10 0 5 4 10 10 10 15 0 31 0 45 0 6 0 10-5 10-10 0-6-4-10-10-10-14 0-30 0-45 0 0 0 0 0 0 0z m-184 0c0 0 0 0 0 0-12 0-26 0-40 0 0 0 0 0 0 0-5 0-10 4-10 10 0 5 5 10 10 10 14 0 28 0 41 0 5 0 10-5 10-10-1-6-5-10-11-10z m94-129c-5 0-10 4-10 9 0 14 0 26 0 40 0 5 5 9 10 9 0 0 0 0 0 0 6 0 10-5 10-10 0-13 0-25 0-38 0-6-4-10-10-10 0 0 0 0 0 0z m0 223c-5 0-10 4-10 9 0 14 0 26 0 40 0 5 5 9 10 9 6 0 10-5 10-10 0-13 0-25 0-38 0-6-4-10-10-10 0 0 0 0 0 0z m-68-26c-2 0-4 0-6 2-6 5-11 10-16 15-4 5-8 9-12 13-4 4-5 10-1 14 4 4 10 4 14 1 5-5 9-9 14-14 4-5 9-10 14-14 4-4 4-10 1-14-2-2-5-3-8-3z m-24-159c-3 0-5 1-7 3-4 3-4 10-1 14 5 5 9 10 14 14 5 4 9 8 12 12 4 4 10 5 14 1 4-4 5-10 1-14-4-5-9-10-13-14-5-4-9-8-13-12-2-2-4-4-7-4z m157 157c-3 0-5 1-6 2-5 3-6 10-2 14 4 6 10 11 15 16 5 4 10 8 13 12 3 5 10 6 14 2 4-3 5-9 2-14-5-6-10-10-15-15-5-4-10-8-13-13-2-2-5-4-8-4z"/>
<glyph glyph-name="market" unicode="&#116;" d="M428 332c-2 4-7 7-12 7-5 1-10 1-14 1-5 0-10 1-15 1-27 1-51 2-75 3-23 1-47 2-74 3-10 0-18 1-27 1-9 0-18 1-27 1l-1 0 0 1c-2 8-8 26-12 39-2 5-3 9-4 12-2 8-7 12-16 12l-48 0c-9 0-16-6-16-15 0-8 7-14 16-14l32 0c5 0 7-3 8-7l0 0c6-25 13-51 19-76 7-24 13-50 19-75 2-9 3-16 0-24-1-4-2-9-3-14-1-4-2-9-3-14-2-8-2-14 1-17 3-4 8-6 16-6l190 0c4 1 7 3 9 6 3 3 4 8 3 12-1 8-7 12-17 12l-170 0 1 1c0 1 1 4 1 6 2 7 5 17 4 20l0 1c1 6 5 10 12 10 8 0 16 0 24 0 43 2 87 3 128 5 8 1 12 4 15 10 8 15 29 65 36 86l0 0c3 4 3 8 0 12z m-45-224c0-16-13-30-29-30-16 0-29 13-29 30 0 15 13 30 29 30 16-1 29-15 29-30z m-177 1c0-16-14-29-29-29-16 0-29 14-29 29 0 17 13 30 29 30 16-1 29-14 29-30z"/>
<glyph glyph-name="wear" unicode="&#57390;" d="M451 180c3 1 5 4 6 7 1 3 1 7-1 10-2 3-4 5-8 6-3 1-6 1-10-1-6-4-13-5-19-6-3-1-6-1-7-1-1 0-1 0-1 0l-1 0-26 0 0 66c0 9-3 43-27 73-24 29-58 44-101 44-54 0-84-24-100-44-24-30-26-64-27-73l0-66-17 0c-2 0-4 0-8 1-8 1-17 3-27 7-7 3-14-1-17-7-2-7 1-14 8-17 14-6 27-8 33-9 3 0 6 0 8-1 1 0 1 0 2 0l299 0c1 0 2 0 3 0l0 0c2 1 6 1 10 2 6 1 18 3 28 9z m-295 80c0 15 6 39 20 58 18 22 45 34 80 34 35 0 62-12 80-34 15-19 21-43 22-58l0-6-202 0z m202-65l-202 0 0 33 202 0z"/>
<glyph glyph-name="certificate" unicode="&#57392;" d="M168 320l172 0c7 0 14 6 14 14 0 7-7 13-14 13l-172 0c-8 0-14-6-14-13 0-8 6-14 14-14z m0-55l63 0c7 0 13 6 13 13 0 8-6 13-13 13l-63 0c-8 0-14-5-14-13 0-7 6-13 14-13z m0-57l46 0c8 0 14 6 14 14 0 7-6 14-14 14l-46 0c-8 0-14-7-14-14 0-8 6-14 14-14z m-65 210l0-283 139 0c7 0 12 6 12 13 0 6-5 12-12 12l-114 0 0 233 256 0 0-83c0-7 6-12 13-12 6 0 12 5 12 12l0 108z m304-200c0 43-35 78-78 78-43 0-78-35-78-78 0-27 14-52 37-66l-3-69c0-5 2-9 6-11 5-3 10-2 13 1l27 20 26-21c2-2 5-3 8-3 2 0 4 0 5 1 4 2 7 7 7 12l-4 72c21 14 34 38 34 64z m-68-101c-4 4-10 4-14 1l-15-11 1 36c6-2 12-2 18-2 7 0 14 1 20 2l2-36z"/>
<glyph glyph-name="gift" unicode="&#57393;" d="M342 330c1 1 3 2 4 3 19 17 21 47 4 66-9 10-22 16-35 16-6 0-12-1-17-3-6 19-24 33-45 33-22 0-41-15-46-35-5 2-11 3-17 3-13 0-26-6-35-16-17-20-15-50 5-66 0 0 0 0 0-1l-82 0 0-84 27 0 0-166 298 0 0 166 27 0 0 84z m-45 50l0 1c1 1 2 2 4 3 5 5 10 6 14 6 6 0 12-3 16-8 4-4 6-9 5-15 0-6-3-11-7-15-2-2-3-3-4-3l0 0 0 0c-5-1-27-10-52-18 10 22 22 44 24 49z m-44 40c12 0 21-9 21-21 0-3 0-4 0-5l0 0 0 0c-2-5-11-24-21-48-10 23-19 42-21 47l0 1c0 1-1 3-1 5 0 12 10 21 22 21z m-79-40c4 5 10 8 16 8 4 0 9-1 14-5 2-2 3-3 4-4l0 0 0 0c2-5 11-23 22-47-24 7-44 13-49 15l-1 0c-1 1-2 2-4 3-9 8-10 21-2 30z m67-274l-110 0 0 140 110 0z m0 166l-137 0 0 32 137 0z m136-166l-111 0 0 140 111 0z m27 166l-138 0 0 32 138 0z"/>
<glyph glyph-name="update" unicode="&#57394;" d="M380 170c-7 0-13-6-13-13l0-12c0-5-4-9-9-9l-203 0c-5 0-9 4-9 9l0 114 33-27c6-4 14-4 19 2 4 5 4 13-2 18l-54 47c-3 2-5 3-8 3-4 0-7-1-9-3l-54-47c-6-5-6-13-1-18 4-6 13-6 18-1l32 26 0-114c0-19 16-35 35-35l203 0c19 0 35 16 35 35l0 12c0 7-6 13-13 13z m-248 153c7 0 13 5 13 13l0 12c0 5 4 8 9 8l203 0c5 0 9-4 9-8l0-115-33 27c-5 5-14 4-18-1-5-6-5-14 1-19l54-47c3-2 5-3 9-3 3 0 6 1 8 3l54 47c6 5 6 13 2 19-5 5-13 6-19 1l-32-27 0 115c0 19-16 34-35 34l-203 0c-19 0-35-15-35-34l0-12c0-8 6-13 13-13z"/>
<glyph glyph-name="uninstall" unicode="&#57395;" d="M83 227c-7 0-13-6-13-13l0-78c0-19 16-35 35-35l297 0c19 0 35 16 35 35l0 78c0 7-6 13-13 13-7 0-13-6-13-13l0-78c0-5-4-9-9-9l-297 0c-5 0-9 4-9 9l0 78c0 7-6 13-13 13z m191 47l50 50c5 5 5 14 0 19-5 5-13 5-19 0l-50-50-50 50c-5 5-13 5-19 0-5-5-5-14 0-19l50-50-50-50c-5-5-5-14 0-19 5-5 14-5 19 0l50 50 50-50c5-5 14-5 19 0 5 5 5 14 0 19z"/>
<glyph glyph-name="install" unicode="&#57391;" d="M83 227c-7 0-13-6-13-13l0-78c0-19 16-35 35-35l297 0c19 0 35 16 35 35l0 78c0 7-6 13-13 13-7 0-13-6-13-13l0-78c0-5-4-9-9-9l-297 0c-5 0-9 4-9 9l0 78c0 7-6 13-13 13z m170 171l0-155-33 27c-6 5-14 5-19-1-4-5-4-14 2-18l54-48c3-2 5-3 8-3 3 0 7 1 9 3l54 48c5 4 6 13 1 18-4 5-13 6-18 1l-32-27 0 154c0 8-6 13-13 13-7 0-13-5-13-12z"/>
<glyph glyph-name="ellipsis-vertical" unicode="&#57396;" d="M276 178c0-14-11-24-24-24-14 0-25 10-25 24 0 13 11 24 25 24 13 0 24-11 24-24z m0 78c0-14-11-24-24-24-14 0-25 10-25 24 0 13 11 24 25 24 13 0 24-11 24-24z m0 78c0-14-11-24-24-24-14 0-25 10-25 24 0 13 11 24 25 24 13 0 24-11 24-24z"/>
<glyph glyph-name="backward" unicode="&#69;" d="M292 349c-5 3-12 3-18-1l-94-71c-4-3-7-8-7-13 0-5 2-10 6-14l95-80c3-2 7-4 11-4 2 0 5 1 7 2 6 3 10 9 10 15l0 151c0 6-4 12-10 15"/>
<glyph glyph-name="40-reload" unicode="&#70;" d="M365 261c-9 1-17-5-18-15-4-45-43-80-89-80-49 0-89 40-89 89 0 19 4 45 25 65 16 15 39 23 68 25l-15-16c-6-6-6-17 0-24 4-3 8-4 12-4 4 0 9 1 12 5l43 44c2 2 3 4 4 6 2 6 1 13-4 18l-44 44c-6 6-17 6-23 0-7-7-7-17 0-24l15-15c-38-2-69-14-91-35-23-21-36-53-36-88 0-68 55-123 123-123 64 0 116 47 122 110 1 9-5 18-15 18"/>
<glyph glyph-name="forward" unicode="&#68;" d="M330 278l-95 70c-5 4-12 5-18 2-5-3-9-9-9-16l0-150c0-7 4-13 10-16 2-1 5-2 7-2 4 0 8 2 11 5l95 79c4 4 6 9 6 14-1 5-3 10-7 14"/>
<glyph glyph-name="avatar-1" unicode="&#84;" d="M396 344l-2 2c-4 4-9 5-15 5-1 0-88-13-124-14-1 0-2 0-3 0-37 0-126 15-127 15-7 1-14-2-18-8l-2-4c-3-4-3-9-2-14 2-5 5-9 10-11 16-7 69-22 85-29 3-1 10-4 10-14 1-11-4-67-10-93-7-26-18-60-19-60-3-9 2-19 11-22l11-4c4-2 9-1 13 1 5 2 8 6 9 10l31 94 28-96c2-5 5-9 9-11 3-1 5-2 8-2 2 0 4 0 7 1l10 4c8 3 12 12 10 20 0 1-8 36-16 65-4 17-6 43-7 64-1 13-1 21-3 30 0 1 2 11 10 14 10 4 81 29 80 28 6 2 10 7 11 13 1 6-1 12-5 16z m-98 54c0-24-19-43-43-43-24 0-43 19-43 43 0 23 19 42 43 42 24 0 43-19 43-42z"/>
</font></defs></svg>

After

Width:  |  Height:  |  Size: 83 KiB

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,481 @@
@charset "UTF-8";
@font-face {
font-family: "hifi-glyphs";
src:url("fonts/hifi-glyphs.eot");
src:url("fonts/hifi-glyphs.eot?#iefix") format("embedded-opentype"),
url("fonts/hifi-glyphs.woff") format("woff"),
url("fonts/hifi-glyphs.ttf") format("truetype"),
url("fonts/hifi-glyphs.svg#hifi-glyphs") format("svg");
font-weight: normal;
font-style: normal;
}
[data-icon]:before {
font-family: "hifi-glyphs" !important;
content: attr(data-icon);
font-style: normal !important;
font-weight: normal !important;
font-variant: normal !important;
text-transform: none !important;
speak: none;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
[class^="icon-"]:before,
[class*=" icon-"]:before {
font-family: "hifi-glyphs" !important;
font-style: normal !important;
font-weight: normal !important;
font-variant: normal !important;
text-transform: none !important;
speak: none;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-hmd:before {
content: "\62";
}
.icon-2d-screen:before {
content: "\63";
}
.icon-keyboard:before {
content: "\64";
}
.icon-hand-controllers:before {
content: "\65";
}
.icon-headphones-mic:before {
content: "\66";
}
.icon-gamepad:before {
content: "\67";
}
.icon-headphones:before {
content: "\68";
}
.icon-mic:before {
content: "\69";
}
.icon-upload:before {
content: "\6a";
}
.icon-script:before {
content: "\6b";
}
.icon-text:before {
content: "\6c";
}
.icon-cube:before {
content: "\6d";
}
.icon-sphere:before {
content: "\6e";
}
.icon-zone:before {
content: "\6f";
}
.icon-light:before {
content: "\70";
}
.icon-web:before {
content: "\71";
}
.icon-web-2:before {
content: "\72";
}
.icon-edit:before {
content: "\73";
}
.icon-directory:before {
content: "\75";
}
.icon-menu:before {
content: "\76";
}
.icon-close:before {
content: "\77";
}
.icon-close-inverted:before {
content: "\78";
}
.icon-pin:before {
content: "\79";
}
.icon-pin-inverted:before {
content: "\7a";
}
.icon-resize-handle:before {
content: "\41";
}
.icon-diclosure-expand:before {
content: "\42";
}
.icon-reload-small:before {
content: "\61";
}
.icon-close-small:before {
content: "\43";
}
.icon-minimize:before {
content: "\49";
}
.icon-maximize:before {
content: "\4a";
}
.icon-maximize-inverted:before {
content: "\4b";
}
.icon-disclosure-button-expand:before {
content: "\4c";
}
.icon-disclosure-button-collapse:before {
content: "\4d";
}
.icon-script-stop:before {
content: "\4e";
}
.icon-script-reload:before {
content: "\4f";
}
.icon-script-run:before {
content: "\50";
}
.icon-script-new:before {
content: "\51";
}
.icon-hifi-forum:before {
content: "\32";
}
.icon-hifi-logo-small:before {
content: "\53";
}
.icon-placemark:before {
content: "\55";
}
.icon-box:before {
content: "\56";
}
.icon-community:before {
content: "\30";
}
.icon-grab-handle:before {
content: "\58";
}
.icon-search:before {
content: "\59";
}
.icon-disclosure-collapse:before {
content: "\5a";
}
.icon-script-upload:before {
content: "\52";
}
.icon-code:before {
content: "\57";
}
.icon-avatar:before {
content: "\3c";
}
.icon-arrows-h:before {
content: "\3a";
}
.icon-arrows-v:before {
content: "\3b";
}
.icon-arrows:before {
content: "\60";
}
.icon-compress:before {
content: "\21";
}
.icon-expand:before {
content: "\22";
}
.icon-placemark-1:before {
content: "\23";
}
.icon-circle:before {
content: "\24";
}
.icon-hand-pointer:before {
content: "\39";
}
.icon-plus-square-o:before {
content: "\25";
}
.icon-square:before {
content: "\27";
}
.icon-align-center:before {
content: "\38";
}
.icon-align-justify:before {
content: "\29";
}
.icon-align-left:before {
content: "\2a";
}
.icon-align-right:before {
content: "\5e";
}
.icon-bars:before {
content: "\37";
}
.icon-circle-slash:before {
content: "\2c";
}
.icon-sync:before {
content: "\28";
}
.icon-key:before {
content: "\2d";
}
.icon-link:before {
content: "\2e";
}
.icon-location:before {
content: "\2f";
}
.icon-carat-r:before {
content: "\33";
}
.icon-carat-l:before {
content: "\34";
}
.icon-folder-lg:before {
content: "\3e";
}
.icon-folder-sm:before {
content: "\3f";
}
.icon-level-up:before {
content: "\31";
}
.icon-info:before {
content: "\5b";
}
.icon-question:before {
content: "\5d";
}
.icon-alert:before {
content: "\2b";
}
.icon-home:before {
content: "\5f";
}
.icon-error:before {
content: "\3d";
}
.icon-settings:before {
content: "\40";
}
.icon-trash:before {
content: "\7b";
}
.icon-object-group:before {
content: "\e000";
}
.icon-cm:before {
content: "\7d";
}
.icon-msvg:before {
content: "\7e";
}
.icon-deg:before {
content: "\5c";
}
.icon-px:before {
content: "\7c";
}
.icon-m-sq:before {
content: "\e001";
}
.icon-m-cubed:before {
content: "\e002";
}
.icon-acceleration:before {
content: "\e003";
}
.icon-particles:before {
content: "\e004";
}
.icon-voxels:before {
content: "\e005";
}
.icon-lock:before {
content: "\e006";
}
.icon-visible:before {
content: "\e007";
}
.icon-model:before {
content: "\e008";
}
.icon-avatar-2:before {
content: "\e009";
}
.icon-arrow-dn:before {
content: "\35";
}
.icon-arrow-up:before {
content: "\36";
}
.icon-time:before {
content: "\e00a";
}
.icon-transparency:before {
content: "\e00b";
}
.icon-unmuted:before {
content: "\47";
}
.icon-user:before {
content: "\e00c";
}
.icon-edit-pencil:before {
content: "\e00d";
}
.icon-muted:before {
content: "\48";
}
.icon-vol-0:before {
content: "\e00e";
}
.icon-vol-1:before {
content: "\e00f";
}
.icon-vol-2:before {
content: "\e010";
}
.icon-vol-3:before {
content: "\e011";
}
.icon-vol-4:before {
content: "\e012";
}
.icon-vol-x-0:before {
content: "\e013";
}
.icon-vol-x-1:before {
content: "\e014";
}
.icon-vol-x-2:before {
content: "\e015";
}
.icon-vol-x-3:before {
content: "\e016";
}
.icon-vol-x-4:before {
content: "\e017";
}
.icon-share-ext:before {
content: "\e018";
}
.icon-ellipsis:before {
content: "\e019";
}
.icon-check:before {
content: "\e01a";
}
.icon-sliders:before {
content: "\26";
}
.icon-polyline:before {
content: "\e01b";
}
.icon-source:before {
content: "\e01c";
}
.icon-playback-play:before {
content: "\e01d";
}
.icon-stop-square:before {
content: "\e01e";
}
.icon-avatar-t-pose:before {
content: "\e01f";
}
.icon-check-1:before {
content: "\e020";
}
.icon-exchange:before {
content: "\e021";
}
.icon-hfc:before {
content: "\e022";
}
.icon-home-1:before {
content: "\e023";
}
.icon-private-key:before {
content: "\e024";
}
.icon-security-pic:before {
content: "\e026";
}
.icon-wallet:before {
content: "\e027";
}
.icon-send:before {
content: "\e028";
}
.icon-password:before {
content: "\e029";
}
.icon-rez:before {
content: "\e025";
}
.icon-keyboard-collapse:before {
content: "\e02b";
}
.icon-image:before {
content: "\e02a";
}
.icon-environments:before {
content: "\e02c";
}
.icon-wand:before {
content: "\e02d";
}
.icon-market:before {
content: "\74";
}
.icon-wear:before {
content: "\e02e";
}
.icon-certificate:before {
content: "\e030";
}
.icon-gift:before {
content: "\e031";
}
.icon-update:before {
content: "\e032";
}
.icon-uninstall:before {
content: "\e033";
}
.icon-install:before {
content: "\e02f";
}
.icon-ellipsis-vertical:before {
content: "\e034";
}
.icon-backward:before {
content: "\45";
}
.icon-40-reload:before {
content: "\46";
}
.icon-forward:before {
content: "\44";
}
.icon-avatar-1:before {
content: "\54";
}

View file

@ -0,0 +1,76 @@
//converts hsv color into rgb color space, expects hsv with the following ranges
//H(0, 359), S(0, 1), V(0, 1) to R(0, 255), G(0, 255), B(0, 255)
hsv2rgb = function (hsvColor) {
var c = hsvColor.value * hsvColor.saturation;
var x = c * (1 - Math.abs((hsvColor.hue/60) % 2 - 1));
var m = hsvColor.value - c;
var rgbColor = new Object();
if (hsvColor.hue >= 0 && hsvColor.hue < 60) {
rgbColor.red = Math.ceil((c + m) * 255);
rgbColor.green = Math.ceil((x + m) * 255);
rgbColor.blue = Math.ceil((0 + m) * 255);
} else if (hsvColor.hue >= 60 && hsvColor.hue < 120) {
rgbColor.red = Math.ceil((x + m) * 255);
rgbColor.green = Math.ceil((c + m) * 255);
rgbColor.blue = Math.ceil((0 + m) * 255);
} else if (hsvColor.hue >= 120 && hsvColor.hue < 180) {
rgbColor.red = Math.ceil((0 + m) * 255);
rgbColor.green = Math.ceil((c + m) * 255);
rgbColor.blue = Math.ceil((x + m) * 255);
} else if (hsvColor.hue >= 180 && hsvColor.hue < 240) {
rgbColor.red = Math.ceil((0 + m) * 255);
rgbColor.green = Math.ceil((x + m) * 255);
rgbColor.blue = Math.ceil((c + m) * 255);
} else if (hsvColor.hue >= 240 && hsvColor.hue < 300) {
rgbColor.red = Math.ceil((x + m) * 255);
rgbColor.green = Math.ceil((0 + m) * 255);
rgbColor.blue = Math.ceil((c + m) * 255);
} else if (hsvColor.hue >= 300 && hsvColor.hue < 360) {
rgbColor.red = Math.ceil((c + m) * 255);
rgbColor.green = Math.ceil((0 + m) * 255);
rgbColor.blue = Math.ceil((x + m) * 255);
}
return rgbColor;
}
//converts rgb color into hsv color space, expects rgb with the following ranges
//R(0, 255), G(0, 255), B(0, 255) to H(0, 359), S(0, 1), V(0, 1)
rgb2hsv = function (rgbColor) {
var r = rgbColor.red / 255.0;
var g = rgbColor.green / 255.0;
var b = rgbColor.blue / 255.0;
var cMax = Math.max(r, Math.max(g, b));
var cMin = Math.min(r, Math.min(g, b));
var deltaC = cMax - cMin;
var hsvColor = new Object();
//hue calculatio
if (deltaC == 0) {
hsvColor.hue = 0;
} else if (cMax == r) {
hsvColor.hue = 60 * (((g-b)/deltaC) % 6);
} else if (cMax == g) {
hsvColor.hue = 60 * (((b-r)/deltaC) + 2);
} else if (cMax == b) {
hsvColor.hue = 60 * (((r-g)/deltaC) + 4);
}
if (hsvColor.hue < 0) {
hsvColor.hue += 360;
}
//saturation calculation
if (cMax == 0) {
hsvColor.saturation = 0;
} else {
hsvColor.saturation = (deltaC/cMax);
}
hsvColor.value = (cMax);
return hsvColor;
}

View file

@ -0,0 +1 @@
<svg fill="#fff" id="Brush-icon-High-Fidelity" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><title>Artboard 1</title><path d="M186.14,357.79c7.59,9.58,8.08,17.35,8.5,23,1.45,19.27-6.3,35.94-22.69,47-16.48,11.34-42.76,18.39-66.78,20.23a155,155,0,0,1-59.6-7.11,8.54,8.54,0,0,1-5.89-8.38c.09-3.79,2.75-6.72,6.34-8,13.84-5.08,22.76-14.57,34.07-29.61s22.25-32.28,34.73-45C123.09,341.41,129,339,140.91,338c14.3-1,34.25,5.49,45.23,19.78"/><path d="M457.94,72.56A13,13,0,0,0,449.48,69c-2.41,0-4.82,1.24-7.22,2.46C367.84,122.63,226.49,258.69,163,320.63a53.88,53.88,0,0,1,35.08,15.43C211.45,349.24,214,370.93,214,370.93c61.05-64.34,196.33-207.59,246.45-282.71C462.84,83.38,462.79,76.14,457.94,72.56Z"/></svg>

After

Width:  |  Height:  |  Size: 710 B

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#fff;}</style></defs><title>hand</title><path class="cls-1" d="M197.33,26.23q13.93-19.8,40.33-19.8t40.7,20.17q14.3,20.17,14.3,51v38.87l124.3,48a52.83,52.83,0,0,1,15,7.15q7.33,5,7.33,10.45v125.4q0,2.57-29.7,33T375.17,370.9H182.67q-6.24,0-13-5.13A48.79,48.79,0,0,1,159.2,355.5l-3.3-5.13L71.57,217.27q-5.87-11.36,2.2-19.43l41.07-40.33a16.62,16.62,0,0,1,11.73-5A18.61,18.61,0,0,1,139,156.77l44.37,30.8V76.83Q183.4,46,197.33,26.23ZM256,124.5V50.07q0-7.7-9.17-11.18a25.63,25.63,0,0,0-18.33-.18q-9.17,3.3-9.17,11.37V224a8.5,8.5,0,0,1-.18,2.2c-.13.37-.31,1-.55,1.83a7.1,7.1,0,0,1-.73,1.83c-.25.37-.55.86-.92,1.47a4.23,4.23,0,0,1-1.47,1.47c-.61.37-1.16.68-1.65.92q-9.17,4.4-17.23-1.83L129.5,178.4,99.07,209.93l86.53,124.3H370l32.63-36.67V190.13l-124.3-48a52.74,52.74,0,0,1-15-7.15Q256,130,256,124.5ZM201,407.57H384.33a18.15,18.15,0,0,1,18.33,18.33v36.67a18.15,18.15,0,0,1-18.33,18.33H201a18.15,18.15,0,0,1-18.33-18.33V425.9A18.15,18.15,0,0,1,201,407.57Z"/></svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1 @@
<svg fill="#fff" id="Palette-icon-High-Fidelity" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><title>palette-icon</title><path d="M186.73,239.68a31.17,31.17,0,0,0,10.36-7.46,20.84,20.84,0,0,0,4.27-18.36c-3.11-12.11-15.54-17.4-26.67-19.67-10.51-2.14-21.55-2.44-31.34-6.82-14.91-6.66-24.85-23.11-23.8-39.41,1.28-20,17-36,33.5-47.35,60.53-41.4,146.23-41.86,207.34-1.31s94,119.52,79.92,191.5S366.23,423.51,294.48,438.65c-51.48,10.86-106-.5-152.82-24.6C120.85,403.33,101,389.8,86.82,371.13S64.92,328,70.05,305.2s23.86-41.3,46-48c13.5-4.08,27.93-3.92,41.68-7a142.49,142.49,0,0,0,24.14-8.3C183.52,241.16,185.14,240.45,186.73,239.68ZM373,148.22a29.25,29.25,0,1,0-3.88,41.32h0a29.26,29.26,0,0,0,4-41.17l-.14-.17Zm27.95,141.42.15-.12a29.45,29.45,0,1,0-41.45-4l.11.14a29.26,29.26,0,0,0,41.17,4l.15-.12Zm-40.52,89.43a29.25,29.25,0,1,0-41.17-4,29.26,29.26,0,0,0,41.17,4l.06,0ZM263.61,407.5a33.22,33.22,0,1,0-.15.1l.29-.24Zm-83.69-82.23A29.25,29.25,0,1,0,176,366.59h0a29.26,29.26,0,0,0,4-41.17l-.14-.17Z"/></svg>

After

Width:  |  Height:  |  Size: 1,010 B

View file

@ -0,0 +1,420 @@
/*
colpick Color Picker / colpick.com
*/
/*Main container*/
.colpick {
position: absolute;
width: 346px;
height: 170px;
overflow: hidden;
display: none;
font-family: Arial, Helvetica, sans-serif;
background:#ebebeb;
border: 1px solid #bbb;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
/*Prevents selecting text when dragging the selectors*/
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
/*Color selection box with gradients*/
.colpick_color {
position: absolute;
left: 7px;
top: 7px;
width: 156px;
height: 156px;
overflow: hidden;
outline: 1px solid #aaa;
cursor: crosshair;
}
.colpick_color_overlay1 {
position: absolute;
left:0;
top:0;
width: 156px;
height: 156px;
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')"; /* IE8 */
background: -moz-linear-gradient(left, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(left, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(left, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(left, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%); /* IE10+ */
background: linear-gradient(to right, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%);
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff'); /* IE6 & IE7 */
}
.colpick_color_overlay2 {
position: absolute;
left:0;
top:0;
width: 156px;
height: 156px;
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')"; /* IE8 */
background: -moz-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(0,0,0,0)), color-stop(100%,rgba(0,0,0,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00000000', endColorstr='#000000',GradientType=0 ); /* IE6-9 */
}
/*Circular color selector*/
.colpick_selector_outer {
background:none;
position: absolute;
width: 11px;
height: 11px;
margin: -6px 0 0 -6px;
border: 1px solid black;
border-radius: 50%;
}
.colpick_selector_inner{
position: absolute;
width: 9px;
height: 9px;
border: 1px solid white;
border-radius: 50%;
}
/*Vertical hue bar*/
.colpick_hue {
position: absolute;
top: 6px;
left: 175px;
width: 19px;
height: 156px;
border: 1px solid #aaa;
cursor: n-resize;
}
/*Hue bar sliding indicator*/
.colpick_hue_arrs {
position: absolute;
left: -8px;
width: 35px;
height: 7px;
margin: -7px 0 0 0;
}
.colpick_hue_larr {
position:absolute;
width: 0;
height: 0;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-left: 7px solid #858585;
}
.colpick_hue_rarr {
position:absolute;
right:0;
width: 0;
height: 0;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 7px solid #858585;
}
/*New color box*/
.colpick_new_color {
position: absolute;
left: 207px;
top: 6px;
width: 60px;
height: 27px;
background: #f00;
border: 1px solid #8f8f8f;
}
/*Current color box*/
.colpick_current_color {
position: absolute;
left: 277px;
top: 6px;
width: 60px;
height: 27px;
background: #f00;
border: 1px solid #8f8f8f;
}
/*Input field containers*/
.colpick_field, .colpick_hex_field {
position: absolute;
height: 20px;
width: 60px;
overflow:hidden;
background:#f3f3f3;
color:#b8b8b8;
font-size:12px;
border:1px solid #bdbdbd;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.colpick_rgb_r {
top: 40px;
left: 207px;
}
.colpick_rgb_g {
top: 67px;
left: 207px;
}
.colpick_rgb_b {
top: 94px;
left: 207px;
}
.colpick_hsb_h {
top: 40px;
left: 277px;
}
.colpick_hsb_s {
top: 67px;
left: 277px;
}
.colpick_hsb_b {
top: 94px;
left: 277px;
}
.colpick_hex_field {
width: 68px;
left: 207px;
top: 121px;
}
/*Text field container on focus*/
.colpick_focus {
border-color: #999;
}
/*Field label container*/
.colpick_field_letter {
position: absolute;
width: 12px;
height: 20px;
line-height: 20px;
padding-left: 4px;
background: #efefef;
border-right: 1px solid #bdbdbd;
font-weight: bold;
color:#777;
}
/*Text inputs*/
.colpick_field input, .colpick_hex_field input {
position: absolute;
right: 11px;
margin: 0;
padding: 0;
height: 20px;
line-height: 20px;
background: transparent;
border: none;
font-size: 12px;
font-family: Arial, Helvetica, sans-serif;
color: #555;
text-align: right;
outline: none;
}
.colpick_hex_field input {
right: 4px;
}
/*Field up/down arrows*/
.colpick_field_arrs {
position: absolute;
top: 0;
right: 0;
width: 9px;
height: 21px;
cursor: n-resize;
}
.colpick_field_uarr {
position: absolute;
top: 5px;
width: 0;
height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-bottom: 4px solid #959595;
}
.colpick_field_darr {
position: absolute;
bottom:5px;
width: 0;
height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 4px solid #959595;
}
/*Submit/Select button*/
.colpick_submit {
position: absolute;
left: 207px;
top: 149px;
width: 130px;
height: 22px;
line-height:22px;
background: #efefef;
text-align: center;
color: #555;
font-size: 12px;
font-weight:bold;
border: 1px solid #bdbdbd;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.colpick_submit:hover {
background:#f3f3f3;
border-color:#999;
cursor: pointer;
}
/*full layout with no submit button*/
.colpick_full_ns .colpick_submit, .colpick_full_ns .colpick_current_color{
display:none;
}
.colpick_full_ns .colpick_new_color {
width: 130px;
height: 25px;
}
.colpick_full_ns .colpick_rgb_r, .colpick_full_ns .colpick_hsb_h {
top: 42px;
}
.colpick_full_ns .colpick_rgb_g, .colpick_full_ns .colpick_hsb_s {
top: 73px;
}
.colpick_full_ns .colpick_rgb_b, .colpick_full_ns .colpick_hsb_b {
top: 104px;
}
.colpick_full_ns .colpick_hex_field {
top: 135px;
}
/*rgbhex layout*/
.colpick_rgbhex .colpick_hsb_h, .colpick_rgbhex .colpick_hsb_s, .colpick_rgbhex .colpick_hsb_b {
display:none;
}
.colpick_rgbhex {
width:282px;
}
.colpick_rgbhex .colpick_field, .colpick_rgbhex .colpick_submit {
width:68px;
}
.colpick_rgbhex .colpick_new_color {
width:34px;
border-right:none;
}
.colpick_rgbhex .colpick_current_color {
width:34px;
left:240px;
border-left:none;
}
/*rgbhex layout, no submit button*/
.colpick_rgbhex_ns .colpick_submit, .colpick_rgbhex_ns .colpick_current_color{
display:none;
}
.colpick_rgbhex_ns .colpick_new_color{
width:68px;
border: 1px solid #8f8f8f;
}
.colpick_rgbhex_ns .colpick_rgb_r {
top: 42px;
}
.colpick_rgbhex_ns .colpick_rgb_g {
top: 73px;
}
.colpick_rgbhex_ns .colpick_rgb_b {
top: 104px;
}
.colpick_rgbhex_ns .colpick_hex_field {
top: 135px;
}
/*hex layout*/
.colpick_hex .colpick_hsb_h, .colpick_hex .colpick_hsb_s, .colpick_hex .colpick_hsb_b, .colpick_hex .colpick_rgb_r, .colpick_hex .colpick_rgb_g, .colpick_hex .colpick_rgb_b {
display:none;
}
.colpick_hex {
width:206px;
height:201px;
}
.colpick_hex .colpick_hex_field {
width:72px;
height:25px;
top:168px;
left:80px;
}
.colpick_hex .colpick_hex_field div, .colpick_hex .colpick_hex_field input {
height: 25px;
line-height: 25px;
}
.colpick_hex .colpick_new_color {
left:9px;
top:168px;
width:30px;
border-right:none;
}
.colpick_hex .colpick_current_color {
left:39px;
top:168px;
width:30px;
border-left:none;
}
.colpick_hex .colpick_submit {
left:164px;
top: 168px;
width:30px;
height:25px;
line-height: 25px;
}
/*hex layout, no submit button*/
.colpick_hex_ns .colpick_submit, .colpick_hex_ns .colpick_current_color {
display:none;
}
.colpick_hex_ns .colpick_hex_field {
width:80px;
}
.colpick_hex_ns .colpick_new_color{
width:60px;
border: 1px solid #8f8f8f;
}
/*Dark color scheme*/
.colpick_dark {
background: #161616;
border-color: #2a2a2a;
}
.colpick_dark .colpick_color {
outline-color: #333;
}
.colpick_dark .colpick_hue {
border-color: #555;
}
.colpick_dark .colpick_field, .colpick_dark .colpick_hex_field {
background: #101010;
border-color: #2d2d2d;
}
.colpick_dark .colpick_field_letter {
background: #131313;
border-color: #2d2d2d;
color: #696969;
}
.colpick_dark .colpick_field input, .colpick_dark .colpick_hex_field input {
color: #7a7a7a;
}
.colpick_dark .colpick_field_uarr {
border-bottom-color:#696969;
}
.colpick_dark .colpick_field_darr {
border-top-color:#696969;
}
.colpick_dark .colpick_focus {
border-color:#444;
}
.colpick_dark .colpick_submit {
background: #131313;
border-color:#2d2d2d;
color:#7a7a7a;
}
.colpick_dark .colpick_submit:hover {
background-color:#101010;
border-color:#444;
}

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,520 @@
/*
colpick Color Picker
Copyright 2013 Jose Vargas. Licensed under GPL license. Based on Stefan Petre's Color Picker www.eyecon.ro, dual licensed under the MIT and GPL licenses
For usage and examples: colpick.com/plugin
*/
(function ($) {
var colpick = function () {
var
tpl = '<div class="colpick"><div class="colpick_color"><div class="colpick_color_overlay1"><div class="colpick_color_overlay2"><div class="colpick_selector_outer"><div class="colpick_selector_inner"></div></div></div></div></div><div class="colpick_hue"><div class="colpick_hue_arrs"><div class="colpick_hue_larr"></div><div class="colpick_hue_rarr"></div></div></div><div class="colpick_new_color"></div><div class="colpick_current_color"></div><div class="colpick_hex_field"><div class="colpick_field_letter">#</div><input type="text" maxlength="6" size="6" /></div><div class="colpick_rgb_r colpick_field"><div class="colpick_field_letter">R</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_rgb_g colpick_field"><div class="colpick_field_letter">G</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_rgb_b colpick_field"><div class="colpick_field_letter">B</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_hsb_h colpick_field"><div class="colpick_field_letter">H</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_hsb_s colpick_field"><div class="colpick_field_letter">S</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_hsb_b colpick_field"><div class="colpick_field_letter">B</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_submit"></div></div>',
defaults = {
showEvent: 'click',
onShow: function () {},
onBeforeShow: function(){},
onHide: function () {},
onChange: function () {},
onSubmit: function () {},
colorScheme: 'light',
color: '3289c7',
livePreview: true,
flat: false,
layout: 'full',
submit: 1,
submitText: 'OK',
height: 156
},
//Fill the inputs of the plugin
fillRGBFields = function (hsb, cal) {
var rgb = hsbToRgb(hsb);
$(cal).data('colpick').fields
.eq(1).val(rgb.r).end()
.eq(2).val(rgb.g).end()
.eq(3).val(rgb.b).end();
},
fillHSBFields = function (hsb, cal) {
$(cal).data('colpick').fields
.eq(4).val(Math.round(hsb.h)).end()
.eq(5).val(Math.round(hsb.s)).end()
.eq(6).val(Math.round(hsb.b)).end();
},
fillHexFields = function (hsb, cal) {
$(cal).data('colpick').fields.eq(0).val(hsbToHex(hsb));
},
//Set the round selector position
setSelector = function (hsb, cal) {
$(cal).data('colpick').selector.css('backgroundColor', '#' + hsbToHex({h: hsb.h, s: 100, b: 100}));
$(cal).data('colpick').selectorIndic.css({
left: parseInt($(cal).data('colpick').height * hsb.s/100, 10),
top: parseInt($(cal).data('colpick').height * (100-hsb.b)/100, 10)
});
},
//Set the hue selector position
setHue = function (hsb, cal) {
$(cal).data('colpick').hue.css('top', parseInt($(cal).data('colpick').height - $(cal).data('colpick').height * hsb.h/360, 10));
},
//Set current and new colors
setCurrentColor = function (hsb, cal) {
$(cal).data('colpick').currentColor.css('backgroundColor', '#' + hsbToHex(hsb));
},
setNewColor = function (hsb, cal) {
$(cal).data('colpick').newColor.css('backgroundColor', '#' + hsbToHex(hsb));
},
//Called when the new color is changed
change = function (ev) {
var cal = $(this).parent().parent(), col;
if (this.parentNode.className.indexOf('_hex') > 0) {
cal.data('colpick').color = col = hexToHsb(fixHex(this.value));
fillRGBFields(col, cal.get(0));
fillHSBFields(col, cal.get(0));
} else if (this.parentNode.className.indexOf('_hsb') > 0) {
cal.data('colpick').color = col = fixHSB({
h: parseInt(cal.data('colpick').fields.eq(4).val(), 10),
s: parseInt(cal.data('colpick').fields.eq(5).val(), 10),
b: parseInt(cal.data('colpick').fields.eq(6).val(), 10)
});
fillRGBFields(col, cal.get(0));
fillHexFields(col, cal.get(0));
} else {
cal.data('colpick').color = col = rgbToHsb(fixRGB({
r: parseInt(cal.data('colpick').fields.eq(1).val(), 10),
g: parseInt(cal.data('colpick').fields.eq(2).val(), 10),
b: parseInt(cal.data('colpick').fields.eq(3).val(), 10)
}));
fillHexFields(col, cal.get(0));
fillHSBFields(col, cal.get(0));
}
setSelector(col, cal.get(0));
setHue(col, cal.get(0));
setNewColor(col, cal.get(0));
cal.data('colpick').onChange.apply(cal.parent(), [col, hsbToHex(col), hsbToRgb(col), cal.data('colpick').el, 0]);
},
//Change style on blur and on focus of inputs
blur = function (ev) {
$(this).parent().removeClass('colpick_focus');
},
focus = function () {
$(this).parent().parent().data('colpick').fields.parent().removeClass('colpick_focus');
$(this).parent().addClass('colpick_focus');
},
//Increment/decrement arrows functions
downIncrement = function (ev) {
ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;
var field = $(this).parent().find('input').focus();
var current = {
el: $(this).parent().addClass('colpick_slider'),
max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
y: ev.pageY,
field: field,
val: parseInt(field.val(), 10),
preview: $(this).parent().parent().data('colpick').livePreview
};
$(document).mouseup(current, upIncrement);
$(document).mousemove(current, moveIncrement);
},
moveIncrement = function (ev) {
ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val - ev.pageY + ev.data.y, 10))));
if (ev.data.preview) {
change.apply(ev.data.field.get(0), [true]);
}
return false;
},
upIncrement = function (ev) {
change.apply(ev.data.field.get(0), [true]);
ev.data.el.removeClass('colpick_slider').find('input').focus();
$(document).off('mouseup', upIncrement);
$(document).off('mousemove', moveIncrement);
return false;
},
//Hue slider functions
downHue = function (ev) {
ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;
var current = {
cal: $(this).parent(),
y: $(this).offset().top
};
$(document).on('mouseup touchend',current,upHue);
$(document).on('mousemove touchmove',current,moveHue);
var pageY = ((ev.type == 'touchstart') ? ev.originalEvent.changedTouches[0].pageY : ev.pageY );
change.apply(
current.cal.data('colpick')
.fields.eq(4).val(parseInt(360*(current.cal.data('colpick').height - (pageY - current.y))/current.cal.data('colpick').height, 10))
.get(0),
[current.cal.data('colpick').livePreview]
);
return false;
},
moveHue = function (ev) {
var pageY = ((ev.type == 'touchmove') ? ev.originalEvent.changedTouches[0].pageY : ev.pageY );
change.apply(
ev.data.cal.data('colpick')
.fields.eq(4).val(parseInt(360*(ev.data.cal.data('colpick').height - Math.max(0,Math.min(ev.data.cal.data('colpick').height,(pageY - ev.data.y))))/ev.data.cal.data('colpick').height, 10))
.get(0),
[ev.data.preview]
);
return false;
},
upHue = function (ev) {
fillRGBFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
fillHexFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
$(document).off('mouseup touchend',upHue);
$(document).off('mousemove touchmove',moveHue);
return false;
},
//Color selector functions
downSelector = function (ev) {
ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;
var current = {
cal: $(this).parent(),
pos: $(this).offset()
};
current.preview = current.cal.data('colpick').livePreview;
$(document).on('mouseup touchend',current,upSelector);
$(document).on('mousemove touchmove',current,moveSelector);
var payeX,pageY;
if(ev.type == 'touchstart') {
pageX = ev.originalEvent.changedTouches[0].pageX,
pageY = ev.originalEvent.changedTouches[0].pageY;
} else {
pageX = ev.pageX;
pageY = ev.pageY;
}
change.apply(
current.cal.data('colpick').fields
.eq(6).val(parseInt(100*(current.cal.data('colpick').height - (pageY - current.pos.top))/current.cal.data('colpick').height, 10)).end()
.eq(5).val(parseInt(100*(pageX - current.pos.left)/current.cal.data('colpick').height, 10))
.get(0),
[current.preview]
);
return false;
},
moveSelector = function (ev) {
var payeX,pageY;
if(ev.type == 'touchmove') {
pageX = ev.originalEvent.changedTouches[0].pageX,
pageY = ev.originalEvent.changedTouches[0].pageY;
} else {
pageX = ev.pageX;
pageY = ev.pageY;
}
change.apply(
ev.data.cal.data('colpick').fields
.eq(6).val(parseInt(100*(ev.data.cal.data('colpick').height - Math.max(0,Math.min(ev.data.cal.data('colpick').height,(pageY - ev.data.pos.top))))/ev.data.cal.data('colpick').height, 10)).end()
.eq(5).val(parseInt(100*(Math.max(0,Math.min(ev.data.cal.data('colpick').height,(pageX - ev.data.pos.left))))/ev.data.cal.data('colpick').height, 10))
.get(0),
[ev.data.preview]
);
return false;
},
upSelector = function (ev) {
fillRGBFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
fillHexFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
$(document).off('mouseup touchend',upSelector);
$(document).off('mousemove touchmove',moveSelector);
return false;
},
//Submit button
clickSubmit = function (ev) {
var cal = $(this).parent();
var col = cal.data('colpick').color;
cal.data('colpick').origColor = col;
setCurrentColor(col, cal.get(0));
cal.data('colpick').onSubmit(col, hsbToHex(col), hsbToRgb(col), cal.data('colpick').el);
},
//Show/hide the color picker
show = function (ev) {
// Prevent the trigger of any direct parent
ev.stopPropagation();
var cal = $('#' + $(this).data('colpickId'));
cal.data('colpick').onBeforeShow.apply(this, [cal.get(0)]);
var pos = $(this).offset();
var top = pos.top + this.offsetHeight;
var left = pos.left;
var viewPort = getViewport();
var calW = cal.width();
if (left + calW > viewPort.l + viewPort.w) {
left -= calW;
}
cal.css({left: left + 'px', top: top + 'px'});
if (cal.data('colpick').onShow.apply(this, [cal.get(0)]) != false) {
cal.show();
}
//Hide when user clicks outside
$('html').mousedown({cal:cal}, hide);
cal.mousedown(function(ev){ev.stopPropagation();})
},
hide = function (ev) {
if (ev.data.cal.data('colpick').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
ev.data.cal.hide();
}
$('html').off('mousedown', hide);
},
getViewport = function () {
var m = document.compatMode == 'CSS1Compat';
return {
l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth)
};
},
//Fix the values if the user enters a negative or high value
fixHSB = function (hsb) {
return {
h: Math.min(360, Math.max(0, hsb.h)),
s: Math.min(100, Math.max(0, hsb.s)),
b: Math.min(100, Math.max(0, hsb.b))
};
},
fixRGB = function (rgb) {
return {
r: Math.min(255, Math.max(0, rgb.r)),
g: Math.min(255, Math.max(0, rgb.g)),
b: Math.min(255, Math.max(0, rgb.b))
};
},
fixHex = function (hex) {
var len = 6 - hex.length;
if (len > 0) {
var o = [];
for (var i=0; i<len; i++) {
o.push('0');
}
o.push(hex);
hex = o.join('');
}
return hex;
},
restoreOriginal = function () {
var cal = $(this).parent();
var col = cal.data('colpick').origColor;
cal.data('colpick').color = col;
fillRGBFields(col, cal.get(0));
fillHexFields(col, cal.get(0));
fillHSBFields(col, cal.get(0));
setSelector(col, cal.get(0));
setHue(col, cal.get(0));
setNewColor(col, cal.get(0));
};
return {
init: function (opt) {
opt = $.extend({}, defaults, opt||{});
//Set color
if (typeof opt.color == 'string') {
opt.color = hexToHsb(opt.color);
} else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
opt.color = rgbToHsb(opt.color);
} else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
opt.color = fixHSB(opt.color);
} else {
return this;
}
//For each selected DOM element
return this.each(function () {
//If the element does not have an ID
if (!$(this).data('colpickId')) {
var options = $.extend({}, opt);
options.origColor = opt.color;
//Generate and assign a random ID
var id = 'collorpicker_' + parseInt(Math.random() * 1000);
$(this).data('colpickId', id);
//Set the tpl's ID and get the HTML
var cal = $(tpl).attr('id', id);
//Add class according to layout
cal.addClass('colpick_'+options.layout+(options.submit?'':' colpick_'+options.layout+'_ns'));
//Add class if the color scheme is not default
if(options.colorScheme != 'light') {
cal.addClass('colpick_'+options.colorScheme);
}
//Setup submit button
cal.find('div.colpick_submit').html(options.submitText).click(clickSubmit);
//Setup input fields
options.fields = cal.find('input').change(change).blur(blur).focus(focus);
cal.find('div.colpick_field_arrs').mousedown(downIncrement).end().find('div.colpick_current_color').click(restoreOriginal);
//Setup hue selector
options.selector = cal.find('div.colpick_color').on('mousedown touchstart',downSelector);
options.selectorIndic = options.selector.find('div.colpick_selector_outer');
//Store parts of the plugin
options.el = this;
options.hue = cal.find('div.colpick_hue_arrs');
huebar = options.hue.parent();
//Paint the hue bar
var UA = navigator.userAgent.toLowerCase();
var isIE = navigator.appName === 'Microsoft Internet Explorer';
var IEver = isIE ? parseFloat( UA.match( /msie ([0-9]{1,}[\.0-9]{0,})/ )[1] ) : 0;
var ngIE = ( isIE && IEver < 10 );
var stops = ['#ff0000','#ff0080','#ff00ff','#8000ff','#0000ff','#0080ff','#00ffff','#00ff80','#00ff00','#80ff00','#ffff00','#ff8000','#ff0000'];
if(ngIE) {
var i, div;
for(i=0; i<=11; i++) {
div = $('<div></div>').attr('style','height:8.333333%; filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='+stops[i]+', endColorstr='+stops[i+1]+'); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='+stops[i]+', endColorstr='+stops[i+1]+')";');
huebar.append(div);
}
} else {
stopList = stops.join(',');
huebar.attr('style','background:-webkit-linear-gradient(top,'+stopList+'); background: -o-linear-gradient(top,'+stopList+'); background: -ms-linear-gradient(top,'+stopList+'); background:-moz-linear-gradient(top,'+stopList+'); -webkit-linear-gradient(top,'+stopList+'); background:linear-gradient(to bottom,'+stopList+'); ');
}
cal.find('div.colpick_hue').on('mousedown touchstart',downHue);
options.newColor = cal.find('div.colpick_new_color');
options.currentColor = cal.find('div.colpick_current_color');
//Store options and fill with default color
cal.data('colpick', options);
fillRGBFields(options.color, cal.get(0));
fillHSBFields(options.color, cal.get(0));
fillHexFields(options.color, cal.get(0));
setHue(options.color, cal.get(0));
setSelector(options.color, cal.get(0));
setCurrentColor(options.color, cal.get(0));
setNewColor(options.color, cal.get(0));
//Append to body if flat=false, else show in place
if (options.flat) {
cal.appendTo(this).show();
cal.css({
position: 'relative',
display: 'block'
});
} else {
cal.appendTo(document.body);
$(this).on(options.showEvent, show);
cal.css({
position:'absolute'
});
}
}
});
},
//Shows the picker
showPicker: function() {
return this.each( function () {
if ($(this).data('colpickId')) {
show.apply(this);
}
});
},
//Hides the picker
hidePicker: function() {
return this.each( function () {
if ($(this).data('colpickId')) {
$('#' + $(this).data('colpickId')).hide();
}
});
},
//Sets a color as new and current (default)
setColor: function(col, setCurrent) {
setCurrent = (typeof setCurrent === "undefined") ? 1 : setCurrent;
if (typeof col == 'string') {
col = hexToHsb(col);
} else if (col.r != undefined && col.g != undefined && col.b != undefined) {
col = rgbToHsb(col);
} else if (col.h != undefined && col.s != undefined && col.b != undefined) {
col = fixHSB(col);
} else {
return this;
}
return this.each(function(){
if ($(this).data('colpickId')) {
var cal = $('#' + $(this).data('colpickId'));
cal.data('colpick').color = col;
cal.data('colpick').origColor = col;
fillRGBFields(col, cal.get(0));
fillHSBFields(col, cal.get(0));
fillHexFields(col, cal.get(0));
setHue(col, cal.get(0));
setSelector(col, cal.get(0));
setNewColor(col, cal.get(0));
cal.data('colpick').onChange.apply(cal.parent(), [col, hsbToHex(col), hsbToRgb(col), cal.data('colpick').el, 1]);
if(setCurrent) {
setCurrentColor(col, cal.get(0));
}
}
});
}
};
}();
//Color space convertions
var hexToRgb = function (hex) {
var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
};
var hexToHsb = function (hex) {
return rgbToHsb(hexToRgb(hex));
};
var rgbToHsb = function (rgb) {
var hsb = {h: 0, s: 0, b: 0};
var min = Math.min(rgb.r, rgb.g, rgb.b);
var max = Math.max(rgb.r, rgb.g, rgb.b);
var delta = max - min;
hsb.b = max;
hsb.s = max != 0 ? 255 * delta / max : 0;
if (hsb.s != 0) {
if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta;
else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta;
else hsb.h = 4 + (rgb.r - rgb.g) / delta;
} else hsb.h = -1;
hsb.h *= 60;
if (hsb.h < 0) hsb.h += 360;
hsb.s *= 100/255;
hsb.b *= 100/255;
return hsb;
};
var hsbToRgb = function (hsb) {
var rgb = {};
var h = hsb.h;
var s = hsb.s*255/100;
var v = hsb.b*255/100;
if(s == 0) {
rgb.r = rgb.g = rgb.b = v;
} else {
var t1 = v;
var t2 = (255-s)*v/255;
var t3 = (t1-t2)*(h%60)/60;
if(h==360) h = 0;
if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
else {rgb.r=0; rgb.g=0; rgb.b=0}
}
return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
};
var rgbToHex = function (rgb) {
var hex = [
rgb.r.toString(16),
rgb.g.toString(16),
rgb.b.toString(16)
];
$.each(hex, function (nr, val) {
if (val.length == 1) {
hex[nr] = '0' + val;
}
});
return hex.join('');
};
var hsbToHex = function (hsb) {
return rgbToHex(hsbToRgb(hsb));
};
$.fn.extend({
colpick: colpick.init,
colpickHide: colpick.hidePicker,
colpickShow: colpick.showPicker,
colpickSetColor: colpick.setColor
});
$.extend({
colpick:{
rgbToHex: rgbToHex,
rgbToHsb: rgbToHsb,
hsbToHex: hsbToHex,
hsbToRgb: hsbToRgb,
hexToHsb: hexToHsb,
hexToRgb: hexToRgb
}
});
})(jQuery);

View file

@ -0,0 +1,19 @@
//public slots:
// void emitWebEvent(const QString& data);
// void emitScriptEvent(const QString& data);
//
//signals:
// void webEventReceived(const QString& data);
// void scriptEventReceived(const QString& data);
//
var EventBridge;
var WebChannel;
openEventBridge = function(callback) {
WebChannel = new QWebChannel(qt.webChannelTransport, function (channel) {
EventBridge = WebChannel.objects.eventBridge;
callback(EventBridge);
});
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,67 @@
//
// keyboardControl.js
//
// Created by David Rowe on 28 Sep 2016.
// Copyright 2016 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
function setUpKeyboardControl() {
var lowerTimer = null;
var isRaised = false;
var KEYBOARD_HEIGHT = 200;
function raiseKeyboard() {
if (lowerTimer !== null) {
clearTimeout(lowerTimer);
lowerTimer = null;
}
EventBridge.emitWebEvent("_RAISE_KEYBOARD" + (this.type === "number" ? "_NUMERIC" : ""));
if (!isRaised) {
var delta = this.getBoundingClientRect().bottom + 10 - (document.body.clientHeight - KEYBOARD_HEIGHT);
if (delta > 0) {
setTimeout(function () {
document.body.scrollTop += delta;
}, 500); // Allow time for keyboard to be raised in QML.
}
}
isRaised = true;
}
function doLowerKeyboard() {
EventBridge.emitWebEvent("_LOWER_KEYBOARD");
lowerTimer = null;
isRaised = false;
}
function lowerKeyboard() {
// Delay lowering keyboard a little in case immediately raise it again.
if (lowerTimer === null) {
lowerTimer = setTimeout(doLowerKeyboard, 20);
}
}
function documentBlur() {
// Action any pending Lower keyboard event immediately upon leaving document window so that they don't interfere with
// other Entities Editor tab.
if (lowerTimer !== null) {
clearTimeout(lowerTimer);
doLowerKeyboard();
}
}
var inputs = document.querySelectorAll("input[type=text], input[type=password], input[type=number], textarea");
for (var i = 0, length = inputs.length; i < length; i++) {
inputs[i].addEventListener("focus", raiseKeyboard);
inputs[i].addEventListener("blur", lowerKeyboard);
}
window.addEventListener("blur", documentBlur);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View file

@ -0,0 +1,695 @@
<!DOCTYPE html>
<html>
<script type="text/javascript" src="../hifi/js/keyboardControl.js"></script>
<script src="../hifi/js/jquery-2.1.4.min.js"></script>
<script src="../content/js/ColorUtils.js"></script>
<script src="../hifi/js/colpick.js"></script>
<style>
input[type=range] {
-webkit-appearance: none;
background: #2e2e2e;
height: 1.8rem;
border-radius: 1rem;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance:none;
width: 0.6rem;
height: 1.8rem;
padding:0;
margin: 0;
background-color: #696969;
border-radius: 1rem;
}
input[type=range]::-webkit-slider-thumb:hover {
background-color: white;
}
input[type=range]:focus {
outline: none;
}
.sliderWrapper {
display: table;
padding: 0.4rem 0;
}
.property.range input[type=number] {
margin-left: 0.8rem;
width: 3.4rem;
height: 1.8rem;
}
.brushButton {
background-color: #2e2e2e;
border:none;
position: relative;
width: 80px;
margin: 1px 0px;
}
.checkbox {
margin: 0px;
}
.BrushIcon {
width: 100%;
height: 80px;
background-size: 75% 75%;
background-position: center;
background-repeat: no-repeat;
background-blend-mode: multiply;
background-image: url("../hifi/resources/icons/loadingDark.gif");
-webkit-mask-repeat: no-repeat;
}
#animatedBrush {
margin: 20px 0;
}
.selectedBrush {
position: relative;
}
#selectedOverlay {
background-color: rgba(16, 128, 184, 0.7);
top:0;
left:0;
width: 100%;
height: 100%;
position: absolute;
z-index: 1;
color: white;
font-size: 25px;
display: flex;
align-items: center;
justify-content: center;
}
#brushesCointainer {
margin-bottom: 50px;
margin-top: 24px;
}
.imageContainer {
display: block;
position: relative;
margin-bottom: 5px;
height: 80px;
}
.brushLabel {
display: block;
position: relative;
margin-bottom: 5px;
color: white;
width: 100%;
font-size: 12px;
z-index: 2;
word-wrap: break-word;
text-overflow: ellipsis;
}
#strokeWidthWidget {
position: fixed;
background-color: #404040;
display: flex;
z-index: 3;
width: 100%;
top: -1px;
margin: 0px;
padding: 15px 0px;
border: none;
padding-left: 21px;
left: 0px;
}
#pressureSensitiveCheckbox {
margin-left: 20px;
margin-top: 23px;
}
.animationBrush input[type=checkbox]:disabled + label,
.dynamicBrush input[type=checkbox]:disabled + label {
color: #202020;
}
.brushes-group[collapsed="true"] ~ .brushes-group,
.special-group[collapsed="true"] ~ .special-group {
display: none !important;
}
#brushesContent {
margin-top: 48px
}
.effectPreview {
width: 40px;
height: 18px;
background-color: red;
display: inline-block;
margin-right: 10px;
margin-top: 4px;
}
#continuousLineIcon {
text-align: center;
background-color: transparent;
color: white;
font-size: 32px;
margin-top: -6px;
}
</style>
<link rel="stylesheet" type="text/css" href="../hifi/css/edit-style.css">
<div id="strokeWidthWidget" class="property range">
<div>
<label style="display: block">Stroke Width</label>
<div class="sliderWrapper">
<input type="range" id="lineWidthRange" value=0.25 min=0 max=1 step=0.01 onchange="changeLineWidthRange(this)"/>
<input type="number" id="lineWidthText" value=0.25 min=0 max=1 step=0.01 onchange="changeLineWidthNumber(this)"/>
</div>
</div>
<div id="pressureSensitiveCheckbox" class="behavior-group property checkbox">
<input onchange="switchPressureSensitiveWidth(this)" type="checkbox" id="triggerSensitiveWidth"></input>
<label for="triggerSensitiveWidth">Trigger Sensitive Width</label>
</div>
</div>
<div id="brushesContent">
<div id="properties-list">
<fieldset class="major">
<legend id="special-section" class="section-header special-group special-section">
Special Effects<span>M</span>
</legend>
<div class="special-group special-brushes-section special-section">
<div class="special-group special-brushes property checkbox">
<span id="continuousLineIcon" class="glyph effectPreview">&#8734;</span>
<input onchange="setContinuosLineMode(this)" type="checkbox" id="continuousLine"></input>
<label for="continuousLine">Use Continuous Line</label>
</div>
<div class="special-group behavior-group property checkbox animationBrush">
<span id="animatedHue" class="effectPreview"></span>
<input onchange="setAnimatedBrush(this)" type="checkbox" id="animatedBrush"></input>
<label for="animatedBrush">Use Hue Animation</label>
</div>
<div class="special-group behavior-group property checkbox dynamicBrush">
<span id="hue" class="effectPreview"></span>
<input onchange="setDynamicBrush(this)" type="checkbox" id="dynamicHue"></input>
<label for="dynamicHue">Use Dynamic Hue</label>
</div>
<div class="special-group behavior-group property checkbox dynamicBrush">
<span id="saturation" class="effectPreview"></span>
<input onchange="setDynamicBrush(this)" type="checkbox" id="dynamicSaturation"></input>
<label for="dynamicSaturation">Use Dynamic Saturation</label>
</div>
<div class="special-group behavior-group property checkbox dynamicBrush">
<span id="value" class="effectPreview"></span>
<input onchange="setDynamicBrush(this)" type="checkbox" id="dynamicValue"></input>
<label for="dynamicValue">Use Dynamic Brightness</label>
</div>
</div>
</fieldset>
<fieldset class="major">
<legend id="brush-section" class="section-header brushes-group brushes-section">
Brushes<span>M</span>
</legend>
<div id="brushesCointainer" class="brushes-group">
<button class="brushButton" brushType="stretch" id="content/brushes/square.png" onclick="changePaintBrush(0)">
<div class="imageContainer">
<div imageSrc="../content/brushes/square.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Square</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/paintbrush6.png" onclick="changePaintBrush(1)">
<div class="imageContainer">
<div imageSrc="../content/brushes/paintbrush6.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Rounded</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/soft.png" onclick="changePaintBrush(2)">
<div class="imageContainer">
<div imageSrc="../content/brushes/soft.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Soft</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/dupuiz.png" onclick="changePaintBrush(3)">
<div class="imageContainer">
<div imageSrc="../content/brushes/dupuiz.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Tri</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/basic.png" onclick="changePaintBrush(4)">
<div class="imageContainer">
<div imageSrc="../content/brushes/basic.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Basic</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/oil.png" onclick="changePaintBrush(5)">
<div class="imageContainer">
<div imageSrc="../content/brushes/oil.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Oil</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/gouache.png" onclick="changePaintBrush(6)">
<div class="imageContainer">
<div imageSrc="../content/brushes/gouache.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Gouache A</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/gouache.png" onclick="changePaintBrush(7)">
<div class="imageContainer">
<div imageSrc="../content/brushes/gouacheB.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Gouache B</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/koons.png" onclick="changePaintBrush(8)">
<div class="imageContainer">
<div imageSrc="../content/brushes/koons.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Koons</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/sponge.png" onclick="changePaintBrush(9)">
<div class="imageContainer">
<div imageSrc="../content/brushes/sponge.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Sponge A</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/sponge.png" onclick="changePaintBrush(10)">
<div class="imageContainer">
<div imageSrc="../content/brushes/spongeB.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Sponge B</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/graphite.png" onclick="changePaintBrush(11)">
<div class="imageContainer">
<div imageSrc="../content/brushes/graphite.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Graphite</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/bristle.png" onclick="changePaintBrush(12)">
<div class="imageContainer">
<div imageSrc="../content/brushes/bristle.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Bristle</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/spat-fine.png" onclick="changePaintBrush(13)">
<div class="imageContainer">
<div imageSrc="../content/brushes/spat-fine.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Spat</div>
</button>
<button class="brushButton" brushType="stretch" id="content/brushes/gradient2.png" onclick="changePaintBrush(14)">
<div class="imageContainer">
<div imageSrc="../content/brushes/gradient2.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Gradient A</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/gradient2.png" onclick="changePaintBrush(15)">
<div class="imageContainer">
<div imageSrc="../content/brushes/gradient2.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Gradient B</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/dot.png" onclick="changePaintBrush(16)">
<div class="imageContainer">
<div imageSrc="../content/brushes/dot.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Dot</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/polka.png" onclick="changePaintBrush(17)">
<div class="imageContainer">
<div imageSrc="../content/brushes/polka.png" class="BrushIcon"/></div>
</div>
<div class="brushLabel">Polka</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/heart.png" onclick="changePaintBrush(18)">
<div class="imageContainer">
<div imageSrc="../content/brushes/heart.png" class="BrushIcon"/></div>
</div>
<div class="brushLabel">Heart</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/hearts.png" onclick="changePaintBrush(19)">
<div class="imageContainer">
<div imageSrc="../content/brushes/hearts.png" class="BrushIcon"/></div>
</div>
<div class="brushLabel">Hearts</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/flowers2.png" onclick="changePaintBrush(20)">
<div class="imageContainer">
<div imageSrc="../content/brushes/flowers2.png" class="BrushIcon"/></div>
</div>
<div class="brushLabel">Flowers</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/leaves.png" onclick="changePaintBrush(21)">
<div class="imageContainer">
<div imageSrc="../content/brushes/leaves.png" class="BrushIcon"/></div>
</div>
<div class="brushLabel">Leaves</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/snowflakes2.png" onclick="changePaintBrush(22)">
<div class="imageContainer">
<div imageSrc="../content/brushes/snowflakes2.png" class="BrushIcon"/></div>
</div>
<div class="brushLabel">Snowflakes</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/paintbrush1.png" onclick="changePaintBrush(23)">
<div class="imageContainer">
<div imageSrc="../content/brushes/paintbrush1.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Stars</div>
</button>
<button class="brushButton" colored="true" brushType="stretch" id="content/brushes/breakfast.png" onclick="changePaintBrush(24)">
<div class="imageContainer">
<div imageSrc="../content/brushes/breakfast.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Breakfast</div>
</button>
<button class="brushButton" colored="true" brushType="stretch" id="content/brushes/newton.png" onclick="changePaintBrush(25)">
<div class="imageContainer">
<div imageSrc="../content/brushes/newton.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Newton</div>
</button>
<button class="brushButton" colored="true" brushType="stretch" id="content/brushes/softy.png" onclick="changePaintBrush(26)">
<div class="imageContainer">
<div imageSrc="../content/brushes/softy.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Softbow</div>
<button class="brushButton" brushType="repeat" id="content/brushes/paw-print.png" onclick="changePaintBrush(27)">
<div class="imageContainer">
<div imageSrc="../content/brushes/paw-print.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">Paws</div>
</button>
<button class="brushButton" brushType="repeat" id="content/brushes/barbWire.png" onclick="changePaintBrush(28)">
<div class="imageContainer">
<div imageSrc="../content/brushes/barbWire.png" class="BrushIcon"></div>
</div>
<div class="brushLabel">KeepOut</div>
</button>
</button>
</fieldset>
</div>
</div>
</div>
</html>
<script type="text/javascript">
var ANIMATED_HUE_STEP = 1;
var currentBrush = 0;
var colorAnimPreviewInterval = null;
var currentAnimationColor = {h: 0, s: 100, b: 100};
colorAnimPreviewInterval = setInterval(setHueAnimationColorPreview, 30);
var EventBridge = parent.EventBridge;
function changeLineWidthRange(e) {
document.getElementById("lineWidthText").value = e.value;
notifyLineWidthChanged(e);
}
function changeLineWidthNumber(e) {
if (e.value > 1) {
document.getElementById("lineWidthText").value = 1;
}
if (e.value < 0) {
document.getElementById("lineWidthText").value = 0;
}
document.getElementById("lineWidthRange").value = e.value > 1 ? 1 : e.value;
document.getElementById("lineWidthRange").value = e.value < 0 ? 0 : e.value;
notifyLineWidthChanged(e);
}
function notifyLineWidthChanged(e) {
var changeLineWidthEvent = {
"type" : "changeLineWidth",
"brushWidth": e.value
};
EventBridge.emitWebEvent(JSON.stringify(changeLineWidthEvent));
}
function switchPressureSensitiveWidth(checkbox) {
// 'jscolor' instance can be used as a string
var switchPressureSensitiveWidthEvent = {
"type" : "switchTriggerPressureWidth",
"enabled" : checkbox.checked,
};
EventBridge.emitWebEvent(JSON.stringify(switchPressureSensitiveWidthEvent));
}
function changePaintBrush(brushIndex) {
var brushes = document.getElementById("brushesCointainer").children;
brushes[currentBrush].classList.remove("selectedBrush");
if (document.getElementById("selectedOverlay"))
document.getElementById("selectedOverlay").remove();
currentBrush = brushIndex;
brushes[currentBrush].classList.add("selectedBrush");
var selectedOverlay = document.createElement("div");
selectedOverlay.id = "selectedOverlay";
selectedOverlay.innerHTML = "&#x2714";
brushes[currentBrush].children[0].appendChild(selectedOverlay);
var changedBrushEvent = {
"type" : "changeBrush",
"brushName": brushes[currentBrush].id,
"brushType": brushes[currentBrush].getAttribute("brushType"),
"isColored": brushes[currentBrush].getAttribute("colored"),
"brushID" : brushIndex
};
EventBridge.emitWebEvent(JSON.stringify(changedBrushEvent));
}
function switchDynamicBrushEnabledStatus(checkbox) {
var isAnyAnimatedChecked = false;
$(".animationBrush").each(function( index ) {
isAnyAnimatedChecked |= $(this).find("input[type=checkbox]")[0].checked;
});
$(".dynamicBrush").each(function( index ) {
$(this).find("input[type=checkbox]")[0].disabled = isAnyAnimatedChecked;
});
}
function switchAnimationBrushEnabledStatus(checkbox) {
var isAnyDynamicChecked = false;
$(".dynamicBrush").each(function( index ) {
isAnyDynamicChecked |= $(this).find("input[type=checkbox]")[0].checked;
});
$(".animationBrush").each(function( index ) {
$(this).find("input[type=checkbox]")[0].disabled = isAnyDynamicChecked;
});
}
function setAnimatedBrush(checkbox) {
switchDynamicBrushEnabledStatus();
var switchAnimatedBrushEvent = {
"type" : "switchAnimatedBrush",
"animatedBrushName": "animatedHueBrush",
"enabled" : checkbox.checked,
"settings" : null,
"animatedBrushID" : checkbox.id
};
EventBridge.emitWebEvent(JSON.stringify(switchAnimatedBrushEvent));
}
function setDynamicBrush(checkbox) {
switchAnimationBrushEnabledStatus();
var switchDynamicBrushEvent = {
"type" : "switchDynamicBrush",
"enabled" : checkbox.checked,
"dynamicBrushId" : checkbox.id
};
EventBridge.emitWebEvent(JSON.stringify(switchDynamicBrushEvent));
}
function setContinuosLineMode(checkbox) {
var switchContinuousDrawModeEvent = {
"type" : "switchIsContinuous",
"enabled" : checkbox.checked,
};
EventBridge.emitWebEvent(JSON.stringify(switchContinuousDrawModeEvent));
}
function resizeImage(image, width, height) {
var height = height == width ? "80px" : "40px";
image.css("height", height);
image.first().css("background-image", "url(" + image.attr('imageSrc') + ")");
image.first().css("background-size", "contain");
image.first().css("background-position", "center");
if (height == "40px") {
image.first().css("top", "18px");
image.first().css("position", "absolute");
}
}
function setPreviewColors(id, hsvColor, num_steps, hsvComponent, min, max, start, step_size) {
var gradient_step = 100.0 / (num_steps - 1);
var previewColor = {h: hsvColor.h, s: hsvColor.s, b: hsvColor.b};
var gradientStr = "";
//generate the gradient string
previewColor[hsvComponent] = start;
for (var i = 0; i < num_steps; i++) {
gradientStr += "#" + $.colpick.hsbToHex({h: previewColor.h, s: previewColor.s, b: previewColor.b})
+ " " + (gradient_step * i).toFixed(1) + "%";
gradientStr += i < (num_steps - 1) ? ", " : "";
previewColor[hsvComponent] = start + (i + 1) * step_size;
previewColor[hsvComponent] = previewColor[hsvComponent] > max
? min + (previewColor[hsvComponent] % (max - min))
: previewColor[hsvComponent];
}
$(id).css("background", "-webkit-linear-gradient(left, " + gradientStr + ")");
}
function setHueAnimationColorPreview() {
currentAnimationColor.h += ANIMATED_HUE_STEP;
currentAnimationColor.h = currentAnimationColor.h > 360
? 360 - currentAnimationColor.h
: currentAnimationColor.h;
$("#animatedHue").css("background-color",
"#" + $.colpick.hsbToHex({h: currentAnimationColor.h, s: currentAnimationColor.s, b: currentAnimationColor.b}));
}
function setStrokeColor(strokeColor) {
$(".imageContainer").each(function( index ) {
//recalculate the image height so it keeps the aspect ratio
var image = new Image();
image.src = $(this).find('div').first().attr('imageSrc');
var img = $(this).find('div').first();
image.addEventListener("load", function(){
resizeImage(img, this.naturalWidth, this.naturalHeight);
});
if (!$(this).parent().attr("colored")) {
$(this).find('div').first().css("-webkit-mask-box-image",
"url(" + $(this).find('div').first().attr('imageSrc') + ")");
$(this).find('div').first().css("background-color",
"rgb(" + strokeColor.red + ", " + strokeColor.green + ", " + strokeColor.blue + ")");
}
});
var hsvColor = $.colpick.rgbToHsb({r: strokeColor.red, g: strokeColor.green, b: strokeColor.blue});
setPreviewColors("#hue", hsvColor, 7, "h", 0, 360, hsvColor.h, 60);
setPreviewColors("#saturation", hsvColor, 2, "s", 50, 100, 100, 50);
setPreviewColors("#value", hsvColor, 2, "b", 60, 100, 100, 60);
currentAnimationColor = {h: hsvColor.h, s: hsvColor.s, b: hsvColor.b};
}
restoreSavedBrushes(JSON.parse(decodeURIComponent(window.parent.location.search).substring(1)));
function restoreSavedBrushes(brushData) {
if ("currentTexture" in brushData) {
changePaintBrush(brushData.currentTexture.brushID);
}
if ("currentAnimatedBrushes" in brushData) {
var animatedBrushes = brushData.currentAnimatedBrushes;
for (var i = 0; i < animatedBrushes.length; i++) {
document.getElementById(animatedBrushes[i]).checked = true;
//Fix for onchange not being called (this appears to be the only checkbox where this happens)
$("#" + animatedBrushes[i]).trigger("change");
}
switchDynamicBrushEnabledStatus();
}
if ("currentDynamicBrushes" in brushData) {
for(var key in brushData.currentDynamicBrushes) {
document.getElementById(key).checked = brushData.currentDynamicBrushes[key];
}
switchAnimationBrushEnabledStatus();
}
if ("currentColor" in brushData) {
setStrokeColor(brushData.currentColor);
}
if ("currentStrokeWidth" in brushData) {
document.getElementById("lineWidthRange").value = brushData.currentStrokeWidth;
changeLineWidthRange({value: brushData.currentStrokeWidth});
changeLineWidthNumber({value: brushData.currentStrokeWidth});
}
if ("currentTriggerWidthEnabled" in brushData) {
document.getElementById("triggerSensitiveWidth").checked = brushData.currentTriggerWidthEnabled;
}
if ("currentIsContinuous" in brushData) {
document.getElementById("continuousLine").checked = brushData.currentIsContinuous;
}
if ("currentHeadersCollapsedStatus" in brushData) {
for (var key in brushData.currentHeadersCollapsedStatus) {
var element = document.getElementById(key);
if (brushData.currentHeadersCollapsedStatus[key]) {
element.setAttribute("collapsed", "true");
element.getElementsByTagName("span")[0].textContent ="L";
}
}
}
}
window.addEventListener("message", receiveStrokeColor, false);
function receiveStrokeColor(message) {
var event = JSON.parse(message.data);
setStrokeColor(event.value);
}
$(window).load(function(){
setUpKeyboardControl();
// Collapsible sections
var elCollapsible = document.getElementsByClassName("section-header");
var toggleCollapsedEvent = function(event) {
var element = event.target;
var isCollapsed = element.getAttribute("collapsed") !== "true";
element.setAttribute("collapsed", isCollapsed ? "true" : "false");
element.getElementsByTagName("span")[0].textContent = isCollapsed ? "L" : "M";
var switchCollapsedState = {
"type" : "switchCollapsed",
"isCollapsed": isCollapsed,
"sectionId" : element.getAttribute("id")
};
EventBridge.emitWebEvent(JSON.stringify(switchCollapsedState));
};
for (var i = 0, length = elCollapsible.length; i < length; i++) {
var element = elCollapsible[i];
element.addEventListener("click", toggleCollapsedEvent, true);
};
});
window.onbeforeunload = function(){
clearInterval(colorAnimPreviewInterval);
}
</script>

View file

@ -0,0 +1,127 @@
<!DOCTYPE html>
<html>
<link rel="stylesheet" type="text/css" href="../hifi/css/edit-style.css">
<style type="text/css">
@font-face {
font-family: Font-Awesome;
src: url(../hifi/fonts/fontawesome-webfont.ttf),
url(../../../../resources/fonts/fontawesome-webfont.ttf),
url(../../../../fonts/fontawesome-webfont.ttf),
url(../../../../interface/resources/fonts/fontawesome-webfont.ttf);
}
.changeHandButton {
width: 216px;
height: 216px;
color: white !important;
background-color: #2e2e2e;
border: none;
float: left;
margin: 2px;
text-transform: uppercase;
font-size: 100px;
background-image: url("../content/tabicons/hand-icon.svg");
background-size: 60% 60%;
background-repeat: no-repeat;
background-position: center;
}
.deleteButton {
color: white;
background-color: #bf0b29;
border: black solid 1px;
font-size: 16px;
width: 200px;
/* font-weight: bold; */
height: 40px;
text-align: center;
margin: 0 auto;
display: block;
}
.mt-mb-20 {
margin: 20 0 !important;
padding-top: 20px !important;
}
.pt-pb-20 {
padding-bottom: 20px !important;
}
.pt-20 {
padding-top: 20px !important;
}
.changeHandButton:first-child {
margin-left: 0px;
}
.changeHandButton:last-child {
margin-right: 0px;
}
#left {
transform: scale(-1, 1);
}
.selectedHand {
background-color: rgb(16, 128, 184);
}
</style>
<div class="pt-pb-20">
<form>
<input type="radio" name="paintingOptions" onclick="choosePaintingOption('paint_world')" checked>Draw on World<br>
<input type="radio" name="paintingOptions" onclick="choosePaintingOption('paint_self')">Draw on Myself<br>
<input type="radio" name="paintingOptions" onclick="choosePaintingOption('paint_others')">Draw on Other People
</form>
</div>
<div id="handButtonsContainer pt-pb-20" >
<button class="changeHandButton" id="left" onclick="chooseHand(0)"></button>
<button class="changeHandButton selectedHand" id="right" onclick="chooseHand(1)"></button>
</div>
<div class="pt-20">
<div class="pt-pb-20 mt-mb-20">
<button class="deleteButton btn" onclick="deleteAll()">Delete All</button>
</div>
</div>
</html>
<script type="text/javascript">
var currentHand = 1;
var EventBridge = parent.EventBridge;
function chooseHand(handIndex) {
handButtons = document.getElementById("handButtonsContainer").children;
handButtons[currentHand].classList.remove("selectedHand");
currentHand = handIndex;
handButtons[currentHand].classList.add("selectedHand");
var chooseHandEvent = {
"type" : "changeBrushHand",
"DrawingHand": handButtons[handIndex].id
};
EventBridge.emitWebEvent(JSON.stringify(chooseHandEvent));
}
restoreCurrentDrawingHand(JSON.parse(decodeURIComponent(window.parent.location.search).substring(1)));
function restoreCurrentDrawingHand(handData) {
if (handData.currentDrawingHand) {
chooseHand(0);
} else {
chooseHand(1);
}
}
function choosePaintingOption (optionName) {
var chooseOptionEvent = {
"type" : "changePaintMode",
"option" : optionName
};
EventBridge.emitWebEvent(JSON.stringify(chooseOptionEvent));
// options
// PAINT_WORLD = "paint_world",
// PAINT_SELF = "paint_self",
// PAINT_OTHERS = "paint_others",
// _paintMode = PAINT_WORLD,
}
function deleteAll () {
var chooseOptionEvent = {
"type" : "deleteAll"
};
EventBridge.emitWebEvent(JSON.stringify(chooseOptionEvent));
}
</script>

View file

@ -0,0 +1,244 @@
<!DOCTYPE html>
<html>
<link rel="stylesheet" type="text/css" href="../hifi/css/edit-style.css">
<link rel="stylesheet" type="text/css" href="../hifi/css/colpick.css">
<script type="text/javascript" src="../hifi/js/eventBridgeLoader.js"></script>
<script type="text/javascript" src="../hifi/js/keyboardControl.js"></script>
<script src="../hifi/js/jquery-2.1.4.min.js"></script>
<style>
#colorPicker {
display: grid;
}
.colorPickerCell {
border: none;
width: 20px;
height: 20px;
display: inline-block;
}
#colorPickerTable {
margin-top: 24px;
border-collapse:collapse
}
#customColorPicker {
height: 50px;
}
.colorPickerCell {
position: relative;
}
#selectedOverlay {
text-align: center;
font-size: 12px;
line-height: 20px;
color: white;
background-color: rgba(16, 128, 184, 0.3);
top:0;
left:0;
width: 100%;
height: 100%;
position: absolute;
z-index: 1;
}
</style>
<div id="colorpicker"></div>
<div id="colorPickerTable"></div>
<div id="lastPickedColors"></div>
</html>
<script src="../hifi/js/colpick.js">
require('jquery-colpick');
</script>
<script>
$('#colorpicker').colpick({
flat:true,
layout:'full',
colorScheme:'dark',
submitText: 'Add custom color',
onChange: function(hsb, hex, rgb, el) {
updateFromCustomPicker([rgb.r, rgb.g, rgb.b])
},
onSubmit: function(hsb, hex, rgb, el) {
addColorFromCustomPicker(rgb)
}
});
var COLUMNS = 18, ROWS = 10;
var lastSelectedButton = null;
var currentSelectedColorOrigin = "custom"; //where the color was picked from
var EventBridge = parent.EventBridge;
function addColors() {
//10-90%
var startingColors = [];
for (var i = 0; i < COLUMNS; i++) {
var hsl = new Object();
hsl.hue = 340*i/(COLUMNS-1) + 10;
startingColors.push(hsl);
}
var colorPickerLayout = document.getElementById("colorPickerTable");
for (var j = 0; j < ROWS; j++) {
var row = document.createElement("div");
for (var i = 0; i < startingColors.length; i++) {
var colorCell = document.createElement("div");
//colorCell.type = "button";
colorCell.style.backgroundColor = "hsl(" + startingColors[i].hue
+ ",100%," + ((80-(80*j/(ROWS-1))) + 10) + "%)";
colorCell.className = "colorPickerCell";
colorCell.onclick = function() {
updateColorFromTable(this, "table")
};
row.appendChild(colorCell);
}
colorPickerLayout.appendChild(row);
}
//make it easier to select later the current color
$(".colorPickerCell").each(function() {
var colorArray = window.getComputedStyle($(this)[0]).backgroundColor.match(/\d+/g);
$(this).attr("id", "table(" + colorArray[0] + "," + colorArray[1] + "," + colorArray[2] + ")");
});
}
addColors();
function clampColors(colorArray) {
colorArray[0] = Math.min(Math.max(colorArray[0], 0), 255);
colorArray[1] = Math.min(Math.max(colorArray[1], 0), 255);
colorArray[2] = Math.min(Math.max(colorArray[2], 0), 255);
$('#colorpicker').colpickSetColor({'r': colorArray[0], 'g': colorArray[1], 'b': colorArray[2]}, true);
}
function update(colorArray) {
// 'jscolor' instance can be used as a string
var changedColorEvent = {
"type" : "changeColor",
"red" : colorArray[0],
"green" : colorArray[1],
"blue" : colorArray[2],
"origin" : currentSelectedColorOrigin,
};
setColorInTable(colorArray);
EventBridge.emitWebEvent(JSON.stringify(changedColorEvent));
}
function updateFromCustomPicker(colorArray) {
if (colorArray[0] != Math.min(Math.max(colorArray[0], 0), 255)
|| colorArray[1] != Math.min(Math.max(colorArray[1], 0), 255)
|| colorArray[2] != Math.min(Math.max(colorArray[2], 0), 255)) {
clampColors(colorArray);
return;
}
var tableColor = document.getElementById("table(" + colorArray[0] + "," + colorArray[1] + "," + colorArray[2] + ")");
var userColor = document.getElementById("user(" + colorArray[0] + "," + colorArray[1] + "," + colorArray[2] + ")");
if (tableColor) {
currentSelectedColorOrigin = "table";
} else if (userColor) {
currentSelectedColorOrigin = "user";
} else {
currentSelectedColorOrigin = "custom";
}
update(colorArray);
}
function selectButton(button) {
if (lastSelectedButton != null) {
lastSelectedButton.removeChild(document.getElementById("selectedOverlay"));
}
if (button) {
var selectedOverlay = document.createElement("div");
selectedOverlay.id = "selectedOverlay";
selectedOverlay.innerHTML = "&#x2714";
button.appendChild(selectedOverlay);
lastSelectedButton = button;
} else {
lastSelectedButton = null;
}
}
function updateColorFromTable(button, origin) {
var colorArray = window.getComputedStyle(button).backgroundColor.match(/\d+/g);
$('#colorpicker').colpickSetColor({'r': colorArray[0], 'g': colorArray[1], 'b': colorArray[2]}, true);
currentSelectedColorOrigin = origin;
update(colorArray);
}
function addColorFromCustomPicker(rgbColor) {
currentSelectedColorOrigin = "user";
var colorArray = [rgbColor.r, rgbColor.g, rgbColor.b];
addCustomColor(colorArray, true);
update(colorArray);
}
function addCustomColor(colorArray, notify) {
var lastPickedColorsContainer = document.getElementById("lastPickedColors");
var lastPickedColors = lastPickedColorsContainer.children;
for (var i = 0; i < lastPickedColors.length; i++) {
var lasPickedCellColor = window.getComputedStyle(lastPickedColors[i]).backgroundColor.match(/\d+/g);
var equalRgbComponentsCount = 0;
for (var j = 0; j < 3; j++) {
if (lasPickedCellColor[j] == colorArray[j])
equalRgbComponentsCount++;
if (equalRgbComponentsCount == 3) //the color is the same so we won't add it!
return;
}
}
if (lastPickedColors.length + 1 > COLUMNS) {
lastPickedColorsContainer.removeChild(lastPickedColors[lastPickedColors.length-1]);
}
var colorCell = document.createElement("div");
colorCell.style.backgroundColor = "rgb(" + colorArray[0] + "," + colorArray[1] + "," + colorArray[2] + ")";
colorCell.className = "colorPickerCell";
colorCell.id = "user(" + colorArray[0] + "," + colorArray[1] + "," + colorArray[2] + ")";
colorCell.onclick = function() { updateColorFromTable(this, "user") };
lastPickedColorsContainer.insertBefore(colorCell, lastPickedColorsContainer.firstChild);
if (notify) {
var addCustomColorEvent = {
"type" : "addCustomColor",
"maxColors": COLUMNS,
"red" : colorArray[0],
"green" : colorArray[1],
"blue" : colorArray[2]
};
EventBridge.emitWebEvent(JSON.stringify(addCustomColorEvent));
}
}
restoreLastColor(JSON.parse(decodeURIComponent(window.parent.location.search).substring(1)));
function restoreLastColor(palleteData) {
if ("customColors" in palleteData) {
var customColors = palleteData.customColors;
for (var i = 0; i < customColors.length; i++) {
addCustomColor([customColors[i].red, customColors[i].green, customColors[i].blue], false);
}
}
if ("currentColor" in palleteData) {
var newColor = palleteData.currentColor;
$('#colorpicker').colpickSetColor({'r': newColor.red, 'g': newColor.green, 'b': newColor.blue}, true);
currentSelectedColorOrigin = newColor.origin;
setColorInTable([newColor.red, newColor.green, newColor.blue]);
}
}
function setColorInTable(colorArray) {
var color = document.getElementById(currentSelectedColorOrigin + "(" + colorArray[0] + "," + colorArray[1] + "," + colorArray[2] + ")");
selectButton(color);
}
$(window).load(function(){
setUpKeyboardControl();
});
</script>

View file

@ -0,0 +1,139 @@
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="../hifi/js/jquery-2.1.4.min.js"></script>
<link rel="stylesheet" type="text/css" href="../hifi/css/edit-style.css">
<link rel="stylesheet" href="../content/glyphs/styles.css">
<style>
@font-face {
font-family: Font-Awesome;
src: url(../hifi/fonts/fontawesome-webfont.ttf),
url(../../../../resources/fonts/fontawesome-webfont.ttf),
url(../../../../fonts/fontawesome-webfont.ttf),
url(../../../../interface/resources/fonts/fontawesome-webfont.ttf);
}
iframe {
height:100%;
width:100%;
position: absolute;
}
#tabs {
background-color: black;
}
.tabButton {
background-color: #000;
color: white;
font-size: 14px;
line-height: 24px;
padding: 12px;
margin: 0px;
vertical-align: middle;
display: inline-flex;
user-select: none;
}
.tabIcon {
width: 24px;
height: 24px;
padding-right: 8px;
}
.icon {
font-size: 24px;
}
.selected {
background-color: #404040;
}
#undoButton {
float: right;
border: 2px solid white;
height: 32px;
width: 32px;
font-size: 15px;
margin-top: 10px;
transform: scale(-1, 1);
}
</style>
</head>
<body style="margin:0px;padding:0px;overflow:hidden">
<div id="tabs">
<div class="tabButton" onclick="selectTab(0)"><img class="tabIcon" src="../content/tabicons/palette-icon.svg"/>Palette</div>
<div class="tabButton" onclick="selectTab(1)"><img class="tabIcon" src="../content/tabicons/brush-icon.svg"/>Brushes</div>
<div class="tabButton" onclick="selectTab(2)"><div class="tabIcon icon icon-edit"></div>Options</div>
<input type="button" onclick="undo()" id="undoButton" style="font-family: Font-Awesome;" disabled class="grayButton glyph" value="&#xf064;"/>
</div>
<div id="content">
<iframe frameborder="0" lastState="window.location.search" onload="frameLoaded(this)" src="colorsTab.html" id="colorTab" seamless></iframe>
<iframe frameborder="0" lastState="window.location.search" onload="frameLoaded(this)" src="brushesTab.html" id="brushesTab" seamless style="display: none"></iframe>
<iframe frameborder="0" lastState="window.location.search" onload="frameLoaded(this)" src="chooseHandTab.html" id="chooseHandTab" seamless style="display: none"></iframe>
</div>
</body>
</html>
<script type="text/javascript">
var currentTab = 0;
var iframesLoaded = 0;
function selectTab(tabIndex) {
var tabs = document.getElementById("tabs").children;
var contentPanels = document.getElementById("content").children;
tabs[currentTab].classList.remove("selected");
contentPanels[currentTab].style.display = "none";
contentPanels[tabIndex].style.display = "block";
tabs[tabIndex].classList.add("selected");
currentTab = tabIndex;
var changeTabEvent = {
"type" : "changeTab",
"currentTab": tabIndex
};
EventBridge.emitWebEvent(JSON.stringify(changeTabEvent));
}
function frameLoaded(iframe) {
iframesLoaded++;
if (iframesLoaded == $("#content").children().length) {
var appReadyEvent = {
"type" : "appReady",
};
EventBridge.emitWebEvent(JSON.stringify(appReadyEvent));
}
}
EventBridge.scriptEventReceived.connect(function (message) {
var event = JSON.parse(message);
if (event.type == "undoDisable") {
setUndoState(event.value);
}
if (event.type == "changeStrokeColor") {
document.getElementById("brushesTab").contentWindow.postMessage(message, "*");
}
});
//restore last opened tab
selectTab(JSON.parse(decodeURIComponent(window.location.search).substring(1)).currentTab);
//Undo related logic
function setUndoState(disabled) {
if (!disabled) {
document.getElementById("undoButton").removeAttribute("disabled");
} else {
document.getElementById("undoButton").setAttribute("disabled", disabled);
}
}
function undo() {
var undoEvent = {"type": "undo"};
EventBridge.emitWebEvent(JSON.stringify(undoEvent));
}
window.onbeforeunload = function (e) {
var reloadPageEvent = {
"type" : "reloadPage",
};
EventBridge.emitWebEvent(JSON.stringify(reloadPageEvent));
};
var undoState = JSON.parse(decodeURIComponent(window.location.search).substring(1));
setUndoState(undoState.undoDisable);
</script>

View file

@ -153,6 +153,24 @@ var metadata = { "applications":
"icon": "home/appicon_i.png",
"caption": "HOME"
},
{
"isActive": true,
"directory": "BodyPaint4",
"name": "Body Paint",
"description": "Paint with your finger in VR, or with mouse in desktop mode.<br> You can paint in free space, on yourself, or even on other avatars, it's the fastest way to put cat-ears on all your friends.",
"jsfile": "BodyPaint4/bodyPaint4.js",
"icon": "BodyPaint4/content/appicons/body-paint-i.svg",
"caption": "BODY PAINT"
},
{
"isActive": true,
"directory": "tabletCam",
"name": "Camera Snap-Pro",
"description": "The Camera 'Snap-Pro' allows you to take high quality in-world photos and selfies (Low, Normal, 4K, and 'EXTREME' resolution). It has two cameras on the tablet, front-facing/rear-facing, and one detachable to allow more flexibility. It supports different aspect ratio formats: 8x10, 2x3, 9x16 and 'Square'. It comes with an Optical Zoom, a trigger on the VR hand controller and other features.",
"jsfile": "tabletCam/tabletCam_app.js",
"icon": "tabletCam/appIcons/snap-pro-i.svg",
"caption": "SNAP-PRO"
},
{
"isActive": true,
"directory": "cam360",

View file

@ -0,0 +1,77 @@
# Tablet Cam
## Note
This was a personal project by [Zach Fox](https://github.com/zfox23/), a member of the High Fidelity Experiences Team. It has not undergone the same code review or QA process as the rest of the projects in this repository.
## Description
The Tablet Cam app allows you to **easily take selfies and regular photos in High Fidelity/Overte** using your Tablet or hand controllers!
## Features
- **Front-facing and rear-facing** cameras and flashes with optional **custom positioning**
- Works in **Desktop Mode and in VR Mode**
- **Persistent "Camera Roll"** for reviewing photos that you recently took
- Optical **zoom**
- Photo **quality settings**: Low, Normal, 4k, and _EXTREME_!
- **Aspect ratio settings**: 8x10, 2x3, 9x16, Square
- Editable photo directory
## Changelog
### v2.4 (2022-08-22) by Alezia Kurdis
- Fixed a bug in HMD where the rear-facing camera was pointed to the tablet instead of the scene.
- Replaced the camera model by a new one (nicer and less heavy, 198k instead of 576k, less but more optimal polygons, 1 PBR material.)
- Rebranded the tool: Camera Snap-Pro
- Replaced the icons for something more easy to identify as a device to take picture ("camera"), as an advance version of the "Snap" app.
- Added a notice in the settings page to informe the user about the trigger on the thumbstick of the right VR hand controller.
### v2.3 (2019-10-15)
- Removed unnecessary tone curve correction present in captured Tablet Cam output image.
- Adjusted y-offset of Desktop-mode selfie cam to better serve Virtual You avatars.
- Added `"Head"` as a backup joint to `"HeadTop_End"` for certain operations.
### v2.2 (2019-07-09)
- Fixed a hack in which the secondary camera feed was darkened to compensate for it being rendered too light.
- If your camera looks too light, it means you have an older version of Interface (pre PR #15862) and should go back to the previous version of this script.
- If your camera looks too dark, it means you have a newer version of Interface (post PR #15682) and should update to the current version of this script.
### v2.1 (2019-06-27)
- We've moved the code for this project into a new remote folder, which necessitated a version bump. There are no changes to functionality.
### v2.0 (2019-04)
**I've made some huge changes in v2.0!**
- In Desktop mode, when using the rear-facing camera and while you're using Third Person Camera, Tablet Cam will now be parented to Interface's Third Person Camera!
- The camera's viewpoint can now be detached from its default position! Snap a photo from a unique viewpoint.
- Fixed a bug that caused zoom settings to be saved incorrectly between restarts.
- Fixed a bug that caused the camera preview to show up as a corrupted image in HMD mode.
- Fixed a bug that caused the position of the rear-facing camera to be incorrect in HMD mode.
- Switched Overlay usage to Local Entities.
- Now you can use Tablet Cam in Desktop mode while "Desktop Tablet becomes Toolbar" is unchecked - although I'm not sure why you'd want to do that. :)
- Fixed some interface bugs.
### v1.1 (2019-02)
- Fixed a bug that caused Tablet Cam to erroneously appear on the Tablet after switching domains when it was previously active.
### Tablet Cam v1.0 (2019-01)
- Tablet Cam v1.0 is an update to Selfie Cam v1.0. It is a complete overhaul of the app. All of its features are new!
### Selfie Cam v1.0 (2018-12)
- Initial Release!
## Attributions
- "snap.wav" from "Camera Shutter, Fast, A.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org
- "switchCams.svg" from "rotate camera" by Diego Naive from the Noun Project
- "orientation.svg" from "orientation" by Atif Arshad from the Noun Project
- "camera.fbx" from "Digital camera" by Nick Ladd: https://poly.google.com/view/4A3SYVh_smq
- "camera-a.svg" and "camera-i.svg" from "Selfie" by Path Lord from the Noun Project

View file

@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="50"
height="50"
viewBox="0 0 13.229167 13.229167"
version="1.1"
id="svg5"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="snap-pro-a.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title7500">snap-pro-a</title>
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
showguides="false"
units="px"
width="50px"
inkscape:zoom="6.0007856"
inkscape:cx="65.408102"
inkscape:cy="39.828118"
inkscape:window-width="1628"
inkscape:window-height="932"
inkscape:window-x="1690"
inkscape:window-y="22"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<symbol
id="u"
overflow="visible">
<path
d="m 14.656,-0.875 c -0.76172,0.39844 -1.5547,0.69531 -2.375,0.89062 -0.8125,0.19531 -1.6641,0.29688 -2.5469,0.29688 -2.6562,0 -4.7617,-0.73828 -6.3125,-2.2188 -1.5547,-1.4883 -2.3281,-3.5039 -2.3281,-6.0469 0,-2.5508 0.77344,-4.5664 2.3281,-6.0469 1.5508,-1.4883 3.6562,-2.2344 6.3125,-2.2344 0.88281,0 1.7344,0.10156 2.5469,0.29688 0.82031,0.19922 1.6133,0.49609 2.375,0.89062 v 3.2969 c -0.76172,-0.51953 -1.5117,-0.89844 -2.25,-1.1406 -0.74219,-0.23828 -1.5234,-0.35938 -2.3438,-0.35938 -1.4688,0 -2.625,0.46875 -3.4688,1.4062 -0.83594,0.9375 -1.25,2.2344 -1.25,3.8906 0,1.6484 0.41406,2.9375 1.25,3.875 0.84375,0.9375 2,1.4062 3.4688,1.4062 0.82031,0 1.6016,-0.11719 2.3438,-0.35938 0.73828,-0.23828 1.4883,-0.61719 2.25,-1.1406 z"
id="path824" />
</symbol>
<symbol
id="b"
overflow="visible">
<path
d="m 10.719,-8.7031 c -0.33594,-0.15625 -0.66797,-0.26953 -1,-0.34375 -0.32422,-0.082031 -0.65625,-0.125 -1,-0.125 -0.98047,0 -1.7344,0.32031 -2.2656,0.95312 -0.53125,0.625 -0.79688,1.5273 -0.79688,2.7031 V -3e-5 h -3.8125 v -11.969 h 3.8125 v 1.9688 c 0.48828,-0.78125 1.0508,-1.3477 1.6875,-1.7031 0.64453,-0.36328 1.4102,-0.54688 2.2969,-0.54688 0.13281,0 0.27344,0.0078 0.42188,0.01563 0.14453,0.01172 0.36328,0.03125 0.65625,0.0625 z"
id="path827" />
</symbol>
<symbol
id="a"
overflow="visible">
<path
d="m 13.781,-6.0156 v 1.0938 H 4.8435 c 0.09375,0.89844 0.41406,1.5703 0.96875,2.0156 0.55078,0.44922 1.3281,0.67188 2.3281,0.67188 0.80078,0 1.625,-0.11719 2.4688,-0.35938 0.84375,-0.23828 1.7109,-0.59766 2.6094,-1.0781 v 2.9531 c -0.90625,0.33594 -1.8125,0.58984 -2.7188,0.76562 -0.9063,0.17578 -1.8125,0.26562 -2.7188,0.26562 -2.1562,0 -3.8398,-0.54688 -5.0469,-1.6406 -1.1992,-1.1016 -1.7969,-2.6484 -1.7969,-4.6406 0,-1.9453 0.58594,-3.4766 1.7656,-4.5938 1.1758,-1.125 2.8008,-1.6875 4.875,-1.6875 1.875,0 3.375,0.57031 4.5,1.7031 1.1328,1.125 1.7031,2.6367 1.7031,4.5312 z M 9.8435,-7.2812 c 0,-0.72656 -0.21484,-1.3125 -0.64062,-1.75 -0.41797,-0.44531 -0.96875,-0.67188 -1.6562,-0.67188 -0.74219,0 -1.3438,0.21094 -1.8125,0.625 -0.46094,0.41797 -0.74609,1.0156 -0.85938,1.7969 z"
id="path830" />
</symbol>
<symbol
id="d"
overflow="visible">
<path
d="m 7.2031,-5.3906 c -0.80469,0 -1.4062,0.13672 -1.8125,0.40625 -0.39844,0.27344 -0.59375,0.67188 -0.59375,1.2031 0,0.48047 0.16016,0.85938 0.48438,1.1406 0.32031,0.27344 0.77344,0.40625 1.3594,0.40625 0.71875,0 1.3203,-0.25391 1.8125,-0.76562 0.48828,-0.51953 0.73438,-1.1719 0.73438,-1.9531 v -0.4375 z m 5.8438,-1.4375 V 0 H 9.1875 v -1.7656 c -0.51172,0.71875 -1.0898,1.2461 -1.7344,1.5781 -0.63672,0.33203 -1.418,0.5 -2.3438,0.5 -1.2422,0 -2.2461,-0.35938 -3.0156,-1.0781 -0.77344,-0.72656 -1.1562,-1.6719 -1.1562,-2.8281 0,-1.3945 0.47656,-2.4219 1.4375,-3.0781 0.96875,-0.65625 2.4883,-0.98438 4.5625,-0.98438 h 2.25 v -0.29688 c 0,-0.60156 -0.24219,-1.0469 -0.71875,-1.3281 -0.48047,-0.28125 -1.2266,-0.42188 -2.2344,-0.42188 -0.8125,0 -1.5742,0.085937 -2.2812,0.25 -0.71094,0.15625 -1.3672,0.40234 -1.9688,0.73438 v -2.9219 c 0.82031,-0.19531 1.6445,-0.34766 2.4688,-0.45312 0.82031,-0.10156 1.6484,-0.15625 2.4844,-0.15625 2.1562,0 3.7109,0.42969 4.6719,1.2812 0.95703,0.84375 1.4375,2.2266 1.4375,4.1406 z"
id="path833" />
</symbol>
<symbol
id="c"
overflow="visible">
<path
d="m 6.0156,-15.359 v 3.3906 H 9.9531 V -9.234 H 6.0156 v 5.0781 c 0,0.55469 0.10938,0.92969 0.32812,1.125 0.21875,0.19922 0.65625,0.29688 1.3125,0.29688 h 1.9688 v 2.7344 h -3.2812 c -1.5117,0 -2.5859,-0.3125 -3.2188,-0.9375 -0.625,-0.63281 -0.9375,-1.707 -0.9375,-3.2188 v -5.0781 h -1.9062 v -2.7344 h 1.9062 v -3.3906 z"
id="path836" />
</symbol>
<symbol
id="g"
overflow="visible">
<path
d="m 9.9688,-10.219 v -6.4062 h 3.8594 V -2e-4 H 9.9688 V -1.7346 C 9.44536,-1.02366 8.8672,-0.5041 8.2344,-0.1721 7.59768,0.14821 6.8633,0.31228 6.0313,0.31228 c -1.4688,0 -2.6797,-0.58203 -3.625,-1.75 -0.94922,-1.1758 -1.4219,-2.6875 -1.4219,-4.5312 0,-1.8437 0.47266,-3.3477 1.4219,-4.5156 0.94531,-1.1758 2.1562,-1.7656 3.625,-1.7656 0.83203,0 1.5664,0.16797 2.2031,0.5 0.63281,0.32422 1.2109,0.83594 1.7344,1.5312 z m -2.5156,7.75 c 0.82031,0 1.4453,-0.29688 1.875,-0.89062 0.42578,-0.60156 0.64062,-1.4727 0.64062,-2.6094 0,-1.1445 -0.21484,-2.0156 -0.64062,-2.6094 -0.42969,-0.59375 -1.0547,-0.89062 -1.875,-0.89062 -0.8125,0 -1.4336,0.29688 -1.8594,0.89062 -0.42969,0.59375 -0.64062,1.4648 -0.64062,2.6094 0,1.1367 0.21094,2.0078 0.64062,2.6094 0.42578,0.59375 1.0469,0.89062 1.8594,0.89062 z"
id="path839" />
</symbol>
<symbol
id="k"
overflow="visible">
<path
d="m 8.2031,-2.4688 c 0.82031,0 1.4453,-0.29688 1.875,-0.89062 0.42578,-0.60156 0.64062,-1.4727 0.64062,-2.6094 0,-1.1445 -0.21484,-2.0156 -0.64062,-2.6094 -0.42969,-0.59375 -1.0547,-0.89062 -1.875,-0.89062 -0.82422,0 -1.4531,0.30469 -1.8906,0.90625 -0.4375,0.59375 -0.65625,1.4609 -0.65625,2.5938 0,1.1367 0.21875,2.0078 0.65625,2.6094 0.4375,0.59375 1.0664,0.89062 1.8906,0.89062 z m -2.5469,-7.75 c 0.53125,-0.69531 1.1133,-1.207 1.75,-1.5312 0.64453,-0.33203 1.3828,-0.5 2.2188,-0.5 1.4688,0 2.6758,0.58984 3.625,1.7656 0.94531,1.168 1.4219,2.6719 1.4219,4.5156 0,1.8437 -0.47656,3.3555 -1.4219,4.5312 -0.94922,1.168 -2.1562,1.75 -3.625,1.75 -0.83594,0 -1.5742,-0.16797 -2.2188,-0.5 -0.63672,-0.33203 -1.2188,-0.84766 -1.75,-1.5469 V -1e-4 H 1.8437 v -16.625 h 3.8125 z"
id="path842" />
</symbol>
<symbol
id="j"
overflow="visible">
<path
d="m 0.26562,-11.969 h 3.8281 l 3.2188,8.125 2.7344,-8.125 h 3.8125 L 8.82822,1.125 c -0.5,1.332 -1.0898,2.2656 -1.7656,2.7969 -0.66797,0.53125 -1.5547,0.79688 -2.6562,0.79688 h -2.2188 v -2.5 h 1.2031 c 0.64453,0 1.1133,-0.10547 1.4062,-0.3125 C 5.0977,1.69534 5.32817,1.32816 5.48442,0.79688 L 5.5938,0.45313 Z"
id="path845" />
</symbol>
<symbol
id="i"
overflow="visible">
<path
d="M 2.0156,-15.953 H 6.125 V 0 H 2.0156 Z"
id="path848" />
</symbol>
<symbol
id="f"
overflow="visible">
<path
d="M 13.859,-7.2812 V 0 h -3.8438 v -5.5781 c 0,-1.0312 -0.027344,-1.7383 -0.078125,-2.125 -0.042969,-0.39453 -0.12109,-0.6875 -0.23438,-0.875 -0.14844,-0.25 -0.35156,-0.44141 -0.60938,-0.57812 -0.25,-0.14453 -0.54297,-0.21875 -0.875,-0.21875 -0.79297,0 -1.418,0.3125 -1.875,0.9375 -0.46094,0.61719 -0.6875,1.4648 -0.6875,2.5469 V 3e-5 h -3.8125 v -11.969 h 3.8125 v 1.75 c 0.58203,-0.69531 1.1953,-1.207 1.8438,-1.5312 0.64453,-0.33203 1.3594,-0.5 2.1406,-0.5 1.3828,0 2.4297,0.42969 3.1406,1.2812 0.71875,0.84375 1.0781,2.0742 1.0781,3.6875 z"
id="path851" />
</symbol>
<symbol
id="t"
overflow="visible">
<path
d="M 1.8438,-11.969 H 5.6563 V 0 H 1.8438 Z m 0,-4.6562 h 3.8125 v 3.125 H 1.8438 Z"
id="path854" />
</symbol>
<symbol
id="h"
overflow="visible">
<path
d="m 9.7031,-16.625 v 2.5156 H 7.5937 c -0.54297,0 -0.92188,0.10156 -1.1406,0.29688 -0.21094,0.19922 -0.3125,0.53906 -0.3125,1.0156 v 0.82812 h 3.2656 v 2.7344 H 6.1406 V 0 H 2.3125 V -9.2344 H 0.4219 v -2.7344 h 1.8906 v -0.82812 c 0,-1.3008 0.36328,-2.2656 1.0938,-2.8906 0.72656,-0.625 1.8516,-0.9375 3.375,-0.9375 z"
id="path857" />
</symbol>
<symbol
id="s"
overflow="visible">
<path
d="m 11.188,-11.594 v 2.9062 c -0.82422,-0.34375 -1.6172,-0.59766 -2.375,-0.76562 -0.76172,-0.16406 -1.4805,-0.25 -2.1562,-0.25 -0.73047,0 -1.2734,0.089844 -1.625,0.26562 -0.35547,0.17969 -0.53125,0.46094 -0.53125,0.84375 0,0.30469 0.13281,0.53906 0.40625,0.70312 0.26953,0.16797 0.75,0.28906 1.4375,0.35938 l 0.67188,0.09375 c 1.957,0.25 3.2734,0.66406 3.9531,1.2344 0.67578,0.57422 1.0156,1.4648 1.0156,2.6719 0,1.2812 -0.46875,2.2461 -1.4062,2.8906 -0.9375,0.63672 -2.3438,0.95312 -4.2188,0.95312 -0.78125,0 -1.5938,-0.0625 -2.4375,-0.1875 -0.8437,-0.125 -1.7148,-0.3125 -2.6094,-0.5625 v -2.9062 c 0.75781,0.375 1.5391,0.65625 2.3438,0.84375 0.80078,0.17969 1.6133,0.26562 2.4375,0.26562 0.75,0 1.3125,-0.10156 1.6875,-0.3125 0.38281,-0.20703 0.57812,-0.50781 0.57812,-0.90625 0,-0.34375 -0.13281,-0.59766 -0.39062,-0.76562 C 7.70756,-4.38304 7.18803,-4.51586 6.40678,-4.6096 L 5.7349,-4.70335 C 4.0357,-4.91038 2.8443,-5.30101 2.1568,-5.87525 1.4693,-6.45728 1.1256,-7.33615 1.1256,-8.51585 c 0,-1.2695 0.42969,-2.207 1.2969,-2.8125 0.875,-0.61328 2.2109,-0.92188 4.0156,-0.92188 0.69531,0 1.4297,0.05469 2.2031,0.15625 0.78125,0.10547 1.6289,0.27344 2.5469,0.5 z"
id="path860" />
</symbol>
<symbol
id="e"
overflow="visible">
<path
d="m 7.5312,-9.5156 c -0.84375,0 -1.4922,0.30859 -1.9375,0.92188 -0.44922,0.60547 -0.67188,1.4805 -0.67188,2.625 0,1.1484 0.22266,2.0273 0.67188,2.6406 0.44531,0.60547 1.0938,0.90625 1.9375,0.90625 0.83203,0 1.4688,-0.30078 1.9062,-0.90625 0.44531,-0.61328 0.67188,-1.4922 0.67188,-2.6406 0,-1.1445 -0.22656,-2.0195 -0.67188,-2.625 C 8.9999,-9.207 8.3632,-9.5156 7.5312,-9.5156 Z m 0,-2.7344 c 2.0508,0 3.6562,0.55859 4.8125,1.6719 1.1641,1.1055 1.75,2.6406 1.75,4.6094 0,1.9688 -0.58594,3.5117 -1.75,4.625 -1.1562,1.1055 -2.7617,1.6562 -4.8125,1.6562 -2.0625,0 -3.6797,-0.55078 -4.8438,-1.6562 -1.168,-1.1133 -1.75,-2.6562 -1.75,-4.625 0,-1.9688 0.58203,-3.5039 1.75,-4.6094 1.1641,-1.1133 2.7812,-1.6719 4.8438,-1.6719 z"
id="path863" />
</symbol>
<symbol
id="r"
overflow="visible">
<path
d="m 12.922,-9.9688 c 0.48828,-0.75 1.0625,-1.3164 1.7188,-1.7031 0.66406,-0.38281 1.3984,-0.57812 2.2031,-0.57812 1.375,0 2.4219,0.42969 3.1406,1.2812 0.71875,0.84375 1.0781,2.0742 1.0781,3.6875 v 7.2812 h -3.8438 v -6.2344 c 0.0078,-0.09375 0.01563,-0.1875 0.01563,-0.28125 v -0.4375 c 0,-0.84375 -0.125,-1.457 -0.375,-1.8438 -0.25,-0.38281 -0.65234,-0.57812 -1.2031,-0.57812 -0.73047,0 -1.293,0.30469 -1.6875,0.90625 -0.38672,0.59375 -0.58984,1.4609 -0.60938,2.5938 v 5.875 h -3.8438 v -6.2344 c 0,-1.3203 -0.11719,-2.1758 -0.34375,-2.5625 -0.23047,-0.38281 -0.63672,-0.57812 -1.2188,-0.57812 -0.73047,0 -1.2969,0.30469 -1.7031,0.90625 -0.39844,0.60547 -0.59375,1.4648 -0.59375,2.5781 v 5.8906 h -3.8438 v -11.969 h 3.8438 v 1.75 c 0.46875,-0.66406 1.0039,-1.1719 1.6094,-1.5156 0.61328,-0.34375 1.2891,-0.51562 2.0312,-0.51562 0.82031,0 1.5508,0.19922 2.1875,0.59375 0.63281,0.39844 1.1133,0.96094 1.4375,1.6875 z"
id="path866" />
</symbol>
<symbol
id="q"
overflow="visible">
<path
d="M 13.859,-7.2812 V 0 h -3.8438 v -5.5469 c 0,-1.0508 -0.027344,-1.7695 -0.078125,-2.1562 -0.042969,-0.39453 -0.12109,-0.6875 -0.23438,-0.875 -0.14844,-0.25 -0.35156,-0.44141 -0.60938,-0.57812 -0.25,-0.14453 -0.54297,-0.21875 -0.875,-0.21875 -0.79297,0 -1.418,0.3125 -1.875,0.9375 -0.46094,0.61719 -0.6875,1.4648 -0.6875,2.5469 V 3e-5 h -3.8125 v -16.625 h 3.8125 v 6.4062 c 0.58203,-0.69531 1.1953,-1.207 1.8438,-1.5312 0.64453,-0.33203 1.3594,-0.5 2.1406,-0.5 1.3828,0 2.4297,0.42969 3.1406,1.2812 0.71875,0.84375 1.0781,2.0742 1.0781,3.6875 z"
id="path869" />
</symbol>
<symbol
id="p"
overflow="visible">
<path
d="m 2.0156,-15.953 h 4.5781 l 5.8125,10.938 v -10.938 h 3.8906 V 0 H 11.703 L 5.9061,-10.938 V 0 H 2.0155 Z"
id="path872" />
</symbol>
<symbol
id="o"
overflow="visible">
<path
d="m 1.7031,-4.6562 v -7.3125 h 3.8438 v 1.2031 c 0,0.64844 -0.00781,1.4609 -0.015625,2.4375 v 1.9688 c 0,0.96094 0.023438,1.6523 0.078125,2.0781 0.050781,0.41797 0.13281,0.72656 0.25,0.92188 0.15625,0.25 0.35938,0.44531 0.60938,0.57812 0.25781,0.13672 0.55078,0.20312 0.875,0.20312 0.80078,0 1.4258,-0.30469 1.875,-0.92188 0.45703,-0.61328 0.6875,-1.4688 0.6875,-2.5625 v -5.9062 h 3.8281 v 11.969 h -3.8281 v -1.7344 c -0.57422,0.69922 -1.1836,1.2148 -1.8281,1.5469 -0.64844,0.33203 -1.3555,0.5 -2.125,0.5 -1.3867,0 -2.4453,-0.42188 -3.1719,-1.2656 -0.71875,-0.85156 -1.0781,-2.0859 -1.0781,-3.7031 z"
id="path875" />
</symbol>
<symbol
id="n"
overflow="visible">
<path
d="m 2.0156,-15.953 h 6.8125 c 2.0312,0 3.5859,0.45312 4.6719,1.3594 1.0938,0.89844 1.6406,2.1797 1.6406,3.8438 0,1.6797 -0.54688,2.9688 -1.6406,3.875 -1.0859,0.89844 -2.6406,1.3438 -4.6719,1.3438 H 6.125 V 2e-4 H 2.0156 Z m 4.1094,2.9844 v 4.4531 h 2.2656 c 0.80078,0 1.4141,-0.19141 1.8438,-0.57812 0.4375,-0.38281 0.65625,-0.9375 0.65625,-1.6562 0,-0.70703 -0.21875,-1.2539 -0.65625,-1.6406 -0.42969,-0.38281 -1.043,-0.57812 -1.8438,-0.57812 z"
id="path878" />
</symbol>
<symbol
id="m"
overflow="visible">
<path
d="m 1.8438,-11.969 h 3.8125 v 11.75 c 0,1.6016 -0.38672,2.8281 -1.1562,3.6719 C 3.73838,4.29665 2.629,4.7185 1.172,4.7185 h -1.8906 v -2.5 h 0.65625 c 0.72656,0 1.2266,-0.16797 1.5,-0.5 C 1.70718,1.39428 1.8439,0.74975 1.8439,-0.219 Z m 0,-4.6562 h 3.8125 v 3.125 H 1.8438 Z"
id="path881" />
</symbol>
<symbol
id="l"
overflow="visible">
<path
d="m 11.5,-11.594 v 3.125 C 10.97656,-8.82056 10.457,-9.08228 9.9375,-9.25025 9.41406,-9.42603 8.875,-9.51587 8.3125,-9.51587 c -1.0742,0 -1.9062,0.3125 -2.5,0.9375 -0.5938,0.625 -0.89062,1.4961 -0.89062,2.6094 0,1.1172 0.29688,1.9844 0.89062,2.6094 0.59374,0.625 1.4258,0.9375 2.5,0.9375 0.59375,0 1.1562,-0.085937 1.6875,-0.26562 0.53906,-0.17578 1.0391,-0.44141 1.5,-0.79688 v 3.125 c -0.59375,0.23047 -1.1992,0.39453 -1.8125,0.5 -0.61719,0.11328 -1.2344,0.17188 -1.8594,0.17188 -2.1562,0 -3.8438,-0.55078 -5.0625,-1.6562 -1.2188,-1.1133 -1.8281,-2.6562 -1.8281,-4.625 0,-1.9688 0.60938,-3.5039 1.8281,-4.6094 1.2188,-1.1133 2.9062,-1.6719 5.0625,-1.6719 0.625,0 1.2383,0.05859 1.8438,0.17188 0.61328,0.10547 1.2227,0.26562 1.8281,0.48438 z"
id="path884" />
</symbol>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
d="m 8.8845302,5.3494472 c 0,0.4477953 -0.1778441,0.8772048 -0.4944813,1.1938387 -0.3166348,0.316634 -0.7460153,0.4944822 -1.1938396,0.4944822 -0.4477109,0 -0.8772047,-0.1778449 -1.1938395,-0.4944822 C 5.6858484,6.226652 5.5078885,5.7972707 5.5078885,5.3494472 c 0,-0.4477116 0.1779542,-0.8772055 0.4944813,-1.1938394 0.3166348,-0.316634 0.7461286,-0.4944813 1.1938395,-0.4944813 0.4477953,0 0.8772048,0.177954 1.1938396,0.4944813 0.3166339,0.3166339 0.4944813,0.7461278 0.4944813,1.1938394 z M 11.9797,2.6818787 v 4.9535711 c 0,0.2025579 -0.08042,0.396732 -0.223629,0.5399248 -0.143202,0.1431936 -0.337478,0.22363 -0.539925,0.22363 H 1.7693668 c -0.2024472,0 -0.396732,-0.08043 -0.539925,-0.22363 C 1.0862489,8.0321727 1.0058124,7.8380094 1.0058124,7.6354498 V 2.6818787 c 0,-0.2024471 0.080428,-0.396732 0.2236294,-0.5399247 C 1.3726433,1.9987612 1.5669455,1.921557 1.7693668,1.9183247 H 4.422559 L 5.0067408,1.1926164 v 1.117e-4 C 5.073603,1.0757847 5.1700203,0.97869889 5.2865236,0.91106734 5.4029169,0.84355161 5.5351968,0.80802499 5.6697839,0.80802499 h 3.33439 c 0.1347055,0 0.266875,0.0355242 0.38326,0.10315238 0.1165025,0.0675157 0.2130381,0.16471403 0.279782,0.28155073 L 10.251399,1.918324 h 0.9649 c 0.202447,0 0.396732,0.08043 0.539923,0.2236291 0.143193,0.1432011 0.22363,0.3374778 0.22363,0.5399248 z M 3.0026051,3.1406051 c 0,-0.1492709 -0.059243,-0.2923735 -0.1648241,-0.3979465 C 2.7321996,2.6371873 2.5891078,2.5778337 2.4398344,2.5778337 2.2905607,2.5778337 2.147461,2.6371917 2.041888,2.7426586 1.9363066,2.84824 1.8770635,2.9913309 1.8770635,3.1406051 c 0,0.1492742 0.059246,0.2923726 0.1648245,0.3979465 0.1055814,0.1055813 0.2486727,0.1648241 0.3979464,0.1648241 0.1492734,0 0.2923736,-0.059243 0.3979466,-0.1648241 C 2.9433623,3.4330794 3.0026051,3.2898793 3.0026051,3.1406051 Z m 2.9205146,-0.00883 C 5.5155708,3.337535 5.1846171,3.6685109 4.9787244,4.0761732 3.8026494,6.4140588 6.1313852,8.742793 8.4692981,7.5667478 8.8768479,7.3608798 9.2078012,7.0299014 9.413694,6.6223516 10.589543,4.2844667 8.260921,1.9557319 5.9231197,3.1317788 Z"
id="path889"
style="stroke-width:0.0282432"
sodipodi:nodetypes="ssscscscscsssssssssccccsscccssccscscscscsccccc" />
<g
aria-label="4K"
transform="scale(1.1808986,0.84681275)"
id="text2715"
style="font-size:5.51344px;line-height:1.25;stroke-width:0.137836">
<path
d="m 3.2861357,11.349594 -1.1360702,1.682568 h 1.1360702 z m -0.172295,-0.853399 h 1.1522228 v 2.535967 h 0.5734194 v 0.751099 H 4.2660635 v 0.732253 H 3.2861357 V 13.783261 H 1.5039593 v -0.888397 z"
style="font-weight:bold;-inkscape-font-specification:'sans-serif Bold'"
id="path7376" />
<path
d="m 5.5986578,10.496195 h 1.0364621 v 1.4672 l 1.4941208,-1.4672 h 1.2033729 l -1.9356267,1.903321 2.1348428,2.115998 H 8.2342329 l -1.599113,-1.58296 v 1.58296 H 5.5986578 Z"
style="font-weight:bold;-inkscape-font-specification:'sans-serif Bold'"
id="path7378" />
</g>
</g>
<metadata
id="metadata7498">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>snap-pro-a</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="50"
height="50"
viewBox="0 0 13.229167 13.229167"
version="1.1"
id="svg5"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="snap-pro-i.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title7500">snap-pro-i</title>
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
showguides="false"
units="px"
width="50px"
inkscape:zoom="6.0007856"
inkscape:cx="65.408102"
inkscape:cy="39.828118"
inkscape:window-width="1628"
inkscape:window-height="932"
inkscape:window-x="1690"
inkscape:window-y="22"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<symbol
id="u"
overflow="visible">
<path
d="m 14.656,-0.875 c -0.76172,0.39844 -1.5547,0.69531 -2.375,0.89062 -0.8125,0.19531 -1.6641,0.29688 -2.5469,0.29688 -2.6562,0 -4.7617,-0.73828 -6.3125,-2.2188 -1.5547,-1.4883 -2.3281,-3.5039 -2.3281,-6.0469 0,-2.5508 0.77344,-4.5664 2.3281,-6.0469 1.5508,-1.4883 3.6562,-2.2344 6.3125,-2.2344 0.88281,0 1.7344,0.10156 2.5469,0.29688 0.82031,0.19922 1.6133,0.49609 2.375,0.89062 v 3.2969 c -0.76172,-0.51953 -1.5117,-0.89844 -2.25,-1.1406 -0.74219,-0.23828 -1.5234,-0.35938 -2.3438,-0.35938 -1.4688,0 -2.625,0.46875 -3.4688,1.4062 -0.83594,0.9375 -1.25,2.2344 -1.25,3.8906 0,1.6484 0.41406,2.9375 1.25,3.875 0.84375,0.9375 2,1.4062 3.4688,1.4062 0.82031,0 1.6016,-0.11719 2.3438,-0.35938 0.73828,-0.23828 1.4883,-0.61719 2.25,-1.1406 z"
id="path824" />
</symbol>
<symbol
id="b"
overflow="visible">
<path
d="m 10.719,-8.7031 c -0.33594,-0.15625 -0.66797,-0.26953 -1,-0.34375 -0.32422,-0.082031 -0.65625,-0.125 -1,-0.125 -0.98047,0 -1.7344,0.32031 -2.2656,0.95312 -0.53125,0.625 -0.79688,1.5273 -0.79688,2.7031 V -3e-5 h -3.8125 v -11.969 h 3.8125 v 1.9688 c 0.48828,-0.78125 1.0508,-1.3477 1.6875,-1.7031 0.64453,-0.36328 1.4102,-0.54688 2.2969,-0.54688 0.13281,0 0.27344,0.0078 0.42188,0.01563 0.14453,0.01172 0.36328,0.03125 0.65625,0.0625 z"
id="path827" />
</symbol>
<symbol
id="a"
overflow="visible">
<path
d="m 13.781,-6.0156 v 1.0938 H 4.8435 c 0.09375,0.89844 0.41406,1.5703 0.96875,2.0156 0.55078,0.44922 1.3281,0.67188 2.3281,0.67188 0.80078,0 1.625,-0.11719 2.4688,-0.35938 0.84375,-0.23828 1.7109,-0.59766 2.6094,-1.0781 v 2.9531 c -0.90625,0.33594 -1.8125,0.58984 -2.7188,0.76562 -0.9063,0.17578 -1.8125,0.26562 -2.7188,0.26562 -2.1562,0 -3.8398,-0.54688 -5.0469,-1.6406 -1.1992,-1.1016 -1.7969,-2.6484 -1.7969,-4.6406 0,-1.9453 0.58594,-3.4766 1.7656,-4.5938 1.1758,-1.125 2.8008,-1.6875 4.875,-1.6875 1.875,0 3.375,0.57031 4.5,1.7031 1.1328,1.125 1.7031,2.6367 1.7031,4.5312 z M 9.8435,-7.2812 c 0,-0.72656 -0.21484,-1.3125 -0.64062,-1.75 -0.41797,-0.44531 -0.96875,-0.67188 -1.6562,-0.67188 -0.74219,0 -1.3438,0.21094 -1.8125,0.625 -0.46094,0.41797 -0.74609,1.0156 -0.85938,1.7969 z"
id="path830" />
</symbol>
<symbol
id="d"
overflow="visible">
<path
d="m 7.2031,-5.3906 c -0.80469,0 -1.4062,0.13672 -1.8125,0.40625 -0.39844,0.27344 -0.59375,0.67188 -0.59375,1.2031 0,0.48047 0.16016,0.85938 0.48438,1.1406 0.32031,0.27344 0.77344,0.40625 1.3594,0.40625 0.71875,0 1.3203,-0.25391 1.8125,-0.76562 0.48828,-0.51953 0.73438,-1.1719 0.73438,-1.9531 v -0.4375 z m 5.8438,-1.4375 V 0 H 9.1875 v -1.7656 c -0.51172,0.71875 -1.0898,1.2461 -1.7344,1.5781 -0.63672,0.33203 -1.418,0.5 -2.3438,0.5 -1.2422,0 -2.2461,-0.35938 -3.0156,-1.0781 -0.77344,-0.72656 -1.1562,-1.6719 -1.1562,-2.8281 0,-1.3945 0.47656,-2.4219 1.4375,-3.0781 0.96875,-0.65625 2.4883,-0.98438 4.5625,-0.98438 h 2.25 v -0.29688 c 0,-0.60156 -0.24219,-1.0469 -0.71875,-1.3281 -0.48047,-0.28125 -1.2266,-0.42188 -2.2344,-0.42188 -0.8125,0 -1.5742,0.085937 -2.2812,0.25 -0.71094,0.15625 -1.3672,0.40234 -1.9688,0.73438 v -2.9219 c 0.82031,-0.19531 1.6445,-0.34766 2.4688,-0.45312 0.82031,-0.10156 1.6484,-0.15625 2.4844,-0.15625 2.1562,0 3.7109,0.42969 4.6719,1.2812 0.95703,0.84375 1.4375,2.2266 1.4375,4.1406 z"
id="path833" />
</symbol>
<symbol
id="c"
overflow="visible">
<path
d="m 6.0156,-15.359 v 3.3906 H 9.9531 V -9.234 H 6.0156 v 5.0781 c 0,0.55469 0.10938,0.92969 0.32812,1.125 0.21875,0.19922 0.65625,0.29688 1.3125,0.29688 h 1.9688 v 2.7344 h -3.2812 c -1.5117,0 -2.5859,-0.3125 -3.2188,-0.9375 -0.625,-0.63281 -0.9375,-1.707 -0.9375,-3.2188 v -5.0781 h -1.9062 v -2.7344 h 1.9062 v -3.3906 z"
id="path836" />
</symbol>
<symbol
id="g"
overflow="visible">
<path
d="m 9.9688,-10.219 v -6.4062 h 3.8594 V -2e-4 H 9.9688 V -1.7346 C 9.44536,-1.02366 8.8672,-0.5041 8.2344,-0.1721 7.59768,0.14821 6.8633,0.31228 6.0313,0.31228 c -1.4688,0 -2.6797,-0.58203 -3.625,-1.75 -0.94922,-1.1758 -1.4219,-2.6875 -1.4219,-4.5312 0,-1.8437 0.47266,-3.3477 1.4219,-4.5156 0.94531,-1.1758 2.1562,-1.7656 3.625,-1.7656 0.83203,0 1.5664,0.16797 2.2031,0.5 0.63281,0.32422 1.2109,0.83594 1.7344,1.5312 z m -2.5156,7.75 c 0.82031,0 1.4453,-0.29688 1.875,-0.89062 0.42578,-0.60156 0.64062,-1.4727 0.64062,-2.6094 0,-1.1445 -0.21484,-2.0156 -0.64062,-2.6094 -0.42969,-0.59375 -1.0547,-0.89062 -1.875,-0.89062 -0.8125,0 -1.4336,0.29688 -1.8594,0.89062 -0.42969,0.59375 -0.64062,1.4648 -0.64062,2.6094 0,1.1367 0.21094,2.0078 0.64062,2.6094 0.42578,0.59375 1.0469,0.89062 1.8594,0.89062 z"
id="path839" />
</symbol>
<symbol
id="k"
overflow="visible">
<path
d="m 8.2031,-2.4688 c 0.82031,0 1.4453,-0.29688 1.875,-0.89062 0.42578,-0.60156 0.64062,-1.4727 0.64062,-2.6094 0,-1.1445 -0.21484,-2.0156 -0.64062,-2.6094 -0.42969,-0.59375 -1.0547,-0.89062 -1.875,-0.89062 -0.82422,0 -1.4531,0.30469 -1.8906,0.90625 -0.4375,0.59375 -0.65625,1.4609 -0.65625,2.5938 0,1.1367 0.21875,2.0078 0.65625,2.6094 0.4375,0.59375 1.0664,0.89062 1.8906,0.89062 z m -2.5469,-7.75 c 0.53125,-0.69531 1.1133,-1.207 1.75,-1.5312 0.64453,-0.33203 1.3828,-0.5 2.2188,-0.5 1.4688,0 2.6758,0.58984 3.625,1.7656 0.94531,1.168 1.4219,2.6719 1.4219,4.5156 0,1.8437 -0.47656,3.3555 -1.4219,4.5312 -0.94922,1.168 -2.1562,1.75 -3.625,1.75 -0.83594,0 -1.5742,-0.16797 -2.2188,-0.5 -0.63672,-0.33203 -1.2188,-0.84766 -1.75,-1.5469 V -1e-4 H 1.8437 v -16.625 h 3.8125 z"
id="path842" />
</symbol>
<symbol
id="j"
overflow="visible">
<path
d="m 0.26562,-11.969 h 3.8281 l 3.2188,8.125 2.7344,-8.125 h 3.8125 L 8.82822,1.125 c -0.5,1.332 -1.0898,2.2656 -1.7656,2.7969 -0.66797,0.53125 -1.5547,0.79688 -2.6562,0.79688 h -2.2188 v -2.5 h 1.2031 c 0.64453,0 1.1133,-0.10547 1.4062,-0.3125 C 5.0977,1.69534 5.32817,1.32816 5.48442,0.79688 L 5.5938,0.45313 Z"
id="path845" />
</symbol>
<symbol
id="i"
overflow="visible">
<path
d="M 2.0156,-15.953 H 6.125 V 0 H 2.0156 Z"
id="path848" />
</symbol>
<symbol
id="f"
overflow="visible">
<path
d="M 13.859,-7.2812 V 0 h -3.8438 v -5.5781 c 0,-1.0312 -0.027344,-1.7383 -0.078125,-2.125 -0.042969,-0.39453 -0.12109,-0.6875 -0.23438,-0.875 -0.14844,-0.25 -0.35156,-0.44141 -0.60938,-0.57812 -0.25,-0.14453 -0.54297,-0.21875 -0.875,-0.21875 -0.79297,0 -1.418,0.3125 -1.875,0.9375 -0.46094,0.61719 -0.6875,1.4648 -0.6875,2.5469 V 3e-5 h -3.8125 v -11.969 h 3.8125 v 1.75 c 0.58203,-0.69531 1.1953,-1.207 1.8438,-1.5312 0.64453,-0.33203 1.3594,-0.5 2.1406,-0.5 1.3828,0 2.4297,0.42969 3.1406,1.2812 0.71875,0.84375 1.0781,2.0742 1.0781,3.6875 z"
id="path851" />
</symbol>
<symbol
id="t"
overflow="visible">
<path
d="M 1.8438,-11.969 H 5.6563 V 0 H 1.8438 Z m 0,-4.6562 h 3.8125 v 3.125 H 1.8438 Z"
id="path854" />
</symbol>
<symbol
id="h"
overflow="visible">
<path
d="m 9.7031,-16.625 v 2.5156 H 7.5937 c -0.54297,0 -0.92188,0.10156 -1.1406,0.29688 -0.21094,0.19922 -0.3125,0.53906 -0.3125,1.0156 v 0.82812 h 3.2656 v 2.7344 H 6.1406 V 0 H 2.3125 V -9.2344 H 0.4219 v -2.7344 h 1.8906 v -0.82812 c 0,-1.3008 0.36328,-2.2656 1.0938,-2.8906 0.72656,-0.625 1.8516,-0.9375 3.375,-0.9375 z"
id="path857" />
</symbol>
<symbol
id="s"
overflow="visible">
<path
d="m 11.188,-11.594 v 2.9062 c -0.82422,-0.34375 -1.6172,-0.59766 -2.375,-0.76562 -0.76172,-0.16406 -1.4805,-0.25 -2.1562,-0.25 -0.73047,0 -1.2734,0.089844 -1.625,0.26562 -0.35547,0.17969 -0.53125,0.46094 -0.53125,0.84375 0,0.30469 0.13281,0.53906 0.40625,0.70312 0.26953,0.16797 0.75,0.28906 1.4375,0.35938 l 0.67188,0.09375 c 1.957,0.25 3.2734,0.66406 3.9531,1.2344 0.67578,0.57422 1.0156,1.4648 1.0156,2.6719 0,1.2812 -0.46875,2.2461 -1.4062,2.8906 -0.9375,0.63672 -2.3438,0.95312 -4.2188,0.95312 -0.78125,0 -1.5938,-0.0625 -2.4375,-0.1875 -0.8437,-0.125 -1.7148,-0.3125 -2.6094,-0.5625 v -2.9062 c 0.75781,0.375 1.5391,0.65625 2.3438,0.84375 0.80078,0.17969 1.6133,0.26562 2.4375,0.26562 0.75,0 1.3125,-0.10156 1.6875,-0.3125 0.38281,-0.20703 0.57812,-0.50781 0.57812,-0.90625 0,-0.34375 -0.13281,-0.59766 -0.39062,-0.76562 C 7.70756,-4.38304 7.18803,-4.51586 6.40678,-4.6096 L 5.7349,-4.70335 C 4.0357,-4.91038 2.8443,-5.30101 2.1568,-5.87525 1.4693,-6.45728 1.1256,-7.33615 1.1256,-8.51585 c 0,-1.2695 0.42969,-2.207 1.2969,-2.8125 0.875,-0.61328 2.2109,-0.92188 4.0156,-0.92188 0.69531,0 1.4297,0.05469 2.2031,0.15625 0.78125,0.10547 1.6289,0.27344 2.5469,0.5 z"
id="path860" />
</symbol>
<symbol
id="e"
overflow="visible">
<path
d="m 7.5312,-9.5156 c -0.84375,0 -1.4922,0.30859 -1.9375,0.92188 -0.44922,0.60547 -0.67188,1.4805 -0.67188,2.625 0,1.1484 0.22266,2.0273 0.67188,2.6406 0.44531,0.60547 1.0938,0.90625 1.9375,0.90625 0.83203,0 1.4688,-0.30078 1.9062,-0.90625 0.44531,-0.61328 0.67188,-1.4922 0.67188,-2.6406 0,-1.1445 -0.22656,-2.0195 -0.67188,-2.625 C 8.9999,-9.207 8.3632,-9.5156 7.5312,-9.5156 Z m 0,-2.7344 c 2.0508,0 3.6562,0.55859 4.8125,1.6719 1.1641,1.1055 1.75,2.6406 1.75,4.6094 0,1.9688 -0.58594,3.5117 -1.75,4.625 -1.1562,1.1055 -2.7617,1.6562 -4.8125,1.6562 -2.0625,0 -3.6797,-0.55078 -4.8438,-1.6562 -1.168,-1.1133 -1.75,-2.6562 -1.75,-4.625 0,-1.9688 0.58203,-3.5039 1.75,-4.6094 1.1641,-1.1133 2.7812,-1.6719 4.8438,-1.6719 z"
id="path863" />
</symbol>
<symbol
id="r"
overflow="visible">
<path
d="m 12.922,-9.9688 c 0.48828,-0.75 1.0625,-1.3164 1.7188,-1.7031 0.66406,-0.38281 1.3984,-0.57812 2.2031,-0.57812 1.375,0 2.4219,0.42969 3.1406,1.2812 0.71875,0.84375 1.0781,2.0742 1.0781,3.6875 v 7.2812 h -3.8438 v -6.2344 c 0.0078,-0.09375 0.01563,-0.1875 0.01563,-0.28125 v -0.4375 c 0,-0.84375 -0.125,-1.457 -0.375,-1.8438 -0.25,-0.38281 -0.65234,-0.57812 -1.2031,-0.57812 -0.73047,0 -1.293,0.30469 -1.6875,0.90625 -0.38672,0.59375 -0.58984,1.4609 -0.60938,2.5938 v 5.875 h -3.8438 v -6.2344 c 0,-1.3203 -0.11719,-2.1758 -0.34375,-2.5625 -0.23047,-0.38281 -0.63672,-0.57812 -1.2188,-0.57812 -0.73047,0 -1.2969,0.30469 -1.7031,0.90625 -0.39844,0.60547 -0.59375,1.4648 -0.59375,2.5781 v 5.8906 h -3.8438 v -11.969 h 3.8438 v 1.75 c 0.46875,-0.66406 1.0039,-1.1719 1.6094,-1.5156 0.61328,-0.34375 1.2891,-0.51562 2.0312,-0.51562 0.82031,0 1.5508,0.19922 2.1875,0.59375 0.63281,0.39844 1.1133,0.96094 1.4375,1.6875 z"
id="path866" />
</symbol>
<symbol
id="q"
overflow="visible">
<path
d="M 13.859,-7.2812 V 0 h -3.8438 v -5.5469 c 0,-1.0508 -0.027344,-1.7695 -0.078125,-2.1562 -0.042969,-0.39453 -0.12109,-0.6875 -0.23438,-0.875 -0.14844,-0.25 -0.35156,-0.44141 -0.60938,-0.57812 -0.25,-0.14453 -0.54297,-0.21875 -0.875,-0.21875 -0.79297,0 -1.418,0.3125 -1.875,0.9375 -0.46094,0.61719 -0.6875,1.4648 -0.6875,2.5469 V 3e-5 h -3.8125 v -16.625 h 3.8125 v 6.4062 c 0.58203,-0.69531 1.1953,-1.207 1.8438,-1.5312 0.64453,-0.33203 1.3594,-0.5 2.1406,-0.5 1.3828,0 2.4297,0.42969 3.1406,1.2812 0.71875,0.84375 1.0781,2.0742 1.0781,3.6875 z"
id="path869" />
</symbol>
<symbol
id="p"
overflow="visible">
<path
d="m 2.0156,-15.953 h 4.5781 l 5.8125,10.938 v -10.938 h 3.8906 V 0 H 11.703 L 5.9061,-10.938 V 0 H 2.0155 Z"
id="path872" />
</symbol>
<symbol
id="o"
overflow="visible">
<path
d="m 1.7031,-4.6562 v -7.3125 h 3.8438 v 1.2031 c 0,0.64844 -0.00781,1.4609 -0.015625,2.4375 v 1.9688 c 0,0.96094 0.023438,1.6523 0.078125,2.0781 0.050781,0.41797 0.13281,0.72656 0.25,0.92188 0.15625,0.25 0.35938,0.44531 0.60938,0.57812 0.25781,0.13672 0.55078,0.20312 0.875,0.20312 0.80078,0 1.4258,-0.30469 1.875,-0.92188 0.45703,-0.61328 0.6875,-1.4688 0.6875,-2.5625 v -5.9062 h 3.8281 v 11.969 h -3.8281 v -1.7344 c -0.57422,0.69922 -1.1836,1.2148 -1.8281,1.5469 -0.64844,0.33203 -1.3555,0.5 -2.125,0.5 -1.3867,0 -2.4453,-0.42188 -3.1719,-1.2656 -0.71875,-0.85156 -1.0781,-2.0859 -1.0781,-3.7031 z"
id="path875" />
</symbol>
<symbol
id="n"
overflow="visible">
<path
d="m 2.0156,-15.953 h 6.8125 c 2.0312,0 3.5859,0.45312 4.6719,1.3594 1.0938,0.89844 1.6406,2.1797 1.6406,3.8438 0,1.6797 -0.54688,2.9688 -1.6406,3.875 -1.0859,0.89844 -2.6406,1.3438 -4.6719,1.3438 H 6.125 V 2e-4 H 2.0156 Z m 4.1094,2.9844 v 4.4531 h 2.2656 c 0.80078,0 1.4141,-0.19141 1.8438,-0.57812 0.4375,-0.38281 0.65625,-0.9375 0.65625,-1.6562 0,-0.70703 -0.21875,-1.2539 -0.65625,-1.6406 -0.42969,-0.38281 -1.043,-0.57812 -1.8438,-0.57812 z"
id="path878" />
</symbol>
<symbol
id="m"
overflow="visible">
<path
d="m 1.8438,-11.969 h 3.8125 v 11.75 c 0,1.6016 -0.38672,2.8281 -1.1562,3.6719 C 3.73838,4.29665 2.629,4.7185 1.172,4.7185 h -1.8906 v -2.5 h 0.65625 c 0.72656,0 1.2266,-0.16797 1.5,-0.5 C 1.70718,1.39428 1.8439,0.74975 1.8439,-0.219 Z m 0,-4.6562 h 3.8125 v 3.125 H 1.8438 Z"
id="path881" />
</symbol>
<symbol
id="l"
overflow="visible">
<path
d="m 11.5,-11.594 v 3.125 C 10.97656,-8.82056 10.457,-9.08228 9.9375,-9.25025 9.41406,-9.42603 8.875,-9.51587 8.3125,-9.51587 c -1.0742,0 -1.9062,0.3125 -2.5,0.9375 -0.5938,0.625 -0.89062,1.4961 -0.89062,2.6094 0,1.1172 0.29688,1.9844 0.89062,2.6094 0.59374,0.625 1.4258,0.9375 2.5,0.9375 0.59375,0 1.1562,-0.085937 1.6875,-0.26562 0.53906,-0.17578 1.0391,-0.44141 1.5,-0.79688 v 3.125 c -0.59375,0.23047 -1.1992,0.39453 -1.8125,0.5 -0.61719,0.11328 -1.2344,0.17188 -1.8594,0.17188 -2.1562,0 -3.8438,-0.55078 -5.0625,-1.6562 -1.2188,-1.1133 -1.8281,-2.6562 -1.8281,-4.625 0,-1.9688 0.60938,-3.5039 1.8281,-4.6094 1.2188,-1.1133 2.9062,-1.6719 5.0625,-1.6719 0.625,0 1.2383,0.05859 1.8438,0.17188 0.61328,0.10547 1.2227,0.26562 1.8281,0.48438 z"
id="path884" />
</symbol>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
d="m 8.8845302,5.3494472 c 0,0.4477953 -0.1778441,0.8772048 -0.4944813,1.1938387 -0.3166348,0.316634 -0.7460153,0.4944822 -1.1938396,0.4944822 -0.4477109,0 -0.8772047,-0.1778449 -1.1938395,-0.4944822 C 5.6858484,6.226652 5.5078885,5.7972707 5.5078885,5.3494472 c 0,-0.4477116 0.1779542,-0.8772055 0.4944813,-1.1938394 0.3166348,-0.316634 0.7461286,-0.4944813 1.1938395,-0.4944813 0.4477953,0 0.8772048,0.177954 1.1938396,0.4944813 0.3166339,0.3166339 0.4944813,0.7461278 0.4944813,1.1938394 z M 11.9797,2.6818787 v 4.9535711 c 0,0.2025579 -0.08042,0.396732 -0.223629,0.5399248 -0.143202,0.1431936 -0.337478,0.22363 -0.539925,0.22363 H 1.7693668 c -0.2024472,0 -0.396732,-0.08043 -0.539925,-0.22363 C 1.0862489,8.0321727 1.0058124,7.8380094 1.0058124,7.6354498 V 2.6818787 c 0,-0.2024471 0.080428,-0.396732 0.2236294,-0.5399247 C 1.3726433,1.9987612 1.5669455,1.921557 1.7693668,1.9183247 H 4.422559 L 5.0067408,1.1926164 v 1.117e-4 C 5.073603,1.0757847 5.1700203,0.97869889 5.2865236,0.91106734 5.4029169,0.84355161 5.5351968,0.80802499 5.6697839,0.80802499 h 3.33439 c 0.1347055,0 0.266875,0.0355242 0.38326,0.10315238 0.1165025,0.0675157 0.2130381,0.16471403 0.279782,0.28155073 L 10.251399,1.918324 h 0.9649 c 0.202447,0 0.396732,0.08043 0.539923,0.2236291 0.143193,0.1432011 0.22363,0.3374778 0.22363,0.5399248 z M 3.0026051,3.1406051 c 0,-0.1492709 -0.059243,-0.2923735 -0.1648241,-0.3979465 C 2.7321996,2.6371873 2.5891078,2.5778337 2.4398344,2.5778337 2.2905607,2.5778337 2.147461,2.6371917 2.041888,2.7426586 1.9363066,2.84824 1.8770635,2.9913309 1.8770635,3.1406051 c 0,0.1492742 0.059246,0.2923726 0.1648245,0.3979465 0.1055814,0.1055813 0.2486727,0.1648241 0.3979464,0.1648241 0.1492734,0 0.2923736,-0.059243 0.3979466,-0.1648241 C 2.9433623,3.4330794 3.0026051,3.2898793 3.0026051,3.1406051 Z m 2.9205146,-0.00883 C 5.5155708,3.337535 5.1846171,3.6685109 4.9787244,4.0761732 3.8026494,6.4140588 6.1313852,8.742793 8.4692981,7.5667478 8.8768479,7.3608798 9.2078012,7.0299014 9.413694,6.6223516 10.589543,4.2844667 8.260921,1.9557319 5.9231197,3.1317788 Z"
id="path889"
style="stroke-width:0.0282432;fill:#ffffff"
sodipodi:nodetypes="ssscscscscsssssssssccccsscccssccscscscscsccccc" />
<g
aria-label="4K"
transform="scale(1.1808986,0.84681275)"
id="text2715"
style="font-size:5.51344px;line-height:1.25;stroke-width:0.137836;fill:#ffffff">
<path
d="m 3.2861357,11.349594 -1.1360702,1.682568 h 1.1360702 z m -0.172295,-0.853399 h 1.1522228 v 2.535967 h 0.5734194 v 0.751099 H 4.2660635 v 0.732253 H 3.2861357 V 13.783261 H 1.5039593 v -0.888397 z"
style="font-weight:bold;-inkscape-font-specification:'sans-serif Bold';fill:#ffffff"
id="path7376" />
<path
d="m 5.5986578,10.496195 h 1.0364621 v 1.4672 l 1.4941208,-1.4672 h 1.2033729 l -1.9356267,1.903321 2.1348428,2.115998 H 8.2342329 l -1.599113,-1.58296 v 1.58296 H 5.5986578 Z"
style="font-weight:bold;-inkscape-font-specification:'sans-serif Bold';fill:#ffffff"
id="path7378" />
</g>
</g>
<metadata
id="metadata7498">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>snap-pro-i</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

View file

@ -0,0 +1,388 @@
"use strict";
/* global Tablet, Script */
//
// libraries/appUi.js
//
// Created by Howard Stearns on 3/20/18.
// Modified by Zach Fox on 2019-04-13
// Copyright 2018 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
function AppUi(properties) {
var request = Script.require('request').request;
/* Example development order:
1. var AppUi = Script.require('appUi');
2. Put appname-i.svg, appname-a.svg in graphicsDirectory (where non-default graphicsDirectory can be added in #3).
3. ui = new AppUi({buttonName: "APPNAME", home: "qml-or-html-path"});
(And if converting an existing app,
define var tablet = ui.tablet, button = ui.button; as needed.
remove button.clicked.[dis]connect and tablet.remove(button).)
4. Define onOpened and onClosed behavior in #3, if any.
(And if converting an existing app, remove screenChanged.[dis]connect.)
5. Define onMessage and sendMessage in #3, if any. onMessage is wired/unwired on open/close. If you
want a handler to be "always on", connect it yourself at script startup.
(And if converting an existing app, remove code that [un]wires that message handling such as
fromQml/sendToQml or webEventReceived/emitScriptEvent.)
6. (If converting an existing app, cleanup stuff that is no longer necessary, like references to button, tablet,
and use isOpen, open(), and close() as needed.)
7. lint!
*/
var that = this;
function defaultButton(name, suffix) {
var base = that[name] || (that.buttonPrefix + suffix);
that[name] = (base.indexOf('/') >= 0) ? base : (that.graphicsDirectory + base); // poor man's merge
}
// Defaults:
that.tabletName = "com.highfidelity.interface.tablet.system";
that.inject = "";
that.graphicsDirectory = "icons/tablet-icons/"; // Where to look for button svgs. See below.
that.additionalAppScreens = [];
that.checkIsOpen = function checkIsOpen(type, tabletUrl) { // Are we active? Value used to set isOpen.
// Actual url may have prefix or suffix.
return that.currentVisibleUrl &&
((that.home.indexOf(that.currentVisibleUrl) > -1) ||
(that.additionalAppScreens.indexOf(that.currentVisibleUrl) > -1));
};
that.setCurrentVisibleScreenMetadata = function setCurrentVisibleScreenMetadata(type, url) {
that.currentVisibleScreenType = type;
that.currentVisibleUrl = url;
};
that.open = function open(optionalUrl, optionalInject) { // How to open the app.
var url = optionalUrl || that.home;
var inject = optionalInject || that.inject;
if (that.isQMLUrl(url)) {
that.tablet.loadQMLSource(url);
} else {
that.tablet.gotoWebScreen(url, inject);
}
};
// Opens some app on top of the current app (on desktop, opens new window)
that.openNewAppOnTop = function openNewAppOnTop(url, optionalInject) {
var inject = optionalInject || "";
if (that.isQMLUrl(url)) {
that.tablet.loadQMLOnTop(url);
} else {
that.tablet.loadWebScreenOnTop(url, inject);
}
};
that.close = function close() { // How to close the app.
that.currentVisibleUrl = "";
// for toolbar-mode: go back to home screen, this will close the window.
that.tablet.gotoHomeScreen();
};
that.buttonActive = function buttonActive(isActive) { // How to make the button active (white).
that.button.editProperties({isActive: isActive});
};
that.isQMLUrl = function isQMLUrl(url) {
var type = /.qml$/.test(url) ? 'QML' : 'Web';
return type === 'QML';
};
that.isCurrentlyOnQMLScreen = function isCurrentlyOnQMLScreen() {
return that.currentVisibleScreenType === 'QML';
};
//
// START Notification Handling Defaults
//
that.messagesWaiting = function messagesWaiting(isWaiting) { // How to indicate a message light on button.
// Note that waitingButton doesn't have to exist unless someone explicitly calls this with isWaiting true.
that.button.editProperties({
icon: isWaiting ? that.normalMessagesButton : that.normalButton,
activeIcon: isWaiting ? that.activeMessagesButton : that.activeButton
});
};
that.notificationPollTimeout = [false];
that.notificationPollTimeoutMs = [60000];
that.notificationPollEndpoint = [false];
that.notificationPollStopPaginatingConditionMet = [false];
that.notificationDataProcessPage = function (data) {
return data;
};
that.notificationPollCallback = [that.ignore];
that.notificationPollCaresAboutSince = [false];
that.notificationInitialCallbackMade = [false];
that.notificationDisplayBanner = function (message) {
if (!that.isOpen) {
Window.displayAnnouncement(message);
}
};
//
// END Notification Handling Defaults
//
// Handlers
that.onScreenChanged = function onScreenChanged(type, url) {
// Set isOpen, wireEventBridge, set buttonActive as appropriate,
// and finally call onOpened() or onClosed() IFF defined.
that.setCurrentVisibleScreenMetadata(type, url);
if (that.checkIsOpen(type, url)) {
that.wireEventBridge(true);
if (!that.isOpen) {
if (that.onOpened) {
that.onOpened();
}
that.buttonActive(true);
that.isOpen = true;
}
} else {
// A different screen is now visible, or the tablet has been closed.
// Tablet visibility is controlled separately by `tabletShownChanged()`
that.wireEventBridge(false);
if (that.isOpen) {
if (that.onClosed) {
that.onClosed();
}
that.buttonActive(false);
that.isOpen = false;
}
}
};
// Overwrite with the given properties:
Object.keys(properties).forEach(function (key) {
that[key] = properties[key];
});
//
// START Notification Handling
//
var currentDataPageToRetrieve = [];
var concatenatedServerResponse = [];
for (var i = 0; i < that.notificationPollEndpoint.length; i++) {
currentDataPageToRetrieve[i] = 1;
concatenatedServerResponse[i] = new Array();
}
var MAX_LOG_LENGTH_CHARACTERS = 300;
function requestCallback(error, response, optionalParams) {
var indexOfRequest = optionalParams.indexOfRequest;
var urlOfRequest = optionalParams.urlOfRequest;
if (error || (response.status !== 'success')) {
print("Error: unable to complete request from URL. Error:", error || response.status);
startNotificationTimer(indexOfRequest);
return;
}
if (!that.notificationPollStopPaginatingConditionMet[indexOfRequest] ||
that.notificationPollStopPaginatingConditionMet[indexOfRequest](response)) {
startNotificationTimer(indexOfRequest);
var notificationData;
if (concatenatedServerResponse[indexOfRequest].length) {
notificationData = concatenatedServerResponse[indexOfRequest];
} else {
notificationData = that.notificationDataProcessPage[indexOfRequest](response);
}
console.debug(that.buttonName,
'truncated notification data for processing:',
JSON.stringify(notificationData).substring(0, MAX_LOG_LENGTH_CHARACTERS));
that.notificationPollCallback[indexOfRequest](notificationData);
that.notificationInitialCallbackMade[indexOfRequest] = true;
currentDataPageToRetrieve[indexOfRequest] = 1;
concatenatedServerResponse[indexOfRequest] = new Array();
} else {
concatenatedServerResponse[indexOfRequest] =
concatenatedServerResponse[indexOfRequest].concat(that.notificationDataProcessPage[indexOfRequest](response));
currentDataPageToRetrieve[indexOfRequest]++;
request({
json: true,
uri: (urlOfRequest + "&page=" + currentDataPageToRetrieve[indexOfRequest])
}, requestCallback, optionalParams);
}
}
var METAVERSE_BASE = Account.metaverseServerURL;
var MS_IN_SEC = 1000;
that.notificationPoll = function (i) {
if (!that.notificationPollEndpoint[i]) {
return;
}
// User is "appearing offline" or is not logged in
if (GlobalServices.findableBy === "none" || Account.username === "Unknown user") {
// The notification polling will restart when the user changes their availability
// or when they log in, so it's not necessary to restart a timer here.
console.debug(that.buttonName + " Notifications: User is appearing offline or not logged in. " +
that.buttonName + " will poll for notifications when user logs in and has their availability " +
"set to not appear offline.");
return;
}
var url = METAVERSE_BASE + that.notificationPollEndpoint[i];
var settingsKey = "notifications/" + that.notificationPollEndpoint[i] + "/lastPoll";
var currentTimestamp = new Date().getTime();
var lastPollTimestamp = Settings.getValue(settingsKey, currentTimestamp);
if (that.notificationPollCaresAboutSince[i]) {
url = url + "&since=" + lastPollTimestamp / MS_IN_SEC;
}
Settings.setValue(settingsKey, currentTimestamp);
request({
json: true,
uri: url
},
requestCallback,
{
indexOfRequest: i,
urlOfRequest: url
});
};
// This won't do anything if there isn't a notification endpoint set
for (i = 0; i < that.notificationPollEndpoint.length; i++) {
that.notificationPoll(i);
}
function startNotificationTimer(indexOfRequest) {
that.notificationPollTimeout[indexOfRequest] = Script.setTimeout(function () {
that.notificationPoll(indexOfRequest);
}, that.notificationPollTimeoutMs[indexOfRequest]);
}
function restartNotificationPoll() {
for (var j = 0; j < that.notificationPollEndpoint.length; j++) {
that.notificationInitialCallbackMade[j] = false;
if (that.notificationPollTimeout[j]) {
Script.clearTimeout(that.notificationPollTimeout[j]);
that.notificationPollTimeout[j] = false;
}
that.notificationPoll(j);
}
}
//
// END Notification Handling
//
// Properties:
that.tablet = Tablet.getTablet(that.tabletName);
// Must be after we gather properties.
that.buttonPrefix = that.buttonPrefix || that.buttonName.toLowerCase() + "-";
defaultButton('normalButton', 'i.svg');
defaultButton('activeButton', 'a.svg');
defaultButton('normalMessagesButton', 'i-msg.svg');
defaultButton('activeMessagesButton', 'a-msg.svg');
var buttonOptions = {
icon: that.normalButton,
activeIcon: that.activeButton,
text: that.buttonName
};
// `TabletScriptingInterface` looks for the presence of a `sortOrder` key.
// What it SHOULD do is look to see if the value inside that key is defined.
// To get around the current code, we do this instead.
if (that.sortOrder) {
buttonOptions.sortOrder = that.sortOrder;
}
that.button = that.tablet.addButton(buttonOptions);
that.ignore = function ignore() { };
that.hasOutboundEventBridge = false;
that.hasInboundQmlEventBridge = false;
that.hasInboundHtmlEventBridge = false;
// HTML event bridge uses strings, not objects. Here we abstract over that.
// (Although injected javascript still has to use JSON.stringify/JSON.parse.)
that.sendToHtml = function (messageObject) {
that.tablet.emitScriptEvent(JSON.stringify(messageObject));
};
that.fromHtml = function (messageString) {
var parsedMessage = JSON.parse(messageString);
parsedMessage.messageSrc = "HTML";
that.onMessage(parsedMessage);
};
that.sendMessage = that.ignore;
that.wireEventBridge = function wireEventBridge(on) {
// Uniquivocally sets that.sendMessage(messageObject) to do the right thing.
// Sets has*EventBridge and wires onMessage to the proper event bridge as appropriate, IFF onMessage defined.
var isCurrentlyOnQMLScreen = that.isCurrentlyOnQMLScreen();
// Outbound (always, regardless of whether there is an inbound handler).
if (on) {
that.sendMessage = isCurrentlyOnQMLScreen ? that.tablet.sendToQml : that.sendToHtml;
that.hasOutboundEventBridge = true;
} else {
that.sendMessage = that.ignore;
that.hasOutboundEventBridge = false;
}
if (!that.onMessage) {
return;
}
// Inbound
if (on) {
if (isCurrentlyOnQMLScreen && !that.hasInboundQmlEventBridge) {
console.debug(that.buttonName, 'connecting', that.tablet.fromQml);
that.tablet.fromQml.connect(that.onMessage);
that.hasInboundQmlEventBridge = true;
} else if (!isCurrentlyOnQMLScreen && !that.hasInboundHtmlEventBridge) {
console.debug(that.buttonName, 'connecting', that.tablet.webEventReceived);
that.tablet.webEventReceived.connect(that.fromHtml);
that.hasInboundHtmlEventBridge = true;
}
} else {
if (that.hasInboundQmlEventBridge) {
console.debug(that.buttonName, 'disconnecting', that.tablet.fromQml);
that.tablet.fromQml.disconnect(that.onMessage);
that.hasInboundQmlEventBridge = false;
}
if (that.hasInboundHtmlEventBridge) {
console.debug(that.buttonName, 'disconnecting', that.tablet.webEventReceived);
that.tablet.webEventReceived.disconnect(that.fromHtml);
that.hasInboundHtmlEventBridge = false;
}
}
};
that.isOpen = false;
// To facilitate incremental development, only wire onClicked to do something when "home" is defined in properties.
that.onClicked = that.home
? function onClicked() {
// Call open() or close(), and reset type based on current home property.
if (that.isOpen) {
that.close();
} else {
that.open();
}
} : that.ignore;
that.onScriptEnding = function onScriptEnding() {
// Close if necessary, clean up any remaining handlers, and remove the button.
GlobalServices.myUsernameChanged.disconnect(restartNotificationPoll);
GlobalServices.findableByChanged.disconnect(restartNotificationPoll);
that.tablet.screenChanged.disconnect(that.onScreenChanged);
if (that.isOpen) {
that.close();
that.onScreenChanged("", "");
}
if (that.button) {
if (that.onClicked) {
that.button.clicked.disconnect(that.onClicked);
}
that.tablet.removeButton(that.button);
}
for (var i = 0; i < that.notificationPollTimeout.length; i++) {
if (that.notificationPollTimeout[i]) {
Script.clearInterval(that.notificationPollTimeout[i]);
that.notificationPollTimeout[i] = false;
}
}
};
// Set up the handlers.
that.tablet.screenChanged.connect(that.onScreenChanged);
that.button.clicked.connect(that.onClicked);
Script.scriptEnding.connect(that.onScriptEnding);
GlobalServices.findableByChanged.connect(restartNotificationPoll);
GlobalServices.myUsernameChanged.connect(restartNotificationPoll);
if (that.buttonName === Settings.getValue("startUpApp")) {
Settings.setValue("startUpApp", "");
Script.setTimeout(function () {
that.open();
}, 1000);
}
}
module.exports = AppUi;

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,646 @@
"use strict";
/*jslint vars:true, plusplus:true, forin:true*/
/*global Tablet, Script, */
/* eslint indent: ["error", 4, { "outerIIFEBody": 1 }] */
//
// tabletCam_app.js
//
// Created by Zach Fox on 2019-04-14
// Copyright 2022 Overte e.V.
//
// Camera with more advanced features than the SNAP application, with an higher resolution capability.
//
// Distributed under the Apache License, Version 2.0
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
(function () { // BEGIN LOCAL_SCOPE
var AppUi = Script.require('./modules/appUi.js');
var secondaryCameraConfig = Render.getConfig("SecondaryCamera");
var tabletCamAvatarEntity = false;
var previousNearClipDistance = false;
var previousFarClipDistance = false;
var previousvFoV = false;
var NEAR_CLIP_DISTANCE = 0.001;
var FAR_CLIP_DISTANCE = 16384;
var vFoV = Settings.getValue("tabletCam/vFoV", 60);
var secondaryCameraResolutionWidth = 1000;
var secondaryCameraResolutionHeight = secondaryCameraResolutionWidth / aspectRatio;
var PREVIEW_SHORT_SIDE_RESOLUTION = 400;
var secondaryCameraResolutionPreviewWidth = PREVIEW_SHORT_SIDE_RESOLUTION;
var secondaryCameraResolutionPreviewHeight = PREVIEW_SHORT_SIDE_RESOLUTION / aspectRatio;
var CAMERA_ENTITY_NAME = "CAMERA SNAP-PRO OV-22";
var APPLICATION_CAPTION = "SNAP-PRO";
var tabletCamRunning = false;
var TABLET_CAM_ENTITY_PROPERTIES = {
"type": "Model",
"modelURL": Script.resolvePath("models/camera.fbx"),
"shapeType": "simple-hull",
"dimensions": {"x":0.1600, "y":0.1021, "z":0.1137},
"damping": 0,
"angularDamping": 0,
"shape": "Cube",
"isVisibleInSecondaryCamera": false,
"name": CAMERA_ENTITY_NAME,
"grab": {
"grabbable": true
},
"registrationPoint": {
"x": 0.42,
"y": 0.4,
"z": 0
}
};
function enableTabletCam() {
if (!tabletCamRunning) {
wireSignals(true);
setTakePhotoControllerMappingStatus(true);
secondaryCameraConfig.enableSecondaryCameraRenderConfigs(true);
setSnapshotQuality(snapshotQuality);
var props = TABLET_CAM_ENTITY_PROPERTIES;
var dynamicProps = getDynamicTabletCamAvatarEntityProperties();
for (var key in dynamicProps) {
props[key] = dynamicProps[key];
}
tabletCamAvatarEntity = Entities.addEntity(props, "avatar");
previousFarClipDistance = secondaryCameraConfig.farClipPlaneDistance;
previousNearClipDistance = secondaryCameraConfig.nearClipPlaneDistance;
previousvFoV = secondaryCameraConfig.vFoV;
secondaryCameraConfig.nearClipPlaneDistance = NEAR_CLIP_DISTANCE;
secondaryCameraConfig.farClipPlaneDistance = FAR_CLIP_DISTANCE;
secondaryCameraConfig.vFoV = vFoV;
secondaryCameraConfig.attachedEntityId = tabletCamAvatarEntity;
tabletCamRunning = true;
}
updateTabletCamLocalEntity();
// Remove the existing tabletCamAvatarEntity model from the domain if one exists.
// It's easy for this to happen if the user crashes while the Tablet Cam is on.
// We do this down here (after the new one is rezzed) so that we don't accidentally delete
// the newly-rezzed model.
var entityIDs = Entities.findEntitiesByName(CAMERA_ENTITY_NAME, MyAvatar.position, 100, false);
entityIDs.forEach(function (currentEntityID) {
var currentEntityOwner = Entities.getEntityProperties(currentEntityID, ['owningAvatarID']).owningAvatarID;
if (currentEntityOwner === MyAvatar.sessionUUID && currentEntityID !== tabletCamAvatarEntity) {
Entities.deleteEntity(currentEntityID);
}
});
}
var frontCamInUse = Settings.getValue("tabletCam/frontCamInUse", true);
function switchCams(forceFrontCamValue) {
if (!tabletCamAvatarEntity || (!!HMD.tabletID && !tabletCamLocalEntity)) {
console.log("User tried to switch cams, but TabletCam wasn't ready!");
return;
}
frontCamInUse = forceFrontCamValue || !frontCamInUse;
Settings.setValue("tabletCam/frontCamInUse", frontCamInUse);
var newTabletCamAvatarEntityProps = getDynamicTabletCamAvatarEntityProperties();
Entities.editEntity(tabletCamAvatarEntity, newTabletCamAvatarEntityProps);
updateTabletCamLocalEntity();
}
function disableTabletCam() {
function deleteTabletCamAvatarEntity() {
if (flash) {
Entities.deleteEntity(flash);
flash = false;
}
if (tabletCamAvatarEntity) {
Entities.deleteEntity(tabletCamAvatarEntity);
tabletCamAvatarEntity = false;
detached = false; // TO BE CONFIRMED
Settings.setValue("tabletCam/detached", detached); // TO BE CONFIRMED
}
}
wireSignals(false);
setTakePhotoControllerMappingStatus(false);
if (tabletCamRunning) {
secondaryCameraConfig.farClipPlaneDistance = previousFarClipDistance;
secondaryCameraConfig.nearClipPlaneDistance = previousNearClipDistance;
secondaryCameraConfig.vFoV = previousvFoV;
secondaryCameraConfig.attachedEntityId = false;
secondaryCameraConfig.enableSecondaryCameraRenderConfigs(false);
}
deleteTabletCamAvatarEntity();
if (tabletCamLocalEntity) {
Entities.deleteEntity(tabletCamLocalEntity);
tabletCamLocalEntity = false;
detached = false; // TO BE CONFIRMED
Settings.setValue("tabletCam/detached", detached); // TO BE CONFIRMED
}
tabletCamRunning = false;
}
var tabletCamLocalEntityWidth = 0.282;
var tabletCamLocalEntityHeight = 0.282;
var tabletCamLocalEntityDim = { x: tabletCamLocalEntityWidth, y: tabletCamLocalEntityHeight };
var tabletCamLocalEntity = false;
var LOCAL_ENTITY_STATIC_PROPERTIES = {
type: "Image",
imageURL: "resource://spectatorCameraFrame",
emissive: true,
grab: {
"grabbable": false
},
alpha: 1,
triggerable: false
};
function updateTabletCamLocalEntity() {
if (!HMD.tabletID) {
return;
}
if (tabletCamLocalEntity) {
Entities.deleteEntity(tabletCamLocalEntity);
tabletCamLocalEntity = false;
}
var props = LOCAL_ENTITY_STATIC_PROPERTIES;
props.dimensions = tabletCamLocalEntityDim;
if (!!HMD.tabletID) {
props.parentID = HMD.tabletID;
props.localPosition = [0, 0.0225, -0.008];
if (frontCamInUse) {
props.localRotation = Quat.fromVec3Degrees([0, 180, 180]);
} else {
props.localRotation = Quat.fromVec3Degrees([0, 0, 180]);
}
} else {
props.parentID = Uuid.NULL;
props.localPosition = inFrontOf(0.5);
props.localRotation = MyAvatar.orientation;
}
tabletCamLocalEntity = Entities.addEntity(props, "local");
}
function onDomainChanged() {
if (tabletCamRunning) {
disableTabletCam();
}
}
function tabletVisibilityChanged() {
if (!ui.tablet.tabletShown && ui.isOpen) {
ui.close();
}
}
var flash = Settings.getValue("tabletCam/flashEnabled", false);;
function setFlashStatus(enabled) {
if (!tabletCamAvatarEntity) {
return;
}
Settings.setValue("tabletCam/flashEnabled", enabled);
var cameraPosition = Entities.getEntityProperties(tabletCamAvatarEntity, ["positon"]).position;
if (enabled) {
Audio.playSound(SOUND_FLASH_ON, {
position: cameraPosition,
localOnly: true,
volume: 0.8
});
flash = Entities.addEntity({
"collisionless": true,
"collidesWith": "",
"collisionMask": 0,
"color": {
"blue": 173,
"green": 252,
"red": 255
},
"cutoff": 90,
"dimensions": {
"x": 4,
"y": 4,
"z": 4
},
"dynamic": false,
"falloffRadius": 0.20000000298023224,
"intensity": 27,
"isSpotlight": true,
"localRotation": { w: 1, x: 0, y: 0, z: 0 },
"localPosition": { x: 0, y: 0, z: -0.005 },
"name": "Tablet Camera Flash",
"type": "Light",
"parentID": tabletCamAvatarEntity,
}, "avatar");
} else {
if (flash) {
Audio.playSound(SOUND_FLASH_OFF, {
position: cameraPosition,
localOnly: true,
volume: 0.8
});
Entities.deleteEntity(flash);
flash = false;
}
}
}
function takePhoto() {
var tabletCamAvatarEntityPosition = Entities.getEntityProperties(tabletCamAvatarEntity, ["position"]).position;
Audio.playSound(SOUND_SNAPSHOT, {
position: { x: tabletCamAvatarEntityPosition.x, y: tabletCamAvatarEntityPosition.y, z: tabletCamAvatarEntityPosition.z },
localOnly: true,
volume: 0.2
});
Window.takeSecondaryCameraSnapshot();
}
function maybeTakePhoto() {
if (tabletCamAvatarEntity) {
secondaryCameraConfig.resetSizeSpectatorCamera(secondaryCameraResolutionWidth, secondaryCameraResolutionHeight);
// Wait a moment before taking the photo for the resolution to update
Script.setTimeout(function () {
takePhoto();
}, 250);
}
}
var snapshotQuality = Settings.getValue("tabletCam/quality", "normal");
function setSnapshotQuality(quality) {
snapshotQuality = quality;
Settings.setValue("tabletCam/quality", snapshotQuality);
var shortSideTargetResolution = 1000;
if (snapshotQuality === "low") {
shortSideTargetResolution = 500;
} else if (snapshotQuality === "normal") {
shortSideTargetResolution = 1000;
} else if (snapshotQuality === "high") {
shortSideTargetResolution = 2160;
} else if (snapshotQuality === "extreme") {
shortSideTargetResolution = 4320;
}
if (tallOrientation && !HMD.active) {
secondaryCameraResolutionWidth = shortSideTargetResolution;
secondaryCameraResolutionHeight = secondaryCameraResolutionWidth / aspectRatio;
secondaryCameraResolutionPreviewWidth = PREVIEW_SHORT_SIDE_RESOLUTION;
secondaryCameraResolutionPreviewHeight = secondaryCameraResolutionPreviewWidth / aspectRatio;
} else {
secondaryCameraResolutionHeight = shortSideTargetResolution;
secondaryCameraResolutionWidth = secondaryCameraResolutionHeight / aspectRatio;
secondaryCameraResolutionPreviewHeight = PREVIEW_SHORT_SIDE_RESOLUTION;
secondaryCameraResolutionPreviewWidth = secondaryCameraResolutionPreviewHeight / aspectRatio;
}
secondaryCameraConfig.resetSizeSpectatorCamera(secondaryCameraResolutionPreviewWidth, secondaryCameraResolutionPreviewHeight);
}
var aspectRatio = parseFloat(Settings.getValue("tabletCam/aspectRatio", "0.8"));
function setAspectRatio(ratio) {
aspectRatio = ratio;
Settings.setValue("tabletCam/aspectRatio", aspectRatio);
setSnapshotQuality(snapshotQuality);
}
var tallOrientation = Settings.getValue("tabletCam/tallOrientation", true);
function setOrientation(orientation) {
tallOrientation = orientation;
Settings.setValue("tabletCam/tallOrientation", tallOrientation);
setSnapshotQuality(snapshotQuality);
}
function photoDirChanged(snapshotPath) {
Window.browseDirChanged.disconnect(photoDirChanged);
if (snapshotPath !== "") { // not cancelled
Snapshot.setSnapshotsLocation(snapshotPath);
ui.sendMessage({
method: "photoDirectoryChanged",
photoDirectory: snapshotPath
});
}
}
function fromQml(message) {
switch (message.method) {
case 'switchCams':
switchCams(message.frontCamInUse);
break;
case 'switchOrientation':
setOrientation(!tallOrientation);
break;
case 'setFlashStatus':
setFlashStatus(message.enabled);
break;
case 'takePhoto':
maybeTakePhoto();
break;
case 'updateCameravFoV':
vFoV = message.vFoV;
secondaryCameraConfig.vFoV = vFoV;
Settings.setValue("tabletCam/vFoV", vFoV);
break;
case 'setSnapshotQuality':
setSnapshotQuality(message.quality);
break;
case 'setAspectRatio':
setAspectRatio(message.aspectRatio);
break;
case 'activeViewChanged':
if (message.activeView === "settingsView" || message.activeView === "reviewView") {
//disableTabletCam();
} else {
enableTabletCam();
}
break;
case 'setPhotoDirectory':
Window.browseDirChanged.connect(photoDirChanged);
Window.browseDirAsync("Choose Photo Directory", "", "");
break;
case 'setDetached':
detached = message.detached;
Settings.setValue("tabletCam/detached", detached);
var newTabletCamAvatarEntityProps = getDynamicTabletCamAvatarEntityProperties();
Entities.editEntity(tabletCamAvatarEntity, newTabletCamAvatarEntityProps);
break;
default:
print('Unrecognized message from TabletCam.qml.');
}
}
function setTakePhotoControllerMappingStatus(status) {
if (!takePhotoControllerMapping) {
return;
}
if (status) {
takePhotoControllerMapping.enable();
} else {
takePhotoControllerMapping.disable();
}
}
var takePhotoControllerMapping;
var takePhotoControllerMappingName = 'Hifi-TabletCam-Mapping-TakePhoto';
function registerTakePhotoControllerMapping() {
takePhotoControllerMapping = Controller.newMapping(takePhotoControllerMappingName);
if (controllerType === "OculusTouch") {
takePhotoControllerMapping.from(Controller.Standard.RS).to(function (value) {
if (value === 1.0) {
maybeTakePhoto();
}
return;
});
} else if (controllerType === "Vive") {
takePhotoControllerMapping.from(Controller.Standard.RightPrimaryThumb).to(function (value) {
if (value === 1.0) {
maybeTakePhoto();
}
return;
});
}
}
var controllerType = "Other";
function registerButtonMappings() {
var VRDevices = Controller.getDeviceNames().toString();
if (VRDevices) {
if (VRDevices.indexOf("Vive") !== -1) {
controllerType = "Vive";
} else if (VRDevices.indexOf("OculusTouch") !== -1) {
controllerType = "OculusTouch";
} else {
return; // Neither Vive nor Touch detected
}
}
if (!takePhotoControllerMapping) {
registerTakePhotoControllerMapping();
}
}
function onHMDChanged(isHMDMode) {
registerButtonMappings();
disableTabletCam();
}
var cameraRollPaths = JSON.parse(Settings.getValue("tabletCam/cameraRollPaths", '{"paths": []}'));
function onStillSnapshotTaken(path) {
var tempObject = {};
tempObject.imagePath = "file:///" + path;
cameraRollPaths.paths.unshift(tempObject);
if (cameraRollPaths.paths.length > 15) {
cameraRollPaths.paths.pop();
}
Settings.setValue("tabletCam/cameraRollPaths", JSON.stringify(cameraRollPaths));
secondaryCameraConfig.resetSizeSpectatorCamera(secondaryCameraResolutionPreviewWidth, secondaryCameraResolutionPreviewHeight);
ui.sendMessage({
method: 'stillSnapshotTaken',
lastStillSnapshotPath: tempObject.imagePath
});
}
var signalsWired = false;
function wireSignals(shouldWire) {
if (signalsWired === shouldWire) {
return;
}
signalsWired = shouldWire;
if (shouldWire) {
Window.stillSnapshotTaken.connect(onStillSnapshotTaken);
} else {
Window.stillSnapshotTaken.disconnect(onStillSnapshotTaken);
}
}
function inFrontOf(distance, position, orientation) {
return Vec3.sum(position || MyAvatar.position,
Vec3.multiply(distance, Quat.getForward(orientation || MyAvatar.orientation)));
}
var detached = false;
Settings.setValue("tabletCam/detached", detached);
function getDynamicTabletCamAvatarEntityProperties() {
var dynamicProps = {
dimensions: {"x":0.1600, "y":0.1021, "z":0.1137}
};
if (detached) {
//print("DETACHED MODE");
dynamicProps.collisionless = false;
dynamicProps.ignoreForCollisions = false;
dynamicProps.grab = {
"grabbable": true,
"equippableLeftRotation": {
"x": -0.0000152587890625,
"y": -0.0000152587890625,
"z": -0.0000152587890625,
"w": 1
},
"equippableRightRotation": {
"x": -0.0000152587890625,
"y": -0.0000152587890625,
"z": -0.0000152587890625,
"w": 1
}
};
dynamicProps.visible = true;
dynamicProps.parentID = Uuid.NULL;
dynamicProps.parentJointIndex = 65535;
dynamicProps.triggerable = true;
if (tabletCamAvatarEntity) {
var currentProps = Entities.getEntityProperties(tabletCamAvatarEntity, ["position", "rotation"]);
if (!!HMD.tabletID) {
dynamicProps.position = inFrontOf(0.2, currentProps.position, currentProps.rotation);
} else {
dynamicProps.position = currentProps.position;
}
dynamicProps.rotation = currentProps.rotation;
} else {
dynamicProps.position = inFrontOf(0.5);
dynamicProps.rotation = MyAvatar.orientation;
}
dynamicProps.velocity = [0, 0, 0];
dynamicProps.angularVelocity = [0, 0, 0];
} else {
dynamicProps.triggerable = false;
dynamicProps.collisionless = true;
dynamicProps.ignoreForCollisions = true;
dynamicProps.grab = {
"grabbable": false
};
dynamicProps.visible = false;
if (!!HMD.tabletID) {
//print("TABLET MODE");
dynamicProps.parentID = HMD.tabletID;
dynamicProps.parentJointIndex = 65535;
dynamicProps.dimensions = [0.01, 0.01, 0.01];
} else {
//print("DESKTOP USER CAMERA MODE");
var cameraMode = Camera.mode;
// If:
// - User is in third person mode
// - User is using the rear-facing camera
if (cameraMode !== "first person" && !frontCamInUse) {
dynamicProps.parentID = MyAvatar.sessionUUID;
dynamicProps.parentJointIndex = MyAvatar.getJointIndex("_CAMERA_MATRIX");
} else {
dynamicProps.parentID = MyAvatar.sessionUUID;
var jointIndex = MyAvatar.getJointIndex("HeadTop_End");
if (jointIndex === -1) {
jointIndex = MyAvatar.getJointIndex("Head");
}
dynamicProps.parentJointIndex = jointIndex;
}
}
dynamicProps.localPosition = {
"x": 0,
"y": !!HMD.tabletID ? 0.215 : (frontCamInUse ? -0.03 : (Camera.mode !== "first person" ? 0 : -0.02)),
"z": !!HMD.tabletID ? (frontCamInUse ? -0.02 : 0.1) : (frontCamInUse ? 1 : (Camera.mode !== "first person" ? 0 : 0.05))
};
if (!!HMD.tabletID) {
dynamicProps.localRotation = {
"x": 0,
"y": frontCamInUse ? 0 : 1,
"z": 0,
"w": frontCamInUse ? 1 : 0
};
} else {
dynamicProps.localRotation = {
"x": 0,
"y": frontCamInUse || (!frontCamInUse && Camera.mode !== "first person") ? 0 : 1,
"z": 0,
"w": frontCamInUse || (!frontCamInUse && Camera.mode !== "first person") ? 1 : 0
};
}
}
return dynamicProps;
}
function onModeUpdated(newMode) {
if (tabletCamAvatarEntity) {
var newTabletCamAvatarEntityProps = getDynamicTabletCamAvatarEntityProperties();
Entities.editEntity(tabletCamAvatarEntity, newTabletCamAvatarEntityProps);
}
}
function onClosed() {
if (!detached) {
disableTabletCam();
}
if (tabletCamLocalEntity) {
Entities.deleteEntity(tabletCamLocalEntity);
tabletCamLocalEntity = false;
}
}
function buttonActive(isActive) {
ui.button.editProperties({isActive: isActive || tabletCamRunning});
}
var ui;
function startup() {
ui = new AppUi({
buttonName: APPLICATION_CAPTION,
home: Script.resolvePath("./ui/TabletCam.qml"),
// Selfie by Path Lord from the Noun Project
graphicsDirectory: Script.resolvePath("appIcons/"),
onOpened: enableTabletCam,
onClosed: onClosed,
onMessage: fromQml,
buttonActive: buttonActive
});
Window.domainChanged.connect(onDomainChanged);
ui.tablet.tabletShownChanged.connect(tabletVisibilityChanged);
HMD.displayModeChanged.connect(onHMDChanged);
Camera.modeUpdated.connect(onModeUpdated);
registerButtonMappings();
}
startup();
function shutdown() {
disableTabletCam();
Window.domainChanged.disconnect(onDomainChanged);
ui.tablet.tabletShownChanged.disconnect(tabletVisibilityChanged);
HMD.displayModeChanged.disconnect(onHMDChanged);
Camera.modeUpdated.disconnect(onModeUpdated);
if (takePhotoControllerMapping) {
takePhotoControllerMapping.disable();
}
wireSignals(false);
}
Script.scriptEnding.connect(shutdown);
// "Camera Shutter, Fast, A.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org
var SOUND_SNAPSHOT = SoundCache.getSound(Script.resolvePath("sounds/snap.wav"));
var SOUND_FLASH_ON = SoundCache.getSound(Script.resolvePath("sounds/flashOn.wav"));
var SOUND_FLASH_OFF = SoundCache.getSound(Script.resolvePath("sounds/flashOff.wav"));
}()); // END LOCAL_SCOPE

View file

@ -0,0 +1,907 @@
//
// TabletCam.qml
// qml/hifi
//
// Tablet Cam v2.2
//
// Created by Zach Fox on 2019-04-14
// Copyright 2022 Overte e.V.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
import Hifi 1.0 as Hifi
import QtQuick 2.7
import QtQuick.Controls 2.3
import stylesUit 1.0 as HifiStylesUit
import controlsUit 1.0 as HifiControlsUit
Rectangle {
id: root;
property bool flashEnabled: Settings.getValue("tabletCam/flashEnabled", false);
property string snapshotQuality: Settings.getValue("tabletCam/quality", "normal");
property real aspectRatio: Settings.getValue("tabletCam/aspectRatio", (8 / 10));
property bool detached: Settings.getValue("tabletCam/detached", false);
property bool frontCamInUse: Settings.getValue("tabletCam/frontCamInUse", true);
property string activeView: "mainView";
HifiStylesUit.HifiConstants { id: hifi; }
color: hifi.colors.black;
onFlashEnabledChanged: {
sendToScript({method: 'setFlashStatus', enabled: root.flashEnabled});
}
onDetachedChanged: {
sendToScript({method: 'setDetached', detached: root.detached});
}
onFrontCamInUseChanged: {
sendToScript({method: 'switchCams', frontCamInUse: root.frontCamInUse});
}
onActiveViewChanged: {
root.flashEnabled = false;
sendToScript({method: 'activeViewChanged', activeView: root.activeView});
if (root.activeView === "settingsView") {
photoDirectoryTextField.text = Settings.getValue("snapshotsLocation", "<Not Set>");
}
}
Item {
id: mainView;
visible: root.activeView === "mainView";
anchors.fill: parent;
Rectangle {
id: helpTextContainer;
visible: !!Settings.getValue('tabletCam/firstRun', true) && HMD.active;
width: parent.width;
height: topBarContainer_main.height;
anchors.left: parent.left;
anchors.top: parent.top;
color: "#121212";
HifiStylesUit.RalewaySemiBold {
text: "Try clicking right thumbstick for photos!";
// Anchors
anchors.left: parent.left;
anchors.leftMargin: 8;
anchors.verticalCenter: parent.verticalCenter;
size: 22;
// Style
color: hifi.colors.white;
// Alignment
horizontalAlignment: Text.AlignLeft;
verticalAlignment: Text.AlignVCenter;
wrapMode: Text.Wrap;
}
HifiControlsUit.Button {
text: "OK";
colorScheme: hifi.colorSchemes.dark;
color: hifi.buttons.blue;
anchors.verticalCenter: parent.verticalCenter;
anchors.right: parent.right;
anchors.rightMargin: 8;
width: 50;
height: 35;
onClicked: {
helpTextContainer.visible = false;
Settings.setValue('tabletCam/firstRun', false);
}
}
}
Rectangle {
id: topBarContainer_main;
visible: !helpTextContainer.visible;
width: parent.width;
height: 42;
anchors.left: parent.left;
anchors.top: parent.top;
color: "#121212";
HifiControlsUit.CheckBox {
id: detachCheckbox;
text: "Detach"
checked: root.detached;
boxSize: 24;
height: 32;
anchors.verticalCenter: parent.verticalCenter;
anchors.left: parent.left;
anchors.leftMargin: 8;
onClicked: {
root.detached = checked;
}
}
HifiControlsUit.GlyphButton {
id: flashButton;
height: 26;
width: height;
anchors.verticalCenter: parent.verticalCenter;
anchors.right: fakeFlash.left;
anchors.rightMargin: 8;
glyph: hifi.glyphs.lightning;
color: root.flashEnabled ? hifi.buttons.blue : hifi.buttons.none;
onClicked: {
root.flashEnabled = !root.flashEnabled;
}
}
Rectangle {
id: fakeCamera;
width: 34;
height: width;
radius: width;
anchors.centerIn: parent;
color: hifi.colors.black;
Rectangle {
visible: root.frontCamInUse && !root.detached;
width: parent.width - 12;
height: width;
radius: width;
anchors.centerIn: parent;
color: "#230000";
}
}
Rectangle {
id: fakeFlash;
width: 12;
height: width;
radius: width;
anchors.verticalCenter: fakeCamera.verticalCenter;
anchors.right: fakeCamera.left;
anchors.rightMargin: 4;
color: root.flashEnabled && root.frontCamInUse ? "#fffcad" : "#000000";
}
Image {
id: switchCams;
height: 26;
width: height;
anchors.verticalCenter: parent.verticalCenter;
anchors.left: fakeCamera.right;
anchors.leftMargin: 8;
source: "./images/switchCams.svg"; // rotate camera by Diego Naive from the Noun Project
mipmap: true;
MouseArea {
anchors.fill: parent;
enabled: !root.detached;
onClicked: {
root.frontCamInUse = !root.frontCamInUse;
}
}
}
HifiControlsUit.GlyphButton {
id: settingsButton;
height: 26;
width: height;
anchors.verticalCenter: parent.verticalCenter;
anchors.right: parent.right;
anchors.rightMargin: 8;
glyph: hifi.glyphs.settings;
color: hifi.buttons.none;
onClicked: {
root.activeView = "settingsView";
}
}
}
Rectangle {
visible: !secondaryCameraPreview.visible && HMD.tabletID !== "{00000000-0000-0000-0000-000000000000}";
anchors.fill: secondaryCameraPreview;
color: hifi.colors.white;
}
// Secondary Camera Preview
Hifi.ResourceImageItem {
id: secondaryCameraPreview;
visible: HMD.tabletID !== "{00000000-0000-0000-0000-000000000000}";
url: "resource://spectatorCameraFrame";
ready: visible;
mirrorVertically: true;
anchors.top: topBarContainer_main.bottom;
anchors.bottom: bottomBarContainer_main.top;
anchors.left: parent.left;
anchors.right: parent.right;
onVisibleChanged: {
update();
}
}
Rectangle {
id: bottomBarContainer_main;
height: 88;
anchors.left: parent.left;
anchors.bottom: parent.bottom;
anchors.right: parent.right;
color: "#121212";
Item {
id: fieldOfView;
anchors.left: parent.left;
anchors.leftMargin: 12;
anchors.verticalCenter: parent.verticalCenter;
anchors.right: takeSnapshotButton.left;
anchors.rightMargin: 12;
height: 35;
HifiControlsUit.GlyphButton {
id: resetvFoV;
anchors.verticalCenter: parent.verticalCenter;
anchors.left: parent.left;
height: parent.height - 8;
width: height;
glyph: hifi.glyphs.reload;
onClicked: {
fieldOfViewSlider.value = 60.0;
}
}
HifiControlsUit.Slider {
id: fieldOfViewSlider;
anchors.top: parent.top;
anchors.bottom: parent.bottom;
anchors.right: parent.right;
anchors.left: resetvFoV.right;
anchors.leftMargin: 8;
colorScheme: hifi.colorSchemes.dark;
from: 8.0;
to: 120.0;
value: (to - Settings.getValue("tabletCam/vFoV", 60.0) + from);
stepSize: 1;
onValueChanged: {
sendToScript({method: 'updateCameravFoV', vFoV: to - value + from});
}
onPressedChanged: {
if (!pressed) {
sendToScript({method: 'updateCameravFoV', vFoV: to - value + from});
}
}
}
}
Rectangle {
id: takeSnapshotButton;
color: "#EA4C5F";
anchors.horizontalCenter: parent.horizontalCenter;
anchors.verticalCenter: parent.verticalCenter;
height: 72;
width: height;
radius: height;
border.width: 3;
border.color: hifi.colors.white;
MouseArea {
anchors.fill: parent;
hoverEnabled: true;
onEntered: {
parent.color = "#C62147";
}
onExited: {
parent.color = "#EA4C5F";
}
onClicked: {
if (HMD.tabletID !== "{00000000-0000-0000-0000-000000000000}") {
secondaryCameraPreview.visible = false;
}
sendToScript({method: 'takePhoto'});
}
}
}
Image {
visible: !HMD.active;
source: "./images/orientation.svg"; // orientation by Atif Arshad from the Noun Project
height: 24;
width: height;
anchors.left: takeSnapshotButton.right;
anchors.leftMargin: 24;
anchors.verticalCenter: parent.verticalCenter;
MouseArea {
anchors.fill: parent;
onClicked: {
sendToScript({method: 'switchOrientation'});
}
}
}
Rectangle {
id: galleryButton;
anchors.right: parent.right;
anchors.rightMargin: 12;
anchors.verticalCenter: parent.verticalCenter;
height: 72;
width: height;
color: hifi.colors.black;
Image {
id: galleryButtonImage;
source: JSON.parse(Settings.getValue("tabletCam/cameraRollPaths", '{"paths": ["imagePath": ""]}')).paths[0].imagePath;
fillMode: Image.PreserveAspectCrop;
anchors.fill: parent;
mipmap: true;
}
MouseArea {
enabled: galleryButtonImage.source !== "";
anchors.fill: parent;
onClicked: {
cameraRollSwipeView.setCurrentIndex(0);
cameraRollModel.clear();
var settingsString = Settings.getValue("tabletCam/cameraRollPaths", '{"paths": []}');
cameraRollModel.append(JSON.parse(settingsString).paths);
root.activeView = "reviewView";
}
}
}
}
}
Item {
id: reviewView;
visible: root.activeView === "reviewView";
anchors.fill: parent;
Rectangle {
id: topBarContainer_review;
width: parent.width;
height: 42;
anchors.left: parent.left;
anchors.top: parent.top;
color: "#121212";
HifiControlsUit.Button {
text: "BACK";
colorScheme: hifi.colorSchemes.dark;
color: hifi.buttons.noneBorderlessWhite;
anchors.verticalCenter: parent.verticalCenter;
anchors.left: parent.left;
anchors.leftMargin: 8;
width: 50;
height: 30;
onClicked: {
root.activeView = "mainView";
}
}
HifiStylesUit.RalewaySemiBold {
text: "CAMERA ROLL";
// Anchors
anchors.horizontalCenter: parent.horizontalCenter;
anchors.verticalCenter: parent.verticalCenter;
size: 22;
// Style
color: hifi.colors.white;
// Alignment
horizontalAlignment: Text.AlignHCenter;
verticalAlignment: Text.AlignVCenter;
wrapMode: Text.Wrap;
}
}
ListModel {
id: cameraRollModel;
}
SwipeView {
id: cameraRollSwipeView;
anchors.top: topBarContainer_review.bottom;
anchors.left: parent.left;
anchors.right: parent.right;
anchors.bottom: bottomBarContainer_review.top;
Repeater {
model: cameraRollModel;
Image {
source: imagePath;
fillMode: Image.PreserveAspectFit;
mipmap: true;
}
}
}
PageIndicator {
id: indicator;
interactive: true;
count: cameraRollSwipeView.count;
currentIndex: cameraRollSwipeView.currentIndex
anchors.bottom: cameraRollSwipeView.bottom;
anchors.horizontalCenter: cameraRollSwipeView.horizontalCenter;
delegate: Rectangle {
implicitWidth: 15;
implicitHeight: 15;
radius: width;
color: "#00b4ef";
opacity: index === cameraRollSwipeView.currentIndex ? 0.95 : 0.45;
border.color: "#FFFFFF";
border.width: index === cameraRollSwipeView.currentIndex ? 2 : 0;
Behavior on opacity {
OpacityAnimator {
duration: 100;
}
}
}
}
Rectangle {
id: bottomBarContainer_review;
height: 88;
anchors.left: parent.left;
anchors.bottom: parent.bottom;
anchors.right: parent.right;
color: "#121212";
HifiControlsUit.Button {
text: "SHOW IN DESKTOP FILE BROWSER";
colorScheme: hifi.colorSchemes.dark;
color: hifi.buttons.blue;
anchors.verticalCenter: parent.verticalCenter;
anchors.horizontalCenter: parent.horizontalCenter;
width: 240;
height: 30;
onClicked: {
var currentImagePath = cameraRollModel.get(cameraRollSwipeView.index).imagePath;
Qt.openUrlExternally(currentImagePath.substring(0, currentImagePath.lastIndexOf('/')));
}
}
}
}
Rectangle {
id: settingsView;
visible: root.activeView === "settingsView";
anchors.fill: parent;
color: hifi.colors.black;
Rectangle {
id: topBarContainer_settings;
width: parent.width;
height: 42;
anchors.left: parent.left;
anchors.top: parent.top;
color: "#121212";
HifiControlsUit.Button {
text: "BACK";
colorScheme: hifi.colorSchemes.dark;
color: hifi.buttons.noneBorderlessWhite;
anchors.verticalCenter: parent.verticalCenter;
anchors.left: parent.left;
anchors.leftMargin: 8;
width: 50;
height: 30;
onClicked: {
root.activeView = "mainView";
}
}
HifiStylesUit.RalewaySemiBold {
text: "SETTINGS";
// Anchors
anchors.horizontalCenter: parent.horizontalCenter;
anchors.verticalCenter: parent.verticalCenter;
size: 22;
// Style
color: hifi.colors.white;
// Alignment
horizontalAlignment: Text.AlignHCenter;
verticalAlignment: Text.AlignVCenter;
wrapMode: Text.Wrap;
}
}
Item {
id: settingsContainer;
anchors.top: topBarContainer_settings.bottom;
anchors.topMargin: 16;
anchors.left: parent.left;
anchors.leftMargin: 16;
anchors.right: parent.right;
anchors.rightMargin: 16;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 8;
Item {
id: qualityContainer;
anchors.top: parent.top;
anchors.left: parent.left;
anchors.right: parent.right;
height: childrenRect.height;
HifiStylesUit.RalewaySemiBold {
id: qualityHeaderText;
text: "Photo Quality";
// Anchors
anchors.left: parent.left;
anchors.top: parent.top;
height: 22;
size: 18;
// Style
color: hifi.colors.white;
// Alignment
horizontalAlignment: Text.AlignLeft;
verticalAlignment: Text.AlignTop;
}
HifiControlsUit.RadioButton {
id: lowRadioButton;
checked: root.snapshotQuality === "low";
text: "Low";
width: 70;
height: 35;
anchors.left: parent.left;
anchors.top: qualityHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (!lowRadioButton.checked) {
lowRadioButton.checked = true;
}
if (normalRadioButton.checked) {
normalRadioButton.checked = false;
}
if (highRadioButton.checked) {
highRadioButton.checked = false;
}
if (extremeRadioButton.checked) {
extremeRadioButton.checked = false;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setSnapshotQuality', quality: "low"});
}
}
}
HifiControlsUit.RadioButton {
id: normalRadioButton;
checked: root.snapshotQuality === "normal";
text: "Normal";
width: 100;
height: 35;
anchors.left: lowRadioButton.right;
anchors.leftMargin: 16;
anchors.top: qualityHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (lowRadioButton.checked) {
lowRadioButton.checked = false;
}
if (!normalRadioButton.checked) {
normalRadioButton.checked = true;
}
if (highRadioButton.checked) {
highRadioButton.checked = false;
}
if (extremeRadioButton.checked) {
extremeRadioButton.checked = false;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setSnapshotQuality', quality: "normal"});
}
}
}
HifiControlsUit.RadioButton {
id: highRadioButton;
checked: root.snapshotQuality === "high";
text: "4k";
width: 75;
height: 35;
anchors.left: normalRadioButton.right;
anchors.leftMargin: 16;
anchors.top: qualityHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (lowRadioButton.checked) {
lowRadioButton.checked = false;
}
if (normalRadioButton.checked) {
normalRadioButton.checked = false;
}
if (!highRadioButton.checked) {
highRadioButton.checked = true;
}
if (extremeRadioButton.checked) {
extremeRadioButton.checked = false;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setSnapshotQuality', quality: "high"});
}
}
}
HifiControlsUit.RadioButton {
id: extremeRadioButton;
checked: root.snapshotQuality === "extreme";
text: "EXTREME";
width: 120;
height: 35;
anchors.left: highRadioButton.right;
anchors.leftMargin: 16;
anchors.top: qualityHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (lowRadioButton.checked) {
lowRadioButton.checked = false;
}
if (normalRadioButton.checked) {
normalRadioButton.checked = false;
}
if (highRadioButton.checked) {
highRadioButton.checked = false;
}
if (!extremeRadioButton.checked) {
extremeRadioButton.checked = true;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setSnapshotQuality', quality: "extreme"});
}
}
}
}
Item {
id: aspectRatioContainer;
anchors.top: qualityContainer.bottom;
anchors.topMargin: 16;
anchors.left: parent.left;
anchors.right: parent.right;
height: childrenRect.height;
HifiStylesUit.RalewaySemiBold {
id: aspectRatioHeaderText;
text: "Aspect Ratio";
// Anchors
anchors.left: parent.left;
anchors.top: parent.top;
height: 22;
size: 18;
// Style
color: hifi.colors.white;
// Alignment
horizontalAlignment: Text.AlignLeft;
verticalAlignment: Text.AlignTop;
}
HifiControlsUit.RadioButton {
id: eightByTenRadioButton;
checked: parseFloat(root.aspectRatio) === (8 / 10);
text: "8x10";
width: 70;
height: 35;
anchors.left: parent.left;
anchors.top: aspectRatioHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (!eightByTenRadioButton.checked) {
eightByTenRadioButton.checked = true;
}
if (twoByThreeRadioButton.checked) {
twoByThreeRadioButton.checked = false;
}
if (nineBySixteenRadioButton.checked) {
nineBySixteenRadioButton.checked = false;
}
if (oneByOneRadioButton.checked) {
oneByOneRadioButton.checked = false;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setAspectRatio', aspectRatio: (8 / 10)});
}
}
}
HifiControlsUit.RadioButton {
id: twoByThreeRadioButton;
checked: parseFloat(root.aspectRatio) === (2 / 3);
text: "2x3";
width: 100;
height: 35;
anchors.left: eightByTenRadioButton.right;
anchors.leftMargin: 16;
anchors.top: aspectRatioHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (eightByTenRadioButton.checked) {
eightByTenRadioButton.checked = false;
}
if (!twoByThreeRadioButton.checked) {
twoByThreeRadioButton.checked = true;
}
if (nineBySixteenRadioButton.checked) {
nineBySixteenRadioButton.checked = false;
}
if (oneByOneRadioButton.checked) {
oneByOneRadioButton.checked = false;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setAspectRatio', aspectRatio: (2 / 3)});
}
}
}
HifiControlsUit.RadioButton {
id: nineBySixteenRadioButton;
checked: parseFloat(root.aspectRatio) === 9 / 16;
text: "9x16";
width: 75;
height: 35;
anchors.left: twoByThreeRadioButton.right;
anchors.leftMargin: 16;
anchors.top: aspectRatioHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (eightByTenRadioButton.checked) {
eightByTenRadioButton.checked = false;
}
if (twoByThreeRadioButton.checked) {
twoByThreeRadioButton.checked = false;
}
if (!nineBySixteenRadioButton.checked) {
nineBySixteenRadioButton.checked = true;
}
if (oneByOneRadioButton.checked) {
oneByOneRadioButton.checked = false;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setAspectRatio', aspectRatio: (9 / 16)});
}
}
}
HifiControlsUit.RadioButton {
id: oneByOneRadioButton;
checked: parseFloat(root.aspectRatio) === 1 / 1;
text: "Square";
width: 83;
height: 35;
anchors.left: nineBySixteenRadioButton.right;
anchors.leftMargin: 16;
anchors.top: aspectRatioHeaderText.bottom;
colorScheme: hifi.colorSchemes.dark;
onClicked: {
if (eightByTenRadioButton.checked) {
eightByTenRadioButton.checked = false;
}
if (twoByThreeRadioButton.checked) {
twoByThreeRadioButton.checked = false;
}
if (nineBySixteenRadioButton.checked) {
nineBySixteenRadioButton.checked = false;
}
if (!oneByOneRadioButton.checked) {
oneByOneRadioButton.checked = true;
}
}
onCheckedChanged: {
if (checked) {
sendToScript({method: 'setAspectRatio', aspectRatio: 1});
}
}
}
}
Item {
id: photoDirectoryContainer;
anchors.top: aspectRatioContainer.bottom;
anchors.topMargin: 16;
anchors.left: parent.left;
anchors.right: parent.right;
height: childrenRect.height;
HifiStylesUit.RalewaySemiBold {
id: photoDirectoryHeaderText;
text: "Photo Directory";
// Anchors
anchors.left: parent.left;
anchors.top: parent.top;
height: 22;
size: 18;
// Style
color: hifi.colors.white;
// Alignment
horizontalAlignment: Text.AlignLeft;
verticalAlignment: Text.AlignTop;
}
HifiControlsUit.TextField {
id: photoDirectoryTextField;
readOnly: true;
text: Settings.getValue("snapshotsDirectory", "<Not Set>");
colorScheme: hifi.colorSchemes.dark;
// Anchors
anchors.top: photoDirectoryHeaderText.bottom;
anchors.topMargin: 8;
anchors.left: parent.left;
anchors.right: parent.right;
height: 50;
MouseArea {
anchors.fill: parent;
onClicked: {
sendToScript({method: 'setPhotoDirectory'});
}
}
}
HifiControlsUit.Button {
text: "CHANGE";
colorScheme: hifi.colorSchemes.dark;
color: hifi.buttons.blue;
anchors.top: photoDirectoryTextField.bottom;
anchors.topMargin: 4;
anchors.right: parent.right;
width: 100;
height: 35;
onClicked: {
sendToScript({method: 'setPhotoDirectory'});
}
}
}
HifiStylesUit.FiraSansRegular {
text: "Hint:\nIn HMD, using the detached camera, you can press on the\nthumbsticks of your right controller to take a photo.\n\n\nv2.4";
// Anchors
anchors.bottom: parent.bottom;
anchors.left: parent.left;
size: 16;
// Style
color: hifi.colors.lightGrayText;
}
}
}
function fromScript(message) {
switch (message.method) {
case 'stillSnapshotTaken':
Settings.setValue('tabletCam/firstRun', false);
helpTextContainer.visible = false;
galleryButtonImage.source = message.lastStillSnapshotPath;
if (HMD.tabletID !== "{00000000-0000-0000-0000-000000000000}") {
secondaryCameraPreview.visible = true;
}
break;
case 'photoDirectoryChanged':
photoDirectoryTextField.text = message.photoDirectory;
break;
case 'inspectionCertificate_resetCert':
break;
default:
console.log('Unrecognized message from TabletCam.js.');
}
}
signal sendToScript(var message);
}

View file

@ -0,0 +1,3 @@
<svg enable-background="new 0 0 24 24" version="1.1" viewBox="0 0 23.732 22.154" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-.134 -.764)" fill="#fff"><path d="m9.544 19.319h-7.167c-1.237 0-2.243-1.007-2.243-2.243v-14.069c0-1.237 1.006-2.243 2.243-2.243h7.167c1.237 0 2.243 1.006 2.243 2.243v14.069c0 1.237-1.006 2.243-2.243 2.243zm-7.167-17.255c-0.52 0-0.943 0.423-0.943 0.943v14.069c0 0.52 0.423 0.942 0.943 0.942h7.167c0.52 0 0.943-0.423 0.943-0.942v-14.069c0-0.52-0.423-0.943-0.943-0.943z"/><path d="m11.137 5.515h-10.353c-0.359 0-0.65-0.291-0.65-0.65s0.291-0.65 0.65-0.65h10.353c0.359 0 0.65 0.291 0.65 0.65s-0.291 0.65-0.65 0.65z"/><path d="m11.137 15.735h-10.353c-0.359 0-0.65-0.291-0.65-0.65s0.291-0.65 0.65-0.65h10.353c0.359 0 0.65 0.291 0.65 0.65s-0.291 0.65-0.65 0.65z"/><path d="m21.623 22.918h-14.069c-1.237 0-2.243-1.007-2.243-2.243v-2.006c0-0.359 0.291-0.65 0.65-0.65s0.65 0.291 0.65 0.65v2.006c0 0.52 0.423 0.942 0.943 0.942h14.069c0.52 0 0.942-0.423 0.942-0.942v-7.167c0-0.52-0.423-0.942-0.942-0.942h-10.485c-0.359 0-0.65-0.292-0.65-0.65s0.291-0.65 0.65-0.65h10.485c1.236 0 2.243 1.006 2.243 2.243v7.167c0 1.235-1.007 2.242-2.243 2.242z"/><path d="m19.765 22.918c-0.359 0-0.65-0.291-0.65-0.65v-10.353c0-0.359 0.291-0.65 0.65-0.65s0.65 0.291 0.65 0.65v10.353c0 0.359-0.291 0.65-0.65 0.65z"/><path d="m9.545 22.54c-0.359 0-0.65-0.291-0.65-0.65v-3.221c0-0.359 0.291-0.65 0.65-0.65s0.65 0.291 0.65 0.65v3.221c0 0.359-0.291 0.65-0.65 0.65z"/></g><text x="-0.134" y="38.236" fill="#000000" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif" font-size="5px" font-weight="bold">Created by Atif Arshad</text>
<text x="-0.134" y="43.236" fill="#000000" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif" font-size="5px" font-weight="bold">from the Noun Project</text>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,9 @@
<svg version="1.1" viewBox="0 0 73.497 73.571" xmlns="http://www.w3.org/2000/svg">
<title>rotate-cam-3</title>
<desc>Created with Sketch.</desc>
<g transform="translate(-13,-13)" fill="#fff" fill-rule="evenodd">
<path d="m54.548 48.979c0-2.654-2.158-4.813-4.812-4.813s-4.814 2.159-4.814 4.813c0 2.653 2.16 4.812 4.814 4.812s4.812-2.159 4.812-4.812zm4 0c0 4.859-3.953 8.813-8.812 8.813-4.86 0-8.814-3.954-8.814-8.813s3.954-8.813 8.814-8.813c4.859 0 8.812 3.954 8.812 8.813zm6.762-5.951c0-1.639-1.333-2.972-2.971-2.972h-2.418c-1.733 0-3.262-0.853-4.142-2.283l-1.101-1.78h-9.885l-1.105 1.785c-0.876 1.425-2.405 2.278-4.085 2.278h-2.47c-1.639 0-2.972 1.333-2.972 2.972v13.779c0 1.639 1.333 2.972 2.972 2.972h25.206c1.638 0 2.971-1.333 2.971-2.972zm4 0v13.779c0 3.844-3.127 6.972-6.971 6.972h-25.206c-3.844 0-6.972-3.128-6.972-6.972v-13.779c0-3.844 3.128-6.972 6.972-6.972h2.417c0.333 0 0.588-0.141 0.733-0.379l1.696-2.737c0.364-0.589 1.007-0.947 1.7-0.947h12.113c0.693 0 1.336 0.358 1.7 0.947l1.692 2.732c0.149 0.243 0.404 0.384 0.684 0.384h2.471c3.844 0 6.971 3.128 6.971 6.972zm9.049-16.349c-7.008-8.694-17.433-13.679-28.605-13.679h-0.018c-3.411 0-6.802 0.475-10.081 1.411-1.062 0.302-1.677 1.409-1.374 2.471 0.302 1.062 1.407 1.679 2.472 1.374 2.921-0.833 5.943-1.256 8.984-1.256h0.016c9.956 0 19.247 4.443 25.492 12.189 5.487 6.806 7.994 15.341 7.061 24.034-0.774 7.207-3.841 13.802-8.743 18.975l1e-3 -5.235c0-1.104-0.896-2-2-2-1.105 0-2 0.896-2 2l-2e-3 9.805c0 0.028 7e-3 0.055 7e-3 0.082 3e-3 0.07 0.012 0.139 0.022 0.208 9e-3 0.064 0.02 0.126 0.034 0.187 0.015 0.061 0.035 0.121 0.056 0.181 0.023 0.066 0.047 0.13 0.077 0.193 0.024 0.051 0.053 0.101 0.082 0.151 0.038 0.066 0.079 0.13 0.124 0.19 0.016 0.021 0.025 0.043 0.041 0.063 0.018 0.021 0.039 0.036 0.057 0.057 0.063 0.072 0.132 0.138 0.205 0.201 0.038 0.033 0.076 0.066 0.116 0.096 0.076 0.056 0.157 0.103 0.241 0.148 0.04 0.021 0.078 0.046 0.119 0.064 0.099 0.045 0.202 0.077 0.309 0.106 0.029 8e-3 0.058 0.02 0.088 0.027 0.136 0.028 0.276 0.046 0.421 0.046l9.799 3e-3h1e-3c1.105 0 2-0.896 2-1.999 0-1.105-0.894-2.001-1.999-2.001l-4.724-1e-3c5.406-5.778 8.786-13.113 9.645-21.12 1.047-9.756-1.767-19.334-7.924-26.971zm-17.167 55.995c0.303 1.063-0.312 2.169-1.373 2.473-3.354 0.959-6.763 1.424-10.133 1.424-10.93 0-21.476-4.888-28.572-13.693-11.6-14.39-10.532-34.945 1.733-48.089l-4.738-1e-3c-1.105 0-1.999-0.897-1.999-2.001s0.895-1.999 2-1.999l9.805 3e-3c0.033 0 0.067 7e-3 0.1 9e-3 0.069 4e-3 0.137 0.01 0.206 0.021 0.06 0.01 0.119 0.021 0.179 0.037 0.066 0.016 0.13 0.035 0.195 0.059 0.057 0.021 0.112 0.043 0.168 0.07 0.061 0.029 0.121 0.06 0.181 0.096 0.053 0.033 0.105 0.068 0.156 0.105 0.052 0.039 0.103 0.081 0.153 0.126 0.024 0.022 0.053 0.039 0.076 0.062 0.027 0.027 0.046 0.059 0.071 0.086 0.023 0.026 0.049 0.046 0.071 0.073 0.018 0.023 0.03 0.049 0.048 0.073 0.042 0.057 0.079 0.115 0.114 0.176 0.033 0.055 0.063 0.112 0.091 0.17 0.027 0.058 0.049 0.117 0.07 0.177 0.023 0.064 0.043 0.128 0.059 0.194 0.014 0.059 0.024 0.12 0.033 0.18 0.01 0.069 0.017 0.135 0.019 0.203 2e-3 0.028 9e-3 0.055 9e-3 0.084l-5e-3 9.804c-1e-3 1.105-0.895 1.999-2 1.999h-1e-3c-1.104-1e-3 -2-0.896-1.999-2.001l3e-3 -5.223c-11.058 11.706-12.063 30.121-1.683 42.998 8.274 10.264 21.813 14.555 34.49 10.932 1.063-0.305 2.17 0.312 2.473 1.373z" fill="#fff"/>
</g>
<text x="-13" y="102" fill="#000000" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif" font-size="5px" font-weight="bold">Created by Diego Naive</text>
<text x="-13" y="107" fill="#000000" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif" font-size="5px" font-weight="bold">from the Noun Project</text>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB