Skip to content

Instantly share code, notes, and snippets.

@roachhd
Created October 15, 2014 08:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save roachhd/ed868adaad1f2e3d9b3e to your computer and use it in GitHub Desktop.
Save roachhd/ed868adaad1f2e3d9b3e to your computer and use it in GitHub Desktop.
Super single page site
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var App, app, characters, client, navigation, _,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
_ = require('underscore');
characters = require('./characters');
navigation = require('./navigation');
App = (function() {
App.prototype.BASEURL = "http://api.adorable.io/avatars/";
App.prototype.url = '';
App.prototype.size = "285";
App.prototype.radius = "0";
App.prototype.name = "abott@adorable.io.png";
App.prototype.maxsize = 400;
App.prototype.tmpValue = '';
function App() {
this.requestImage = __bind(this.requestImage, this);
this.handleInputEvent = __bind(this.handleInputEvent, this);
this._handleInputEvent = _.throttle(this.handleInputEvent, 100);
this._setImageStyles = _.debounce(this.setImageStyles, 100);
this._requestImage = _.debounce(this.requestImage, 400);
this.url = "" + this.BASEURL + this.size + "/" + this.name;
this.setupEvents();
}
App.prototype.setupEvents = function() {
$('input').on('input', this.handleInputEvent);
$('input[type=text]').on('input', this._requestImage);
$('input').on('change', this.requestImage);
$('#png').on('change', this.handleInputEvent);
return $('.input-container').on('click', this.setActive);
};
App.prototype.handleInputEvent = function(e) {
var $el, $for, value;
$el = $(e.target);
$for = $($el.data('for'));
if (e.target.type === 'checkbox') {
return this.setExtension(e, $for);
}
this.setActive($el);
value = $el.val();
this[e.target.id] = encodeURIComponent(value);
$for.text(value);
this.url = "" + this.BASEURL + this.size + "/" + this.name;
return this._setImageStyles();
};
App.prototype.setActive = function(el) {
var $el;
if (el.type) {
el = el.target;
}
$el = $(el);
$('.input-container').removeClass('active');
return $el.closest('.input-container').addClass('active');
};
App.prototype.requestImage = function(e) {
var $el, $for;
$el = $(e.target);
$for = $($el.data('for'));
this.flash($for);
return this.setImageURL();
};
App.prototype.flash = function($for) {
$for.addClass('flash');
return setTimeout((function() {
return $for.removeClass('flash');
}), 600);
};
App.prototype.processCharacter = function(e) {
if ($(e.target).hasClass('num')) {
if (!characters.isNumber(e.keyCode)) {
return e.preventDefault();
}
}
};
App.prototype.setExtension = function(e, $for) {
return $for.toggle(e.target.checked);
};
App.prototype.setImageURL = function() {
return $('#demo-image').attr('src', this.url);
};
App.prototype.setImageStyles = function() {
return $('#demo-image').css({
'width': this.size,
'height': this.size,
'border-radius': "" + this.radius + "%"
});
};
return App;
})();
client = new ZeroClipboard($("#copy-button"));
client.on("ready", function(readyEvent) {
client.on("copy", function(e) {
var clipboard;
clipboard = e.clipboardData;
return clipboard.setData('text/plain', app.url);
});
return client.on("aftercopy", function(e) {
var $el, $prev;
$el = $(e.target);
$prev = $el.prev();
return app.flash($prev);
});
});
module.exports = app = new App();
},{"./characters":2,"./navigation":3,"underscore":4}],2:[function(require,module,exports){
module.exports = {
KEY_0: 48,
KEY_1: 49,
KEY_2: 50,
KEY_3: 51,
KEY_4: 52,
KEY_5: 53,
KEY_6: 54,
KEY_7: 55,
KEY_8: 56,
KEY_9: 57,
KEY_BACKSPACE: 8,
KEY_TAB: 9,
KEY_LEFT: 37,
KEY_UP: 38,
KEY_RIGHT: 39,
KEY_DOWN: 40,
isNumber: function(code) {
var i, _i, _ref, _ref1;
for (i = _i = _ref = this.KEY_0, _ref1 = this.KEY_9; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = _ref <= _ref1 ? ++_i : --_i) {
if (code === i) {
return true;
}
}
return false;
}
};
},{}],3:[function(require,module,exports){
var Navigation, _,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
_ = require("underscore");
Navigation = (function() {
Navigation.prototype.closeMenu = function() {
return $('body').removeClass('open');
};
Navigation.prototype.toggleMenu = function() {
console.log('toggleMenu');
if ($('body.open').length > 0) {
return this.closeMenu();
} else {
return $('body').addClass('open');
}
};
Navigation.prototype.handleScroll = function(e) {
var demoTolerance;
if ($(e.target).scrollTop() <= 120) {
$('body').removeClass('scrolled');
} else {
$('body').addClass('scrolled');
}
demoTolerance = Math.max(0, Math.abs($('#demo').offset().top - $(document).scrollTop()));
if (demoTolerance < 100) {
return _.delay(this.highlightNameField, 100);
}
};
Navigation.prototype.highlightNameField = function() {
var $demo, $nameField, aFieldIsActive, nameFieldIsActive;
$demo = $('#demo + section');
$nameField = $demo.find('#name');
aFieldIsActive = $demo.find('.input-container.active').length;
if (!aFieldIsActive) {
$nameField.parent('.input-container').addClass('active');
}
nameFieldIsActive = $demo.find('.input-container.active #name').length;
if (nameFieldIsActive) {
return $nameField.focus().get(0).select();
}
};
Navigation.prototype.gotoAnchor = function($el) {
var distance, position, speed, time;
position = $($el.attr('href')).offset().top;
distance = position - $(document).scrollTop();
speed = 10;
time = Math.abs(distance) / speed;
return $('html, body').animate({
scrollTop: position
}, Math.floor(time));
};
function Navigation() {
this.handleScroll = __bind(this.handleScroll, this);
this.toggleMenu = __bind(this.toggleMenu, this);
this._gotoAnchor = _.throttle(this.gotoAnchor, 500, {
trailing: false
});
this._handleScroll = _.throttle(this.handleScroll, 300, true);
this._toggleMenu = _.throttle(this.toggleMenu, 300, true);
$('.menu').on('click', this._toggleMenu);
$('.navigation [href]').on('click', (function(_this) {
return function(e) {
e.preventDefault();
_this.closeMenu();
return _this._gotoAnchor($(e.currentTarget));
};
})(this));
$.each($('.title'), function() {
var offset;
offset = $(this).find('a').outerWidth();
return $(this).find('.tooltip').css('left', offset);
});
$(document).on('scroll', this._handleScroll);
}
return Navigation;
})();
module.exports = new Navigation();
},{"underscore":4}],4:[function(require,module,exports){
// Underscore.js 1.6.0
// http://underscorejs.org
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
(function() {
// Baseline setup
// --------------
// Establish the root object, `window` in the browser, or `exports` on the server.
var root = this;
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
// Establish the object that gets returned to break out of a loop iteration.
var breaker = {};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
// Create quick reference variables for speed access to core prototypes.
var
push = ArrayProto.push,
slice = ArrayProto.slice,
concat = ArrayProto.concat,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
nativeForEach = ArrayProto.forEach,
nativeMap = ArrayProto.map,
nativeReduce = ArrayProto.reduce,
nativeReduceRight = ArrayProto.reduceRight,
nativeFilter = ArrayProto.filter,
nativeEvery = ArrayProto.every,
nativeSome = ArrayProto.some,
nativeIndexOf = ArrayProto.indexOf,
nativeLastIndexOf = ArrayProto.lastIndexOf,
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
};
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object via a string identifier,
// for Closure Compiler "advanced" mode.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} else {
root._ = _;
}
// Current version.
_.VERSION = '1.6.0';
// Collection Functions
// --------------------
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects with the built-in `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return obj;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, length = obj.length; i < length; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
var keys = _.keys(obj);
for (var i = 0, length = keys.length; i < length; i++) {
if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
}
}
return obj;
};
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = _.collect = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results.push(iterator.call(context, value, index, list));
});
return results;
};
var reduceError = 'Reduce of empty array with no initial value';
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduce && obj.reduce === nativeReduce) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
}
each(obj, function(value, index, list) {
if (!initial) {
memo = value;
initial = true;
} else {
memo = iterator.call(context, memo, value, index, list);
}
});
if (!initial) throw new TypeError(reduceError);
return memo;
};
// The right-associative version of reduce, also known as `foldr`.
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
}
var length = obj.length;
if (length !== +length) {
var keys = _.keys(obj);
length = keys.length;
}
each(obj, function(value, index, list) {
index = keys ? keys[--length] : --length;
if (!initial) {
memo = obj[index];
initial = true;
} else {
memo = iterator.call(context, memo, obj[index], index, list);
}
});
if (!initial) throw new TypeError(reduceError);
return memo;
};
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, predicate, context) {
var result;
any(obj, function(value, index, list) {
if (predicate.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
// Return all the elements that pass a truth test.
// Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
_.filter = _.select = function(obj, predicate, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
each(obj, function(value, index, list) {
if (predicate.call(context, value, index, list)) results.push(value);
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, predicate, context) {
return _.filter(obj, function(value, index, list) {
return !predicate.call(context, value, index, list);
}, context);
};
// Determine whether all of the elements match a truth test.
// Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
_.every = _.all = function(obj, predicate, context) {
predicate || (predicate = _.identity);
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);
each(obj, function(value, index, list) {
if (!(result = result && predicate.call(context, value, index, list))) return breaker;
});
return !!result;
};
// Determine if at least one element in the object matches a truth test.
// Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
var any = _.some = _.any = function(obj, predicate, context) {
predicate || (predicate = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
each(obj, function(value, index, list) {
if (result || (result = predicate.call(context, value, index, list))) return breaker;
});
return !!result;
};
// Determine if the array or object contains a given value (using `===`).
// Aliased as `include`.
_.contains = _.include = function(obj, target) {
if (obj == null) return false;
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
return any(obj, function(value) {
return value === target;
});
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
return (isFunc ? method : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, _.property(key));
};
// Convenience version of a common use case of `filter`: selecting only objects
// containing specific `key:value` pairs.
_.where = function(obj, attrs) {
return _.filter(obj, _.matches(attrs));
};
// Convenience version of a common use case of `find`: getting the first object
// containing specific `key:value` pairs.
_.findWhere = function(obj, attrs) {
return _.find(obj, _.matches(attrs));
};
// Return the maximum element or (element-based computation).
// Can't optimize arrays of integers longer than 65,535 elements.
// See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
_.max = function(obj, iterator, context) {
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
return Math.max.apply(Math, obj);
}
var result = -Infinity, lastComputed = -Infinity;
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
if (computed > lastComputed) {
result = value;
lastComputed = computed;
}
});
return result;
};
// Return the minimum element (or element-based computation).
_.min = function(obj, iterator, context) {
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
return Math.min.apply(Math, obj);
}
var result = Infinity, lastComputed = Infinity;
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
if (computed < lastComputed) {
result = value;
lastComputed = computed;
}
});
return result;
};
// Shuffle an array, using the modern version of the
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
_.shuffle = function(obj) {
var rand;
var index = 0;
var shuffled = [];
each(obj, function(value) {
rand = _.random(index++);
shuffled[index - 1] = shuffled[rand];
shuffled[rand] = value;
});
return shuffled;
};
// Sample **n** random values from a collection.
// If **n** is not specified, returns a single random element.
// The internal `guard` argument allows it to work with `map`.
_.sample = function(obj, n, guard) {
if (n == null || guard) {
if (obj.length !== +obj.length) obj = _.values(obj);
return obj[_.random(obj.length - 1)];
}
return _.shuffle(obj).slice(0, Math.max(0, n));
};
// An internal function to generate lookup iterators.
var lookupIterator = function(value) {
if (value == null) return _.identity;
if (_.isFunction(value)) return value;
return _.property(value);
};
// Sort the object's values by a criterion produced by an iterator.
_.sortBy = function(obj, iterator, context) {
iterator = lookupIterator(iterator);
return _.pluck(_.map(obj, function(value, index, list) {
return {
value: value,
index: index,
criteria: iterator.call(context, value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria;
var b = right.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index - right.index;
}), 'value');
};
// An internal function used for aggregate "group by" operations.
var group = function(behavior) {
return function(obj, iterator, context) {
var result = {};
iterator = lookupIterator(iterator);
each(obj, function(value, index) {
var key = iterator.call(context, value, index, obj);
behavior(result, key, value);
});
return result;
};
};
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
_.groupBy = group(function(result, key, value) {
_.has(result, key) ? result[key].push(value) : result[key] = [value];
});
// Indexes the object's values by a criterion, similar to `groupBy`, but for
// when you know that your index values will be unique.
_.indexBy = group(function(result, key, value) {
result[key] = value;
});
// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
_.countBy = group(function(result, key) {
_.has(result, key) ? result[key]++ : result[key] = 1;
});
// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iterator, context) {
iterator = lookupIterator(iterator);
var value = iterator.call(context, obj);
var low = 0, high = array.length;
while (low < high) {
var mid = (low + high) >>> 1;
iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
}
return low;
};
// Safely create a real, live array from anything iterable.
_.toArray = function(obj) {
if (!obj) return [];
if (_.isArray(obj)) return slice.call(obj);
if (obj.length === +obj.length) return _.map(obj, _.identity);
return _.values(obj);
};
// Return the number of elements in an object.
_.size = function(obj) {
if (obj == null) return 0;
return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head` and `take`. The **guard** check
// allows it to work with `_.map`.
_.first = _.head = _.take = function(array, n, guard) {
if (array == null) return void 0;
if ((n == null) || guard) return array[0];
if (n < 0) return [];
return slice.call(array, 0, n);
};
// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N. The **guard** check allows it to work with
// `_.map`.
_.initial = function(array, n, guard) {
return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
};
// Get the last element of an array. Passing **n** will return the last N
// values in the array. The **guard** check allows it to work with `_.map`.
_.last = function(array, n, guard) {
if (array == null) return void 0;
if ((n == null) || guard) return array[array.length - 1];
return slice.call(array, Math.max(array.length - n, 0));
};
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
// Especially useful on the arguments object. Passing an **n** will return
// the rest N values in the array. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = _.drop = function(array, n, guard) {
return slice.call(array, (n == null) || guard ? 1 : n);
};
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, _.identity);
};
// Internal implementation of a recursive `flatten` function.
var flatten = function(input, shallow, output) {
if (shallow && _.every(input, _.isArray)) {
return concat.apply(output, input);
}
each(input, function(value) {
if (_.isArray(value) || _.isArguments(value)) {
shallow ? push.apply(output, value) : flatten(value, shallow, output);
} else {
output.push(value);
}
});
return output;
};
// Flatten out an array, either recursively (by default), or just one level.
_.flatten = function(array, shallow) {
return flatten(array, shallow, []);
};
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
return _.difference(array, slice.call(arguments, 1));
};
// Split an array into two arrays: one whose elements all satisfy the given
// predicate, and one whose elements all do not satisfy the predicate.
_.partition = function(array, predicate) {
var pass = [], fail = [];
each(array, function(elem) {
(predicate(elem) ? pass : fail).push(elem);
});
return [pass, fail];
};
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted, iterator, context) {
if (_.isFunction(isSorted)) {
context = iterator;
iterator = isSorted;
isSorted = false;
}
var initial = iterator ? _.map(array, iterator, context) : array;
var results = [];
var seen = [];
each(initial, function(value, index) {
if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
seen.push(value);
results.push(array[index]);
}
});
return results;
};
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = function() {
return _.uniq(_.flatten(arguments, true));
};
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersection = function(array) {
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
return _.contains(other, item);
});
});
};
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
return _.filter(array, function(value){ return !_.contains(rest, value); });
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
var length = _.max(_.pluck(arguments, 'length').concat(0));
var results = new Array(length);
for (var i = 0; i < length; i++) {
results[i] = _.pluck(arguments, '' + i);
}
return results;
};
// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values.
_.object = function(list, values) {
if (list == null) return {};
var result = {};
for (var i = 0, length = list.length; i < length; i++) {
if (values) {
result[list[i]] = values[i];
} else {
result[list[i][0]] = list[i][1];
}
}
return result;
};
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
// we need this function. Return the position of the first occurrence of an
// item in an array, or -1 if the item is not included in the array.
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i = 0, length = array.length;
if (isSorted) {
if (typeof isSorted == 'number') {
i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
} else {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
}
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
_.lastIndexOf = function(array, item, from) {
if (array == null) return -1;
var hasIndex = from != null;
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
}
var i = (hasIndex ? from : array.length);
while (i--) if (array[i] === item) return i;
return -1;
};
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = arguments[2] || 1;
var length = Math.max(Math.ceil((stop - start) / step), 0);
var idx = 0;
var range = new Array(length);
while(idx < length) {
range[idx++] = start;
start += step;
}
return range;
};
// Function (ahem) Functions
// ------------------
// Reusable constructor function for prototype setting.
var ctor = function(){};
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
// available.
_.bind = function(func, context) {
var args, bound;
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError;
args = slice.call(arguments, 2);
return bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
ctor.prototype = func.prototype;
var self = new ctor;
ctor.prototype = null;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (Object(result) === result) return result;
return self;
};
};
// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context. _ acts
// as a placeholder, allowing any combination of arguments to be pre-filled.
_.partial = function(func) {
var boundArgs = slice.call(arguments, 1);
return function() {
var position = 0;
var args = boundArgs.slice();
for (var i = 0, length = args.length; i < length; i++) {
if (args[i] === _) args[i] = arguments[position++];
}
while (position < arguments.length) args.push(arguments[position++]);
return func.apply(this, args);
};
};
// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length === 0) throw new Error('bindAll must be passed function names');
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memo = {};
hasher || (hasher = _.identity);
return function() {
var key = hasher.apply(this, arguments);
return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
};
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){ return func.apply(null, args); }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
_.throttle = function(func, wait, options) {
var context, args, result;
var timeout = null;
var previous = 0;
options || (options = {});
var later = function() {
previous = options.leading === false ? 0 : _.now();
timeout = null;
result = func.apply(context, args);
context = args = null;
};
return function() {
var now = _.now();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0) {
clearTimeout(timeout);
timeout = null;
previous = now;
result = func.apply(context, args);
context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
var timeout, args, context, timestamp, result;
var later = function() {
var last = _.now() - timestamp;
if (last < wait) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
context = args = null;
}
}
};
return function() {
context = this;
args = arguments;
timestamp = _.now();
var callNow = immediate && !timeout;
if (!timeout) {
timeout = setTimeout(later, wait);
}
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
};
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = function(func) {
var ran = false, memo;
return function() {
if (ran) return memo;
ran = true;
memo = func.apply(this, arguments);
func = null;
return memo;
};
};
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return _.partial(wrapper, func);
};
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var funcs = arguments;
return function() {
var args = arguments;
for (var i = funcs.length - 1; i >= 0; i--) {
args = [funcs[i].apply(this, args)];
}
return args[0];
};
};
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
return function() {
if (--times < 1) {
return func.apply(this, arguments);
}
};
};
// Object Functions
// ----------------
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = function(obj) {
if (!_.isObject(obj)) return [];
if (nativeKeys) return nativeKeys(obj);
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys.push(key);
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var values = new Array(length);
for (var i = 0; i < length; i++) {
values[i] = obj[keys[i]];
}
return values;
};
// Convert an object into a list of `[key, value]` pairs.
_.pairs = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var pairs = new Array(length);
for (var i = 0; i < length; i++) {
pairs[i] = [keys[i], obj[keys[i]]];
}
return pairs;
};
// Invert the keys and values of an object. The values must be serializable.
_.invert = function(obj) {
var result = {};
var keys = _.keys(obj);
for (var i = 0, length = keys.length; i < length; i++) {
result[obj[keys[i]]] = keys[i];
}
return result;
};
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
var names = [];
for (var key in obj) {
if (_.isFunction(obj[key])) names.push(key);
}
return names.sort();
};
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
obj[prop] = source[prop];
}
}
});
return obj;
};
// Return a copy of the object only containing the whitelisted properties.
_.pick = function(obj) {
var copy = {};
var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
each(keys, function(key) {
if (key in obj) copy[key] = obj[key];
});
return copy;
};
// Return a copy of the object without the blacklisted properties.
_.omit = function(obj) {
var copy = {};
var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
for (var key in obj) {
if (!_.contains(keys, key)) copy[key] = obj[key];
}
return copy;
};
// Fill in a given object with default properties.
_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
if (obj[prop] === void 0) obj[prop] = source[prop];
}
}
});
return obj;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Internal recursive comparison function for `isEqual`.
var eq = function(a, b, aStack, bStack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
if (a === b) return a !== 0 || 1 / a == 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
if (a instanceof _) a = a._wrapped;
if (b instanceof _) b = b._wrapped;
// Compare `[[Class]]` names.
var className = toString.call(a);
if (className != toString.call(b)) return false;
switch (className) {
// Strings, numbers, dates, and booleans are compared by value.
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
return a == String(b);
case '[object Number]':
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
// other numeric values.
return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
return +a == +b;
// RegExps are compared by their source patterns and flags.
case '[object RegExp]':
return a.source == b.source &&
a.global == b.global &&
a.multiline == b.multiline &&
a.ignoreCase == b.ignoreCase;
}
if (typeof a != 'object' || typeof b != 'object') return false;
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
var length = aStack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
if (aStack[length] == a) return bStack[length] == b;
}
// Objects with different constructors are not equivalent, but `Object`s
// from different frames are.
var aCtor = a.constructor, bCtor = b.constructor;
if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
_.isFunction(bCtor) && (bCtor instanceof bCtor))
&& ('constructor' in a && 'constructor' in b)) {
return false;
}
// Add the first object to the stack of traversed objects.
aStack.push(a);
bStack.push(b);
var size = 0, result = true;
// Recursively compare objects and arrays.
if (className == '[object Array]') {
// Compare array lengths to determine if a deep comparison is necessary.
size = a.length;
result = size == b.length;
if (result) {
// Deep compare the contents, ignoring non-numeric properties.
while (size--) {
if (!(result = eq(a[size], b[size], aStack, bStack))) break;
}
}
} else {
// Deep compare objects.
for (var key in a) {
if (_.has(a, key)) {
// Count the expected number of properties.
size++;
// Deep compare each member.
if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
}
}
// Ensure that both objects contain the same number of properties.
if (result) {
for (key in b) {
if (_.has(b, key) && !(size--)) break;
}
result = !size;
}
}
// Remove the first object from the stack of traversed objects.
aStack.pop();
bStack.pop();
return result;
};
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
return eq(a, b, [], []);
};
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
if (obj == null) return true;
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
return true;
};
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
};
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
// Is a given variable an object?
_.isObject = function(obj) {
return obj === Object(obj);
};
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) == '[object ' + name + ']';
};
});
// Define a fallback version of the method in browsers (ahem, IE), where
// there isn't any inspectable "Arguments" type.
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
return !!(obj && _.has(obj, 'callee'));
};
}
// Optimize `isFunction` if appropriate.
if (typeof (/./) !== 'function') {
_.isFunction = function(obj) {
return typeof obj === 'function';
};
}
// Is a given object a finite number?
_.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
// Is the given value `NaN`? (NaN is the only number which does not equal itself).
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
};
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
// Shortcut function for checking if an object has a given property directly
// on itself (in other words, not on a prototype).
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
// Utility Functions
// -----------------
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
// Keep the identity function around for default iterators.
_.identity = function(value) {
return value;
};
_.constant = function(value) {
return function () {
return value;
};
};
_.property = function(key) {
return function(obj) {
return obj[key];
};
};
// Returns a predicate for checking whether an object has a given set of `key:value` pairs.
_.matches = function(attrs) {
return function(obj) {
if (obj === attrs) return true; //avoid comparing an object to itself.
for (var key in attrs) {
if (attrs[key] !== obj[key])
return false;
}
return true;
}
};
// Run a function **n** times.
_.times = function(n, iterator, context) {
var accum = Array(Math.max(0, n));
for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
return accum;
};
// Return a random integer between min and max (inclusive).
_.random = function(min, max) {
if (max == null) {
max = min;
min = 0;
}
return min + Math.floor(Math.random() * (max - min + 1));
};
// A (possibly faster) way to get the current timestamp as an integer.
_.now = Date.now || function() { return new Date().getTime(); };
// List of HTML entities for escaping.
var entityMap = {
escape: {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;'
}
};
entityMap.unescape = _.invert(entityMap.escape);
// Regexes containing the keys and values listed immediately above.
var entityRegexes = {
escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
};
// Functions for escaping and unescaping strings to/from HTML interpolation.
_.each(['escape', 'unescape'], function(method) {
_[method] = function(string) {
if (string == null) return '';
return ('' + string).replace(entityRegexes[method], function(match) {
return entityMap[method][match];
});
};
});
// If the value of the named `property` is a function then invoke it with the
// `object` as context; otherwise, return it.
_.result = function(object, property) {
if (object == null) return void 0;
var value = object[property];
return _.isFunction(value) ? value.call(object) : value;
};
// Add your own custom functions to the Underscore object.
_.mixin = function(obj) {
each(_.functions(obj), function(name) {
var func = _[name] = obj[name];
_.prototype[name] = function() {
var args = [this._wrapped];
push.apply(args, arguments);
return result.call(this, func.apply(_, args));
};
});
};
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
// Add a "chain" function, which will delegate to the wrapper.
_.chain = function(obj) {
return _(obj).chain();
};
// OOP
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
// Helper function to continue chaining intermediate results.
var result = function(obj) {
return this._chain ? _(obj).chain() : obj;
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
var obj = this._wrapped;
method.apply(obj, arguments);
if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
return result.call(this, obj);
};
});
// Add all accessor Array functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
return result.call(this, method.apply(this._wrapped, arguments));
};
});
_.extend(_.prototype, {
// Start chaining a wrapped Underscore object.
chain: function() {
this._chain = true;
return this;
},
// Extracts the result from a wrapped and chained object.
value: function() {
return this._wrapped;
}
});
// AMD registration happens at the end for compatibility with AMD loaders
// that may not enforce next-turn semantics on modules. Even though general
// practice for AMD registration is to be anonymous, underscore registers
// as a named module because, like jQuery, it is a base library that is
// popular enough to be bundled in a third party lib, but not be part of
// an AMD load request. Those cases could generate an error when an
// anonymous define() is called outside of a loader request.
if (typeof define === 'function' && define.amd) {
define('underscore', [], function() {
return _;
});
}
}).call(this);
},{}]},{},[1])
<!DOCTYPE html>
<!--– –-->
<!--– .;:` `` –-->
<!--– ;;;; : :;;;. –-->
<!--– ;;;;;;;;;;;;;;;;;;;,` –-->
<!--– ,;;;;;;;;;;;;;;;;;;;;;;;;: –-->
<!--– `:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, –-->
<!--– `:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:. –-->
<!--– .;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, –-->
<!--– ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;;;;;;;';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;. –-->
<!--– ;;;;;;;;;;;;;;;,';;;';;;;;;;;;;;;;;;;';;;;;;;;;;;;;` –-->
<!--– , ;;;;;;;;;;;;;;;,'',;;;;;;;;;;;;;;;;;';;;;;;;;;;;, –-->
<!--– ;;;;;;;;;;;;;;;;,,;,,;;;;;;;;;;;;;;',::;,;;;;;;;;;;;` –-->
<!--– .;;;;;;;;;;;;;;;;;;;';;;;;;'.;;;;;;;;'.',;;;;;;;;;;;;;;; –-->
<!--– `;;;;;;;;;;;;;;;;;;;;;;;;;;',;:;;;;;;;;;';;;;;;;;;;;;;;;;: –-->
<!--– ,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:,';;;;;;;;;;;;;;;;;;;;;;;;;;;;. –-->
<!--– ,;;;;;;',;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;:',;;;;;;;;;;;;;;;;;;;',';;;;;;;;;;;;;;;;;;;;;;;;;':;;;;;;. –-->
<!--– ,;;;;;;;;;:,;;.';;;;;;;;;;;:;';;:,,';;;;;;';;;;;;;;;;;;;;';'',;;;;;` –-->
<!--– ;;;;;;;;;;;';;';;;;;;;;',';;,,,;':,,,,'';;;,,;;;;;;;;;;;;'.',;,';;;;;` –-->
<!--– ;;;;;;;;;;;;;;;;;;;;';;,,,:':,,,,,,,,,,,,:;,,,,';;;;;;;;;;',;';;;;;;;; –-->
<!--– , :;;;;;;;;;;;;;;;;;,';,,,,,,,,,,,,,,,,,,,,,,,,,,';;;,';;;;;;;;;;;;;;;; –-->
<!--– .;;;;;;;;;;;;:;;;:,,,,,,,,,,,,,,,,,,,,,,,,,,::,,,;;:,,';;;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;;;;',,,:,,,,,,,,::,,,:::,,,,,,,,,,,,:,,,,,,,,,,;;;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;;;;',,,,,,,,,,,,,,,,,,:::,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;; : –-->
<!--– `;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:;';;;;;;;;;: –-->
<!--– :;;;;;;;;;;:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,':,;;;;;;;;;;;. –-->
<!--– `, ;;;;;;;',,,::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::,,';;;;;;;: –-->
<!--– ,.;;;;;;;,:,#,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#:;,:,';;;;;;; –-->
<!--– ;;;;;;;,,:;++ ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++'':,:;;;;;;;; –-->
<!--– ;;;;;;',,:;++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++#+:,,';;;;;;;; –-->
<!--– ;;;;;;;',,:;+++,,,:::,,;;;;;,,,,,;;;;;:,,,,:;;;;;,,::,,,+++':,,';;;;;,,::. –-->
<!--– :;;;;;;;',,:;+++,,,::#+# `+++++ .++++; +++::,.++++:,,';;;;;; –-->
<!--– :;;;;;;;;',,:,###,,,::+++#:.'+++++++: ;++++++'` ,#++:::,,:#+,,,,';;;;;; –-->
<!--– `;;;;,;;;;;;,,,,,,,,,,::+++++++++++++++++++++++++++++++,:,,,,,,,,,:;;;;;;;; –-->
<!--– ;;;;;;',,,,,,,,,,:,+++++++++++#++++++#++++++++++'::,,,,,,,,,';;;;;;;; –-->
<!--– .;;;;;;;:,,,,,,,,,:::+++++++++++++++++++++++++++#:::,,,,,,,,';;;;;;;;;; –-->
<!--– ;;;;;;;;;:,,,,,,,,,::,+++++++++++++++++++++++++':::,,,,,,,,;;;;;;;;;;;; –-->
<!--– :;;;;;;;;;;:,,,,,,,,,,::,;++++++++++++++++++++',:::,,,,,,,,';;;;;;;;;;;;: –-->
<!--– .;;;;;;;;;;;;',,,,,,,,,,,::::,:;'+++++++++';:,::::,,,,,,,,,';;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;;;;;;;':,,,,,,,,,,,,,:::::::::::::::::,,,,,,,,,,,';;;;;;;;;;;;;;.; –-->
<!--– ;;`;;;;;;;;;;;;;';,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:';;;;;;;;;;;;;;;; –-->
<!--– ` ,;;;;;;;;;;;;;;;;':,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:';;;;;;;;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;;;;;;;;;;;;;'';,,,,,,,,,,,,,,,,,,,,,:;'';;;;;;;;;;;;;;;;;;;;;;; –-->
<!--– ;;;;;;':;';:';;;;;;;;;;;;;'''';;;;;;;''''';;;;;;;;;;;;;;;;;;;;;;;;;;;;;` –-->
<!--– ,;;;;;;:,',,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;';,';;;;;;;;; –-->
<!--– ;;;;;;;;:;;';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;':,,,;;;;;;;;;;; –-->
<!--– ;;;;;;;;;';;;;;;;;;',;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;',,';;;;;;;;; –-->
<!--– ;;;;;;;;;;;;;;;;;;;,'.;':;';;;;;;;;;;;;;;;;';',;:';;;;;;;;;;;;;;;;;;;;;; –-->
<!--– `,`;;;;;;;;;;;;;;;;;,.::,,,;;;;;;;;;;;;;;;;;;,;;,;;;;;;;;;;;;;;;;;;;;;;;;, –-->
<!--– ;;;;;;;;;;;;;;;;;'';'';;;;;;;;;;;;;;;;;;;;',;;;;;;;;;;;;;;;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; –-->
<!--– ,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,'';;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;':,';;;;;;;;;;;;;, –-->
<!--– `;;;;;;;;::;';';;;;;;;;;;;;;;;;;;':';;:';;;;;;;;;;;;;;;;',';;;;;;;;;;;;;; –-->
<!--– .` ;;;;;;;'.;,.';;;;;;;;;;;;;;;;;;,,,:.';;;;;;;;;;;;;;;;;';;;;;;;;;;;;;;;; –-->
<!--– ,;;;;;;;;;';;;;;;;;;;;;;;;;;;;;;',''';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; –-->
<!--– ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; –-->
<!--– `;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;';;;;;;; ; –-->
<!--– ,` ;;;:`;;;;#;;;;#';;;;;.:;;;` `;;, ;; ;;;;;,,;;;;;;;;;#';;;+ .;;;: –-->
<!--– ;; +;+++#;'#+++# `, ;` ., ;;###''++++#++ –-->
<!--– .++++++++++++ +++++++++++++ –-->
<!--– ++++++++++++ ++++++++++++' –-->
<!--– ++++++++++++ ++++++++++++. –-->
<!--– ,+++ +++ +++, +++'++++,+++ –-->
<!--– –-->
<html>
<head>
<title>Adorable Avatars!</title>
<meta name="viewport" content="initial-scale=1, maximum-scale=1, width=device-width, user-scalable=no">
<link href="main.css" rel="stylesheet">
</head>
<body>
<div class="navigation"><a class="menu"><span>Menu</span></a>
<ul>
<li><a href="#top"><i class="icon-top"></i>Tippy-top</a></li>
<li><a href="#what"><i class="icon-what"></i>What is this?</a></li>
<li><a href="#faq"><i class="icon-support"></i>FAQ &amp; Support</a></li>
<li><a href="#demo"><i class="icon-demo"></i>Try it out</a></li>
</ul>
</div>
<div id="top"></div>
<header>
<div class="row">
<div class="small-12 text-center columns">
<h1>Adorable Avatars</h1>
</div>
</div>
<div class="row">
<div class="small-12 medium-8 small-center text-center columns">
<p>Avatars are earthly creatures that serve as proxies for gods. In the web world, they just represent people, and they're usually small images.</p>
</div>
</div>
<div class="row">
<div class="small-12 text-center columns"><a href="#what" class="button lame">What are you talking about?</a><a href="#demo" class="button">Try it out</a><small class="github-link"><a href="https://github.com/adorableio/adorable-avatars">Check it out on Github</a></small></div>
</div>
</header>
<div id="what"></div>
<section>
<div class="sub-section">
<div class="row">
<div class="small-12 text-center columns">
<h1>What's the Adorable Avatars service?</h1>
</div>
</div>
<div class="row">
<div class="small-12 medium-8 small-center text-center columns">
<p class="subtitle">
Adorable Avatars is an avatar placeholder service for web
developers and designers.
</p>
</div>
</div>
</div>
<div class="row">
<div class="small-12 medium-8 small-center columns">
<h2>Wait, how is Adorable Avatars different?</h2>
<p>
While other placeholder services provide purely random images,
Adorable Avatars renders a unique image based on the URL. Our service
takes your request <small>(with your identifier)</small> and procedurally generates a
<b>consistent</b> avatar, just for you.
</p>
</div>
</div>
<div class="row">
<div class="small-12 medium-8 small-center columns">
<h2>How would I use it?</h2>
<p>
The simplest way is to create an image tag that points to our service
<small>(specifying your identifier)</small>, but you can also browse to your avatar
URL and save the image to your computer.
</p>
<p>
Already have avatars implemented in your application? Use Adorable
Avatars as a fallback and get rid of those boring gray silhouettes!
</p>
</div>
</div>
<div class="row">
<div class="small-12 medium-8 small-center columns">
<h2>Why would I use it?</h2>
<p>
What if you're developing a feature like member lists or profiles,
but you don't have any images to use? Just give us your user's
identifier and we'll give you their avatar image.
</p>
</div>
</div>
<div class="row">
<div class="small-12 medium-8 small-center columns">
<h3>That's it! Simple, right?</h3>
</div>
</div>
<div class="row">
<div class="small-12 medium-8 small-center text-center columns"><a href="#demo" class="button">I just want to check it out!</a></div>
</div>
</section>
<div id="demo"></div>
<section>
<div class="row">
<div class="small-12 medium-10 large-12 small-center columns">
<div class="row">
<div class="small-12 columns">
<h1 class="the-magic">The Magic</h1>
</div>
</div>
<div class="row">
<div class="small-11 small-only-center medium-6 columns">
<div class="form-card">
<div class="input-container name">
<label>identifier</label>
<input id="name" type="text" data-for=".name-value" placeholder="enter text" value="abott@adorable.io" maxlength="32" class="edit">
<div class="checkbox">
<input id="png" type="checkbox" data-for=".png-value" checked="true" class="edit">
<label for="png" class="inline">.png</label>
</div>
</div>
<div class="input-container size">
<label>Size<span class="size-value">285</span><span>px</span></label>
<input id="size" type="range" value="285" min="40" max="285" data-for=".size-value" class="edit">
</div>
<div class="input-container radius">
<label>Border-radius<span class="radius-value">0</span><span>%</span><small>&nbsp; (just for funsies)</small></label>
<input id="radius" type="range" value="0" min="0" max="50" data-for=".radius-value" class="edit">
</div>
</div>
</div>
<div class="small-12 medium-6 text-center columns">
<div class="container"><img id="demo-image" src="http://api.adorable.io/avatars/400/abott@adorable.io.png" style="width: 285px; height: 285px" alt="demo-image"></div>
</div>
</div>
</div>
</div>
<div class="row code-row">
<div class="code-wrapper"><code class="block"><span class="fade">http://api.adorable.io/avatars/</span><span class="size-value">285</span><span class="fade">/</span><span class="name-value">abott@adorable</span><span class="png-value">.png</span></code><a id="copy-button" data-clipboard-text="argh" title="Click to copy me." class="button">Copy to Clipboard</a></div>
</div>
</section>
<footer>
<div class="row">
<div class="small-12 columns">
<p class="adorable-creation">Adorable Avatars is an <a href="http://adorable.io" title="adorable.io">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 400 450 134" enable-background="new 0 400 450 134" xml:space="preserve" preserveAspectRatio="xMidYMax meet">
<path id="shadow" fill="#434343" d="M445.8,494.9l0-0.1c0-0.6-0.1-1.1-0.4-1.7c-1.1-2.7-4.1-4.1-6.9-3c0,0-0.5,0.2-1.3,0.8
c-0.8,0.5-1.7,1.5-2.8,2.9c-1.9,2.9-4.8,7-8.9,11.9c-1,1.2-2.1,2.4-3.3,3.7c-1.2,1.2-2.5,2.5-3.9,3.7c-2.7,2.4-5.9,4.8-9.4,6.5
c-0.4,0.2-0.9,0.4-1.3,0.6c-0.4,0.2-0.9,0.3-1.4,0.5c-0.4,0.1-0.9,0.4-1.4,0.4c-0.4,0.1-0.8,0.2-1.2,0.3l-0.6,0.2l-0.9,0.1
c-0.6,0-1.2,0.1-1.8,0.1l-0.1,0l-0.3,0c-0.2,0-0.3,0-0.5-0.1c-0.3,0-0.7-0.1-1-0.2c-1.3-0.5-2.7-1.5-4-3.1c-0.6-0.7-1.2-1.6-1.7-2.5
c0-0.1,0.1-0.1,0.1-0.2c4.9-6.5,8.5-13.6,11.1-20.9c0.3-0.9,0.7-1.8,1-2.7c0.3-0.8,0.6-1.8,0.9-2.7c0.6-1.8,1.1-3.7,1.5-5.5
c0.9-3.7,1.6-7.5,1.9-11.5c0.1-2,0.1-4.1-0.2-6.3c-0.2-1.1-0.4-2.3-0.8-3.5c-0.4-1.2-1-2.5-2-3.8c-1-1.3-2.4-2.4-4-3.1
c-0.4-0.2-0.8-0.3-1.2-0.4c-0.4-0.1-0.8-0.2-1.2-0.3c-0.4-0.1-0.8-0.1-1.2-0.1l-0.6,0c-0.2,0,0.1,0-0.5,0l-0.2,0l-0.6,0
c-0.1,0-0.2,0-0.4,0l-0.6,0.1l-1.1,0.2l-1,0.2c-1.3,0.3-2.5,0.8-3.6,1.4c-2.2,1.3-4,3-5.3,4.7c-1.3,1.8-2.4,3.6-3.2,5.4
c-1.6,3.6-2.5,7.1-3.2,10.6c-0.7,3.5-1.1,6.8-1.4,10.1c-0.1,1.8-0.2,3.5-0.2,5.2c0,1.7,0.1,3.4,0.2,5c0.5,5.9,1.6,11.5,3.6,16.8
l-0.9,0.9l-0.5,0.5l-0.3,0.2l0,0c0,0-0.1,0.1-0.1,0.1l-0.9,0.8c-2.5,2-5.3,3.7-8,4.4l-1,0.2c-0.3,0.1-0.5,0.1-0.8,0.1
c-0.2,0-0.2,0.1-0.4,0.1l-0.7,0l-0.7,0c0,0,0,0,0,0l-0.2,0c-0.8-0.1-1.8-0.5-2.8-1.2c-1-0.7-1.9-1.8-2.8-3.1c-0.4-0.6-0.8-1.3-1.2-2
c-0.4-0.7-0.7-1.4-1.1-2.2c-0.7-1.5-1.2-3.1-1.7-4.8l-0.7-2.4l-0.3-1.4l-0.2-0.7l-0.1-0.3c0,0,0-0.1,0-0.1c0,0,0,0,0,0l0-0.2
c-0.3-1.8-0.7-3.6-0.9-5.4c-0.1-0.4-0.1-0.9-0.2-1.3c0.5-1.2,1-2.3,1.5-3.5c2.1-4.9,4-10.2,6-15.6c2-5.5,4-11.1,5.5-17.2
c1.6-6.2,2.7-12.7,3.2-19.6c0.2-3.4,0.3-7-0.1-10.6c-0.4-3.6-1-7.4-2.7-11.3c-0.4-1-1-2-1.7-3c-0.7-1-1.6-2-2.9-3
c-0.4-0.2-0.7-0.5-1.1-0.7c-0.4-0.2-0.8-0.4-1.4-0.5c-0.5-0.1-1-0.3-1.6-0.3l-0.4,0c-0.1,0-1,0-0.7,0l-0.3,0l-0.2,0l-0.5,0.1
c-0.3,0.1-0.7,0.2-1,0.3c-0.4,0.1-0.5,0.2-0.8,0.3c-0.2,0.1-0.4,0.2-0.6,0.3c-0.4,0.2-0.7,0.5-1.1,0.8c-0.3,0.3-0.6,0.5-0.8,0.8
c-1,1.1-1.7,2.1-2.2,3.1c-0.6,1-1,2-1.4,2.9c-0.8,1.9-1.3,3.8-1.8,5.6c-1.9,7.4-2.7,14.8-3.2,22.3c-0.3,3.7-0.4,7.5-0.5,11.3
c0,1.9-0.1,3.8-0.1,5.7c0,1.9,0,3.7,0,5.6c0,7.5,0.1,15.2,0.8,23c0.1,1.4,0.3,2.8,0.5,4.2c-0.9,1.7-1.8,3.3-2.8,4.8
c-0.6,0.9-1.2,1.8-1.8,2.7c-0.6,0.9-1.2,1.7-1.8,2.5c-0.6,0.8-1.2,1.5-1.8,2.2c-0.6,0.7-1.4,1.5-2.1,2.2l-0.3,0.3
c-0.1,0.1,0.1-0.1,0,0l-0.1,0.1l-0.1,0.1l-0.5,0.4c-0.3,0.3-0.7,0.6-1,0.9c-0.6,0.6-1.3,1.1-2,1.6c-0.3,0.2-0.6,0.5-1,0.7
c-0.3,0.2-0.7,0.4-1,0.6c-0.6,0.4-1.3,0.8-1.9,1.2c-0.6,0.3-1.1,0.6-1.6,0.9c3.5-7,5.4-16,5.4-24.6c0-9.5-3.2-19-8.7-26
c-4.4-5.6-12.4-12.2-25.7-13.5c0-3.5,0-6.8,0-10c0-4.5,0.1-8.7,0.2-12.4c0.1-3.7,0.1-6.9,0.2-9.5c0.1-5.3,0.1-8.3,0.1-8.3
c0,0,0-0.1,0-0.1c0-2.8-2.3-5.1-5.1-5c-2.8,0-5.1,2.3-5,5.1c0,0,0,3,0.1,8.3c0,2.6,0.1,5.9,0.2,9.5c0.1,3.7,0.2,7.8,0.2,12.4
c0,4,0,14.1,0,14.8l-0.4,34.7c0,0.9,0,2,0,3.3c0,1.5,0,3.1,0,4.6c0,3,0,6-0.1,8.8c-0.2,2.7-0.5,5.4-1.3,7.3
c-0.4,0.9-0.8,1.7-1.3,2.1c-0.5,0.5-1,0.9-1.8,1.1c-0.8,0.3-1.7,0.4-2.8,0.5l-0.3,0l-0.2,0l-1.1-0.1c-0.9,0-1-0.2-1.3-0.3
c-0.3,0-0.7-0.3-1.1-0.4c-0.1,0-0.2-0.1-0.3-0.1l-0.3-0.2c-0.2-0.1-0.4-0.2-0.6-0.3c-0.4-0.2-0.7-0.6-1.1-0.9
c-0.3-0.3-0.7-0.7-1-1.1c-2.6-3.1-4.1-8-4.4-12.2c0-0.3,0-0.5,0-0.7l0-0.4l0-0.5c0-0.6,0-1.3,0-1.9c0-1.3,0-2.5,0-3.7
c0-2.4,0-4.8,0-7.1c0-18.1-0.1-30.2-0.1-30.2c0-0.4,0-1.9,0-2.4c-0.2-2.8-2.7-4.9-5.5-4.6c0,0-0.5,0-1.4,0.1
c-0.9,0.1-2.3,0.2-4.1,0.5c-1.8,0.3-4,0.7-6.5,1.3c-2.5,0.7-5.4,1.6-8.4,3.1c-3,1.5-6.2,3.6-8.9,6.5c-2.8,2.9-5,6.6-6.5,10.6
c-0.7,2-1.3,4-1.7,6.1c-0.4,2.1-0.6,4.2-0.7,6.4c-0.1,3.3,0,6.8,0.4,10.2c-0.2,0.5-0.3,1-0.2,1.6l0,0.1c0,1,0,2.2-0.1,3.3
c-0.1,1.1-0.2,2.3-0.3,3.4c-0.3,2.3-0.7,4.5-1.3,6.5c-0.6,2-1.4,3.8-2.4,5.1c-0.5,0.6-1,1.1-1.5,1.4c-0.5,0.3-1,0.5-1.6,0.6
c-0.1,0-0.3,0-0.5,0l-0.2,0l0,0l-0.1,0l-0.9-0.1c-0.1,0-0.4,0-0.4,0c-0.1,0-0.1,0-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1l-0.4-0.2
c-0.3-0.1-0.5-0.3-0.8-0.4c-0.9-0.6-1.8-1.7-2.5-3.4c-0.7-1.7-1.1-3.8-1.4-6c-0.3-2.2-0.3-4.5-0.3-6.8c0.1-4.7,0.6-9.5,1.3-14.4
c0.7-4.8,1.5-9.7,2.4-14.6l0.2-0.9l0-0.2l0.1-0.5l0.1-0.5c0-0.1,0-0.1,0-0.3l0-0.5c0-0.3,0-0.6,0-0.9c0-0.6-0.1-1.1-0.1-1.6
c-0.3-2.1-1.2-4.1-2.4-5.7c-1.2-1.7-2.9-3-4.7-4c-0.5-0.2-0.9-0.4-1.4-0.6c-0.5-0.2-1-0.3-1.5-0.4c-0.5-0.1-2.2-0.4-2.2-0.4
c-0.7-0.1-1-0.3-1.4-0.4l-1.5-0.5l-1.7-0.6l-1.7-0.6l-3.5-1.3l-0.9-0.3c-0.3-0.1-0.6-0.2-0.8-0.3l-1.4-0.6l0,0l-0.2-0.1
c-2.8-1-6,0.4-7.1,3.2c-0.4,1.1-0.8,2.1-1.3,3.1c-0.2,0.5-0.5,1-0.7,1.5c-0.2,0.5-0.5,1-0.8,1.5c-0.5,1-1.1,1.9-1.7,2.9
c-0.6,0.9-1.3,1.8-2,2.6l-0.5,0.6l-0.5,0.6c-0.3,0.3-0.6,0.7-0.9,1c-3.9-12.4-11.5-15.6-18.1-15.6c-16.1,0-23.3,18.7-23.3,37.2
c0,4.1,0.2,8,0.7,11.5c0,0.1,0,0.2,0,0.2l0,0.2c0,0,0,0.5,0,1.5c0,1-0.1,2.5-0.3,4.3c-0.2,1.8-0.7,3.9-1.5,6c-0.2,0.5-0.5,1-0.7,1.5
c-0.3,0.4-0.5,0.9-0.9,1.3c-0.2,0.2-0.3,0.4-0.5,0.5c-0.2,0.1-0.3,0.3-0.5,0.5c-0.4,0.2-0.7,0.5-1.1,0.6c-0.1,0-0.2,0.1-0.3,0.1
c-0.1,0-0.1,0-0.2,0c-0.1,0-0.1,0-0.2,0.1l-0.1,0.1c0,0-0.2,0-0.3,0c-0.4,0-0.8,0.1-1.2,0.1l0,0l-0.2,0c-0.1,0-0.2,0-0.4,0
c-0.9-0.1-1.7-0.5-2.6-1.2c-1.8-1.5-3.4-4.8-4.4-8.5c-0.2-0.9-0.4-1.9-0.6-2.8c-0.2-1-0.3-2-0.3-2.8c0-0.4,0-1-0.1-1.6l0-0.2l0-0.1
l0,0l0-0.4l0-0.9c0-1.2,0-2.3,0-3.5c0-4.7,0.1-9.4,0.1-14.1c0.1-18.9,0.3-37.8,0.4-52c0-3.5,0-6.8,0-9.7c0-2.9-0.1-5.4-0.1-7.5
c-0.1-4.1-0.3-6.5-0.3-6.5c-0.2-2.5-2.2-4.5-4.7-4.7c-2.8-0.2-5.2,1.9-5.4,4.7c0,0-0.2,2.4-0.3,6.5c0,2.1-0.1,4.6-0.1,7.5
c0,2.9,0,6.1,0,9.7c0,6.8,0.1,14.7,0.2,23.1c-2.6-1.1-5.6-1.8-9.2-1.8c-16.6,0-24,23.5-24,46.8l0,1.9c0,6.6,0.1,14-2.8,16.9
c-0.4,0.4-1.5,1.6-5,1.6c-9.4,0-11.4-14-11.4-16.7v-45.3c0-0.1,0-0.1,0-0.2c0-0.1,0-0.1,0-0.2c0-0.1,0-0.2-0.1-0.3
c0-0.2-0.1-0.3-0.1-0.5c0-0.2-0.1-0.3-0.1-0.5c-0.1-0.2-0.1-0.3-0.2-0.5c-0.1-0.1-0.1-0.3-0.2-0.4c-0.1-0.1-0.2-0.3-0.3-0.4
c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.3-0.4-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.2-0.1-0.3-0.2-0.5-0.3c-0.1-0.1-0.2-0.1-0.4-0.2
c-0.2-0.1-0.3-0.2-0.5-0.2c-0.1,0-0.3-0.1-0.4-0.1c-0.2,0-0.4-0.1-0.5-0.1c-0.2,0-0.3,0-0.5,0c-0.1,0-0.2,0-0.3,0
c-0.1,0-0.1,0-0.2,0c-0.1,0-0.1,0-0.2,0C22.1,456.8,8.3,471.2,8.3,494c0,22.6,9.9,38.3,24.1,38.3c3.8,0,10.9-1.1,15.3-8.2
c3.4,4.5,8.4,7.9,15.4,7.9c5.1,0,9.2-1.5,12.2-4.5c1.1-1.1,2-2.4,2.7-3.8c3.5,4.8,8.8,8.3,16.9,8.3c4.5,0,8.5-1.7,11.6-4.9
c1.1-1.1,2-2.4,2.9-3.8c1,1.7,2.3,3.3,3.9,4.7c2.2,1.9,5.1,3.2,8,3.5l1.1,0.1l0.5,0l0.1,0l0.1,0c0.2,0-0.4,0,0.5,0l0.2,0
c0.5,0,0.9-0.1,1.4-0.1c0.1,0,0.2,0,0.4,0l0.6-0.1c0.4-0.1,0.8-0.2,1.2-0.3c0.4-0.1,0.8-0.2,1.1-0.3l0.9-0.4c1.3-0.5,2.4-1.3,3.4-2
c0.5-0.4,0.9-0.8,1.4-1.3c0.5-0.4,0.8-0.9,1.1-1.3c0.7-0.8,1.2-1.7,1.7-2.5c3.7,5.6,8.8,8.6,15.1,8.6c13.9,0,22.2-14.5,22.2-38.9
c0-3.5-0.2-6.7-0.4-9.5c0.6-0.4,1.2-0.7,1.7-1.1c0.6-0.5,1.2-0.9,1.8-1.4l1.6-1.5c0.6-0.5,1-1,1.5-1.6l0.8-0.8l0.7-0.8
c1-1.1,1.8-2.3,2.6-3.4c0.8-1.2,1.6-2.4,2.3-3.6c0.4-0.6,0.7-1.2,1-1.8c0.2-0.3,0.3-0.6,0.5-0.9l2.4,0.7l1.9,0.6l1.9,0.5l0.9,0.3
l1.2,0.3c0.8,0.2,1.7,0.4,2.2,0.5l0.5,0.1l0.1,0l0.1,0l0.5,0.1l0.1,0c0.1,0,0.2,0,0.3,0c0.1,0,0.2,0,0.3,0.1c0.1,0,0.2,0.1,0.3,0.1
c0.4,0.2,0.7,0.4,1,0.8c0.3,0.3,0.4,0.7,0.5,1.1c0,0.1,0,0.2,0,0.3c0,0,0,0,0,0l0,0c0,0,0,0.1,0,0.2l-0.1,0.5l0,0.1l0,0.1l-0.2,0.9
c-0.9,4.9-1.7,9.9-2.4,15c-0.7,5.1-1.2,10.3-1.3,15.6c0,2.7,0.1,5.4,0.4,8.2c0.3,2.8,0.9,5.7,2.1,8.6c0.6,1.5,1.4,3,2.5,4.4
c1,1.4,2.5,2.7,4.1,3.8c0.8,0.5,1.7,1,2.6,1.2c0.5,0.2,0.9,0.3,1.4,0.5c0.5,0.1,1,0.2,1.5,0.3l0.8,0.1c0.3,0,0.3,0,0.5,0l0.9,0.1
l0.2,0l0.4,0l0.2,0l0.7,0c0.5,0,0.9,0,1.4-0.1c1.9-0.2,3.8-1,5.4-2c1.6-1,3-2.3,4-3.7c1.3-1.7,2.3-3.5,3-5.2
c1.1,1.6,2.4,3.1,3.8,4.4c0.8,0.8,1.8,1.4,2.8,2.1c0.5,0.3,1,0.6,1.5,0.9c0.5,0.3,1,0.6,1.6,0.7c0.5,0.2,1.1,0.4,1.6,0.6
c0.5,0.2,1.2,0.3,1.8,0.4l0.9,0.2l0.5,0.1c0.1,0,0.2,0,0.3,0c0.4,0,0.8,0.1,1.2,0.1l0.3,0l0.2,0l0.4,0l0,0l0.1,0l0.8,0
c0.5,0,1,0,1.6-0.1c1.1-0.2,2.1-0.3,3.1-0.7c1-0.3,2-0.8,3-1.2c0.5-0.3,0.9-0.5,1.3-0.8c0.5-0.3,0.9-0.6,1.2-0.9
c1.4-1.1,2.5-2.5,3.4-3.8c0.5,0.8,1.1,1.7,1.8,2.5c0.6,0.7,1.2,1.4,1.9,2c0.7,0.6,1.4,1.3,2.3,1.8l1.3,0.8l0.6,0.4
c0.2,0.1,0.5,0.2,0.7,0.3c1,0.4,1.8,0.8,3,1.1c1.1,0.3,2.4,0.5,3,0.5l1.1,0.1l0.3,0l0.1,0l0.5,0l0.1,0l0.7,0
c1.9-0.1,3.9-0.3,5.9-1.1c2-0.7,4.1-2,5.7-3.7c0.8-0.9,1.5-1.8,2.1-2.7c3.2,4.4,8.1,7.5,15.2,7.5c0.1,0,0.3,0,0.4,0c0,0,0.2,0,0.4,0
c0.4,0,0.8,0,1.4,0c1.1,0,2.7-0.1,4.7-0.4c4-0.6,9.8-2.1,16.2-6c0.8-0.5,1.6-1,2.4-1.6c0.4-0.3,0.8-0.6,1.2-0.9
c0.4-0.3,0.8-0.6,1.2-1c0.8-0.7,1.6-1.3,2.3-2c0.4-0.4,0.8-0.7,1.2-1.1l0.6-0.6l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.3
c0.7-0.8,1.3-1.5,2-2.3c0.7-0.9,1.5-1.8,2.2-2.8c0.7-0.9,1.3-1.9,2-2.8c0.1,0.4,0.2,0.9,0.3,1.3c0.6,2,1.2,4,2.1,5.9
c0.4,1,0.9,2,1.4,2.9c0.6,1,1.1,1.9,1.7,2.9c1.3,1.9,2.8,3.7,4.9,5.3c2,1.6,4.6,2.9,7.6,3.2l0.5,0.1c0.2,0-0.1,0,0.6,0l0.2,0l0.7,0
l0.7,0c0.2,0,0.7,0,1-0.1c0.7-0.1,1.4-0.1,2-0.3l1.7-0.4c4.6-1.2,8.5-3.5,11.8-6.2l1.2-1c0.3,0.4,0.6,0.9,1,1.3
c2.1,2.6,5.1,5,8.7,6.3c0.9,0.3,1.8,0.5,2.8,0.7c0.5,0.1,0.9,0.1,1.4,0.2l0.7,0l0.3,0c0,0,0.4,0,0.5,0l0.1,0c0.6,0,1.3-0.1,1.9-0.1
l0.9-0.1l1.2-0.2c0.8-0.1,1.6-0.3,2.4-0.5c0.8-0.2,1.4-0.4,2.1-0.6c0.7-0.2,1.4-0.4,2-0.7c0.6-0.3,1.2-0.6,1.9-0.8
c4.9-2.3,8.7-5.2,11.9-8c1.7-1.4,3.1-2.9,4.5-4.2c1.3-1.4,2.6-2.8,3.7-4.1c4.6-5.3,7.6-9.7,10-12.5c1.1-1.5,1.7-2.8,1.9-3.7
C445.8,495.5,445.8,494.9,445.8,494.9z M41.5,506.9c0,15.2-6.9,15.2-9.1,15.2c-8,0-13.9-12.1-13.9-28.1c0-15.9,7.8-25.4,23.1-28.4
v39.5c0,0.4,0,0.9,0,1.4C41.6,506.7,41.5,506.8,41.5,506.9z M94.9,521.8c-3.8,0-12.6,0-13.7-25.4c0-0.1,0-0.2,0-0.3
c1-17.6,6.8-31.2,13.7-31.2c4.4,0,7.6,2,9.3,3.4c0,5.6,0.1,11.4,0.1,17.1c0,4.7,0.1,9.5,0.1,14.1c0,0.7,0,1.5,0,2.2
c-0.2,5-1.3,14.3-5.2,18.3C98,521.3,96.7,521.8,94.9,521.8z M153.4,466.1c5,0,7.7,4.9,9.1,10.9c0,0-0.1,0-0.1,0l-0.7,0.2l-0.7,0.1
c-0.5,0.1-1,0.2-1.5,0.2l-1.5,0.1l-0.4,0l0,0l0,0l-0.9-0.1l-0.5,0c-0.1,0-0.2,0-0.2,0l-0.1,0c-0.1,0-0.2-0.1-0.4-0.1
c-0.2,0-0.6-0.2-1-0.3c-0.4-0.1-0.8-0.3-1.1-0.5c-0.8-0.4-1.5-0.9-2.2-1.5c-0.4-0.3-0.7-0.7-1.1-1c-0.3-0.4-0.7-0.7-1-1.1
c-0.7-0.8-1.3-1.6-1.9-2.5c-0.2-0.3-0.4-0.7-0.6-1C148.3,467.5,150.6,466.1,153.4,466.1z M160.8,513.7c-3.2,8.1-7.4,8.1-8.8,8.1
c-1.4,0-5.5,0-8.7-8.1c-2-5.2-3.1-12.5-3.1-20.6c0-3.9,0.5-8.5,1.5-12.7c0.3,0.4,0.6,0.7,1,1.1c0.6,0.5,1.1,1.1,1.7,1.6
c1.2,1,2.5,2,4,2.8c0.7,0.4,1.5,0.8,2.3,1.1c0.8,0.3,1.6,0.6,2.6,0.8c0.5,0.1,1,0.2,1.5,0.3l0.4,0.1l0.2,0l0.5,0l0.9,0.1l0.2,0
l0.1,0l0.4,0l0.1,0l0.6,0l2.3-0.1c0.8-0.1,1.5-0.2,2.3-0.3l1-0.2c0.1,1.9,0.1,3.7,0.1,5.4C164,501.2,162.9,508.5,160.8,513.7z
M200.6,459.2C200.6,459.2,200.6,459.2,200.6,459.2C200.6,459.2,200.6,459.2,200.6,459.2z M256.9,509.7c-0.2,1.5-0.5,3.2-1.2,4.9
c-0.3,0.9-0.7,1.7-1.2,2.4c-0.5,0.7-1,1.4-1.7,1.9c-0.2,0.1-0.3,0.3-0.5,0.4c-0.2,0.1-0.4,0.2-0.5,0.3c-0.4,0.2-0.8,0.4-1.3,0.5
c-0.4,0.2-1,0.2-1.5,0.3c-0.3,0-0.6,0-0.9,0l-0.4,0l-0.3,0c-0.4,0-0.8-0.1-1.2-0.1c-0.1,0-0.2,0-0.3,0l-0.2-0.1l-0.3-0.1
c-0.2-0.1-0.4,0-0.7-0.2c-0.3-0.1-0.5-0.2-0.8-0.3c-0.3-0.1-0.5-0.2-0.8-0.4c-0.3-0.2-0.5-0.2-0.8-0.4c-0.5-0.4-1-0.7-1.5-1.2
c-1.9-1.7-3.5-4.4-4.7-7.4c-1.2-3-1.9-6.5-2.3-10c-0.4-3.5-0.5-7.1-0.4-10.7c0.1-1.5,0.3-3.2,0.6-4.8c0.3-1.6,0.7-3.1,1.2-4.4
c1-2.8,2.5-5.1,4.4-7c1.8-1.9,3.9-3.3,6.1-4.4c2.2-1.1,4.4-1.8,6.4-2.4c1.8-0.5,3.4-0.8,4.8-1c0,4.9,0,14.3-0.1,26.3
c0,2.3,0,4.6,0,7.1c0,1.2,0,2.5,0,3.7c0,0.6,0,1.3,0,1.9l0,0.5l0,0.6c0,0.4,0,0.8,0.1,1.2c0,0,0,0.1,0,0.1c0,0.2,0,0.4-0.1,0.6
C257.1,508.3,257.1,509,256.9,509.7z M296.7,494.1v-29.3c18.6,2.6,23.8,19.1,23.8,29.3c0,13.7-6.1,27.7-12,27.7
C303.4,521.8,296.7,519,296.7,494.1z M358.3,420.3C358.3,420.3,358.3,420.3,358.3,420.3C358.3,420.3,358.3,420.3,358.3,420.3
C358.2,420.3,358.3,420.3,358.3,420.3z M353.1,459.4c0-3.6,0.2-7.2,0.4-10.8c0.5-7.1,1.2-14.2,2.8-20.6c0.4-1.6,0.9-3.1,1.4-4.5
c0.3-0.7,0.6-1.3,0.9-1.9c0.1-0.2,0.2-0.4,0.3-0.6c0,0,0,0,0,0.1c0.3,0.4,0.6,0.9,0.8,1.5c1.1,2.4,1.7,5.4,2,8.4
c0.3,3,0.3,6.1,0.1,9.2c-0.4,6.1-1.6,12.2-3,17.9c-0.8,2.9-1.5,5.8-2.2,8.6c-0.8,2.8-1.4,5.6-2.3,8.3c-0.4,1.3-0.7,2.5-1.1,3.7
c-0.1-2.7-0.1-5.5-0.1-8.2c0-1.9,0-3.7,0-5.6C353,463,353,461.2,353.1,459.4z M398.3,464.9C398.3,464.9,398.3,464.9,398.3,464.9
L398.3,464.9z M387.5,488.3c0.2-3,0.6-6.1,1.2-9c0.6-2.9,1.4-5.8,2.5-8.4c1.1-2.5,2.6-4.6,4.1-5.4c0.4-0.2,0.8-0.4,1.2-0.5l0.3-0.1
c0.1,0,0.1,0,0.2,0l0.1,0c0,0,0.2,0,0.3,0l0.6,0c0,0,0,0,0,0l0.1,0c0.1,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0.1
c0.2,0.2,0.6,1.2,0.8,2.5c0.2,1.3,0.2,2.7,0.1,4.3c-0.2,3.1-0.8,6.4-1.6,9.7c-0.4,1.7-0.9,3.3-1.4,5c-0.2,0.8-0.5,1.6-0.8,2.5
c-0.3,0.8-0.6,1.6-0.9,2.4c-1.6,4.5-3.6,8.8-6,12.9c-0.5-2.4-0.9-4.9-1.1-7.4c-0.1-1.4-0.2-2.8-0.2-4.3
C387.4,491.1,387.5,489.7,387.5,488.3z"/>
<path id="letters" fill="#C69B24" d="M441.7,491.6l0-0.1c0-0.6-0.1-1.1-0.4-1.7c-1.1-2.7-4.1-4.1-6.9-3c0,0-0.5,0.2-1.3,0.8
c-0.8,0.5-1.7,1.5-2.8,2.9c-1.9,2.9-4.8,7-8.9,11.9c-1,1.2-2.1,2.4-3.3,3.7c-1.2,1.2-2.5,2.5-3.9,3.7c-2.7,2.4-5.9,4.8-9.4,6.5
c-0.4,0.2-0.9,0.4-1.3,0.6c-0.4,0.2-0.9,0.3-1.4,0.5c-0.4,0.1-0.9,0.4-1.4,0.4c-0.4,0.1-0.8,0.2-1.2,0.3l-0.6,0.2l-0.9,0.1
c-0.6,0-1.2,0.1-1.8,0.1l-0.1,0l-0.3,0c-0.2,0-0.3,0-0.5-0.1c-0.3,0-0.7-0.1-1-0.2c-1.3-0.5-2.7-1.5-4-3.1c-0.6-0.7-1.2-1.6-1.7-2.5
c0-0.1,0.1-0.1,0.1-0.2c4.9-6.5,8.5-13.6,11.1-20.9c0.3-0.9,0.7-1.8,1-2.7c0.3-0.8,0.6-1.8,0.9-2.7c0.6-1.8,1.1-3.7,1.5-5.5
c0.9-3.7,1.6-7.5,1.9-11.5c0.1-2,0.1-4.1-0.2-6.3c-0.2-1.1-0.4-2.3-0.8-3.5c-0.4-1.2-1-2.5-2-3.8c-1-1.3-2.4-2.4-4-3.1
c-0.4-0.2-0.8-0.3-1.2-0.4c-0.4-0.1-0.8-0.2-1.2-0.3c-0.4-0.1-0.8-0.1-1.2-0.1l-0.6,0c-0.2,0,0.1,0-0.5,0l-0.2,0l-0.6,0
c-0.1,0-0.2,0-0.4,0l-0.6,0.1l-1.1,0.2l-1,0.2c-1.3,0.3-2.5,0.8-3.6,1.4c-2.2,1.3-4,3-5.3,4.7c-1.3,1.8-2.4,3.6-3.2,5.4
c-1.6,3.6-2.5,7.1-3.2,10.6c-0.7,3.5-1.1,6.8-1.4,10.1c-0.1,1.8-0.2,3.5-0.2,5.2c0,1.7,0.1,3.4,0.2,5c0.5,5.9,1.6,11.5,3.6,16.8
l-0.9,0.9l-0.5,0.5l-0.3,0.2l0,0c0,0-0.1,0.1-0.1,0.1l-0.9,0.8c-2.5,2-5.3,3.7-8,4.4l-1,0.2c-0.3,0.1-0.5,0.1-0.8,0.1
c-0.2,0-0.2,0.1-0.4,0.1l-0.7,0l-0.7,0c0,0,0,0,0,0l-0.2,0c-0.8-0.1-1.8-0.5-2.8-1.2c-1-0.7-1.9-1.8-2.8-3.1c-0.4-0.6-0.8-1.3-1.2-2
c-0.4-0.7-0.7-1.4-1.1-2.2c-0.7-1.5-1.2-3.1-1.7-4.8l-0.7-2.4l-0.3-1.4l-0.2-0.7l-0.1-0.3c0,0,0-0.1,0-0.1c0,0,0,0,0,0l0-0.2
c-0.3-1.8-0.7-3.6-0.9-5.4c-0.1-0.4-0.1-0.9-0.2-1.3c0.5-1.2,1-2.3,1.5-3.5c2.1-4.9,4-10.2,6-15.6c2-5.5,4-11.1,5.5-17.2
c1.6-6.2,2.7-12.7,3.2-19.6c0.2-3.4,0.3-7-0.1-10.6c-0.4-3.6-1-7.4-2.7-11.3c-0.4-1-1-2-1.7-3c-0.7-1-1.6-2-2.9-3
c-0.4-0.2-0.7-0.5-1.1-0.7c-0.4-0.2-0.8-0.4-1.4-0.5c-0.5-0.1-1-0.3-1.6-0.3l-0.4,0c-0.1,0-1,0-0.7,0l-0.3,0l-0.2,0l-0.5,0.1
c-0.3,0.1-0.7,0.2-1,0.3c-0.4,0.1-0.5,0.2-0.8,0.3c-0.2,0.1-0.4,0.2-0.6,0.3c-0.4,0.2-0.7,0.5-1.1,0.8c-0.3,0.3-0.6,0.5-0.8,0.8
c-1,1.1-1.7,2.1-2.2,3.1c-0.6,1-1,2-1.4,2.9c-0.8,1.9-1.3,3.8-1.8,5.6c-1.9,7.4-2.7,14.8-3.2,22.3c-0.3,3.7-0.4,7.5-0.5,11.3
c0,1.9-0.1,3.8-0.1,5.7c0,1.9,0,3.7,0,5.6c0,7.5,0.1,15.2,0.8,23c0.1,1.4,0.3,2.8,0.5,4.2c-0.9,1.7-1.8,3.3-2.8,4.8
c-0.6,0.9-1.2,1.8-1.8,2.7c-0.6,0.9-1.2,1.7-1.8,2.5c-0.6,0.8-1.2,1.5-1.8,2.2c-0.6,0.7-1.4,1.5-2.1,2.2l-0.3,0.3
c-0.1,0.1,0.1-0.1,0,0l-0.1,0.1l-0.1,0.1l-0.5,0.4c-0.3,0.3-0.7,0.6-1,0.9c-0.6,0.6-1.3,1.1-2,1.6c-0.3,0.2-0.6,0.5-1,0.7
c-0.3,0.2-0.7,0.4-1,0.6c-0.6,0.4-1.3,0.8-1.9,1.2c-0.6,0.3-1.1,0.6-1.6,0.9c3.5-7,5.4-16,5.4-24.6c0-9.5-3.2-19-8.7-26
c-4.4-5.6-12.4-12.2-25.7-13.5c0-3.5,0-6.8,0-10c0-4.5,0.1-8.7,0.2-12.4c0.1-3.7,0.1-6.9,0.2-9.5c0.1-5.3,0.1-8.3,0.1-8.3
c0,0,0-0.1,0-0.1c0-2.8-2.3-5.1-5.1-5c-2.8,0-5.1,2.3-5,5.1c0,0,0,3,0.1,8.3c0,2.6,0.1,5.9,0.2,9.5c0.1,3.7,0.2,7.8,0.2,12.4
c0,4,0,14.1,0,14.8l-0.4,34.7c0,0.9,0,2,0,3.3c0,1.5,0,3.1,0,4.6c0,3,0,6-0.1,8.8c-0.2,2.7-0.5,5.4-1.3,7.3
c-0.4,0.9-0.8,1.7-1.3,2.1c-0.5,0.5-1,0.9-1.8,1.1c-0.8,0.3-1.7,0.4-2.8,0.5l-0.3,0l-0.2,0l-1.1-0.1c-0.9,0-1-0.2-1.3-0.3
c-0.3,0-0.7-0.3-1.1-0.4c-0.1,0-0.2-0.1-0.3-0.1l-0.3-0.2c-0.2-0.1-0.4-0.2-0.6-0.3c-0.4-0.2-0.7-0.6-1.1-0.9
c-0.3-0.3-0.7-0.7-1-1.1c-2.6-3.1-4.1-8-4.4-12.2c0-0.3,0-0.5,0-0.7l0-0.4l0-0.5c0-0.6,0-1.3,0-1.9c0-1.3,0-2.5,0-3.7
c0-2.4,0-4.8,0-7.1c0-18.1-0.1-30.2-0.1-30.2c0-0.4,0-1.9,0-2.4c-0.2-2.8-2.7-4.9-5.5-4.6c0,0-0.5,0-1.4,0.1
c-0.9,0.1-2.3,0.2-4.1,0.5c-1.8,0.3-4,0.7-6.5,1.3c-2.5,0.7-5.4,1.6-8.4,3.1c-3,1.5-6.2,3.6-8.9,6.5c-2.8,2.9-5,6.6-6.5,10.6
c-0.7,2-1.3,4-1.7,6.1c-0.4,2.1-0.6,4.2-0.7,6.4c-0.1,3.3,0,6.8,0.4,10.2c-0.2,0.5-0.3,1-0.2,1.6l0,0.1c0,1,0,2.2-0.1,3.3
c-0.1,1.1-0.2,2.3-0.3,3.4c-0.3,2.3-0.7,4.5-1.3,6.5c-0.6,2-1.4,3.8-2.4,5.1c-0.5,0.6-1,1.1-1.5,1.4c-0.5,0.3-1,0.5-1.6,0.6
c-0.1,0-0.3,0-0.5,0l-0.2,0l0,0l-0.1,0l-0.9-0.1c-0.1,0-0.4,0-0.4,0c-0.1,0-0.1,0-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1l-0.4-0.2
c-0.3-0.1-0.5-0.3-0.8-0.4c-0.9-0.6-1.8-1.7-2.5-3.4c-0.7-1.7-1.1-3.8-1.4-6c-0.3-2.2-0.3-4.5-0.3-6.8c0.1-4.7,0.6-9.5,1.3-14.4
c0.7-4.8,1.5-9.7,2.4-14.6l0.2-0.9l0-0.2l0.1-0.5l0.1-0.5c0-0.1,0-0.1,0-0.3l0-0.5c0-0.3,0-0.6,0-0.9c0-0.6-0.1-1.1-0.1-1.6
c-0.3-2.1-1.2-4.1-2.4-5.7c-1.2-1.7-2.9-3-4.7-4c-0.5-0.2-0.9-0.4-1.4-0.6c-0.5-0.2-1-0.3-1.5-0.4c-0.5-0.1-2.2-0.4-2.2-0.4
c-0.7-0.1-1-0.3-1.4-0.4l-1.5-0.5l-1.7-0.6l-1.7-0.6l-3.5-1.3l-0.9-0.3c-0.3-0.1-0.6-0.2-0.8-0.3l-1.4-0.6l0,0l-0.2-0.1
c-2.8-1-6,0.4-7.1,3.2c-0.4,1.1-0.8,2.1-1.3,3.1c-0.2,0.5-0.5,1-0.7,1.5c-0.2,0.5-0.5,1-0.8,1.5c-0.5,1-1.1,1.9-1.7,2.9
c-0.6,0.9-1.3,1.8-2,2.6l-0.5,0.6l-0.5,0.6c-0.3,0.3-0.6,0.7-0.9,1c-3.9-12.4-11.5-15.6-18.1-15.6c-16.1,0-23.3,18.7-23.3,37.2
c0,4.1,0.2,8,0.7,11.5c0,0.1,0,0.2,0,0.2l0,0.2c0,0,0,0.5,0,1.5c0,1-0.1,2.5-0.3,4.3c-0.2,1.8-0.7,3.9-1.5,6c-0.2,0.5-0.5,1-0.7,1.5
c-0.3,0.4-0.5,0.9-0.9,1.3c-0.2,0.2-0.3,0.4-0.5,0.5c-0.2,0.1-0.3,0.3-0.5,0.5c-0.4,0.2-0.7,0.5-1.1,0.6c-0.1,0-0.2,0.1-0.3,0.1
c-0.1,0-0.1,0-0.2,0c-0.1,0-0.1,0-0.2,0.1l-0.1,0.1c0,0-0.2,0-0.3,0c-0.4,0-0.8,0.1-1.2,0.1l0,0l-0.2,0c-0.1,0-0.2,0-0.4,0
c-0.9-0.1-1.7-0.5-2.6-1.2c-1.8-1.5-3.4-4.8-4.4-8.5c-0.2-0.9-0.4-1.9-0.6-2.8c-0.2-1-0.3-2-0.3-2.8c0-0.4,0-1-0.1-1.6l0-0.2l0-0.1
l0,0l0-0.4l0-0.9c0-1.2,0-2.3,0-3.5c0-4.7,0.1-9.4,0.1-14.1c0.1-18.9,0.3-37.8,0.4-52c0-3.5,0-6.8,0-9.7c0-2.9-0.1-5.4-0.1-7.5
c-0.1-4.1-0.3-6.5-0.3-6.5c-0.2-2.5-2.2-4.5-4.7-4.7c-2.8-0.2-5.2,1.9-5.4,4.7c0,0-0.2,2.4-0.3,6.5c0,2.1-0.1,4.6-0.1,7.5
c0,2.9,0,6.1,0,9.7c0,6.8,0.1,14.7,0.2,23.1c-2.6-1.1-5.6-1.8-9.2-1.8c-16.6,0-24,23.5-24,46.8l0,1.9c0,6.6,0.1,14-2.8,16.9
c-0.4,0.4-1.5,1.6-5,1.6c-9.4,0-11.4-14-11.4-16.7v-45.3c0-0.1,0-0.1,0-0.2c0-0.1,0-0.1,0-0.2c0-0.1,0-0.2-0.1-0.3
c0-0.2-0.1-0.3-0.1-0.5c0-0.2-0.1-0.3-0.1-0.5c-0.1-0.2-0.1-0.3-0.2-0.5c-0.1-0.1-0.1-0.3-0.2-0.4c-0.1-0.1-0.2-0.3-0.3-0.4
c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.3-0.4-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.2-0.1-0.3-0.2-0.5-0.3c-0.1-0.1-0.2-0.1-0.4-0.2
c-0.2-0.1-0.3-0.2-0.5-0.2c-0.1,0-0.3-0.1-0.4-0.1c-0.2,0-0.4-0.1-0.5-0.1c-0.2,0-0.3,0-0.5,0c-0.1,0-0.2,0-0.3,0
c-0.1,0-0.1,0-0.2,0c-0.1,0-0.1,0-0.2,0C18,453.5,4.2,467.8,4.2,490.7c0,22.6,9.9,38.3,24.1,38.3c3.8,0,10.9-1.1,15.3-8.2
c3.4,4.5,8.4,7.9,15.4,7.9c5.1,0,9.2-1.5,12.2-4.5c1.1-1.1,2-2.4,2.7-3.8c3.5,4.8,8.8,8.3,16.9,8.3c4.5,0,8.5-1.7,11.6-4.9
c1.1-1.1,2-2.4,2.9-3.8c1,1.7,2.3,3.3,3.9,4.7c2.2,1.9,5.1,3.2,8,3.5l1.1,0.1l0.5,0l0.1,0l0.1,0c0.2,0-0.4,0,0.5,0l0.2,0
c0.5,0,0.9-0.1,1.4-0.1c0.1,0,0.2,0,0.4,0l0.6-0.1c0.4-0.1,0.8-0.2,1.2-0.3c0.4-0.1,0.8-0.2,1.1-0.3l0.9-0.4c1.3-0.5,2.4-1.3,3.4-2
c0.5-0.4,0.9-0.8,1.4-1.3c0.5-0.4,0.8-0.9,1.1-1.3c0.7-0.8,1.2-1.7,1.7-2.5c3.7,5.6,8.8,8.6,15.1,8.6c13.9,0,22.2-14.5,22.2-38.9
c0-3.5-0.2-6.7-0.4-9.5c0.6-0.4,1.2-0.7,1.7-1.1c0.6-0.5,1.2-0.9,1.8-1.4l1.6-1.5c0.6-0.5,1-1,1.5-1.6l0.8-0.8l0.7-0.8
c1-1.1,1.8-2.3,2.6-3.4c0.8-1.2,1.6-2.4,2.3-3.6c0.4-0.6,0.7-1.2,1-1.8c0.2-0.3,0.3-0.6,0.5-0.9l2.4,0.7l1.9,0.6l1.9,0.5l0.9,0.3
l1.2,0.3c0.8,0.2,1.7,0.4,2.2,0.5l0.5,0.1l0.1,0l0.1,0l0.5,0.1l0.1,0c0.1,0,0.2,0,0.3,0c0.1,0,0.2,0,0.3,0.1c0.1,0,0.2,0.1,0.3,0.1
c0.4,0.2,0.7,0.4,1,0.8c0.3,0.3,0.4,0.7,0.5,1.1c0,0.1,0,0.2,0,0.3c0,0,0,0,0,0l0,0c0,0,0,0.1,0,0.2l-0.1,0.5l0,0.1l0,0.1l-0.2,0.9
c-0.9,4.9-1.7,9.9-2.4,15c-0.7,5.1-1.2,10.3-1.3,15.6c0,2.7,0.1,5.4,0.4,8.2c0.3,2.8,0.9,5.7,2.1,8.6c0.6,1.5,1.4,3,2.5,4.4
c1,1.4,2.5,2.7,4.1,3.8c0.8,0.5,1.7,1,2.6,1.2c0.5,0.2,0.9,0.3,1.4,0.5c0.5,0.1,1,0.2,1.5,0.3l0.8,0.1c0.3,0,0.3,0,0.5,0l0.9,0.1
l0.2,0l0.4,0l0.2,0l0.7,0c0.5,0,0.9,0,1.4-0.1c1.9-0.2,3.8-1,5.4-2c1.6-1,3-2.3,4-3.7c1.3-1.7,2.3-3.5,3-5.2
c1.1,1.6,2.4,3.1,3.8,4.4c0.8,0.8,1.8,1.4,2.8,2.1c0.5,0.3,1,0.6,1.5,0.9c0.5,0.3,1,0.6,1.6,0.7c0.5,0.2,1.1,0.4,1.6,0.6
c0.5,0.2,1.2,0.3,1.8,0.4l0.9,0.2l0.5,0.1c0.1,0,0.2,0,0.3,0c0.4,0,0.8,0.1,1.2,0.1l0.3,0l0.2,0l0.4,0l0,0l0.1,0l0.8,0
c0.5,0,1,0,1.6-0.1c1.1-0.2,2.1-0.3,3.1-0.7c1-0.3,2-0.8,3-1.2c0.5-0.3,0.9-0.5,1.3-0.8c0.5-0.3,0.9-0.6,1.2-0.9
c1.4-1.1,2.5-2.5,3.4-3.8c0.5,0.8,1.1,1.7,1.8,2.5c0.6,0.7,1.2,1.4,1.9,2c0.7,0.6,1.4,1.3,2.3,1.8l1.3,0.8l0.6,0.4
c0.2,0.1,0.5,0.2,0.7,0.3c1,0.4,1.8,0.8,3,1.1c1.1,0.3,2.4,0.5,3,0.5l1.1,0.1l0.3,0l0.1,0l0.5,0l0.1,0l0.7,0
c1.9-0.1,3.9-0.3,5.9-1.1c2-0.7,4.1-2,5.7-3.7c0.8-0.9,1.5-1.8,2.1-2.7c3.2,4.4,8.1,7.5,15.2,7.5c0.1,0,0.3,0,0.4,0c0,0,0.2,0,0.4,0
c0.4,0,0.8,0,1.4,0c1.1,0,2.7-0.1,4.7-0.4c4-0.6,9.8-2.1,16.2-6c0.8-0.5,1.6-1,2.4-1.6c0.4-0.3,0.8-0.6,1.2-0.9
c0.4-0.3,0.8-0.6,1.2-1c0.8-0.7,1.6-1.3,2.3-2c0.4-0.4,0.8-0.7,1.2-1.1l0.6-0.6l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.3
c0.7-0.8,1.3-1.5,2-2.3c0.7-0.9,1.5-1.8,2.2-2.8c0.7-0.9,1.3-1.9,2-2.8c0.1,0.4,0.2,0.9,0.3,1.3c0.6,2,1.2,4,2.1,5.9
c0.4,1,0.9,2,1.4,2.9c0.6,1,1.1,1.9,1.7,2.9c1.3,1.9,2.8,3.7,4.9,5.3c2,1.6,4.6,2.9,7.6,3.2l0.5,0.1c0.2,0-0.1,0,0.6,0l0.2,0l0.7,0
l0.7,0c0.2,0,0.7,0,1-0.1c0.7-0.1,1.4-0.1,2-0.3l1.7-0.4c4.6-1.2,8.5-3.5,11.8-6.2l1.2-1c0.3,0.4,0.6,0.9,1,1.3
c2.1,2.6,5.1,5,8.7,6.3c0.9,0.3,1.8,0.5,2.8,0.7c0.5,0.1,0.9,0.1,1.4,0.2l0.7,0l0.3,0c0,0,0.4,0,0.5,0l0.1,0c0.6,0,1.3-0.1,1.9-0.1
l0.9-0.1l1.2-0.2c0.8-0.1,1.6-0.3,2.4-0.5c0.8-0.2,1.4-0.4,2.1-0.6c0.7-0.2,1.4-0.4,2-0.7c0.6-0.3,1.2-0.6,1.9-0.8
c4.9-2.3,8.7-5.2,11.9-8c1.7-1.4,3.1-2.9,4.5-4.2c1.3-1.4,2.6-2.8,3.7-4.1c4.6-5.3,7.6-9.7,10-12.5c1.1-1.5,1.7-2.8,1.9-3.7
C441.7,492.2,441.7,491.6,441.7,491.6z M37.4,503.6c0,15.2-6.9,15.2-9.1,15.2c-8,0-13.9-12.1-13.9-28.1c0-15.9,7.8-25.4,23.1-28.4
v39.5c0,0.4,0,0.9,0,1.4C37.4,503.3,37.4,503.5,37.4,503.6z M90.8,518.5c-3.8,0-12.6,0-13.7-25.4c0-0.1,0-0.2,0-0.3
c1-17.6,6.8-31.2,13.7-31.2c4.4,0,7.6,2,9.3,3.4c0,5.6,0.1,11.4,0.1,17.1c0,4.7,0.1,9.5,0.1,14.1c0,0.7,0,1.5,0,2.2
c-0.2,5-1.3,14.3-5.2,18.3C93.9,517.9,92.6,518.5,90.8,518.5z M149.3,462.8c5,0,7.7,4.9,9.1,10.9c0,0-0.1,0-0.1,0l-0.7,0.2l-0.7,0.1
c-0.5,0.1-1,0.2-1.5,0.2l-1.5,0.1l-0.4,0l0,0l0,0l-0.9-0.1l-0.5,0c-0.1,0-0.2,0-0.2,0l-0.1,0c-0.1,0-0.2-0.1-0.4-0.1
c-0.2,0-0.6-0.2-1-0.3c-0.4-0.1-0.8-0.3-1.1-0.5c-0.8-0.4-1.5-0.9-2.2-1.5c-0.4-0.3-0.7-0.7-1.1-1c-0.3-0.4-0.7-0.7-1-1.1
c-0.7-0.8-1.3-1.6-1.9-2.5c-0.2-0.3-0.4-0.7-0.6-1C144.2,464.2,146.5,462.8,149.3,462.8z M156.7,510.4c-3.2,8.1-7.4,8.1-8.8,8.1
c-1.4,0-5.5,0-8.7-8.1c-2-5.2-3.1-12.5-3.1-20.6c0-3.9,0.5-8.5,1.5-12.7c0.3,0.4,0.6,0.7,1,1.1c0.6,0.5,1.1,1.1,1.7,1.6
c1.2,1,2.5,2,4,2.8c0.7,0.4,1.5,0.8,2.3,1.1c0.8,0.3,1.6,0.6,2.6,0.8c0.5,0.1,1,0.2,1.5,0.3l0.4,0.1l0.2,0l0.5,0l0.9,0.1l0.2,0
l0.1,0l0.4,0l0.1,0l0.6,0l2.3-0.1c0.8-0.1,1.5-0.2,2.3-0.3l1-0.2c0.1,1.9,0.1,3.7,0.1,5.4C159.9,497.8,158.8,505.1,156.7,510.4z
M196.5,455.8C196.5,455.8,196.5,455.8,196.5,455.8C196.5,455.8,196.5,455.8,196.5,455.8z M252.8,506.4c-0.2,1.5-0.5,3.2-1.2,4.9
c-0.3,0.9-0.7,1.7-1.2,2.4c-0.5,0.7-1,1.4-1.7,1.9c-0.2,0.1-0.3,0.3-0.5,0.4c-0.2,0.1-0.4,0.2-0.5,0.3c-0.4,0.2-0.8,0.4-1.3,0.5
c-0.4,0.2-1,0.2-1.5,0.3c-0.3,0-0.6,0-0.9,0l-0.4,0l-0.3,0c-0.4,0-0.8-0.1-1.2-0.1c-0.1,0-0.2,0-0.3,0l-0.2-0.1l-0.3-0.1
c-0.2-0.1-0.4,0-0.7-0.2c-0.3-0.1-0.5-0.2-0.8-0.3c-0.3-0.1-0.5-0.2-0.8-0.4c-0.3-0.2-0.5-0.2-0.8-0.4c-0.5-0.4-1-0.7-1.5-1.2
c-1.9-1.7-3.5-4.4-4.7-7.4c-1.2-3-1.9-6.5-2.3-10c-0.4-3.5-0.5-7.1-0.4-10.7c0.1-1.5,0.3-3.2,0.6-4.8c0.3-1.6,0.7-3.1,1.2-4.4
c1-2.8,2.5-5.1,4.4-7c1.8-1.9,3.9-3.3,6.1-4.4c2.2-1.1,4.4-1.8,6.4-2.4c1.8-0.5,3.4-0.8,4.8-1c0,4.9,0,14.3-0.1,26.3
c0,2.3,0,4.6,0,7.1c0,1.2,0,2.5,0,3.7c0,0.6,0,1.3,0,1.9l0,0.5l0,0.6c0,0.4,0,0.8,0.1,1.2c0,0,0,0.1,0,0.1c0,0.2,0,0.4-0.1,0.6
C253,505,252.9,505.6,252.8,506.4z M292.6,490.8v-29.3c18.6,2.6,23.8,19.1,23.8,29.3c0,13.7-6.1,27.7-12,27.7
C299.3,518.5,292.6,515.6,292.6,490.8z M354.2,417C354.2,417,354.2,417,354.2,417C354.2,417,354.1,417,354.2,417
C354.1,417,354.1,417,354.2,417z M348.9,456.1c0-3.6,0.2-7.2,0.4-10.8c0.5-7.1,1.2-14.2,2.8-20.6c0.4-1.6,0.9-3.1,1.4-4.5
c0.3-0.7,0.6-1.3,0.9-1.9c0.1-0.2,0.2-0.4,0.3-0.6c0,0,0,0,0,0.1c0.3,0.4,0.6,0.9,0.8,1.5c1.1,2.4,1.7,5.4,2,8.4
c0.3,3,0.3,6.1,0.1,9.2c-0.4,6.1-1.6,12.2-3,17.9c-0.8,2.9-1.5,5.8-2.2,8.6c-0.8,2.8-1.4,5.6-2.3,8.3c-0.4,1.3-0.7,2.5-1.1,3.7
c-0.1-2.7-0.1-5.5-0.1-8.2c0-1.9,0-3.7,0-5.6C348.9,459.7,348.9,457.9,348.9,456.1z M394.1,461.6
C394.1,461.6,394.1,461.6,394.1,461.6L394.1,461.6z M383.4,485c0.2-3,0.6-6.1,1.2-9c0.6-2.9,1.4-5.8,2.5-8.4
c1.1-2.5,2.6-4.6,4.1-5.4c0.4-0.2,0.8-0.4,1.2-0.5l0.3-0.1c0.1,0,0.1,0,0.2,0l0.1,0c0,0,0.2,0,0.3,0l0.6,0c0,0,0,0,0,0l0.1,0
c0.1,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0.1c0.2,0.2,0.6,1.2,0.8,2.5c0.2,1.3,0.2,2.7,0.1,4.3
c-0.2,3.1-0.8,6.4-1.6,9.7c-0.4,1.7-0.9,3.3-1.4,5c-0.2,0.8-0.5,1.6-0.8,2.5c-0.3,0.8-0.6,1.6-0.9,2.4c-1.6,4.5-3.6,8.8-6,12.9
c-0.5-2.4-0.9-4.9-1.1-7.4c-0.1-1.4-0.2-2.8-0.2-4.3C383.3,487.8,383.3,486.4,383.4,485z"/>
<g id="sheen">
<path fill="#FFFFFF" d="M31.8,457.7c-0.4,0-0.8-0.3-1-0.7c-0.2-0.5,0.1-1.1,0.7-1.3c0.1,0,1.9-0.6,5-1.2c0.6-0.1,1.1,0.2,1.2,0.8
c0.1,0.5-0.2,1.1-0.8,1.2c-3.1,0.7-4.8,1.2-4.9,1.2C32,457.7,31.9,457.7,31.8,457.7z"/>
<path fill="#FFFFFF" d="M80.2,461.2c-0.1,0-0.3,0-0.4-0.1c-0.5-0.2-0.7-0.8-0.5-1.3c0.1-0.2,0.4-0.8,1.4-1.6
c0.4-0.3,1.1-0.3,1.4,0.2c0.3,0.4,0.3,1.1-0.2,1.4c-0.6,0.5-0.8,0.8-0.8,0.8C80.9,461,80.6,461.2,80.2,461.2z"/>
<path fill="#FFFFFF" d="M103.2,406.9c-0.1,0-0.3,0-0.4-0.1c-0.5-0.2-0.7-0.8-0.5-1.4c0.1-0.2,0.6-0.9,1.2-1.4
c0.4-0.4,1.1-0.3,1.4,0.1c0.4,0.4,0.3,1.1-0.1,1.4c-0.5,0.4-0.8,0.8-0.8,0.9C103.9,406.7,103.5,406.9,103.2,406.9z"/>
<path fill="#FFFFFF" d="M285.8,412.1c-0.1,0-0.3,0-0.4-0.1c-0.5-0.2-0.7-0.8-0.5-1.4c0.1-0.2,0.6-0.9,1.2-1.4
c0.4-0.4,1.1-0.3,1.4,0.1c0.4,0.4,0.3,1.1-0.1,1.4c-0.5,0.4-0.8,0.8-0.8,0.9C286.5,412,286.2,412.1,285.8,412.1z"/>
<path fill="#FFFFFF" d="M85.5,456.7c-0.3,0-0.7-0.2-0.8-0.5c-0.3-0.5-0.2-1.1,0.3-1.4c0.1-0.1,2.7-1.8,6.1-1.3
c0.6,0.1,0.9,0.6,0.9,1.1c-0.1,0.6-0.6,0.9-1.1,0.9c-2.6-0.4-4.7,1-4.7,1C85.9,456.7,85.7,456.7,85.5,456.7z"/>
<path fill="#FFFFFF" d="M349.1,416.2c-0.1,0-0.2,0-0.3,0c-0.5-0.2-0.8-0.7-0.7-1.3c0-0.1,1.1-3.6,4.5-4.5c0.5-0.1,1.1,0.2,1.2,0.7
c0.1,0.5-0.2,1.1-0.7,1.2c-2.3,0.6-3.1,3-3.1,3.1C349.9,415.9,349.5,416.2,349.1,416.2z"/>
<path fill="#FFFFFF" d="M383.8,461.6c-0.1,0-0.2,0-0.3,0c-0.5-0.2-0.8-0.7-0.7-1.3c0-0.1,1.1-3.6,4.5-4.5c0.5-0.1,1.1,0.2,1.2,0.7
c0.1,0.5-0.2,1.1-0.7,1.2c-2.3,0.6-3.1,3.1-3.1,3.1C384.7,461.4,384.3,461.6,383.8,461.6z"/>
<path fill="#FFFFFF" d="M432.4,492.4c-0.2,0-0.4-0.1-0.6-0.2c-0.5-0.3-0.6-0.9-0.3-1.4c0.8-1.3,1.9-2.7,3.5-3.3
c0.5-0.2,1.1,0,1.3,0.6c0.2,0.5,0,1.1-0.6,1.3c-1.1,0.4-1.9,1.5-2.6,2.5C433.1,492.3,432.8,492.4,432.4,492.4z"/>
<path fill="#FFFFFF" d="M179,456.7c-0.1,0-0.2,0-0.3,0c-0.5-0.2-0.8-0.7-0.7-1.3c0.2-0.7,0.9-2,2.4-2.3c0.5-0.1,1.1,0.2,1.2,0.7
c0.1,0.5-0.2,1.1-0.7,1.2c-0.6,0.2-0.9,0.9-0.9,0.9C179.9,456.4,179.5,456.7,179,456.7z"/>
<path fill="#FFFFFF" d="M203.2,464.3c-0.5,0-0.9-0.4-0.9-0.9c-0.1-0.6-0.8-1-0.8-1c-0.5-0.2-0.7-0.8-0.5-1.3
c0.2-0.5,0.8-0.7,1.3-0.5c0.7,0.3,1.8,1.2,2,2.6c0.1,0.6-0.3,1.1-0.9,1.1C203.3,464.3,203.3,464.3,203.2,464.3z"/>
<path fill="#FFFFFF" d="M139.9,460.6c-0.2,0-0.4-0.1-0.6-0.2c-0.4-0.3-0.5-1-0.2-1.4c0.1-0.1,2.5-3.2,5.8-3.4c0.6,0,1,0.4,1.1,0.9
c0,0.6-0.4,1-0.9,1.1c-2.4,0.2-4.3,2.6-4.3,2.6C140.5,460.5,140.2,460.6,139.9,460.6z"/>
<path fill="#FFFFFF" d="M26.9,458.4L26.9,458.4c-0.2-0.5,0.1-1.1,0.6-1.3c0.2-0.1,0.4-0.1,0.5-0.2c0.5-0.2,1.1,0.2,1.3,0.7
c0.2,0.5-0.2,1.1-0.7,1.3c-0.1,0-0.3,0.1-0.5,0.1C27.7,459.2,27.1,458.9,26.9,458.4z"/>
<path fill="#FFFFFF" d="M247.5,457.6c-0.4,0-0.8-0.3-1-0.7c-0.2-0.5,0.1-1.1,0.7-1.3c0.1,0,1.8-0.6,5-1.3c0.5-0.1,1.1,0.2,1.2,0.8
c0.1,0.5-0.2,1.1-0.8,1.2c-3.1,0.7-4.8,1.2-4.9,1.2C247.7,457.6,247.6,457.6,247.5,457.6z"/>
<path fill="#FFFFFF" d="M242.6,458.3L242.6,458.3c-0.2-0.5,0.1-1.1,0.6-1.3c0.2-0.1,0.4-0.1,0.5-0.2c0.5-0.2,1.1,0.1,1.3,0.7
c0.2,0.5-0.1,1.1-0.7,1.3c-0.1,0-0.3,0.1-0.5,0.2C243.4,459.1,242.8,458.9,242.6,458.3z"/>
</g>
</svg>
</a> creation.
</p>
</div>
</div>
<div id="faq"></div>
<div class="sub-footer">
<div class="row text-center">
<div class="small-12 medium-10 large-12 small-center columns">
<h1>Frequently Asked Questions</h1>
<div class="row">
<div class="small-12 columns">
<dl>
<dt>How is this different from services like lorempixel.com?</dt>
<dd>
<p>
Those services generate a random image on every request, while
Adorable Avatars delivers consistent avatars.
</p>
<p>
If you request the same avatar multiple times, you'll get
<b>the same avatar</b> each time. That kind of thing matters
when you're associating an image with a user's identity.
</p>
</dd>
</dl>
</div>
</div>
<div class="row">
<div class="small-12 medium-6 columns">
<dl>
<dt>Will you be adding more avatars?</dt>
<dd>
<p>
Absolutely! Our original avatars were done by the immensely
talented <a href='https://dribbble.com/missingdink'>missingdink</a>,
and we'd love to feature more artists' series. If you're
interested in contributing, please <a href='#support'>get in touch</a>.
</p>
</dd>
</dl>
</div>
<div class="small-12 medium-6 columns">
<dl>
<dt>How many avatars are there?</dt>
<dd>
<p>
We can currently generate over 5,000 different avatars from supplied identifiers.
However, we also offer access to a slightly more ridiculous API that boasts over
9.6 <i>billion</i> possibilities.
</p>
</dd>
</dl>
</div>
</div>
<div class="row">
<div class="small-12 medium-6 columns">
<dl>
<dt>What happened to the old avatars?</dt>
<dd>
<p>
Have no fear, they're still there! We updated our demo to
showcase our generated avatars, but the original avatars are still
in the same place: <code>/avatar/:your_identifier</code>
</p>
</dd>
</dl>
</div>
<div class="small-12 medium-6 columns">
<dl>
<dt>What does your service do best?</dt>
<dd>
<p>
It works best as a placeholder service.
Adorable Avatars gives you images with humanity when you have
nothing better than silhouettes, random shapes, or empty space.
</p>
</dd>
</dl>
</div>
</div>
<div class="row">
<div class="small-12 columns">
<dl>
<dt>Can I use the same avatar forever?</dt>
<dd>
<div class="row expand">
<div class="small-12 medium-9 columns">
<p>
Totally! There's now a way for you to build your avatar from
scratch! Requests of the form
<code>/avatars/face/:eyes/:nose/:mouth/:color</code>
will build an avatar out of those specified pieces.
</p>
<p>
We even have <a href="http://api.adorable.io/avatars/list">an API
for listing</a> all the possible parts: <code>/avatars/list</code>
</p>
</div>
<div class="small-9 medium-3 columns text-center"><img src="http://api.adorable.io/avatars/face/eyes4/nose3/mouth7/8e8895" alt="Example face!">
<h3>(Example)</h3>
</div>
</div>
<div class="row expand">
<div class="small-12 columns text-center">
<h2>Have fun, and <a href="http://twitter.com/adorableio" class='special'>share</a> your favorites with us!</h2>
</div>
</div>
</dd>
</dl>
</div>
</div>
</div>
</div>
</div>
<div id="support"></div>
<div class="sub-footer">
<div class="row">
<div class="small-12 medium-4 columns">
<h3>Contribute</h3>
<p>
Adorable Avatars is an open-source project available for
contributions on
<a href="https://github.com/adorableio/adorable-avatars">Github</a>.
</p>
</div>
<div class="small-12 medium-4 columns">
<h3>Support</h3>
<p>
Please submit your questions and feedback to us through
<a href="http://twitter.com/adorableio">Twitter</a> or
<a href="https://github.com/adorableio/adorable-avatars/issues">Github issues</a>.
</p>
</div>
<div class="small-12 medium-4 columns">
<h3>License</h3>
<p>
Adorable Avatars is released under the terms of the
<a href="https://raw.githubusercontent.com/adorableio/adorable-avatars/master/LICENSE">MIT License</a>.
</p>
</div>
</div>
</div>
</footer>
<script src="/vendor/jquery/dist/jquery.min.js"></script>
<script src="/vendor/zeroclipboard/dist/ZeroClipboard.min.js"></script>
<script src="app.js"></script>
<script src="//use.typekit.net/vge6uut.js"></script>
</body>
</html>
* {
box-sizing: border-box;
}
.column,
.columns {
float: left;
position: relative;
}
.column .center,
.columns .center {
text-align: center;
}
.column img,
.columns img {
width: 100%;
}
.small-1 {
width: 8.333333333333332%;
padding-left: 15px;
padding-right: 15px;
}
.small-2 {
width: 16.666666666666664%;
padding-left: 15px;
padding-right: 15px;
}
.small-3 {
width: 25%;
padding-left: 15px;
padding-right: 15px;
}
.small-4 {
width: 33.33333333333333%;
padding-left: 15px;
padding-right: 15px;
}
.small-5 {
width: 41.66666666666667%;
padding-left: 15px;
padding-right: 15px;
}
.small-6 {
width: 50%;
padding-left: 15px;
padding-right: 15px;
}
.small-7 {
width: 58.333333333333336%;
padding-left: 15px;
padding-right: 15px;
}
.small-8 {
width: 66.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.small-9 {
width: 75%;
padding-left: 15px;
padding-right: 15px;
}
.small-10 {
width: 83.33333333333334%;
padding-left: 15px;
padding-right: 15px;
}
.small-11 {
width: 91.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.small-12 {
width: 100%;
padding-left: 15px;
padding-right: 15px;
}
@media 'small'-up {
.small-center {
float: none;
margin: 0 auto;
}
}
@media 'small'-only {
.small-only-center {
float: none;
margin: 0 auto;
}
}
@media only screen {
.small-1 {
width: 8.333333333333332%;
padding-left: 15px;
padding-right: 15px;
}
.small-2 {
width: 16.666666666666664%;
padding-left: 15px;
padding-right: 15px;
}
.small-3 {
width: 25%;
padding-left: 15px;
padding-right: 15px;
}
.small-4 {
width: 33.33333333333333%;
padding-left: 15px;
padding-right: 15px;
}
.small-5 {
width: 41.66666666666667%;
padding-left: 15px;
padding-right: 15px;
}
.small-6 {
width: 50%;
padding-left: 15px;
padding-right: 15px;
}
.small-7 {
width: 58.333333333333336%;
padding-left: 15px;
padding-right: 15px;
}
.small-8 {
width: 66.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.small-9 {
width: 75%;
padding-left: 15px;
padding-right: 15px;
}
.small-10 {
width: 83.33333333333334%;
padding-left: 15px;
padding-right: 15px;
}
.small-11 {
width: 91.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.small-12 {
width: 100%;
padding-left: 15px;
padding-right: 15px;
}
@media only screen {
.small-center {
float: none;
margin: 0 auto;
}
}
@media screen and (max-width: 40.063em) {
.small-only-center {
float: none;
margin: 0 auto;
}
}
}
@media screen and (min-width: 40.063em) {
.medium-1 {
width: 8.333333333333332%;
padding-left: 15px;
padding-right: 15px;
}
.medium-2 {
width: 16.666666666666664%;
padding-left: 15px;
padding-right: 15px;
}
.medium-3 {
width: 25%;
padding-left: 15px;
padding-right: 15px;
}
.medium-4 {
width: 33.33333333333333%;
padding-left: 15px;
padding-right: 15px;
}
.medium-5 {
width: 41.66666666666667%;
padding-left: 15px;
padding-right: 15px;
}
.medium-6 {
width: 50%;
padding-left: 15px;
padding-right: 15px;
}
.medium-7 {
width: 58.333333333333336%;
padding-left: 15px;
padding-right: 15px;
}
.medium-8 {
width: 66.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.medium-9 {
width: 75%;
padding-left: 15px;
padding-right: 15px;
}
.medium-10 {
width: 83.33333333333334%;
padding-left: 15px;
padding-right: 15px;
}
.medium-11 {
width: 91.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.medium-12 {
width: 100%;
padding-left: 15px;
padding-right: 15px;
}
@media screen and (min-width: 40.063em) {
.medium-center {
float: none;
margin: 0 auto;
}
}
@media screen and (max-width: 64.063em) {
.medium-only-center {
float: none;
margin: 0 auto;
}
}
}
@media screen and (min-width: 64.063em) {
.large-1 {
width: 8.333333333333332%;
padding-left: 15px;
padding-right: 15px;
}
.large-2 {
width: 16.666666666666664%;
padding-left: 15px;
padding-right: 15px;
}
.large-3 {
width: 25%;
padding-left: 15px;
padding-right: 15px;
}
.large-4 {
width: 33.33333333333333%;
padding-left: 15px;
padding-right: 15px;
}
.large-5 {
width: 41.66666666666667%;
padding-left: 15px;
padding-right: 15px;
}
.large-6 {
width: 50%;
padding-left: 15px;
padding-right: 15px;
}
.large-7 {
width: 58.333333333333336%;
padding-left: 15px;
padding-right: 15px;
}
.large-8 {
width: 66.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.large-9 {
width: 75%;
padding-left: 15px;
padding-right: 15px;
}
.large-10 {
width: 83.33333333333334%;
padding-left: 15px;
padding-right: 15px;
}
.large-11 {
width: 91.66666666666666%;
padding-left: 15px;
padding-right: 15px;
}
.large-12 {
width: 100%;
padding-left: 15px;
padding-right: 15px;
}
@media screen and (min-width: 64.063em) {
.large-center {
float: none;
margin: 0 auto;
}
}
@media screen and (min-width: 64.063em) {
.large-only-center {
float: none;
margin: 0 auto;
}
}
}
.row {
margin-left: auto;
margin-right: auto;
padding-bottom: 15px;
width: 100%;
max-width: 1000px;
}
.row:after {
content: "";
display: block;
clear: both;
visibility: hidden;
font-size: 0;
line-height: 0;
height: 0;
}
.row.expand {
margin-left: -15px;
margin-right: -15px;
}
* {
-webkit-font-smoothing: antialiased;
}
h1,
h2,
h3,
h4,
h5 {
color: #e14283;
font-family: "omnes-pro", sans-serif;
font-weight: 100;
text-transform: none;
-webkit-margin-before: 0;
-webkit-margin-after: 0;
}
h2 {
font-size: 2rem;
}
h3 {
font-size: 1.4rem;
}
body,
p {
color: #1e2c46;
font-family: "proxima-nova-soft", sans-serif;
font-size: 18px;
font-weight: 400;
line-height: 1.8;
text-shadow: none;
}
p {
padding-bottom: 1em;
-webkit-margin-before: 0;
-webkit-margin-after: 0;
}
blockquote {
box-shadow: inset 2px 0 #948fae;
font-family: "source-code-pro", monospace;
background: rgba(148,143,174,0.1);
display: block;
position: relative;
font-style: italic;
left: 0;
right: 0;
margin-left: 0;
margin-right: 0;
padding: 2px 0;
}
code {
background: rgba(30,44,70,0.1);
padding-left: 0.25em;
padding-right: 0.25em;
}
small {
color: rgba(30,44,70,0.8);
}
h1 {
color: #e14283;
font-size: 48px;
}
h2 {
color: #e14283;
font-size: 32px;
line-height: 1.4;
margin-bottom: 0.6em;
}
p.subtitle {
color: rgba(30,44,70,0.75);
font-size: 24px;
}
a {
color: #6ed8d6;
text-decoration: none;
-webkit-transition: all 0.3s ease;
-moz-transition: all 0.3s ease;
transition: all 0.3s ease;
}
a.special {
color: #e14283;
font-weight: 500;
}
.text-center {
text-align: center;
}
code {
color: #e14283;
font-family: "source-code-pro", monospace;
font-size: 14px;
font-weight: 900;
line-height: 1.4;
}
pre {
box-shadow: 0 2px 0 0 #fff;
background-color: #fff;
padding-left: 20px;
padding-right: 20px;
margin-bottom: 30px;
}
pre code {
color: #e14283;
font-family: "source-code-pro", monospace;
font-size: 14px;
font-weight: 900;
line-height: 1.4;
}
pre code span.comment {
color: rgba(225,66,131,0.5);
}
pre code span.bash:before {
content: '$';
color: rgba(225,66,131,0.5);
display: inline-block;
margin-right: 6px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.text-center {
text-align: center;
}
ul {
padding-left: 0;
}
.inline-list {
padding-left: 0;
}
.inline-list > * {
display: inline-block;
}
.inline-list.bullet > *:first-child:before {
display: none;
}
.inline-list.bullet > *:before {
display: inline-block;
content: '•';
margin-left: 10px;
margin-right: 10px;
}
ul.no-bullet {
list-style-type: none;
padding: 0px;
margin: 0px;
}
@font-face {
font-family: 'avatars';
src: url("http://avatars.adorable.io/assets/fonts/avatars.eot");
src: url("http://avatars.adorable.io/assets/fonts/avatars.eot?#iefix") format("embedded-opentype"), url("http://avatars.adorable.io/assets/fonts/avatars.ttf") format("truetype"), url("http://avatars.adorable.io/assets/fonts/avatars.woff") format("woff"), url("http://avatars.adorable.io/assets/fonts/avatars.svg#avatars") format("svg");
font-weight: normal;
font-style: normal;
}
[class*="icon-"]:before,
.navigation .menu:before {
display: inline-block;
font-family: 'avatars';
speak: none;
font-variant: normal;
font-style: normal;
font-weight: normal;
text-transform: none;
line-height: 1;
margin-right: 0.25em;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
[class*="icon-"]:before:active {
text-decoration: none;
}
.icon-demo:before {
content: "\e600";
}
.icon-menu:before {
content: "\e601";
}
.icon-top:before {
content: "\e602";
}
.icon-what:before {
content: "\e603";
}
.icon-support:before {
content: "\e604";
}
html,
body {
margin: 0;
padding: 0;
overflow-x: hidden;
}
body {
background: #f3f3f3;
}
body.scrolled .navigation {
background: rgba(30,34,59,0.95);
}
body.open .navigation {
height: 100%;
background: rgba(30,34,59,0.95);
}
.button {
background-color: #e14283;
color: #fff;
cursor: pointer;
display: inline-block;
padding: 15px 25px 16px;
margin-bottom: 1em;
margin-right: 15px;
}
.button:last-child {
margin-right: 0;
}
.button.lame {
background-color: transparent;
color: #6ed8d6;
box-shadow: 0 0 0 1px #6ed8d6;
}
.button.lame:hover {
color: #1e2c46;
}
.button:hover,
.button.zeroclipboard-is-hover {
background-color: #6ed8d6;
color: #1e2c46;
text-decoration: none;
}
label {
color: rgba(255,255,255,0.45);
display: block;
font-size: 11px;
text-transform: uppercase;
}
label span {
color: #fff;
font-size: 18px;
text-transform: none;
z-index: 300;
position: relative;
}
section {
padding: 0;
margin: 0;
box-sizing: border-box;
}
section .row:after {
content: "";
display: block;
clear: both;
visibility: hidden;
font-size: 0;
line-height: 0;
height: 0;
}
section h2.title {
margin: 0;
padding: 0;
font-weight: 100;
}
.container {
display: inline-block;
width: auto;
}
@-webkit-keyframes flash {
0% {
background-color: #fff;
color: #fff;
}
50% {
background-color: #e14283;
color: #fff;
}
100% {
background-color: rgba(225,66,131,0);
color: #fff;
}
}
@-webkit-keyframes white-flash {
0% {
background-color: #fff;
color: #fff;
}
50% {
background-color: #e14283;
color: #fff;
}
100% {
background-color: #fff;
color: #e14283;
}
}
[class*='-value'] {
position: relative;
padding: 0 5px;
margin: 0 -5px;
}
[class*='-value'] .flash {
-webkit-animation: flash 600ms 1 ease-in;
-moz-animation: flash 600ms 1 ease-in;
-o-animation: flash 600ms 1 ease-in;
animation: flash 600ms 1 ease-in;
position: relative;
z-index: 100;
}
#top,
#what,
#faq,
#demo {
display: block;
position: relative;
top: -70px;
visibility: hidden;
}
.navigation {
-webkit-transition: all 0.4s ease-in;
-moz-transition: all 0.4s ease-in;
transition: all 0.4s ease-in;
position: fixed;
background: transparent;
display: block;
text-align: center;
height: 70px;
overflow: hidden;
padding: 12px 0 0;
left: 0;
right: 0;
top: 0;
z-index: 1000;
}
.navigation .menu {
color: #e14283;
display: block;
font-size: 1.6em;
text-align: right;
margin-right: 20px;
}
.navigation .menu:before {
content: "\e601";
color: inherit;
margin: 0;
padding: 0;
}
.navigation .menu span {
display: none;
}
.navigation ul {
list-style-type: none;
padding: 0;
}
.navigation ul li {
display: block;
margin: -6px 0 6px;
}
.navigation ul li:last-child {
margin-right: 0;
}
.navigation ul li [class^='icon-']:before {
font-size: 36px;
line-height: 1;
height: 100%;
position: relative;
top: 2px;
vertical-align: bottom;
}
.navigation ul li a {
font-family: "omnes-pro", sans-serif;
font-size: 18px;
font-weight: 300;
display: block;
padding: 10px 15px 8px;
color: #e14283;
box-shadow: 0 0 0 1px transparent;
vertical-align: bottom;
}
.navigation ul li a:hover {
background: #6ed8d6;
color: #1e2c46;
box-shadow: 0 0 0 1px #6ed8d6;
}
@media screen and (min-width: 40.063em) {
.navigation {
padding: 0 0.8em;
height: 74px;
}
.navigation .menu {
display: none;
}
.navigation .navigation {
height: auto;
}
.navigation ul {
height: auto;
opacity: 1;
}
.navigation ul li {
display: inline-block;
}
.navigation ul li a {
margin-top: 0;
padding-top: 5px;
}
}
header {
background-color: #1e223b;
background-image: url("http://avatars.adorable.io/assets/img/header-bg.jpg");
background-position: 50%;
background-size: cover;
padding: 8em 0 60px 0;
text-align: center;
}
header h1 {
font-size: 54px;
line-height: 1.2;
}
header h1,
header p {
color: #fff;
}
header p {
margin-bottom: 30px;
}
header .github-link {
display: block;
}
header .github-link a {
color: rgba(148,143,174,0.42);
}
header .github-link a:hover {
color: #6ed8d6;
}
@media screen and (min-width: 40.063em) {
header h1 {
font-size: 94px;
}
}
#what + section {
background: #fff;
padding-bottom: 60px;
text-align: center;
}
#what + section h1 {
line-height: 1.2;
}
#what + section p {
margin-bottom: 20px;
}
#what + section .sub-section {
background: linear-gradient(#298e8d, #467d88);
margin-bottom: 60px;
padding-top: 60px;
}
#what + section .sub-section h1 {
color: #fff;
}
#what + section .sub-section p {
color: #fff;
}
#what + section code {
background-color: rgba(218,218,222,0.5);
padding-left: 5px;
padding-right: 5px;
}
#demo + section {
background-image: url("http://avatars.adorable.io/assets/img/demo-bg.jpg");
background-position: 50%;
background-size: cover;
padding-bottom: 40px;
padding-top: 120px;
position: relative;
}
@media screen and (min-width: 40.063em) {
#demo + section {
height: 560px;
}
}
#demo + section h1 {
background-image: url("http://avatars.adorable.io/assets/img/the-magic.png");
width: 215px;
height: 132px;
color: #fff;
font-size: 0;
margin-bottom: 20px;
position: absolute;
top: -50px;
left: -8px;
z-index: 100;
pointer-events: none;
}
@media screen and (min-width: 40.063em) {
#demo + section h1 {
left: -36px;
}
}
#demo + section img {
box-shadow: 0 2px 0 0 rgba(30,34,59,0.2);
}
#demo + section .code-row {
text-align: center;
position: absolute;
bottom: -32px;
left: 0;
right: 0;
}
#demo + section .code-row .code-wrapper {
width: auto;
display: inline-block;
}
#demo + section #copy-button {
display: none;
height: 52px;
font-size: 18px;
line-height: 1;
margin: 0;
padding: 17px 15px 15px;
vertical-align: top;
}
#demo + section code {
background-color: #fff;
display: inline-block;
line-height: 1;
font-size: 10px;
padding: 2px 5px;
}
#demo + section code.flash {
-webkit-animation: white-flash 600ms 1 ease-in;
-moz-animation: white-flash 600ms 1 ease-in;
-o-animation: white-flash 600ms 1 ease-in;
animation: white-flash 600ms 1 ease-in;
position: relative;
z-index: 100;
}
#demo + section code.block {
height: 52px;
padding: 20px 15px 15px;
position: relative;
overflow: none;
vertical-align: top;
white-space: nowrap;
}
#demo + section code .fade {
color: #7a739a;
font-weight: 400;
}
@media screen and (min-width: 40.063em) {
#demo + section #copy-button {
display: inline-block;
}
#demo + section code {
font-size: 14px;
}
#demo + section .form-card {
margin-bottom: 0;
}
}
.form-card {
background: rgba(30,44,70,0.8);
margin-bottom: 20px;
padding: 0;
}
.form-card [class*='-value'] {
position: relative;
padding: 5px 23px 5px 5px;
margin: 0 -23px 0 0;
}
.form-card .input-container {
box-shadow: 0 1px 0 rgba(110,216,214,0.2);
display: block;
position: relative;
padding-bottom: 15px;
padding-left: 20px;
padding-right: 15px;
padding-top: 15px;
text-align: left;
}
.form-card .input-container:before {
bottom: 0;
content: '';
left: 0;
position: absolute;
top: 0;
-webkit-transition: all 0.2s ease-out;
-moz-transition: all 0.2s ease-out;
transition: all 0.2s ease-out;
width: 0;
}
.form-card .input-container.active:before,
.form-card .input-container.active:hover:before {
background: #e14283;
width: 6px;
}
.form-card .input-container:hover:before {
width: 6px;
background: #6ed8d6;
}
.form-card .input-container:first-child {
padding-top: 20px;
}
.form-card .input-container:last-child {
box-shadow: none;
margin-bottom: 0;
padding-bottom: 20px;
}
.form-card .input-container .checkbox {
background: transparent;
display: block;
position: absolute;
right: 0;
bottom: 0;
top: 0;
margin: 0;
padding: 0 15px;
margin-right: 0;
}
.form-card .input-container .checkbox input + label {
color: rgba(255,255,255,0.2);
}
.form-card .input-container .checkbox input:checked + label {
color: #e14283;
}
.form-card .input-container .checkbox:hover input + label {
color: #6ed8d6;
}
.form-card .input-container .checkbox label {
line-height: 57px;
}
input,
label {
outline: none;
vertical-align: middle;
}
input[type=text] {
background: none;
border: none;
color: #fff;
font-size: 16px;
margin: 0;
padding: 0;
height: 36px;
width: 100%;
}
input[type=range] {
-webkit-transition: all 0.6s ease;
-moz-transition: all 0.6s ease;
transition: all 0.6s ease;
-webkit-appearance: none !important;
border-radius: 1000px;
box-shadow: none;
border: none;
background-color: rgba(218,218,222,0.35);
margin: 0;
padding: 0 5px;
height: 6px;
width: 100%;
outline: none;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none !important;
border-radius: 1000px;
box-shadow: none;
background-color: #fff;
cursor: pointer;
width: 20px;
height: 20px;
}
input[type=checkbox] {
display: none;
}
input[type=checkbox] + label {
cursor: pointer;
color: #dadade;
font-size: 14px;
height: 100%;
text-transform: uppercase;
text-decoration: line-through;
padding: 11px 5px;
height: 100%;
}
input[type=checkbox]:checked + label {
color: #e14283;
text-decoration: none;
}
footer {
padding: 60px 0 0 0;
text-align: center;
}
footer p {
font-size: 23px;
}
footer svg {
max-height: 26px;
width: 88px;
margin: 0 0 12px 0;
vertical-align: bottom;
}
footer svg #letters {
fill: #e14283;
}
footer svg #shadow {
fill: rgba(225,66,131,0);
}
footer svg #sheen {
fill: #fff;
}
.adorable-creation {
margin-bottom: 10px;
}
#faq + .sub-footer {
box-shadow: 0 1px rgba(148,143,174,0.14);
padding-bottom: 60px;
padding-top: 60px;
text-align: center;
}
#faq + .sub-footer h1 {
color: #1e2c46;
font-weight: 100;
line-height: 1.2;
margin-bottom: 0.5em;
}
#faq + .sub-footer dl {
text-align: left;
}
#faq + .sub-footer dl dt {
color: #e14283;
font-family: "omnes-pro", sans-serif;
font-size: 1.4em;
font-weight: 300;
}
#faq + .sub-footer dl dd {
margin-left: 0;
}
.sub-footer {
background-color: rgba(148,143,174,0.14);
padding: 40px 0 20px 0;
margin: 0;
}
.sub-footer h3 {
color: #e14283;
font-size: 1em;
font-weight: 300;
}
.sub-footer p {
color: rgba(30,34,59,0.5);
font-size: 1em;
}
#support + .sub-footer p {
font-size: 0.8em;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment