diff --git a/compare-locales/panel.xml b/compare-locales/panel.xml
new file mode 100644
index 0000000..40e6366
--- /dev/null
+++ b/compare-locales/panel.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/compare_locales.js b/compare_locales.js
new file mode 100644
index 0000000..6f0beaf
--- /dev/null
+++ b/compare_locales.js
@@ -0,0 +1,254 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+define(function(require, exports, module) {
+ "use strict";
+ main.consumes = ["Panel", "Form", "Datagrid",
+ "c9", "fs", "layout", "proc", "settings", "tabManager", "ui", "vfs"];
+ main.provides = ["moz_compare_locales"];
+ return main;
+
+ function main(options, imports, register) {
+ var Panel = imports.Panel;
+ var Datagrid = imports.Datagrid;
+ var Form = imports.Form;
+ var c9 = imports.c9;
+ var layout = imports.layout;
+ var proc = imports.proc;
+ var settings = imports.settings;
+ var tabs = imports.tabManager;
+ var ui = imports.ui;
+ var vfs = imports.vfs;
+ var fs = imports.fs;
+ var panelIndex = options.index || 250;
+
+ var markup = require('text!./compare-locales/panel.xml');
+ var configs;
+
+ /***** Initialization *****/
+
+ settings.on("read", function(){
+ /* settings.setJson("project/moz.compare.locales", [
+ {
+ "l10n": ".",
+ "locales": ["de"],
+ "l10nini": ["mozilla-aurora", "browser/locales/l10n.ini"]
+ }
+ ]); */
+ configs = settings.getJson("project/moz_compare_locales");
+ compare();
+ }, plugin);
+
+ var plugin = new Panel("mozilla.org", main.consumes, {
+ index: panelIndex,
+ caption: "Compare"
+ });
+ var emit = plugin.getEmitter();
+ var container, tree;
+
+ function load() {
+ console.log('compare-locales loaded');
+ fs.on('afterWriteFile', onDiskChange);
+ fs.on('afterRmfile', onDiskChange);
+ layout.on('resize', function() {
+ tree && tree.resize();
+ });
+ }
+
+ function onDiskChange(event) {
+ console.log('afterWriteFile or afterRmfile', event);
+ if (!configs || !tree) return;
+ var p = event.path;
+ var do_run = configs.some(function(c) {
+ if (p.indexOf('/' + c.l10nini[0]) == 0) {
+ return true;
+ }
+ var l10nbase = '/';
+ if (c.l10n !== '.') {
+ l10nbase += c.l10n + '/';
+ }
+ return c.locales.some(function(loc) {
+ return p.indexOf(l10nbase + loc) == 0;
+ });
+ });
+ if (do_run) {
+ compare();
+ }
+ }
+
+ function compare() {
+ if (!configs || !tree) return;
+ proc.execFile("compare-locales", {
+ args: [
+ '--data=json',
+ configs[0].l10nini.join('/'),
+ configs[0].l10n,
+ configs[0].locales[0]
+ ],
+ cwd: c9.workspaceDir,
+ stdoutEncoding: 'utf8',
+ stderrEncoding: 'utf8'
+ }, function(err, stdout, stderr) {
+ if (err) return console.error(err);
+ var data = JSON.parse(stdout);
+ var root = {
+ label: configs[0].l10n,
+ isOpen: true,
+ items: []
+ };
+ function fillChildren(children, node) {
+ if (!children || !children.length) return;
+ node.items = [];
+ children.forEach(function(childtpl) {
+ var label = childtpl[0];
+ var details = childtpl[1];
+ var child = {
+ label: label,
+ isOpen: true
+ };
+ if (details.value) {
+ child.details = details.value;
+ if (details.value.missingEntity) {
+ child.missing = details.value.missingEntity.length;
+ }
+ if (details.value.warning) {
+ child.warnings = details.value.warning.length;
+ }
+ if (details.value.error) {
+ child.errors = details.value.error.length;
+ }
+ if (details.value.missingFile) {
+ child.missingFile = true;
+ child.missing = details.value.strings;
+ }
+ if (details.value.obsoleteEntity) {
+ child.obsolete = details.value.obsoleteEntity.length;
+ }
+ if (details.value.obsoleteFile) {
+ child.obsoleteFile = true;
+ }
+ }
+ if (details.children) {
+ fillChildren(details.children, child);
+ }
+ node.items.push(child);
+ });
+ }
+ fillChildren(data.details.children, root);
+ tree.setRoot(root);
+ });
+ }
+
+ /***** Methods *****/
+
+
+ plugin.on("draw", function(e){
+ // Insert css
+ ui.insertCss(require('text!./style/compare.less'), options.staticPrefix, plugin);
+ ui.insertCss(require('text!./style/open-iconic.less'), options.staticPrefix, plugin);
+ // Insert markup
+ ui.insertMarkup(e.aml, markup, plugin);
+ container = plugin.getElement("container");
+
+ tree = new Datagrid({
+ container: container.$int,
+
+ columns : [
+ {
+ caption: "Path",
+ value: "name",
+ defaultValue: "Scope",
+ width: "100%",
+ type: "tree"
+ },
+ {
+ caption: "-",
+ getText: function(node) {
+ return node.missing || '';
+ },
+ width: "25",
+ },
+ {
+ caption: "?",
+ getText: function(node) {
+ return node.obsolete || '';
+ },
+ width: "25",
+ }
+ ],
+
+ getIconHTML: function(node) {
+ var h = '';
+ if (node.items && node.items.length) {
+ // TODO:
+ // h += ''
+ }
+ if (node.missingFile) {
+ h += '';
+ }
+ if (node.obsoleteFile) {
+ h += '';
+ }
+ if (node.errors) {
+ h += '';
+ }
+ if (node.warnings) {
+ h += '';
+ }
+ return h;
+ }
+ }, plugin);
+ tree.on('afterChoose', function(e, some) {
+ var nodes = tree.selection.getSelectedNodes();
+ var active = tree.selection.getCursor();
+ var panes = tabs.getPanes();
+ var l10n_pane = panes[0];
+ var en_US_pane = panes[1];
+ nodes.forEach(function(node) {
+ var path = node.label;
+ var parent = node.parent;
+ while (parent) {
+ path = parent.label + '/' + path;
+ parent = parent.parent;
+ }
+ if (!node.missingFile) {
+ return tabs.openFile(path, node === active);
+ }
+ // now it's getting async, we need to create the file first
+ // first, we might need the dir
+ var dir = path.substring(0, path.lastIndexOf('/'));
+ fs.mkdirP(dir, function(err) {
+ console.log('mkdirP', err);
+ fs.writeFile(path, '', function(err) {
+ console.log('writeFile', err);
+ tabs.openFile(path, node === active);
+ });
+ });
+ });
+ });
+ compare();
+ });
+
+ /***** Lifecycle *****/
+
+ plugin.on("load", function() {
+ load();
+ });
+ plugin.on("unload", function() {
+ tree = container = null;
+ configs = null;
+ });
+
+ /***** Register and define API *****/
+
+ plugin.freezePublicAPI({
+ get configs() { return configs; },
+ get tree() { return tree; }
+ });
+
+ register(null, {
+ "moz_compare_locales": plugin
+ });
+ }
+});
diff --git a/fonts/open-iconic.eot b/fonts/open-iconic.eot
new file mode 100644
index 0000000..f98177d
Binary files /dev/null and b/fonts/open-iconic.eot differ
diff --git a/fonts/open-iconic.otf b/fonts/open-iconic.otf
new file mode 100644
index 0000000..f6bd684
Binary files /dev/null and b/fonts/open-iconic.otf differ
diff --git a/fonts/open-iconic.svg b/fonts/open-iconic.svg
new file mode 100644
index 0000000..32b2c4e
--- /dev/null
+++ b/fonts/open-iconic.svg
@@ -0,0 +1,543 @@
+
+
+
+
diff --git a/fonts/open-iconic.ttf b/fonts/open-iconic.ttf
new file mode 100644
index 0000000..fab6048
Binary files /dev/null and b/fonts/open-iconic.ttf differ
diff --git a/fonts/open-iconic.woff b/fonts/open-iconic.woff
new file mode 100644
index 0000000..f930998
Binary files /dev/null and b/fonts/open-iconic.woff differ
diff --git a/package.json b/package.json
index 1369306..54e0a96 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,8 @@
"url": "https://github.com/aisle-moz/moz.aisle"
},
"plugins": {
- "plugin": {}
+ "plugin": {},
+ "compare_locales": {}
},
"categories": [
"miscellaneous"
diff --git a/style/compare.less b/style/compare.less
new file mode 100644
index 0000000..f2eeba9
--- /dev/null
+++ b/style/compare.less
@@ -0,0 +1,21 @@
+.moz-cl .cl-tree-icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+}
+
+.cl-tree-add {
+ color: rgba(0, 111, 255, 0.7);
+}
+
+.cl-tree-obsolete {
+ color: rgba(0, 0, 0, 0.5);
+}
+
+.cl-tree-error {
+ color: red;
+}
+
+.cl-tree-warning {
+ color: orange;
+}
diff --git a/style/open-iconic.less b/style/open-iconic.less
new file mode 100644
index 0000000..002c973
--- /dev/null
+++ b/style/open-iconic.less
@@ -0,0 +1,962 @@
+@iconic-font-path: '@{base-path}/fonts/';
+
+@font-face {
+ font-family: 'Icons';
+ src: url('@{iconic-font-path}open-iconic.eot');
+ src: url('@{iconic-font-path}open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('@{iconic-font-path}open-iconic.woff') format('woff'), url('@{iconic-font-path}open-iconic.ttf') format('truetype'), url('@{iconic-font-path}open-iconic.otf') format('opentype'), url('@{iconic-font-path}open-iconic.svg#iconic-sm') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+.oi[data-glyph].oi-text-replace {
+ font-size: 0;
+ line-height: 0;
+}
+
+.oi[data-glyph].oi-text-replace:before {
+ width: 1em;
+ text-align: center;
+}
+
+.oi[data-glyph] {
+ &:before {
+ position: relative;
+ top: 1px;
+ font-family: 'Icons';
+ display: inline-block;
+ speak: none;
+ line-height: 1;
+ vertical-align: baseline;
+ font-weight: normal;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ }
+
+ &:empty:before {
+ width: 1em;
+ text-align: center;
+ box-sizing: content-box;
+ }
+
+ &.oi-align-left:before {
+ text-align: left;
+ }
+ &.oi-align-right:before {
+ text-align: right;
+ }
+ &.oi-align-center:before {
+ text-align: center;
+ }
+
+ &.oi-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+ }
+
+ &.oi-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(1, -1);
+ }
+
+ &.oi-flip-horizontal-vertical:before {
+ -webkit-transform: scale(-1, -1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, -1);
+ }
+}
+
+
+.oi[data-glyph=account-login]:before {
+ content: '\e000';
+}
+
+.oi[data-glyph=account-logout]:before {
+ content: '\e001';
+}
+
+.oi[data-glyph=action-redo]:before {
+ content: '\e002';
+}
+
+.oi[data-glyph=action-undo]:before {
+ content: '\e003';
+}
+
+.oi[data-glyph=align-center]:before {
+ content: '\e004';
+}
+
+.oi[data-glyph=align-left]:before {
+ content: '\e005';
+}
+
+.oi[data-glyph=align-right]:before {
+ content: '\e006';
+}
+
+.oi[data-glyph=aperture]:before {
+ content: '\e007';
+}
+
+.oi[data-glyph=arrow-bottom]:before {
+ content: '\e008';
+}
+
+.oi[data-glyph=arrow-circle-bottom]:before {
+ content: '\e009';
+}
+
+.oi[data-glyph=arrow-circle-left]:before {
+ content: '\e00a';
+}
+
+.oi[data-glyph=arrow-circle-right]:before {
+ content: '\e00b';
+}
+
+.oi[data-glyph=arrow-circle-top]:before {
+ content: '\e00c';
+}
+
+.oi[data-glyph=arrow-left]:before {
+ content: '\e00d';
+}
+
+.oi[data-glyph=arrow-right]:before {
+ content: '\e00e';
+}
+
+.oi[data-glyph=arrow-thick-bottom]:before {
+ content: '\e00f';
+}
+
+.oi[data-glyph=arrow-thick-left]:before {
+ content: '\e010';
+}
+
+.oi[data-glyph=arrow-thick-right]:before {
+ content: '\e011';
+}
+
+.oi[data-glyph=arrow-thick-top]:before {
+ content: '\e012';
+}
+
+.oi[data-glyph=arrow-top]:before {
+ content: '\e013';
+}
+
+.oi[data-glyph=audio-spectrum]:before {
+ content: '\e014';
+}
+
+.oi[data-glyph=audio]:before {
+ content: '\e015';
+}
+
+.oi[data-glyph=badge]:before {
+ content: '\e016';
+}
+
+.oi[data-glyph=ban]:before {
+ content: '\e017';
+}
+
+.oi[data-glyph=bar-chart]:before {
+ content: '\e018';
+}
+
+.oi[data-glyph=basket]:before {
+ content: '\e019';
+}
+
+.oi[data-glyph=battery-empty]:before {
+ content: '\e01a';
+}
+
+.oi[data-glyph=battery-full]:before {
+ content: '\e01b';
+}
+
+.oi[data-glyph=beaker]:before {
+ content: '\e01c';
+}
+
+.oi[data-glyph=bell]:before {
+ content: '\e01d';
+}
+
+.oi[data-glyph=bluetooth]:before {
+ content: '\e01e';
+}
+
+.oi[data-glyph=bold]:before {
+ content: '\e01f';
+}
+
+.oi[data-glyph=bolt]:before {
+ content: '\e020';
+}
+
+.oi[data-glyph=book]:before {
+ content: '\e021';
+}
+
+.oi[data-glyph=bookmark]:before {
+ content: '\e022';
+}
+
+.oi[data-glyph=box]:before {
+ content: '\e023';
+}
+
+.oi[data-glyph=briefcase]:before {
+ content: '\e024';
+}
+
+.oi[data-glyph=british-pound]:before {
+ content: '\e025';
+}
+
+.oi[data-glyph=browser]:before {
+ content: '\e026';
+}
+
+.oi[data-glyph=brush]:before {
+ content: '\e027';
+}
+
+.oi[data-glyph=bug]:before {
+ content: '\e028';
+}
+
+.oi[data-glyph=bullhorn]:before {
+ content: '\e029';
+}
+
+.oi[data-glyph=calculator]:before {
+ content: '\e02a';
+}
+
+.oi[data-glyph=calendar]:before {
+ content: '\e02b';
+}
+
+.oi[data-glyph=camera-slr]:before {
+ content: '\e02c';
+}
+
+.oi[data-glyph=caret-bottom]:before {
+ content: '\e02d';
+}
+
+.oi[data-glyph=caret-left]:before {
+ content: '\e02e';
+}
+
+.oi[data-glyph=caret-right]:before {
+ content: '\e02f';
+}
+
+.oi[data-glyph=caret-top]:before {
+ content: '\e030';
+}
+
+.oi[data-glyph=cart]:before {
+ content: '\e031';
+}
+
+.oi[data-glyph=chat]:before {
+ content: '\e032';
+}
+
+.oi[data-glyph=check]:before {
+ content: '\e033';
+}
+
+.oi[data-glyph=chevron-bottom]:before {
+ content: '\e034';
+}
+
+.oi[data-glyph=chevron-left]:before {
+ content: '\e035';
+}
+
+.oi[data-glyph=chevron-right]:before {
+ content: '\e036';
+}
+
+.oi[data-glyph=chevron-top]:before {
+ content: '\e037';
+}
+
+.oi[data-glyph=circle-check]:before {
+ content: '\e038';
+}
+
+.oi[data-glyph=circle-x]:before {
+ content: '\e039';
+}
+
+.oi[data-glyph=clipboard]:before {
+ content: '\e03a';
+}
+
+.oi[data-glyph=clock]:before {
+ content: '\e03b';
+}
+
+.oi[data-glyph=cloud-download]:before {
+ content: '\e03c';
+}
+
+.oi[data-glyph=cloud-upload]:before {
+ content: '\e03d';
+}
+
+.oi[data-glyph=cloud]:before {
+ content: '\e03e';
+}
+
+.oi[data-glyph=cloudy]:before {
+ content: '\e03f';
+}
+
+.oi[data-glyph=code]:before {
+ content: '\e040';
+}
+
+.oi[data-glyph=cog]:before {
+ content: '\e041';
+}
+
+.oi[data-glyph=collapse-down]:before {
+ content: '\e042';
+}
+
+.oi[data-glyph=collapse-left]:before {
+ content: '\e043';
+}
+
+.oi[data-glyph=collapse-right]:before {
+ content: '\e044';
+}
+
+.oi[data-glyph=collapse-up]:before {
+ content: '\e045';
+}
+
+.oi[data-glyph=command]:before {
+ content: '\e046';
+}
+
+.oi[data-glyph=comment-square]:before {
+ content: '\e047';
+}
+
+.oi[data-glyph=compass]:before {
+ content: '\e048';
+}
+
+.oi[data-glyph=contrast]:before {
+ content: '\e049';
+}
+
+.oi[data-glyph=copywriting]:before {
+ content: '\e04a';
+}
+
+.oi[data-glyph=credit-card]:before {
+ content: '\e04b';
+}
+
+.oi[data-glyph=crop]:before {
+ content: '\e04c';
+}
+
+.oi[data-glyph=dashboard]:before {
+ content: '\e04d';
+}
+
+.oi[data-glyph=data-transfer-download]:before {
+ content: '\e04e';
+}
+
+.oi[data-glyph=data-transfer-upload]:before {
+ content: '\e04f';
+}
+
+.oi[data-glyph=delete]:before {
+ content: '\e050';
+}
+
+.oi[data-glyph=dial]:before {
+ content: '\e051';
+}
+
+.oi[data-glyph=document]:before {
+ content: '\e052';
+}
+
+.oi[data-glyph=dollar]:before {
+ content: '\e053';
+}
+
+.oi[data-glyph=double-quote-sans-left]:before {
+ content: '\e054';
+}
+
+.oi[data-glyph=double-quote-sans-right]:before {
+ content: '\e055';
+}
+
+.oi[data-glyph=double-quote-serif-left]:before {
+ content: '\e056';
+}
+
+.oi[data-glyph=double-quote-serif-right]:before {
+ content: '\e057';
+}
+
+.oi[data-glyph=droplet]:before {
+ content: '\e058';
+}
+
+.oi[data-glyph=eject]:before {
+ content: '\e059';
+}
+
+.oi[data-glyph=elevator]:before {
+ content: '\e05a';
+}
+
+.oi[data-glyph=ellipses]:before {
+ content: '\e05b';
+}
+
+.oi[data-glyph=envelope-closed]:before {
+ content: '\e05c';
+}
+
+.oi[data-glyph=envelope-open]:before {
+ content: '\e05d';
+}
+
+.oi[data-glyph=euro]:before {
+ content: '\e05e';
+}
+
+.oi[data-glyph=excerpt]:before {
+ content: '\e05f';
+}
+
+.oi[data-glyph=expand-down]:before {
+ content: '\e060';
+}
+
+.oi[data-glyph=expand-left]:before {
+ content: '\e061';
+}
+
+.oi[data-glyph=expand-right]:before {
+ content: '\e062';
+}
+
+.oi[data-glyph=expand-up]:before {
+ content: '\e063';
+}
+
+.oi[data-glyph=external-link]:before {
+ content: '\e064';
+}
+
+.oi[data-glyph=eye]:before {
+ content: '\e065';
+}
+
+.oi[data-glyph=eyedropper]:before {
+ content: '\e066';
+}
+
+.oi[data-glyph=file]:before {
+ content: '\e067';
+}
+
+.oi[data-glyph=fire]:before {
+ content: '\e068';
+}
+
+.oi[data-glyph=flag]:before {
+ content: '\e069';
+}
+
+.oi[data-glyph=flash]:before {
+ content: '\e06a';
+}
+
+.oi[data-glyph=folder]:before {
+ content: '\e06b';
+}
+
+.oi[data-glyph=fork]:before {
+ content: '\e06c';
+}
+
+.oi[data-glyph=fullscreen-enter]:before {
+ content: '\e06d';
+}
+
+.oi[data-glyph=fullscreen-exit]:before {
+ content: '\e06e';
+}
+
+.oi[data-glyph=globe]:before {
+ content: '\e06f';
+}
+
+.oi[data-glyph=graph]:before {
+ content: '\e070';
+}
+
+.oi[data-glyph=grid-four-up]:before {
+ content: '\e071';
+}
+
+.oi[data-glyph=grid-three-up]:before {
+ content: '\e072';
+}
+
+.oi[data-glyph=grid-two-up]:before {
+ content: '\e073';
+}
+
+.oi[data-glyph=hard-drive]:before {
+ content: '\e074';
+}
+
+.oi[data-glyph=header]:before {
+ content: '\e075';
+}
+
+.oi[data-glyph=headphones]:before {
+ content: '\e076';
+}
+
+.oi[data-glyph=heart]:before {
+ content: '\e077';
+}
+
+.oi[data-glyph=home]:before {
+ content: '\e078';
+}
+
+.oi[data-glyph=image]:before {
+ content: '\e079';
+}
+
+.oi[data-glyph=inbox]:before {
+ content: '\e07a';
+}
+
+.oi[data-glyph=infinity]:before {
+ content: '\e07b';
+}
+
+.oi[data-glyph=info]:before {
+ content: '\e07c';
+}
+
+.oi[data-glyph=italic]:before {
+ content: '\e07d';
+}
+
+.oi[data-glyph=justify-center]:before {
+ content: '\e07e';
+}
+
+.oi[data-glyph=justify-left]:before {
+ content: '\e07f';
+}
+
+.oi[data-glyph=justify-right]:before {
+ content: '\e080';
+}
+
+.oi[data-glyph=key]:before {
+ content: '\e081';
+}
+
+.oi[data-glyph=laptop]:before {
+ content: '\e082';
+}
+
+.oi[data-glyph=layers]:before {
+ content: '\e083';
+}
+
+.oi[data-glyph=lightbulb]:before {
+ content: '\e084';
+}
+
+.oi[data-glyph=link-broken]:before {
+ content: '\e085';
+}
+
+.oi[data-glyph=link-intact]:before {
+ content: '\e086';
+}
+
+.oi[data-glyph=list-rich]:before {
+ content: '\e087';
+}
+
+.oi[data-glyph=list]:before {
+ content: '\e088';
+}
+
+.oi[data-glyph=location]:before {
+ content: '\e089';
+}
+
+.oi[data-glyph=lock-locked]:before {
+ content: '\e08a';
+}
+
+.oi[data-glyph=lock-unlocked]:before {
+ content: '\e08b';
+}
+
+.oi[data-glyph=loop-circular]:before {
+ content: '\e08c';
+}
+
+.oi[data-glyph=loop-square]:before {
+ content: '\e08d';
+}
+
+.oi[data-glyph=loop]:before {
+ content: '\e08e';
+}
+
+.oi[data-glyph=magnifying-glass]:before {
+ content: '\e08f';
+}
+
+.oi[data-glyph=map-marker]:before {
+ content: '\e090';
+}
+
+.oi[data-glyph=map]:before {
+ content: '\e091';
+}
+
+.oi[data-glyph=media-pause]:before {
+ content: '\e092';
+}
+
+.oi[data-glyph=media-play]:before {
+ content: '\e093';
+}
+
+.oi[data-glyph=media-record]:before {
+ content: '\e094';
+}
+
+.oi[data-glyph=media-skip-backward]:before {
+ content: '\e095';
+}
+
+.oi[data-glyph=media-skip-forward]:before {
+ content: '\e096';
+}
+
+.oi[data-glyph=media-step-backward]:before {
+ content: '\e097';
+}
+
+.oi[data-glyph=media-step-forward]:before {
+ content: '\e098';
+}
+
+.oi[data-glyph=media-stop]:before {
+ content: '\e099';
+}
+
+.oi[data-glyph=medical-cross]:before {
+ content: '\e09a';
+}
+
+.oi[data-glyph=menu]:before {
+ content: '\e09b';
+}
+
+.oi[data-glyph=microphone]:before {
+ content: '\e09c';
+}
+
+.oi[data-glyph=minus]:before {
+ content: '\e09d';
+}
+
+.oi[data-glyph=monitor]:before {
+ content: '\e09e';
+}
+
+.oi[data-glyph=moon]:before {
+ content: '\e09f';
+}
+
+.oi[data-glyph=move]:before {
+ content: '\e0a0';
+}
+
+.oi[data-glyph=musical-note]:before {
+ content: '\e0a1';
+}
+
+.oi[data-glyph=paperclip]:before {
+ content: '\e0a2';
+}
+
+.oi[data-glyph=pencil]:before {
+ content: '\e0a3';
+}
+
+.oi[data-glyph=people]:before {
+ content: '\e0a4';
+}
+
+.oi[data-glyph=person]:before {
+ content: '\e0a5';
+}
+
+.oi[data-glyph=phone]:before {
+ content: '\e0a6';
+}
+
+.oi[data-glyph=pie-chart]:before {
+ content: '\e0a7';
+}
+
+.oi[data-glyph=pin]:before {
+ content: '\e0a8';
+}
+
+.oi[data-glyph=play-circle]:before {
+ content: '\e0a9';
+}
+
+.oi[data-glyph=plus]:before {
+ content: '\e0aa';
+}
+
+.oi[data-glyph=power-standby]:before {
+ content: '\e0ab';
+}
+
+.oi[data-glyph=print]:before {
+ content: '\e0ac';
+}
+
+.oi[data-glyph=project]:before {
+ content: '\e0ad';
+}
+
+.oi[data-glyph=pulse]:before {
+ content: '\e0ae';
+}
+
+.oi[data-glyph=puzzle-piece]:before {
+ content: '\e0af';
+}
+
+.oi[data-glyph=question-mark]:before {
+ content: '\e0b0';
+}
+
+.oi[data-glyph=rain]:before {
+ content: '\e0b1';
+}
+
+.oi[data-glyph=random]:before {
+ content: '\e0b2';
+}
+
+.oi[data-glyph=reload]:before {
+ content: '\e0b3';
+}
+
+.oi[data-glyph=resize-both]:before {
+ content: '\e0b4';
+}
+
+.oi[data-glyph=resize-height]:before {
+ content: '\e0b5';
+}
+
+.oi[data-glyph=resize-width]:before {
+ content: '\e0b6';
+}
+
+.oi[data-glyph=rss-alt]:before {
+ content: '\e0b7';
+}
+
+.oi[data-glyph=rss]:before {
+ content: '\e0b8';
+}
+
+.oi[data-glyph=script]:before {
+ content: '\e0b9';
+}
+
+.oi[data-glyph=share-boxed]:before {
+ content: '\e0ba';
+}
+
+.oi[data-glyph=share]:before {
+ content: '\e0bb';
+}
+
+.oi[data-glyph=shield]:before {
+ content: '\e0bc';
+}
+
+.oi[data-glyph=signal]:before {
+ content: '\e0bd';
+}
+
+.oi[data-glyph=signpost]:before {
+ content: '\e0be';
+}
+
+.oi[data-glyph=sort-ascending]:before {
+ content: '\e0bf';
+}
+
+.oi[data-glyph=sort-descending]:before {
+ content: '\e0c0';
+}
+
+.oi[data-glyph=spreadsheet]:before {
+ content: '\e0c1';
+}
+
+.oi[data-glyph=star]:before {
+ content: '\e0c2';
+}
+
+.oi[data-glyph=sun]:before {
+ content: '\e0c3';
+}
+
+.oi[data-glyph=tablet]:before {
+ content: '\e0c4';
+}
+
+.oi[data-glyph=tag]:before {
+ content: '\e0c5';
+}
+
+.oi[data-glyph=tags]:before {
+ content: '\e0c6';
+}
+
+.oi[data-glyph=target]:before {
+ content: '\e0c7';
+}
+
+.oi[data-glyph=task]:before {
+ content: '\e0c8';
+}
+
+.oi[data-glyph=terminal]:before {
+ content: '\e0c9';
+}
+
+.oi[data-glyph=text]:before {
+ content: '\e0ca';
+}
+
+.oi[data-glyph=thumb-down]:before {
+ content: '\e0cb';
+}
+
+.oi[data-glyph=thumb-up]:before {
+ content: '\e0cc';
+}
+
+.oi[data-glyph=timer]:before {
+ content: '\e0cd';
+}
+
+.oi[data-glyph=transfer]:before {
+ content: '\e0ce';
+}
+
+.oi[data-glyph=trash]:before {
+ content: '\e0cf';
+}
+
+.oi[data-glyph=underline]:before {
+ content: '\e0d0';
+}
+
+.oi[data-glyph=vertical-align-bottom]:before {
+ content: '\e0d1';
+}
+
+.oi[data-glyph=vertical-align-center]:before {
+ content: '\e0d2';
+}
+
+.oi[data-glyph=vertical-align-top]:before {
+ content: '\e0d3';
+}
+
+.oi[data-glyph=video]:before {
+ content: '\e0d4';
+}
+
+.oi[data-glyph=volume-high]:before {
+ content: '\e0d5';
+}
+
+.oi[data-glyph=volume-low]:before {
+ content: '\e0d6';
+}
+
+.oi[data-glyph=volume-off]:before {
+ content: '\e0d7';
+}
+
+.oi[data-glyph=warning]:before {
+ content: '\e0d8';
+}
+
+.oi[data-glyph=wifi]:before {
+ content: '\e0d9';
+}
+
+.oi[data-glyph=wrench]:before {
+ content: '\e0da';
+}
+
+.oi[data-glyph=x]:before {
+ content: '\e0db';
+}
+
+.oi[data-glyph=yen]:before {
+ content: '\e0dc';
+}
+
+.oi[data-glyph=zoom-in]:before {
+ content: '\e0dd';
+}
+
+.oi[data-glyph=zoom-out]:before {
+ content: '\e0de';
+}