diff --git a/.gitignore b/.gitignore
index 4805622..a434b5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,19 @@ __pycache__/
# Django stuff:
*.log
local_settings.py
+conf.py
+source/fixtures
+source/media
# Sphinx documentation
-docs/_build/
+docs/
+*.ods
+*.xlsx
+
+credenciales.conf
+*.sqlite
+*.sql
+rfc.db
+configpac.py
+
+
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..1afd3ec
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,9 @@
+falcon
+falcon-multipart
+Beaker
+Mako
+peewee
+click
+logbook
+bcrypt
+python-dateutil
diff --git a/source/app/conf.py.example b/source/app/conf.py.example
new file mode 100644
index 0000000..1f8e28d
--- /dev/null
+++ b/source/app/conf.py.example
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+from peewee import SqliteDatabase
+
+
+DEBUG = True
+ID_SUPPORT = ''
+
+DATABASE = None
+if DEBUG:
+ DATABASE = SqliteDatabase('empresalibre.sqlite')
diff --git a/source/app/controllers/__init__.py b/source/app/controllers/__init__.py
new file mode 100644
index 0000000..cf529d7
--- /dev/null
+++ b/source/app/controllers/__init__.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python
+
diff --git a/source/app/controllers/cfdi_xml.py b/source/app/controllers/cfdi_xml.py
new file mode 100644
index 0000000..6cef536
--- /dev/null
+++ b/source/app/controllers/cfdi_xml.py
@@ -0,0 +1,308 @@
+#!/usr/bin/env python
+
+import datetime
+from xml.etree import ElementTree as ET
+from xml.dom.minidom import parseString
+
+from logbook import Logger
+
+#~ from settings import DEBUG
+
+
+log = Logger('XML')
+CFDI_ACTUAL = 'cfdi33'
+NOMINA_ACTUAL = 'nomina12'
+
+SAT = {
+ 'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+ 'cfdi32': {
+ 'version': '3.2',
+ 'prefix': 'cfdi',
+ 'xmlns': 'http://www.sat.gob.mx/cfd/3',
+ 'schema': 'http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd',
+ },
+ 'cfdi33': {
+ 'version': '3.3',
+ 'prefix': 'cfdi',
+ 'xmlns': 'http://www.sat.gob.mx/cfd/3',
+ 'schema': 'http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd',
+ },
+ 'nomina11': {
+ 'version': '1.1',
+ 'prefix': 'nomina',
+ 'xmlns': 'http://www.sat.gob.mx/nomina',
+ 'schema': 'http://www.sat.gob.mx/nomina http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina11.xsd',
+ },
+ 'nomina12': {
+ 'version': '1.2',
+ 'prefix': 'nomina',
+ 'xmlns': 'http://www.sat.gob.mx/nomina12',
+ 'schema': 'http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd',
+ },
+}
+
+
+class CFDI(object):
+
+ def __init__(self, version=CFDI_ACTUAL):
+ self._sat_cfdi = SAT[version]
+ self._xsi = SAT['xsi']
+ self._pre = self._sat_cfdi['prefix']
+ self._cfdi = None
+ self.error = ''
+
+ def _now(self):
+ return datetime.datetime.now().isoformat()[:19]
+
+ def get_xml(self, datos):
+ if not self._validate(datos):
+ return ''
+
+ self._comprobante(datos['comprobante'])
+ self._emisor(datos['emisor'])
+ self._receptor(datos['receptor'])
+ self._conceptos(datos['conceptos'])
+ self._impuestos(datos['impuestos'])
+ if 'nomina' in datos:
+ self._nomina(datos['nomina'])
+ if 'complementos' in datos:
+ self._complementos(datos['complementos'])
+ return self._to_pretty_xml(ET.tostring(self._cfdi, encoding='utf-8'))
+
+ def add_sello(self, sello):
+ self._cfdi.attrib['Sello'] = sello
+ return self._to_pretty_xml(ET.tostring(self._cfdi, encoding='utf-8'))
+
+ def _to_pretty_xml(self, source):
+ tree = parseString(source)
+ xml = tree.toprettyxml(encoding='utf-8').decode('utf-8')
+ return xml
+
+ def _validate(self, datos):
+ if 'nomina' in datos:
+ return self._validate_nomina(datos)
+ return True
+
+ def _validate_nomina(self, datos):
+ comprobante = datos['comprobante']
+
+ validators = (
+ ('MetodoDePago', 'NA'),
+ ('TipoCambio', '1'),
+ ('Moneda', 'MXN'),
+ ('TipoDeComprobante', 'egreso'),
+ )
+ for f, v in validators:
+ if f in comprobante:
+ if v != comprobante[f]:
+ msg = 'El atributo: {}, debe ser: {}'.format(f, v)
+ self.error = msg
+ return False
+ return True
+
+ def _comprobante(self, datos):
+ attributes = {}
+ attributes['xmlns:{}'.format(self._pre)] = self._sat_cfdi['xmlns']
+ attributes['xmlns:xsi'] = self._xsi
+ attributes['xsi:schemaLocation'] = self._sat_cfdi['schema']
+ attributes.update(datos)
+
+ #~ if DEBUG:
+ #~ attributes['Fecha'] = self._now()
+ #~ attributes['NoCertificado'] = CERT_NUM
+
+ if not 'Version' in attributes:
+ attributes['Version'] = self._sat_cfdi['version']
+ if not 'Fecha' in attributes:
+ attributes['Fecha'] = self._now()
+
+ self._cfdi = ET.Element('{}:Comprobante'.format(self._pre), attributes)
+ return
+
+ def _emisor(self, datos):
+ #~ if DEBUG:
+ #~ datos['Rfc'] = RFC_TEST
+
+ node_name = '{}:Emisor'.format(self._pre)
+ emisor = ET.SubElement(self._cfdi, node_name, datos)
+ return
+
+ def _receptor(self, datos):
+ node_name = '{}:Receptor'.format(self._pre)
+ emisor = ET.SubElement(self._cfdi, node_name, datos)
+ return
+
+ def _conceptos(self, datos):
+ conceptos = ET.SubElement(self._cfdi, '{}:Conceptos'.format(self._pre))
+ for row in datos:
+ complemento = {}
+ if 'complemento' in row:
+ complemento = row.pop('complemento')
+
+ taxes = {}
+ if 'impuestos' in row:
+ taxes = row.pop('impuestos')
+ node_name = '{}:Concepto'.format(self._pre)
+ concepto = ET.SubElement(conceptos, node_name, row)
+
+ if taxes:
+ node_name = '{}:Impuestos'.format(self._pre)
+ impuestos = ET.SubElement(concepto, node_name)
+ if 'traslados' in taxes and taxes['traslados']:
+ node_name = '{}:Traslados'.format(self._pre)
+ traslados = ET.SubElement(impuestos, node_name)
+ for traslado in taxes['traslados']:
+ ET.SubElement(
+ traslados, '{}:Traslado'.format(self._pre), traslado)
+ if 'retenciones' in taxes and taxes['retenciones']:
+ node_name = '{}:Retenciones'.format(self._pre)
+ retenciones = ET.SubElement(impuestos, node_name)
+ for retencion in taxes['retenciones']:
+ ET.SubElement(
+ retenciones, '{}:Retencion'.format(self._pre), retencion)
+
+ if 'InformacionAduanera' in row:
+ for field in fields:
+ if field in row['InformacionAduanera']:
+ attributes[field] = row['InformacionAduanera'][field]
+ if attributes:
+ node_name = '{}:InformacionAduanera'.format(self._pre)
+ ET.SubElement(concepto, node_name, attributes)
+
+ if 'CuentaPredial' in row:
+ attributes = {'numero': row['CuentaPredial']}
+ node_name = '{}:CuentaPredial'.format(self._pre)
+ ET.SubElement(concepto, node_name, attributes)
+
+ if 'autRVOE' in row:
+ fields = (
+ 'version',
+ 'nombreAlumno',
+ 'CURP',
+ 'nivelEducativo',
+ 'autRVOE',
+ )
+ for field in fields:
+ if field in row['autRVOE']:
+ attributes[field] = row['autRVOE'][field]
+ node_name = '{}:ComplementoConcepto'.format(self._pre)
+ complemento = ET.SubElement(concepto, node_name)
+ ET.SubElement(complemento, 'iedu:instEducativas', attributes)
+ return
+
+ def _impuestos(self, datos):
+ if not datos:
+ node_name = '{}:Impuestos'.format(self._pre)
+ ET.SubElement(self._cfdi, node_name)
+ return
+
+ attributes = {}
+ fields = ('TotalImpuestosTrasladados', 'TotalImpuestosRetenidos')
+ for field in fields:
+ if field in datos:
+ attributes[field] = datos[field]
+ node_name = '{}:Impuestos'.format(self._pre)
+ impuestos = ET.SubElement(self._cfdi, node_name, attributes)
+
+ if 'retenciones' in datos and datos['retenciones']:
+ retenciones = ET.SubElement(impuestos, '{}:Retenciones'.format(self._pre))
+ for row in datos['retenciones']:
+ ET.SubElement(retenciones, '{}:Retencion'.format(self._pre), row)
+
+ if 'traslados' in datos and datos['traslados']:
+ traslados = ET.SubElement(impuestos, '{}:Traslados'.format(self._pre))
+ for row in datos['traslados']:
+ ET.SubElement(traslados, '{}:Traslado'.format(self._pre), row)
+ return
+
+ def _nomina(self, datos):
+ sat_nomina = SAT[NOMINA_ACTUAL]
+ pre = sat_nomina['prefix']
+ complemento = ET.SubElement(self._cfdi, '{}:Complemento'.format(self._pre))
+
+ emisor = datos.pop('Emisor', None)
+ receptor = datos.pop('Receptor', None)
+ percepciones = datos.pop('Percepciones', None)
+ deducciones = datos.pop('Deducciones', None)
+
+ attributes = {}
+ attributes['xmlns:{}'.format(pre)] = sat_nomina['xmlns']
+ attributes['xsi:schemaLocation'] = sat_nomina['schema']
+ attributes.update(datos)
+
+ if not 'Version' in attributes:
+ attributes['Version'] = sat_nomina['version']
+
+ nomina = ET.SubElement(complemento, '{}:Nomina'.format(pre), attributes)
+ if emisor:
+ ET.SubElement(nomina, '{}:Emisor'.format(pre), emisor)
+ if receptor:
+ ET.SubElement(nomina, '{}:Receptor'.format(pre), receptor)
+ if percepciones:
+ detalle = percepciones.pop('detalle', None)
+ percepciones = ET.SubElement(nomina, '{}:Percepciones'.format(pre), percepciones)
+ for row in detalle:
+ ET.SubElement(percepciones, '{}:Percepcion'.format(pre), row)
+ if deducciones:
+ detalle = deducciones.pop('detalle', None)
+ deducciones = ET.SubElement(nomina, '{}:Deducciones'.format(pre), deducciones)
+ for row in detalle:
+ ET.SubElement(deducciones, '{}:Deduccion'.format(pre), row)
+ return
+
+ def _complementos(self, datos):
+ complemento = ET.SubElement(self._cfdi, '{}:Complemento'.format(self._pre))
+ if 'ce' in datos:
+ pre = 'cce11'
+ datos = datos.pop('ce')
+ emisor = datos.pop('emisor')
+ propietario = datos.pop('propietario')
+ receptor = datos.pop('receptor')
+ destinatario = datos.pop('destinatario')
+ conceptos = datos.pop('conceptos')
+
+ attributes = {}
+ attributes['xmlns:{}'.format(pre)] = \
+ 'http://www.sat.gob.mx/ComercioExterior11'
+ attributes['xsi:schemaLocation'] = \
+ 'http://www.sat.gob.mx/ComercioExterior11 ' \
+ 'http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd'
+ attributes.update(datos)
+ ce = ET.SubElement(
+ complemento, '{}:ComercioExterior'.format(pre), attributes)
+
+ attributes = {}
+ if 'Curp' in emisor:
+ attributes = {'Curp': emisor.pop('Curp')}
+ node = ET.SubElement(ce, '{}:Emisor'.format(pre), attributes)
+ ET.SubElement(node, '{}:Domicilio'.format(pre), emisor)
+
+ if propietario:
+ ET.SubElement(ce, '{}:Propietario'.format(pre), propietario)
+
+ attributes = {}
+ if 'NumRegIdTrib' in receptor:
+ attributes = {'NumRegIdTrib': receptor.pop('NumRegIdTrib')}
+ node = ET.SubElement(ce, '{}:Receptor'.format(pre), attributes)
+ ET.SubElement(node, '{}:Domicilio'.format(pre), receptor)
+
+ attributes = {}
+ if 'NumRegIdTrib' in destinatario:
+ attributes = {'NumRegIdTrib': destinatario.pop('NumRegIdTrib')}
+ if 'Nombre' in destinatario:
+ attributes.update({'Nombre': destinatario.pop('Nombre')})
+ node = ET.SubElement(ce, '{}:Destinatario'.format(pre), attributes)
+ ET.SubElement(node, '{}:Domicilio'.format(pre), destinatario)
+
+ node = ET.SubElement(ce, '{}:Mercancias'.format(pre))
+ fields = ('Marca', 'Modelo', 'SubModelo', 'NumeroSerie')
+ for row in conceptos:
+ detalle = {}
+ for f in fields:
+ if f in row:
+ detalle[f] = row.pop(f)
+ concepto = ET.SubElement(node, '{}:Mercancia'.format(pre), row)
+ if detalle:
+ ET.SubElement(
+ concepto, '{}:DescripcionesEspecificas'.format(pre), detalle)
+ return
diff --git a/source/app/controllers/helper.py b/source/app/controllers/helper.py
new file mode 100644
index 0000000..159a6b6
--- /dev/null
+++ b/source/app/controllers/helper.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+
+import falcon
+from models.main import get_cp
+
+
+class AppPostalCode(object):
+
+ def on_get(self, req, resp):
+ values = req.params
+ req.context['result'] = get_cp(values['cp'])
+ resp.status = falcon.HTTP_200
diff --git a/source/app/controllers/main.py b/source/app/controllers/main.py
new file mode 100644
index 0000000..0041f76
--- /dev/null
+++ b/source/app/controllers/main.py
@@ -0,0 +1,213 @@
+#!/usr/bin/env python3
+
+import falcon
+from middleware import get_template
+
+
+class AppLogin(object):
+ template = 'login.html'
+
+ def __init__(self, db):
+ self._db = db
+
+ @falcon.after(get_template)
+ def on_get(self, req, resp):
+ resp.status = falcon.HTTP_200
+
+ def on_post(self, req, resp):
+ session = req.env['beaker.session']
+ values = req.params
+ result = self._db.authenticate(values)
+ if result['login']:
+ session.save()
+ session['user'] = result['user']
+ session['rfc'] = values['rfc']
+ req.context['result'] = result
+ resp.status = falcon.HTTP_200
+
+
+class AppLogout(object):
+
+ def __init__(self, db):
+ self._db = db
+
+ def on_get(self, req, resp):
+ session = req.env['beaker.session']
+ session.delete()
+ resp.status = falcon.HTTP_200
+ raise falcon.HTTPTemporaryRedirect('/')
+
+
+class AppAdmin(object):
+ template = 'admin.html'
+
+ def __init__(self, db):
+ self._db = db
+
+ @falcon.after(get_template)
+ def on_get(self, req, resp):
+ resp.status = falcon.HTTP_200
+
+
+class AppMain(object):
+ template = 'main.html'
+
+ def __init__(self, db):
+ self._db = db
+
+ @falcon.after(get_template)
+ def on_get(self, req, resp):
+ resp.status = falcon.HTTP_200
+
+
+class AppValues(object):
+
+ def __init__(self, db):
+ self._db = db
+
+ def on_get(self, req, resp, table):
+ values = req.params
+ req.context['result'] = self._db.get_values(table, values)
+ resp.status = falcon.HTTP_200
+
+ def on_post(self, req, resp, table):
+ file_object = req.get_param('upload')
+ if file_object is None:
+ session = req.env['beaker.session']
+ values = req.params
+ req.context['result'] = self._db.validate_cert(values, session)
+ else:
+ req.context['result'] = self._db.add_cert(file_object)
+ resp.status = falcon.HTTP_200
+
+
+
+class AppPartners(object):
+
+ def __init__(self, db):
+ self._db = db
+
+ def on_get(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.get_partners(values)
+ resp.status = falcon.HTTP_200
+
+ def on_post(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.partner(values)
+ resp.status = falcon.HTTP_200
+
+ def on_delete(self, req, resp):
+ values = req.params
+ if self._db.delete('partner', values['id']):
+ resp.status = falcon.HTTP_200
+ else:
+ resp.status = falcon.HTTP_204
+
+
+class AppProducts(object):
+
+ def __init__(self, db):
+ self._db = db
+
+ def on_get(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.get_products(values)
+ resp.status = falcon.HTTP_200
+
+ def on_post(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.product(values)
+ resp.status = falcon.HTTP_200
+
+ def on_delete(self, req, resp):
+ values = req.params
+ if self._db.delete('product', values['id']):
+ resp.status = falcon.HTTP_200
+ else:
+ resp.status = falcon.HTTP_204
+
+
+class AppInvoices(object):
+
+ def __init__(self, db):
+ self._db = db
+
+ def on_get(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.get_invoices(values)
+ resp.status = falcon.HTTP_200
+
+ def on_post(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.invoice(values)
+ resp.status = falcon.HTTP_200
+
+ def on_delete(self, req, resp):
+ values = req.params
+ if self._db.delete('invoice', values['id']):
+ resp.status = falcon.HTTP_200
+ else:
+ resp.status = falcon.HTTP_204
+
+
+class AppEmisor(object):
+
+ def __init__(self, db):
+ self._db = db
+
+ def on_get(self, req, resp):
+ values = req.params
+ session = req.env['beaker.session']
+ req.context['result'] = self._db.get_emisor(session['rfc'])
+ resp.status = falcon.HTTP_200
+
+ def on_post(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.emisor(values)
+ resp.status = falcon.HTTP_200
+
+ def on_delete(self, req, resp):
+ values = req.params
+ if self._db.delete('invoice', values['id']):
+ resp.status = falcon.HTTP_200
+ else:
+ resp.status = falcon.HTTP_204
+
+
+class AppFolios(object):
+
+ def __init__(self, db):
+ self._db = db
+
+ def on_get(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.get_folios()
+ resp.status = falcon.HTTP_200
+
+ def on_post(self, req, resp):
+ values = req.params
+ req.context['result'] = self._db.add_folios(values)
+ resp.status = falcon.HTTP_200
+
+ def on_delete(self, req, resp):
+ values = req.params
+ if self._db.delete('folios', values['id']):
+ resp.status = falcon.HTTP_200
+ else:
+ resp.status = falcon.HTTP_204
+
+
+class AppDocumentos(object):
+
+ def __init__(self, db):
+ self._db = db
+ #~ self._not_json = True
+
+ def on_get(self, req, resp, type_doc, id_doc):
+ req.context['result'], file_name, content_type = \
+ self._db.get_doc(type_doc, id_doc)
+ resp.append_header('Content-Disposition',
+ 'attachment; filename={}'.format(file_name))
+ resp.content_type = content_type
+ resp.status = falcon.HTTP_200
diff --git a/source/app/controllers/pac.py b/source/app/controllers/pac.py
new file mode 100644
index 0000000..49e3cc5
--- /dev/null
+++ b/source/app/controllers/pac.py
@@ -0,0 +1,609 @@
+#!/usr/bin/env python
+
+#~ import re
+#~ from xml.etree import ElementTree as ET
+#~ from requests import Request, Session, exceptions
+import datetime
+import hashlib
+import os
+import requests
+import time
+from lxml import etree
+from xml.dom.minidom import parseString
+from xml.sax.saxutils import escape, unescape
+from uuid import UUID
+
+from logbook import Logger
+from zeep import Client
+from zeep.plugins import HistoryPlugin
+from zeep.cache import SqliteCache
+from zeep.transports import Transport
+from zeep.exceptions import Fault, TransportError
+
+from .configpac import DEBUG, TIMEOUT, AUTH, URL
+
+
+log = Logger('PAC')
+#~ node = client.create_message(client.service, SERVICE, **args)
+#~ print(etree.tostring(node, pretty_print=True).decode())
+
+
+class Ecodex(object):
+
+ def __init__(self):
+ self.codes = URL['codes']
+ self.error = ''
+ self.message = ''
+ self._transport = Transport(cache=SqliteCache(), timeout=TIMEOUT)
+ self._plugins = None
+ self._history = None
+ if DEBUG:
+ self._history = HistoryPlugin()
+ self._plugins = [self._history]
+
+ def _get_token(self, rfc):
+ client = Client(URL['seguridad'],
+ transport=self._transport, plugins=self._plugins)
+ try:
+ result = client.service.ObtenerToken(rfc, self._get_epoch())
+ except Fault as e:
+ self.error = str(e)
+ log.error(self.error)
+ return ''
+
+ s = '{}|{}'.format(AUTH['ID'], result.Token)
+ return hashlib.sha1(s.encode()).hexdigest()
+
+ def _get_token_rest(self, rfc):
+ data = {
+ 'rfc': rfc,
+ 'grant_type': 'authorization_token',
+ }
+ headers = {'Content-type': 'application/x-www-form-urlencoded'}
+ result = requests.post(URL['token'], data=data, headers=headers)
+ data = result.json()
+ s = '{}|{}'.format(AUTH['ID'], data['service_token'])
+ return hashlib.sha1(s.encode()).hexdigest(), data['access_token']
+
+ def _validate_xml(self, xml):
+ NS_CFDI = {'cfdi': 'http://www.sat.gob.mx/cfd/3'}
+ if os.path.isfile(xml):
+ tree = etree.parse(xml).getroot()
+ else:
+ tree = etree.fromstring(xml.encode())
+
+ fecha = tree.get('Fecha')
+ rfc = tree.xpath('string(//cfdi:Emisor/@Rfc)', namespaces=NS_CFDI)
+ data = {
+ 'ComprobanteXML': etree.tostring(tree).decode(),
+ 'RFC': rfc,
+ 'Token': self._get_token(rfc),
+ 'TransaccionID': self._get_epoch(fecha),
+ }
+ return data
+
+ def _get_by_hash(self, sh, rfc):
+ token, access_token = self._get_token_rest(rfc)
+ url = URL['hash'].format(sh)
+ headers = {
+ 'Authorization': 'Bearer {}'.format(access_token),
+ 'X-Auth-Token': token,
+ }
+ result = requests.get(url, headers=headers)
+ if result.status_code == 200:
+ print (result.json())
+ return
+
+ def timbra_xml(self, xml):
+ data = self._validate_xml(xml)
+ client = Client(URL['timbra'],
+ transport=self._transport, plugins=self._plugins)
+ try:
+ result = client.service.TimbraXML(**data)
+ except Fault as e:
+ error = str(e)
+ if self.codes['HASH'] in error:
+ sh = error.split(' ')[3]
+ return self._get_by_hash(sh[:40], data['RFC'])
+ self.error = error
+ return ''
+
+ tree = parseString(result.ComprobanteXML.DatosXML)
+ xml = tree.toprettyxml(encoding='utf-8').decode('utf-8')
+ return xml
+
+ def _get_epoch(self, date=None):
+ if isinstance(date, str):
+ f = '%Y-%m-%dT%H:%M:%S'
+ e = int(time.mktime(time.strptime(date, f)))
+ else:
+ date = datetime.datetime.now()
+ e = int(time.mktime(date.timetuple()))
+ return e
+
+ def estatus_cuenta(self, rfc):
+ #~ Codigos:
+ #~ 100 = Cuenta encontrada
+ #~ 101 = RFC no dado de alta en el sistema ECODEX
+ token = self._get_token(rfc)
+ if not token:
+ return {}
+
+ data = {
+ 'RFC': rfc,
+ 'Token': token,
+ 'TransaccionID': self._get_epoch()
+ }
+ client = Client(URL['clients'],
+ transport=self._transport, plugins=self._plugins)
+ try:
+ result = client.service.EstatusCuenta(**data)
+ except Fault as e:
+ log.error(str(e))
+ return
+ #~ print (result)
+ return result.Estatus
+
+
+class Finkok(object):
+
+ def __init__(self):
+ self.codes = URL['codes']
+ self.error = ''
+ self.message = ''
+ self._transport = Transport(cache=SqliteCache(), timeout=TIMEOUT)
+ self._plugins = None
+ self._history = None
+ self.uuid = ''
+ self.fecha = None
+ if DEBUG:
+ self._history = HistoryPlugin()
+ self._plugins = [self._history]
+
+ def _debug(self):
+ if not DEBUG:
+ return
+ print('SEND', self._history.last_sent)
+ print('RESULT', self._history.last_received)
+ return
+
+ def _check_result(self, method, result):
+ #~ print ('CODE', result.CodEstatus)
+ #~ print ('INCIDENCIAS', result.Incidencias)
+ self.message = ''
+ MSG = {
+ 'OK': 'Comprobante timbrado satisfactoriamente',
+ '307': 'Comprobante timbrado previamente',
+ }
+ status = result.CodEstatus
+ if status is None and result.Incidencias:
+ for i in result.Incidencias['Incidencia']:
+ self.error += 'Error: {}\n{}'.format(
+ i['CodigoError'], i['MensajeIncidencia'])
+ return ''
+
+ if method == 'timbra' and status in (MSG['OK'], MSG['307']):
+ #~ print ('UUID', result.UUID)
+ #~ print ('FECHA', result.Fecha)
+ if status == MSG['307']:
+ self.message = MSG['307']
+ tree = parseString(result.xml)
+ response = tree.toprettyxml(encoding='utf-8').decode('utf-8')
+ self.uuid = result.UUID
+ self.fecha = result.Fecha
+
+ return response
+
+ def _load_file(self, path):
+ try:
+ with open(path, 'rb') as f:
+ data = f.read()
+ except Exception as e:
+ self.error = str(e)
+ return
+ return data
+
+ def _validate_xml(self, file_xml):
+ if os.path.isfile(file_xml):
+ try:
+ with open(file_xml, 'rb') as f:
+ xml = f.read()
+ except Exception as e:
+ self.error = str(e)
+ return False, ''
+ else:
+ xml = file_xml.encode('utf-8')
+ return True, xml
+
+ def _validate_uuid(self, uuid):
+ try:
+ UUID(uuid)
+ return True
+ except ValueError:
+ self.error = 'UUID no válido: {}'.format(uuid)
+ return False
+
+ def timbra_xml(self, file_xml):
+ self.error = ''
+ method = 'timbra'
+ ok, xml = self._validate_xml(file_xml)
+ if not ok:
+ return ''
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+
+ args = {
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'xml': xml,
+ }
+ if URL['quick_stamp']:
+ try:
+ result = client.service.quick_stamp(**args)
+ except Fault as e:
+ self.error = str(e)
+ return
+ else:
+ try:
+ result = client.service.stamp(**args)
+ except Fault as e:
+ self.error = str(e)
+ return
+
+ return self._check_result(method, result)
+
+ def _get_xml(self, uuid):
+ if not self._validate_uuid(uuid):
+ return ''
+
+ method = 'util'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+
+ args = {
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'uuid': uuid,
+ 'taxpayer_id': self.rfc,
+ 'invoice_type': 'I',
+ }
+ try:
+ result = client.service.get_xml(**args)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+ except TransportError as e:
+ self.error = str(e)
+ return ''
+
+ if result.error:
+ self.error = result.error
+ return ''
+
+ tree = parseString(result.xml)
+ xml = tree.toprettyxml(encoding='utf-8').decode('utf-8')
+ return xml
+
+ def recupera_xml(self, file_xml='', uuid=''):
+ self.error = ''
+ if uuid:
+ return self._get_xml(uuid)
+
+ method = 'timbra'
+ ok, xml = self._validate_xml(file_xml)
+ if not ok:
+ return ''
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ try:
+ result = client.service.stamped(xml, AUTH['USER'], AUTH['PASS'])
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ return self._check_result(method, result)
+
+ def estatus_xml(self, uuid):
+ method = 'timbra'
+ if not self._validate_uuid(uuid):
+ return ''
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ try:
+ result = client.service.query_pending(AUTH['USER'], AUTH['PASS'], uuid)
+ #~ print (result.date)
+ #~ tree = parseString(unescape(result.xml))
+ #~ response = tree.toprettyxml(encoding='utf-8').decode('utf-8')
+ return result.status
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ def cancel_xml(self, rfc, uuids, path_cer, path_key):
+ for u in uuids:
+ if not self._validate_uuid(u):
+ return ''
+
+ cer = self._load_file(path_cer)
+ key = self._load_file(path_key)
+ method = 'cancel'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ uuid_type = client.get_type('ns1:UUIDS')
+ sa = client.get_type('ns0:stringArray')
+
+ args = {
+ 'UUIDS': uuid_type(uuids=sa(string=uuids)),
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'taxpayer_id': rfc,
+ 'cer': cer,
+ 'key': key,
+ 'store_pending': True,
+ }
+ try:
+ result = client.service.cancel(**args)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ if result.CodEstatus and self.codes['205'] in result.CodEstatus:
+ self.error = result.CodEstatus
+ return ''
+
+ return result
+
+ def cancel_signature(self, file_xml):
+ method = 'cancel'
+ if os.path.isfile(file_xml):
+ root = etree.parse(file_xml).getroot()
+ else:
+ root = etree.fromstring(file_xml)
+
+ xml = etree.tostring(root)
+
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+
+ args = {
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'xml': xml,
+ 'store_pending': True,
+ }
+
+ result = client.service.cancel_signature(**args)
+ return result
+
+ def get_acuse(self, rfc, uuids, type_acuse='C'):
+ for u in uuids:
+ if not self._validate_uuid(u):
+ return ''
+
+ method = 'cancel'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+
+ args = {
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'taxpayer_id': rfc,
+ 'uuid': '',
+ 'type': type_acuse,
+ }
+ try:
+ result = []
+ for u in uuids:
+ args['uuid'] = u
+ r = client.service.get_receipt(**args)
+ result.append(r)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ return result
+
+ def estatus_cancel(self, uuids):
+ for u in uuids:
+ if not self._validate_uuid(u):
+ return ''
+
+ method = 'cancel'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+
+ args = {
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'uuid': '',
+ }
+ try:
+ result = []
+ for u in uuids:
+ args['uuid'] = u
+ r = client.service.query_pending_cancellation(**args)
+ result.append(r)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ return result
+
+ def add_token(self, rfc, email):
+ """
+ Se requiere cuenta de reseller para usar este método
+ """
+ method = 'util'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ args = {
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'name': rfc,
+ 'token_username': email,
+ 'taxpayer_id': rfc,
+ 'status': True,
+ }
+ result = client.service.add_token(**args)
+ return result
+
+ def get_date(self):
+ method = 'util'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ try:
+ result = client.service.datetime(AUTH['USER'], AUTH['PASS'])
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ if result.error:
+ self.error = result.error
+ return
+
+ return result.datetime
+
+ def add_client(self, rfc, type_user=False):
+ """
+ Se requiere cuenta de reseller para usar este método
+ type_user: False == 'P' == Prepago or True == 'O' == On demand
+ """
+ tu = {False: 'P', True: 'O'}
+ method = 'client'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ args = {
+ 'reseller_username': AUTH['USER'],
+ 'reseller_password': AUTH['PASS'],
+ 'taxpayer_id': rfc,
+ 'type_user': tu[type_user],
+ 'added': datetime.datetime.now().isoformat()[:19],
+ }
+ try:
+ result = client.service.add(**args)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ return result
+
+ def edit_client(self, rfc, status=True):
+ """
+ Se requiere cuenta de reseller para usar este método
+ status = 'A' or 'S'
+ """
+ sv = {False: 'S', True: 'A'}
+ method = 'client'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ args = {
+ 'reseller_username': AUTH['USER'],
+ 'reseller_password': AUTH['PASS'],
+ 'taxpayer_id': rfc,
+ 'status': sv[status],
+ }
+ try:
+ result = client.service.edit(**args)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ return result
+
+ def get_client(self, rfc):
+ """
+ Se requiere cuenta de reseller para usar este método
+ """
+ method = 'client'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ args = {
+ 'reseller_username': AUTH['USER'],
+ 'reseller_password': AUTH['PASS'],
+ 'taxpayer_id': rfc,
+ }
+
+ try:
+ result = client.service.get(**args)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+ except TransportError as e:
+ self.error = str(e)
+ return ''
+
+ return result
+
+ def assign_client(self, rfc, credit):
+ """
+ Se requiere cuenta de reseller para usar este método
+ """
+ method = 'client'
+ client = Client(
+ URL[method], transport=self._transport, plugins=self._plugins)
+ args = {
+ 'username': AUTH['USER'],
+ 'password': AUTH['PASS'],
+ 'taxpayer_id': rfc,
+ 'credit': credit,
+ }
+ try:
+ result = client.service.assign(**args)
+ except Fault as e:
+ self.error = str(e)
+ return ''
+
+ return result
+
+
+def _get_data_sat(path):
+ BF = 'string(//*[local-name()="{}"]/@{})'
+ NS_CFDI = {'cfdi': 'http://www.sat.gob.mx/cfd/3'}
+
+ try:
+ if os.path.isfile(path):
+ tree = etree.parse(path).getroot()
+ else:
+ tree = etree.fromstring(path)
+
+ data = {}
+ emisor = escape(
+ tree.xpath('string(//cfdi:Emisor/@rfc)', namespaces=NS_CFDI) or
+ tree.xpath('string(//cfdi:Emisor/@Rfc)', namespaces=NS_CFDI)
+ )
+ receptor = escape(
+ tree.xpath('string(//cfdi:Receptor/@rfc)', namespaces=NS_CFDI) or
+ tree.xpath('string(//cfdi:Receptor/@Rfc)', namespaces=NS_CFDI)
+ )
+ data['total'] = tree.get('total') or tree.get('Total')
+ data['emisor'] = emisor
+ data['receptor'] = receptor
+ data['uuid'] = tree.xpath(BF.format('TimbreFiscalDigital', 'UUID'))
+ except Exception as e:
+ print (e)
+ return {}
+
+ return '?re={emisor}&rr={receptor}&tt={total}&id={uuid}'.format(**data)
+
+
+def get_status_sat(xml):
+ data = _get_data_sat(xml)
+ if not data:
+ return
+
+ URL = 'https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc?wsdl'
+ client = Client(URL, transport=Transport(cache=SqliteCache()))
+ try:
+ result = client.service.Consulta(expresionImpresa=data)
+ except Exception as e:
+ return 'Error: {}'.format(str(e))
+
+ return result.Estado
+
+
+def main():
+ return
+
+
+if __name__ == '__main__':
+ main()
diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py
new file mode 100644
index 0000000..156de65
--- /dev/null
+++ b/source/app/controllers/util.py
@@ -0,0 +1,401 @@
+#!/usr/bin/env python
+
+import datetime
+import getpass
+import hashlib
+import json
+import mimetypes
+import os
+import re
+import sqlite3
+import subprocess
+import tempfile
+import unicodedata
+import uuid
+
+from dateutil import parser
+
+from settings import DEBUG, log, template_lookup, COMPANIES, DB_SAT, \
+ PATH_XSLT, PATH_XSLTPROC, PATH_OPENSSL
+
+
+#~ def _get_hash(password):
+ #~ return bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
+
+
+#~ def validate_password(hashed, password):
+ #~ return bcrypt.hashpw(password.encode(), hashed.encode()) == hashed.encode()
+
+
+def _call(args):
+ return subprocess.check_output(args, shell=True).decode()
+
+
+def _get_md5(data):
+ return hashlib.md5(data.encode()).hexdigest()
+
+
+def _save_temp(data, modo='wb'):
+ path = tempfile.mkstemp()[1]
+ with open(path, modo) as f:
+ f.write(data)
+ return path
+
+
+def _join(*paths):
+ return os.path.join(*paths)
+
+
+def _kill(path):
+ try:
+ os.remove(path)
+ except:
+ pass
+ return
+
+
+def get_pass():
+ password = getpass.getpass('Introduce la contraseña: ')
+ pass2 = getpass.getpass('Confirma la contraseña: ')
+
+ if password != pass2:
+ msg = 'Las contraseñas son diferentes'
+ return False, msg
+ password = password.strip()
+ if not password:
+ msg = 'La contraseña es necesaria'
+ return False, msg
+
+ return True, password
+
+
+def get_value(arg):
+ value = input('Introduce el {}: '.format(arg)).strip()
+ if not value:
+ msg = 'El {} es requerido'.format(arg)
+ log.error(msg)
+ return ''
+ return value
+
+
+def _get_args(rfc):
+ con = sqlite3.connect(COMPANIES)
+ cursor = con.cursor()
+ sql = "SELECT con FROM names WHERE rfc=?"
+ cursor.execute(sql, (rfc,))
+ values = cursor.fetchone()
+ if values is None:
+ msg = 'No se encontró el RFC'
+ log.error(msg)
+ return ''
+
+ cursor.close()
+ con.close()
+ return values[0]
+
+
+def get_con(rfc=''):
+ if not rfc:
+ rfc = get_value('RFC').upper()
+ if not rfc:
+ return False
+
+ args = _get_args(rfc.upper())
+ if not args:
+ return False
+ return loads(args)
+
+
+def get_rfcs():
+ con = sqlite3.connect(COMPANIES)
+ cursor = con.cursor()
+ sql = "SELECT * FROM names"
+ cursor.execute(sql)
+ values = cursor.fetchall()
+ cursor.close()
+ con.close()
+ return values
+
+
+def get_sat_key(table, key):
+ con = sqlite3.connect(DB_SAT)
+ cursor = con.cursor()
+ sql = 'SELECT key, description FROM {} WHERE key=?'.format(table)
+ cursor.execute(sql, (key,))
+ data = cursor.fetchone()
+ cursor.close()
+ con.close()
+ if data is None:
+ return {'ok': False, 'text': 'No se encontró la clave'}
+ return {'ok': True, 'text': data[1]}
+
+
+def now():
+ return datetime.datetime.now().replace(microsecond=0)
+
+
+def get_token():
+ return _get_hash(uuid.uuid4().hex)
+
+
+def get_mimetype(path):
+ mt = mimetypes.guess_type(path)[0]
+ return mt or 'application/octet-stream'
+
+
+def is_file(path):
+ return os.path.isfile(path)
+
+
+def get_stream(path):
+ return get_file(path), get_size(path)
+
+
+def get_file(path):
+ return open(path, 'rb')
+
+
+def get_size(path):
+ return os.path.getsize(path)
+
+
+def get_template(name, data={}):
+ #~ print ('NAME', name, data)
+ template = template_lookup.get_template(name)
+ return template.render(**data)
+
+
+def dumps(data):
+ return json.dumps(data, default=str)
+
+
+def loads(data):
+ return json.loads(data)
+
+
+def clean(values):
+ for k, v in values.items():
+ if isinstance(v, str):
+ values[k] = v.strip()
+ return values
+
+
+def parse_con(values):
+ data = values.split('|')
+ try:
+ con = {'type': data[0]}
+ if con['type'] == 'sqlite':
+ con['name'] = data[1]
+ else:
+ if data[1]:
+ con['host'] = data[1]
+ if data[2]:
+ con['port'] = data[2]
+ con['name'] = data[3]
+ con['user'] = data[4]
+ con['password'] = data[5]
+ return con
+ except IndexError:
+ return {}
+
+
+def spaces(value):
+ return ' '.join(value.split())
+
+
+def to_slug(string):
+ value = (unicodedata.normalize('NFKD', string)
+ .encode('ascii', 'ignore')
+ .decode('ascii').lower())
+ return value
+
+
+class Certificado(object):
+
+ def __init__(self, key, cer):
+ self._key = key
+ self._cer = cer
+ self._modulus = ''
+ self._save_files()
+ self.error = ''
+
+ def _save_files(self):
+ try:
+ self._path_key = _save_temp(self._key)
+ self._path_cer = _save_temp(self._cer)
+ except:
+ self._path_key = ''
+ self._path_cer = ''
+ return
+
+ def _kill(self, path):
+ try:
+ os.remove(path)
+ except:
+ pass
+ return
+
+ def _get_info_cer(self, session_rfc):
+ data = {}
+ args = 'openssl x509 -inform DER -in {}'
+ try:
+ cer_pem = _call(args.format(self._path_cer))
+ except Exception as e:
+ self.error = 'No se pudo convertir el CER en PEM'
+ return data
+
+ args = 'openssl enc -base64 -in {}'
+ try:
+ cer_txt = _call(args.format(self._path_cer))
+ except Exception as e:
+ self.error = 'No se pudo convertir el CER en TXT'
+ return data
+
+ args = 'openssl x509 -inform DER -in {} -noout -{}'
+ try:
+ result = _call(args.format(self._path_cer, 'purpose')).split('\n')[3]
+ except Exception as e:
+ self.error = 'No se puede saber si es FIEL'
+ return data
+
+ if result == 'SSL server : No':
+ self.error = 'El certificado es FIEL'
+ return data
+
+ result = _call(args.format(self._path_cer, 'serial'))
+ serie = result.split('=')[1].split('\n')[0][1::2]
+ result = _call(args.format(self._path_cer, 'subject'))
+ rfc = result.split('=')[5].split('/')[0].strip()
+
+ if not DEBUG:
+ if not rfc == session_rfc:
+ self.error = 'El RFC del certificado no corresponde.'
+ return data
+
+ dates = _call(args.format(self._path_cer, 'dates')).split('\n')
+ desde = parser.parse(dates[0].split('=')[1])
+ hasta = parser.parse(dates[1].split('=')[1])
+ self._modulus = _call(args.format(self._path_cer, 'modulus'))
+
+ data['cer'] = self._cer
+ data['cer_tmp'] = None
+ data['cer_pem'] = cer_pem
+ data['cer_txt'] = cer_txt.replace('\n', '')
+ data['serie'] = serie
+ data['rfc'] = rfc
+ data['desde'] = desde
+ data['hasta'] = hasta
+ return data
+
+ def _get_p12(self, password, rfc):
+ tmp_cer = tempfile.mkstemp()[1]
+ tmp_key = tempfile.mkstemp()[1]
+ tmp_p12 = tempfile.mkstemp()[1]
+
+ args = 'openssl x509 -inform DER -in "{}" -out "{}"'
+ _call(args.format(self._path_cer, tmp_cer))
+ args = 'openssl pkcs8 -inform DER -in "{}" -passin pass:{} -out "{}"'
+ _call(args.format(self._path_key, password, tmp_key))
+
+ args = 'openssl pkcs12 -export -in "{}" -inkey "{}" -name "{}" -passout ' \
+ 'pass:"{}" -out "{}"'
+ _call(args.format(tmp_cer, tmp_key, rfc,
+ hashlib.md5(rfc.encode()).hexdigest(), tmp_p12))
+ data = open(tmp_p12, 'rb').read()
+
+ self._kill(tmp_cer)
+ self._kill(tmp_key)
+ self._kill(tmp_p12)
+
+ return data
+
+ def _get_info_key(self, password, rfc):
+ data = {}
+
+ args = 'openssl pkcs8 -inform DER -in "{}" -passin pass:{}'
+ try:
+ result = _call(args.format(self._path_key, password))
+ except Exception as e:
+ self.error = 'Contraseña incorrecta'
+ return data
+
+ args = 'openssl pkcs8 -inform DER -in "{}" -passin pass:{} | ' \
+ 'openssl rsa -noout -modulus'
+ mod_key = _call(args.format(self._path_key, password))
+
+ if self._modulus != mod_key:
+ self.error = 'Los archivos no son pareja'
+ return data
+
+ args = 'openssl pkcs8 -inform DER -in "{}" -passin pass:{} | ' \
+ 'openssl rsa -des3 -passout pass:{}'.format(
+ self._path_key, password, _get_md5(rfc))
+ key_enc = _call(args)
+
+ data['key'] = self._key
+ data['key_tmp'] = None
+ data['key_enc'] = key_enc
+ data['p12'] = self._get_p12(password, rfc)
+ return data
+
+ def validate(self, password, rfc):
+ if not self._path_key or not self._path_cer:
+ self.error = 'Error al cargar el certificado'
+ return {}
+
+ data = self._get_info_cer(rfc)
+ llave = self._get_info_key(password, data['rfc'])
+ if not llave:
+ return {}
+
+ data.update(llave)
+
+ self._kill(self._path_key)
+ self._kill(self._path_cer)
+ return data
+
+
+def make_xml(data, certificado):
+ from .cfdi_xml import CFDI
+
+ if DEBUG:
+ data['emisor']['Rfc'] = certificado.rfc
+ data['emisor']['RegimenFiscal'] = '603'
+
+ cfdi = CFDI()
+ xml = cfdi.get_xml(data)
+
+ data = {
+ 'xsltproc': PATH_XSLTPROC,
+ 'xslt': _join(PATH_XSLT, 'cadena.xslt'),
+ 'xml': _save_temp(xml, 'w'),
+ 'openssl': PATH_OPENSSL,
+ 'key': _save_temp(certificado.key_enc, 'w'),
+ 'pass': _get_md5(certificado.rfc)
+ }
+ args = '"{xsltproc}" "{xslt}" "{xml}" | ' \
+ '"{openssl}" dgst -sha256 -sign "{key}" -passin pass:{pass} | ' \
+ '"{openssl}" enc -base64 -A'.format(**data)
+ sello = _call(args)
+
+ _kill(data['xml'])
+ _kill(data['key'])
+
+ return cfdi.add_sello(sello)
+
+
+def timbra_xml(xml):
+ from .pac import Finkok as PAC
+
+ result = {'ok': True, 'error': ''}
+ pac = PAC()
+ xml = pac.timbra_xml(xml)
+ if not xml:
+ result['ok'] = False
+ result['error'] = pac.error
+ return result
+
+ result['xml'] = xml
+ result['uuid'] = pac.uuid
+ result['fecha'] = pac.fecha
+ return result
diff --git a/source/app/main.ini b/source/app/main.ini
new file mode 100644
index 0000000..3fec15c
--- /dev/null
+++ b/source/app/main.ini
@@ -0,0 +1,13 @@
+[uwsgi]
+socket = 127.0.0.1:3032
+uid = nginx
+gid = nginx
+chdir = /srv/app/empresalibre/app
+wsgi-file = main.py
+callable = app
+master = true
+processes = 4
+threads = 4
+thunder-lock = true
+#~ stats = 127.0.0.1:9191
+logger = file:/srv/log/empresalibre-uwsgi.log
diff --git a/source/app/main.py b/source/app/main.py
new file mode 100644
index 0000000..b423f09
--- /dev/null
+++ b/source/app/main.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+
+import falcon
+from falcon_multipart.middleware import MultipartMiddleware
+from beaker.middleware import SessionMiddleware
+
+from middleware import (
+ AuthMiddleware,
+ JSONTranslator,
+ ConnectionMiddleware,
+ static,
+ handle_404
+)
+from models.db import StorageEngine
+from controllers.main import (
+ AppLogin, AppLogout, AppAdmin, AppEmisor,
+ AppMain, AppValues, AppPartners, AppProducts, AppInvoices, AppFolios,
+ AppDocumentos
+)
+from settings import DEBUG
+
+
+db = StorageEngine()
+
+api = falcon.API(middleware=[
+ AuthMiddleware(),
+ JSONTranslator(),
+ ConnectionMiddleware(),
+ MultipartMiddleware(),
+])
+api.req_options.auto_parse_form_urlencoded = True
+api.add_sink(handle_404, '')
+
+api.add_route('/', AppLogin(db))
+api.add_route('/logout', AppLogout(db))
+api.add_route('/admin', AppAdmin(db))
+api.add_route('/emisor', AppEmisor(db))
+api.add_route('/folios', AppFolios(db))
+api.add_route('/main', AppMain(db))
+api.add_route('/values/{table}', AppValues(db))
+api.add_route('/doc/{type_doc}/{id_doc}', AppDocumentos(db))
+api.add_route('/partners', AppPartners(db))
+api.add_route('/products', AppProducts(db))
+api.add_route('/invoices', AppInvoices(db))
+
+
+
+if DEBUG:
+ api.add_sink(static, '/static')
+
+
+session_options = {
+ 'session.type': 'file',
+ 'session.cookie_expires': True,
+ 'session.data_dir': '/tmp/cache/data',
+ 'session.lock_dir': '/tmp/cache/lock',
+}
+app = SessionMiddleware(api, session_options)
+
diff --git a/source/app/main_debug.ini b/source/app/main_debug.ini
new file mode 100644
index 0000000..065dcfc
--- /dev/null
+++ b/source/app/main_debug.ini
@@ -0,0 +1,8 @@
+[uwsgi]
+http = 127.0.0.1:8000
+wsgi-file = main.py
+callable = app
+master = true
+processes = 4
+threads = 4
+py-autoreload = 1
diff --git a/source/app/middleware.py b/source/app/middleware.py
new file mode 100644
index 0000000..fc2d00f
--- /dev/null
+++ b/source/app/middleware.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+
+import falcon
+from controllers import util
+from models import main
+from settings import PATH_STATIC
+
+
+def handle_404(req, resp):
+ id_session = req.cookies.get('beaker.session.id', '')
+ if id_session:
+ raise falcon.HTTPTemporaryRedirect('/main')
+ raise falcon.HTTPTemporaryRedirect('/')
+
+
+def get_template(req, resp, resource):
+ session = req.env['beaker.session']
+ resp.content_type = 'text/html'
+ data = {'username': session.get('user', '')}
+ resp.body = util.get_template(resource.template, data)
+
+
+def static(req, res):
+ path = PATH_STATIC + req.path
+ if util.is_file(path):
+ res.content_type = util.get_mimetype(path)
+ res.stream, res.stream_len = util.get_stream(path)
+ res.status = falcon.HTTP_200
+ else:
+ res.status = falcon.HTTP_404
+
+
+class AuthMiddleware(object):
+
+ def process_resource(self, req, resp, resource, params):
+ id_session = req.cookies.get('beaker.session.id', '')
+ if not id_session and req.path != '/':
+ raise falcon.HTTPTemporaryRedirect('/')
+
+
+class JSONTranslator(object):
+
+ #~ def process_request(self, req, resp):
+ #~ pass
+
+ def process_response(self, req, resp, resource):
+ if 'result' not in req.context:
+ return
+ if '/doc/' in req.path:
+ resp.body = req.context['result']
+ return
+ resp.body = util.dumps(req.context['result'])
+
+
+class ConnectionMiddleware(object):
+
+ #~ def process_request(self, req, resp):
+ def process_resource(self, req, resp, resource, params):
+ id_session = req.cookies.get('beaker.session.id', '')
+ session = req.env['beaker.session']
+ rfc = session.get('rfc', '')
+ if id_session and rfc:
+ opt = util.get_con(rfc)
+ main.conectar(opt)
+
+ def process_response(self, req, resp, resource):
+ main.desconectar()
+
diff --git a/source/app/models/__init__.py b/source/app/models/__init__.py
new file mode 100644
index 0000000..cf529d7
--- /dev/null
+++ b/source/app/models/__init__.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python
+
diff --git a/source/app/models/db.py b/source/app/models/db.py
new file mode 100644
index 0000000..fe07363
--- /dev/null
+++ b/source/app/models/db.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+
+from . import main
+
+
+class StorageEngine(object):
+
+ def __init__(self):
+ pass
+
+ def authenticate(self, args):
+ return main.authenticate(args)
+
+ def get_values(self, table, values=None):
+ return getattr(self, '_get_{}'.format(table))(values)
+
+ def add_cert(self, file_object):
+ return main.Certificado.add(file_object)
+
+ def validate_cert(self, values, session):
+ return main.Certificado.validate(values, session)
+
+ def _get_cert(self, values):
+ return main.Certificado.get_data()
+
+ def _get_cp(self, values):
+ return main.get_cp(values['cp'])
+
+ def _get_formapago(self, values):
+ return main.SATFormaPago.get_activos(values)
+
+ def _get_categorias(self, values):
+ return main.Categorias.get_all()
+
+ def _get_newkey(self, values):
+ return main.Productos.next_key()
+
+ def _get_unidades(self, values):
+ return main.SATUnidades.get_activos()
+
+ def _get_taxes(self, values):
+ return main.SATImpuestos.get_activos()
+
+ def _get_satkey(self, values):
+ return main.get_sat_key(values['key'])
+
+ def _get_series(self, values):
+ return main.Folios.get_all()
+
+ def _get_monedas(self, values):
+ return main.SATMonedas.get_activos()
+
+ def _get_regimenes(self, values):
+ return main.Emisor.get_regimenes()
+
+ def _get_usocfdi(self, values):
+ return main.SATUsoCfdi.get_activos(values)
+
+ def delete(self, table, id):
+ if table == 'partner':
+ return main.Socios.remove(id)
+ if table == 'product':
+ return main.Productos.remove(id)
+ if table == 'invoice':
+ return main.Facturas.remove(id)
+ if table == 'folios':
+ return main.Folios.remove(id)
+ return False
+
+ def _get_client(self, values):
+ return main.Socios.get_by_client(values)
+
+ def _get_product(self, values):
+ return main.Productos.get_by(values)
+
+ def get_partners(self, values):
+ return main.Socios.get_(values)
+
+ def partner(self, values):
+ id = int(values.pop('id', '0'))
+ if id:
+ return main.Socios.actualizar(values, id)
+ return main.Socios.add(values)
+
+ def get_products(self, values):
+ return main.Productos.get_(values)
+
+ def product(self, values):
+ id = int(values.pop('id', '0'))
+ if id:
+ return main.Productos.actualizar(values, id)
+ return main.Productos.add(values)
+
+ def invoice(self, values):
+ id = int(values.pop('id', '0'))
+ if id:
+ return main.Facturas.actualizar(values, id)
+ return main.Facturas.add(values)
+
+ def get_invoices(self, values):
+ return main.Facturas.get_(values)
+
+ def _get_timbrar(self, values):
+ return main.Facturas.timbrar(int(values['id']))
+
+ def get_emisor(self, rfc):
+ return main.Emisor.get_(rfc)
+
+ def emisor(self, values):
+ return main.Emisor.add(values)
+
+ def get_folios(self):
+ return main.Folios.get_()
+
+ def add_folios(self, values):
+ return main.Folios.add(values)
+
+ def get_doc(self, type_doc, id):
+ if type_doc == 'xml':
+ data, file_name = main.Facturas.get_xml(id)
+ content_type = 'application.xml'
+ return data, file_name, content_type
+
diff --git a/source/app/models/main.py b/source/app/models/main.py
new file mode 100644
index 0000000..350b25c
--- /dev/null
+++ b/source/app/models/main.py
@@ -0,0 +1,1608 @@
+#!/usr/bin/env python
+
+import sqlite3
+import click
+from peewee import *
+from playhouse.fields import PasswordField, ManyToManyField
+from playhouse.shortcuts import case
+
+
+if __name__ == '__main__':
+ import os, sys
+ parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ sys.path.insert(0, parent_dir)
+
+
+from controllers import util
+from settings import log, VERSION, PATH_CP
+
+FORMAT = '{0:.2f}'
+
+
+database_proxy = Proxy()
+class BaseModel(Model):
+ class Meta:
+ database = database_proxy
+
+
+def conectar(opt):
+ db = {
+ 'sqlite': SqliteDatabase,
+ 'postgres': PostgresqlDatabase,
+ 'mysql': MySQLDatabase,
+ }
+ db_type = opt.pop('type')
+ db_name = opt.pop('name')
+ if not db_type in db:
+ log.error('Tipo de base de datos no soportado')
+ return False
+ #~ print ('DB NAME', db_name)
+ database = db[db_type](db_name, **opt)
+ try:
+ database_proxy.initialize(database)
+ database_proxy.connect()
+ log.info('Conectado a la BD...')
+ return True
+ except OperationalError as e:
+ log.error('Error al intentar conectar a la base de datos')
+ log.error(e)
+ return False
+
+
+def desconectar():
+ if database_proxy.obj is None:
+ return
+ if not database_proxy.is_closed():
+ database_proxy.close()
+ log.info('Desconectado a la BD...')
+ return
+
+
+class Configuracion(BaseModel):
+ clave = TextField()
+ valor = TextField(default='')
+
+ class Meta:
+ order_by = ('clave',)
+ indexes = (
+ (('clave', 'valor'), True),
+ )
+
+
+class Tags(BaseModel):
+ tag = TextField(index=True, unique=True)
+
+ class Meta:
+ order_by = ('tag',)
+
+
+class Usuarios(BaseModel):
+ usuario = TextField(unique=True)
+ nombre = TextField(default='')
+ apellidos = TextField(default='')
+ correo = TextField(default='')
+ contraseña = PasswordField()
+ es_superusuario = BooleanField(default=False)
+ es_admin = BooleanField(default=False)
+ es_activo = BooleanField(default=True)
+ fecha_ingreso = DateTimeField(default=util.now)
+ ultimo_ingreso = DateTimeField(null=True)
+
+ def __str__(self):
+ t = '{} {} ({})'
+ return t.format(self.nombre, self.apellidos, self.usuario)
+
+ class Meta:
+ order_by = ('nombre', 'apellidos')
+
+
+class SATRegimenes(BaseModel):
+ key = TextField(index=True, unique=True)
+ name = TextField(index=True)
+ activo = BooleanField(default=False)
+ default = BooleanField(default=False)
+ fisica = BooleanField(default=False)
+ moral = BooleanField(default=False)
+
+ class Meta:
+ order_by = ('-default', 'name',)
+ indexes = (
+ (('key', 'name'), True),
+ )
+
+ @classmethod
+ def get_(cls, ids):
+ if isinstance(ids, int):
+ ids = [ids]
+ return SATRegimenes.select().where(SATRegimenes.id.in_(ids))
+
+ @classmethod
+ def get_activos(cls, rfc):
+ where = ((SATRegimenes.activo==True) & (SATRegimenes.fisica==True))
+ if (len(rfc) == 12):
+ where = ((SATRegimenes.activo==True) & (SATRegimenes.moral==True))
+
+ rows = (SATRegimenes
+ .select(
+ SATRegimenes.id,
+ SATRegimenes.name.alias('value'))
+ .where(where)
+ .dicts()
+ )
+ return tuple(rows)
+
+
+class Emisor(BaseModel):
+ rfc = TextField(unique=True)
+ nombre = TextField(default='')
+ nombre_comercial = TextField(default='')
+ calle = TextField(default='')
+ no_exterior = TextField(default='')
+ no_interior = TextField(default='')
+ colonia = TextField(default='')
+ municipio = TextField(default='')
+ estado = TextField(default='')
+ pais = TextField(default='México')
+ codigo_postal = TextField(default='')
+ cp_expedicion = TextField(default='')
+ es_moral = BooleanField(default=False)
+ es_ong = BooleanField(default=False)
+ es_escuela = BooleanField(default=False)
+ autorizacion = TextField(default='')
+ fecha_autorizacion = DateField(null=True)
+ fecha_dof = DateField(null=True)
+ telefono = TextField(default='')
+ correo = TextField(default='')
+ web = TextField(default='')
+ curp = TextField(default='')
+ regimenes = ManyToManyField(SATRegimenes, related_name='emisores')
+
+ def __str__(self):
+ t = '{} ({})'
+ return t.format(self.nombre, self.rfc)
+
+ class Meta:
+ order_by = ('nombre',)
+
+ @classmethod
+ def get_(cls, rfc):
+ regimenes = SATRegimenes.get_activos(rfc)
+ row = {'regimenes': regimenes}
+
+ obj = Emisor.select().where(Emisor.rfc==rfc)
+ if bool(obj):
+ obj = obj[0]
+ row['emisor'] = {
+ 'emisor_rfc': obj.rfc,
+ 'emisor_nombre': obj.nombre,
+ 'emisor_cp': obj.codigo_postal,
+ 'emisor_cp2': obj.cp_expedicion,
+ 'emisor_calle': obj.calle,
+ 'emisor_no_exterior': obj.no_exterior,
+ 'emisor_no_interior': obj.no_interior,
+ 'emisor_colonia': obj.colonia,
+ 'emisor_municipio': obj.municipio,
+ 'emisor_estado': obj.estado,
+ 'emisor_pais': obj.pais,
+ 'emisor_nombre_comercial': obj.nombre_comercial,
+ 'emisor_telefono': obj.telefono,
+ 'emisor_correo': obj.correo,
+ 'emisor_web': obj.web,
+ 'es_escuela': obj.es_escuela,
+ 'es_ong': obj.es_ong,
+ 'ong_autorizacion': obj.autorizacion,
+ 'ong_fecha': obj.fecha_autorizacion,
+ 'ong_fecha_dof': obj.fecha_dof,
+ 'regimenes': [row.id for row in obj.regimenes]
+ }
+ else:
+ row['emisor'] = {'emisor_rfc': rfc}
+
+ return {'ok': True, 'row': row}
+
+ @classmethod
+ def get_regimenes(cls):
+ obj = Emisor.select()[0]
+ rows = [{'id': row.key, 'value': row.name} for row in obj.regimenes]
+ return tuple(rows)
+
+ def _clean(self, values):
+ fields = util.clean(values)
+ fields['rfc'] = fields.pop('emisor_rfc')
+ fields['nombre'] = fields.pop('emisor_nombre')
+ fields['codigo_postal'] = fields.pop('emisor_cp')
+ fields['cp_expedicion'] = fields.pop('emisor_cp2', '') or fields['codigo_postal']
+ fields['colonia'] = fields.pop('emisor_colonia', '')
+ fields['municipio'] = fields.pop('emisor_municipio', '')
+ fields['estado'] = fields.pop('emisor_estado', '')
+ fields['pais'] = fields.pop('emisor_pais', 'México')
+ fields['nombre_comercial'] = fields.pop('emisor_nombre_comercial', '')
+ fields['telefono'] = fields.pop('emisor_telefono', '')
+ fields['correo'] = fields.pop('emisor_correo', '')
+ fields['web'] = fields.pop('emisor_web', '')
+ fields['es_escuela'] = bool(fields['es_escuela'].replace('0', ''))
+ fields['es_ong'] = bool(fields['es_ong'].replace('0', ''))
+ fields['autorizacion'] = fields.pop('ong_autorizacion', '')
+ fields['fecha_autorizacion'] = fields.pop('ong_fecha', None)
+ fields['fecha_dof'] = fields.pop('ong_fecha_dof', None)
+ if len(fields['rfc']) == 12:
+ fields['es_moral'] = True
+ fields['regimenes'] = SATRegimenes.get_(
+ util.loads(fields['regimenes']))
+ return fields
+
+ @classmethod
+ def add(cls, values):
+ fields = cls._clean(cls, values)
+ obj, created = Emisor.get_or_create(rfc=fields['rfc'])
+ obj.regimenes = fields.pop('regimenes')
+ q = Emisor.update(**fields).where(Emisor.id==obj.id)
+ return {'ok': bool(q.execute())}
+
+
+class Certificado(BaseModel):
+ key = BlobField(null=True)
+ key_tmp = BlobField(null=True)
+ key_enc = TextField(default='')
+ cer = BlobField(null=True)
+ cer_tmp = BlobField(null=True)
+ cer_pem = TextField(default='')
+ cer_txt = TextField(default='')
+ p12 = BlobField(null=True)
+ serie = TextField(default='')
+ rfc = TextField(default='')
+ desde = DateTimeField(null=True)
+ hasta = DateTimeField(null=True)
+
+ def __str__(self):
+ return self.serie
+
+ @classmethod
+ def get_data(cls):
+ obj = cls.get_(cls)
+ row = {
+ 'cert_rfc': obj.rfc,
+ 'cert_serie': obj.serie,
+ 'cert_desde': obj.desde,
+ 'cert_hasta': obj.hasta,
+ }
+ return row
+
+ def get_(cls):
+ if Certificado.select().count():
+ obj = Certificado.select()[0]
+ else:
+ obj = Certificado()
+ return obj
+
+ @classmethod
+ def add(cls, file_object):
+ obj = cls.get_(cls)
+ if file_object.filename.endswith('key'):
+ obj.key_tmp = file_object.file.read()
+ elif file_object.filename.endswith('cer'):
+ obj.cer_tmp = file_object.file.read()
+ obj.save()
+ return {'status': 'server'}
+
+ @classmethod
+ def validate(cls, values, session):
+ row = {}
+ result = False
+ obj = cls.get_(cls)
+ cert = util.Certificado(obj.key_tmp, obj.cer_tmp)
+ data = cert.validate(values['contra'], session['rfc'])
+ if data:
+ msg = 'Certificado guardado correctamente'
+ q = Certificado.update(**data).where(Certificado.id==obj.id)
+ if q.execute():
+ result = True
+ row = {
+ 'cert_rfc': data['rfc'],
+ 'cert_serie': data['serie'],
+ 'cert_desde': data['desde'],
+ 'cert_hasta': data['hasta'],
+ }
+ else:
+ msg = cert.error
+ obj.key_tmp = None
+ obj.cer_tmp = None
+ obj.save()
+
+ return {'ok': result, 'msg': msg, 'data': row}
+
+
+
+class Folios(BaseModel):
+ serie = TextField(unique=True)
+ inicio = IntegerField(default=1)
+ default = BooleanField(default=False)
+ usarcon = TextField(default='')
+
+ class Meta:
+ order_by = ('-default', 'serie', 'inicio')
+ indexes = (
+ (('serie', 'inicio'), True),
+ )
+
+ @classmethod
+ def get_all(cls):
+ rows = (Folios
+ .select(
+ Folios.id,
+ Folios.serie.alias('value'),
+ Folios.usarcon,
+ )
+ .dicts()
+ )
+ return tuple(rows)
+
+ @classmethod
+ def get_(cls):
+ rows = (Folios
+ .select(
+ Folios.id,
+ SQL(" '-' AS 'delete' "),
+ Folios.serie,
+ Folios.inicio,
+ case(Folios.usarcon, (
+ ('I', 'Ingreso'),
+ ('E', 'Egreso'),
+ ('T', 'Traslado'),
+ ), 'Todos').alias('usarcon'),
+ case(Folios.default, (
+ (True, 'Si'),
+ (False, 'No'),
+ )).alias('pre')
+ )
+ .dicts()
+ )
+ return tuple(rows)
+
+ @classmethod
+ def add(cls, values):
+ uc = {
+ '': 'Todos',
+ 'I': 'Ingreso',
+ 'E': 'Egreso',
+ 'T': 'Traslado',
+ }
+ pre = {
+ True: 'Si',
+ False: 'No',
+ }
+
+ if 'default' in values:
+ values['default'] = True
+ try:
+ obj = Folios.create(**values)
+ except IntegrityError:
+ msg = 'Serie ya existe'
+ return {'ok': False, 'msg': msg}
+ row = {
+ 'id': obj.id,
+ 'delete' : '-',
+ 'serie' : obj.serie,
+ 'inicio' : obj.inicio,
+ 'usarcon' : uc[obj.usarcon],
+ 'pre' : pre[obj.default],
+ }
+ return {'ok': True, 'row': row}
+
+ @classmethod
+ def remove(cls, id):
+ q = Folios.delete().where(Folios.id==id)
+ return bool(q.execute())
+
+
+class Categorias(BaseModel):
+ categoria = TextField()
+ padre = ForeignKeyField('self', null=True, related_name='hijos')
+
+ class Meta:
+ order_by = ('categoria',)
+ indexes = (
+ (('categoria', 'padre'), True),
+ )
+
+ @classmethod
+ def get_all(cls):
+ rows = (Categorias.select(
+ Categorias.id,
+ Categorias.categoria.alias('value'),
+ Categorias.padre.alias('parent_id'))
+ ).dicts()
+ return tuple(rows)
+
+
+class CondicionesPago(BaseModel):
+ condicion = TextField(unique=True)
+
+ class Meta:
+ order_by = ('condicion',)
+
+
+class SATUnidades(BaseModel):
+ key = TextField(unique=True, index=True)
+ name = TextField(default='', index=True)
+ activo = BooleanField(default=False)
+ default = BooleanField(default=False)
+
+ class Meta:
+ order_by = ('-default', 'name')
+ indexes = (
+ (('key', 'name'), True),
+ )
+
+ @classmethod
+ def get_activos(cls):
+ rows = (SATUnidades
+ .select(
+ SATUnidades.id,
+ SATUnidades.name.alias('value'))
+ .where(SATUnidades.activo==True)
+ .dicts()
+ )
+ return tuple(rows)
+
+
+class SATFormaPago(BaseModel):
+ key = TextField(unique=True, index=True)
+ name = TextField(default='', index=True)
+ activo = BooleanField(default=False)
+ default = BooleanField(default=False)
+
+ class Meta:
+ order_by = ('-default', 'name',)
+ indexes = (
+ (('key', 'name'), True),
+ )
+
+ @classmethod
+ def get_activos(cls, values):
+ field = SATFormaPago.id
+ if values:
+ field = SATFormaPago.key.alias('id')
+ rows = (SATFormaPago
+ .select(field, SATFormaPago.name.alias('value'))
+ .where(SATFormaPago.activo==True)
+ .dicts()
+ )
+ return tuple(rows)
+
+
+class SATAduanas(BaseModel):
+ key = TextField(unique=True, index=True)
+ name = TextField(default='', index=True)
+ activo = BooleanField(default=False)
+ default = BooleanField(default=False)
+
+ class Meta:
+ order_by = ('-default', 'name',)
+ indexes = (
+ (('key', 'name'), True),
+ )
+
+
+class SATMonedas(BaseModel):
+ key = TextField(unique=True, index=True)
+ name = TextField(default='', index=True)
+ activo = BooleanField(default=False)
+ default = BooleanField(default=False)
+
+ class Meta:
+ order_by = ('-default', 'name',)
+ indexes = (
+ (('key', 'name'), True),
+ )
+
+ @classmethod
+ def get_activos(cls):
+ rows = (SATMonedas
+ .select(
+ SATMonedas.key.alias('id'),
+ SATMonedas.name.alias('value'))
+ .where(SATMonedas.activo==True)
+ .dicts()
+ )
+ return tuple(rows)
+
+
+class SATImpuestos(BaseModel):
+ key = TextField(index=True)
+ name = TextField(default='', index=True)
+ factor = TextField(default='T')
+ tipo = TextField(default='T')
+ tasa = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ activo = BooleanField(default=False)
+ default = BooleanField(default=False)
+
+ class Meta:
+ order_by = ('-default', 'name',)
+ indexes = (
+ (('key', 'factor', 'tipo', 'tasa'), True),
+ )
+
+ @classmethod
+ def get_activos(self):
+ rows = SATImpuestos.select().where(SATImpuestos.activo==True).dicts()
+ return tuple(rows)
+
+
+class SATUsoCfdi(BaseModel):
+ key = TextField(index=True, unique=True)
+ name = TextField(default='', index=True)
+ activo = BooleanField(default=False)
+ default = BooleanField(default=False)
+ fisica = BooleanField(default=True)
+ moral = BooleanField(default=False)
+
+ class Meta:
+ order_by = ('-default', 'name',)
+ indexes = (
+ (('key', 'name'), True),
+ )
+
+ @classmethod
+ def get_activos(cls, values):
+ field = SATUsoCfdi.id
+ if values:
+ field = SATUsoCfdi.key.alias('id')
+ rows = (SATUsoCfdi
+ .select(
+ field,
+ SATUsoCfdi.name.alias('value'),
+ SATUsoCfdi.fisica,
+ SATUsoCfdi.moral,
+ )
+ .where(SATUsoCfdi.activo==True)
+ .dicts()
+ )
+ return tuple(rows)
+
+
+class Addendas(BaseModel):
+ nombre = TextField(unique=True)
+ addenda = TextField()
+
+ class Meta:
+ order_by = ('nombre',)
+
+
+class Socios(BaseModel):
+ tipo_persona = IntegerField(default=1)
+ rfc = TextField(index=True)
+ nombre = TextField(index=True)
+ slug = TextField(default='')
+ nombre_comercial = TextField(index=True, default='')
+ calle = TextField(default='')
+ no_exterior = TextField(default='')
+ no_interior = TextField(default='')
+ colonia = TextField(default='')
+ municipio = TextField(default='')
+ estado = TextField(default='')
+ pais = TextField(default='')
+ codigo_postal = TextField(default='')
+ notas = TextField(default='')
+ telefonos = TextField(default='')
+ es_activo = BooleanField(default=True)
+ es_ong = BooleanField(default=False)
+ fecha_alta = DateField(default=util.now)
+ dias_pago = IntegerField(default=0)
+ dias_habiles = BooleanField(default=False)
+ es_cliente = BooleanField(default=False)
+ es_proveedor = BooleanField(default=False)
+ cuenta_cliente = TextField(default='')
+ cuenta_proveedor = TextField(default='')
+ web = TextField(default='')
+ correo_facturas = TextField(default='')
+ forma_pago = ForeignKeyField(SATFormaPago, null=True)
+ condicion_pago = ForeignKeyField(CondicionesPago, null=True)
+ addenda = ForeignKeyField(Addendas, null=True)
+ uso_cfdi = ForeignKeyField(SATUsoCfdi, null=True)
+ tags = ManyToManyField(Tags, related_name='socios_tags')
+
+ def __str__(self):
+ t = '{} ({})'
+ return t.format(self.nombre, self.rfc)
+
+ class Meta:
+ order_by = ('nombre',)
+ indexes = (
+ (('rfc', 'slug'), True),
+ )
+
+ def _clean(self, values):
+ fields = util.clean(values)
+ fields['rfc'] = fields['rfc'].upper()
+ fields['nombre'] = util.spaces(fields['nombre'])
+ fields['slug'] = util.to_slug(fields['nombre'])
+ fields['uso_cfdi'] = fields.pop('uso_cfdi_socio', None)
+ fb = ('dias_habiles', 'es_activo', 'es_cliente',
+ 'es_proveedor', 'es_ong')
+ for name in fb:
+ fields[name] = bool(fields[name].replace('0', ''))
+ return fields
+
+ @classmethod
+ def get_(cls, values):
+ if values:
+ id = int(values['id'])
+ row = Socios.select().where(Socios.id==id).dicts()[0]
+ row['uso_cfdi_socio'] = row.pop('uso_cfdi')
+ return row
+
+ rows = Socios.select(Socios.id, Socios.rfc, Socios.nombre).dicts()
+ return {'ok': True, 'rows': tuple(rows)}
+
+ @classmethod
+ def get_by_client(cls, values):
+ id = int(values.get('id', 0))
+ if id:
+ row = (Socios
+ .select(
+ Socios.id, Socios.nombre, Socios.rfc,
+ SATFormaPago.key.alias('forma_pago'),
+ SATUsoCfdi.key.alias('uso_cfdi'))
+ .join(SATFormaPago).switch(Socios)
+ .join(SATUsoCfdi).switch(Socios)
+ .where(
+ (Socios.id==id) & (Socios.es_cliente==True))
+ .dicts()
+ )
+ if len(row):
+ return {'ok': True, 'row': row[0]}
+ return {'ok': False}
+
+ name = values.get('name', '')
+ if name:
+ rows = (Socios
+ .select(Socios.id, Socios.nombre, Socios.rfc,
+ SATFormaPago.key.alias('forma_pago'),
+ SATUsoCfdi.key.alias('uso_cfdi'))
+ .join(SATFormaPago).switch(Socios)
+ .join(SATUsoCfdi).switch(Socios)
+ .where((Socios.es_cliente==True) &
+ (Socios.rfc.contains(name) |
+ Socios.nombre.contains(name)))
+ .dicts())
+ return tuple(rows)
+ return {'ok': False}
+
+ @classmethod
+ def add(cls, values):
+ fields = cls._clean(cls, values)
+ try:
+ obj = Socios.create(**fields)
+ except IntegrityError:
+ msg = 'Ya existe el RFC y Razón Social'
+ data = {'ok': False, 'row': {}, 'new': True, 'msg': msg}
+ return data
+
+ #~ ToDo Agregar Condicion de pago y tags
+
+ row = {
+ 'id': obj.id,
+ 'rfc': obj.rfc,
+ 'nombre': obj.nombre,
+ }
+ data = {'ok': True, 'row': row, 'new': True}
+ return data
+
+ @classmethod
+ def actualizar(cls, values, id):
+ fields = cls._clean(cls, values)
+ try:
+ q = Socios.update(**fields).where(Socios.id==id)
+ q.execute()
+ except IntegrityError:
+ msg = 'Ya existe el RFC y Razón Social'
+ data = {'ok': False, 'row': {}, 'new': True, 'msg': msg}
+ return data
+
+ row = {
+ 'id': id,
+ 'rfc': fields['rfc'],
+ 'nombre': fields['nombre'],
+ }
+ data = {'ok': True, 'row': row, 'new': False}
+ return data
+
+ @classmethod
+ def remove(cls, id):
+ count = (Facturas
+ .select(fn.COUNT(Facturas.id)).join(Socios)
+ .where(Socios.id==id)
+ .count())
+ if count:
+ return False
+
+ q = Socios.delete().where(Socios.id==id)
+ return bool(q.execute())
+
+
+class Productos(BaseModel):
+ categoria = ForeignKeyField(Categorias, null=True)
+ clave = TextField(unique=True, index=True)
+ clave_sat = TextField()
+ descripcion = TextField(index=True)
+ unidad = ForeignKeyField(SATUnidades)
+ valor_unitario = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ ultimo_costo = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ descuento = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ inventario = BooleanField(default=False)
+ existencia = DoubleField(default=0.0)
+ minimo = DoubleField(default=0.0)
+ codigo_barras = TextField(default='')
+ cuenta_predial = TextField(default='')
+ es_activo = BooleanField(default=True)
+ impuestos = ManyToManyField(SATImpuestos, related_name='productos')
+ tags = ManyToManyField(Tags, related_name='productos_tags')
+
+ class Meta:
+ order_by = ('descripcion',)
+
+ @classmethod
+ def next_key(cls):
+ value = Productos.select(fn.Max(Productos.id)).scalar()
+ if value is None:
+ value = 1
+ else:
+ value += 1
+ return {'value': value}
+
+ @classmethod
+ def get_by(cls, values):
+ id = int(values.get('id', 0))
+ if id:
+ row = (Productos
+ .select(Productos.id, Productos.clave, Productos.descripcion,
+ SATUnidades.name.alias('unidad'), Productos.valor_unitario)
+ .join(SATUnidades).switch(Productos)
+ .where(Productos.id==id).dicts())
+ if len(row):
+ model_pt = Productos.impuestos.get_through_model()
+ taxes = tuple(model_pt
+ .select(
+ model_pt.productos_id.alias('product'),
+ model_pt.satimpuestos_id.alias('tax'))
+ .where(model_pt.productos_id==id).dicts())
+ return {'ok': True, 'row': row[0], 'taxes': taxes}
+ return {'ok': False}
+
+ name = values.get('name', '')
+ if name:
+ rows = (Productos
+ .select(
+ Productos.id, Productos.clave, Productos.descripcion,
+ SATUnidades.name.alias('unidad'), Productos.valor_unitario)
+ .join(SATUnidades)
+ .switch(Productos)
+ .where(Productos.descripcion.contains(name))
+ .dicts()
+ )
+ return tuple(rows)
+ return {'ok': False}
+
+ @classmethod
+ def get_(cls, values):
+ if values:
+ id = int(values['id'])
+ row = (Productos
+ .select(
+ Productos.id,
+ Productos.es_activo.alias('es_activo_producto'),
+ Productos.categoria,
+ Productos.clave,
+ Productos.clave_sat,
+ Productos.descripcion,
+ Productos.unidad,
+ Productos.valor_unitario,
+ )
+ .where(Productos.id==id).dicts()[0]
+ )
+ obj = Productos.get(Productos.id==id)
+ taxes = [row.id for row in obj.impuestos]
+ return {'row': row, 'taxes': taxes}
+
+ rows = (Productos
+ .select(
+ Productos.id,
+ Productos.clave,
+ Productos.descripcion,
+ SATUnidades.name.alias('unidad'),
+ Productos.valor_unitario)
+ .join(SATUnidades)
+ .dicts()
+ )
+ return {'ok': True, 'rows': tuple(rows)}
+
+ def _clean(self, values):
+ taxes = util.loads(values.pop('taxes'))
+ fields = util.clean(values)
+
+ fields['es_activo'] = fields.pop('es_activo_producto')
+ fields['descripcion'] = util.spaces(fields['descripcion'])
+ fields['unidad'] = int(fields['unidad'])
+ fields['valor_unitario'] = fields['valor_unitario'].replace(
+ '$', '').replace(',', '')
+
+ fb = ('es_activo', 'inventario')
+ for name in fb:
+ fields[name] = bool(fields[name].replace('0', ''))
+
+ return fields, taxes
+
+ @classmethod
+ def add(cls, values):
+ fields, taxes = cls._clean(cls, values)
+
+ if Productos.select().where(Productos.clave==fields['clave']).exists():
+ msg = 'Clave ya existe'
+ return {'ok': False, 'msg': msg}
+
+ obj_taxes = SATImpuestos.select().where(SATImpuestos.id.in_(taxes))
+
+ with database_proxy.transaction():
+ obj = Productos.create(**fields)
+ obj.impuestos = obj_taxes
+ row = {
+ 'id': obj.id,
+ 'clave': obj.clave,
+ 'descripcion': obj.descripcion,
+ 'unidad': obj.unidad.name,
+ 'valor_unitario': obj.valor_unitario,
+ }
+ data = {'ok': True, 'row': row, 'new': True}
+ return data
+
+ @classmethod
+ def actualizar(cls, values, id):
+ fields, taxes = cls._clean(cls, values)
+ obj_taxes = SATImpuestos.select().where(SATImpuestos.id.in_(taxes))
+ with database_proxy.transaction():
+ q = Productos.update(**fields).where(Productos.id==id)
+ try:
+ q.execute()
+ except IntegrityError:
+ msg = 'Ya existe un producto con esta clave'
+ data = {'ok': False, 'row': {}, 'new': False, 'msg': msg}
+ return data
+
+ obj = Productos.get(Productos.id==id)
+ obj.impuestos = obj_taxes
+ row = {
+ 'id': obj.id,
+ 'clave': obj.clave,
+ 'descripcion': obj.descripcion,
+ 'unidad': obj.unidad.name,
+ 'valor_unitario': obj.valor_unitario,
+ }
+ data = {'ok': True, 'row': row, 'new': False}
+ return data
+
+ @classmethod
+ def remove(cls, id):
+ count = (FacturasDetalle
+ .select(fn.COUNT(FacturasDetalle.id)).join(Productos)
+ .where(Productos.id==id)
+ .count()
+ )
+ if count:
+ return False
+
+ with database_proxy.transaction():
+ obj = Productos.get(Productos.id==id)
+ obj.impuestos.clear()
+ obj.tags.clear()
+ q = Productos.delete().where(Productos.id==id)
+ return bool(q.execute())
+
+
+class Facturas(BaseModel):
+ cliente = ForeignKeyField(Socios)
+ serie = TextField(default='')
+ folio = IntegerField(default=0)
+ fecha = DateTimeField(default=util.now, formats=['%Y-%m-%d %H:%M:%S'])
+ fecha_timbrado = DateTimeField(null=True)
+ forma_pago = TextField(default='')
+ condiciones_pago = TextField(default='')
+ subtotal = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ descuento = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ moneda = TextField(default='MXN')
+ tipo_cambio = DecimalField(default=1.0, decimal_places=6, auto_round=True)
+ total = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ total_mn = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ tipo_comprobante = TextField(default='I')
+ metodo_pago = TextField(default='PUE')
+ lugar_expedicion = TextField(default='')
+ confirmacion = TextField(default='')
+ uso_cfdi = TextField(default='')
+ total_retenciones = DecimalField(
+ decimal_places=6, auto_round=True, null=True)
+ total_trasladados = DecimalField(
+ decimal_places=6, auto_round=True, null=True)
+ xml = TextField(default='')
+ uuid = UUIDField(null=True)
+ estatus = TextField(default='Guardada')
+ regimen_fiscal = TextField(default='')
+ notas = TextField(default='')
+ pagada = BooleanField(default=False)
+ error = TextField(default='')
+
+ class Meta:
+ order_by = ('fecha',)
+
+ @classmethod
+ def get_xml(cls, id):
+ obj = Facturas.get(Facturas.id==id)
+ name = '{}{}_{}.xml'.format(obj.serie, obj.folio, obj.cliente.rfc)
+ return obj.xml, name
+
+ @classmethod
+ def get_(cls, values):
+ rows = tuple(Facturas
+ .select(Facturas.id, Facturas.serie, Facturas.folio, Facturas.uuid,
+ Facturas.fecha, Facturas.tipo_comprobante, Facturas.estatus,
+ Facturas.total_mn, Socios.nombre.alias('cliente'))
+ .join(Socios)
+ .switch(Facturas).dicts()
+ )
+ return {'ok': True, 'rows': rows}
+
+ @classmethod
+ def remove(cls, id):
+ obj = Facturas.get(Facturas.id==id)
+ if obj.uuid:
+ return False
+
+ q = FacturasDetalle.delete().where(FacturasDetalle.factura==obj)
+ q.execute()
+ q = FacturasImpuestos.delete().where(FacturasImpuestos.factura==obj)
+ q.execute()
+ return bool(obj.delete_instance())
+
+ def _get_folio(self, serie):
+ inicio_serie = Folios.select(
+ Folios.inicio).where(Folios.serie==serie).scalar()
+ inicio = (Facturas
+ .select(fn.Max(Facturas.folio))
+ .where(Facturas.serie==serie)
+ .scalar())
+ if inicio is None:
+ inicio = inicio_serie
+ else:
+ inicio += 1
+ return inicio
+
+ def _calculate_totals(self, invoice, products):
+ subtotal = 0
+ totals_tax = {}
+ total_trasladados = None
+ total_retenciones = None
+ total_iva = 0
+
+ for product in products:
+ id_product = product.pop('id')
+ p = Productos.get(Productos.id==id_product)
+ product['descripcion'] = p.descripcion
+ product['unidad'] = p.unidad.key
+ product['clave'] = p.clave
+ product['clave_sat'] = p.clave_sat
+
+ product['factura'] = invoice.id
+ product['producto'] = id_product
+ product['importe'] = round(
+ float(product['cantidad']) * float(product['valor_unitario']), 2)
+ subtotal += product['importe']
+
+ FacturasDetalle.create(**product)
+ for tax in p.impuestos:
+ if tax.id in totals_tax:
+ totals_tax[tax.id]['importe'] += product['importe']
+ else:
+ tax.importe = product['importe']
+ totals_tax[tax.id] = tax
+
+ for tax in totals_tax.values():
+ if tax.tipo == 'E' or tax.tipo == 'R':
+ continue
+ import_tax = round(float(tax.tasa) * tax.importe, 2)
+ total_trasladados = (total_trasladados or 0) + import_tax
+ if tax.name == 'IVA':
+ total_iva += import_tax
+
+ invoice_tax = {
+ 'factura': invoice.id,
+ 'impuesto': tax.id,
+ 'base': tax.importe,
+ 'importe': import_tax,
+ }
+ FacturasImpuestos.create(**invoice_tax)
+
+ for tax in totals_tax.values():
+ if tax.tipo == 'E' or tax.tipo == 'T':
+ continue
+ if tax.tasa == round(Decimal(2/3), 6):
+ import_tax = round(float(tax.tasa) * total_iva, 2)
+ else:
+ import_tax = round(float(tax.tasa) * tax.importe, 2)
+ total_retenciones = (total_retenciones or 0) + import_tax
+
+ invoice_tax = {
+ 'factura': invoice.id,
+ 'impuesto': tax['id'],
+ 'base': tax['importe'],
+ 'importe': import_tax,
+ }
+ FacturasImpuestos.create(**invoice_tax)
+
+ total = subtotal + (total_trasladados or 0) - (total_retenciones or 0)
+ total_mn = round(total * invoice.tipo_cambio, 2)
+ data = {
+ 'subtotal': subtotal,
+ 'total': total,
+ 'total_mn': total_mn,
+ 'total_trasladados': total_trasladados,
+ 'total_retenciones': total_retenciones,
+ }
+ return data
+
+ @classmethod
+ def add(cls, values):
+ #~ print ('VALUES', values)
+ productos = util.loads(values.pop('productos'))
+
+ emisor = Emisor.select()[0]
+ values['folio'] = cls._get_folio(cls, values['serie'])
+ values['tipo_cambio'] = float(values['tipo_cambio'])
+ values['lugar_expedicion'] = emisor.codigo_postal
+
+ with database_proxy.atomic() as txn:
+ obj = Facturas.create(**values)
+ totals = cls._calculate_totals(cls, obj, productos)
+ obj.subtotal = totals['subtotal']
+ obj.total_trasladados = totals['total_trasladados']
+ obj.total_retenciones = totals['total_retenciones']
+ obj.total = totals['total']
+ obj.total_mn = totals['total_mn']
+ obj.save()
+
+ msg = 'Factura guardada correctamente. Enviando a timbrar'
+ row = {
+ 'id': obj.id,
+ 'serie': obj.serie,
+ 'folio': obj.folio,
+ 'uuid': obj.uuid,
+ 'fecha': obj.fecha,
+ 'tipo_comprobante': obj.tipo_comprobante,
+ 'estatus': obj.estatus,
+ 'total_mn': obj.total_mn,
+ 'cliente': obj.cliente.nombre,
+ }
+ data = {'ok': True, 'row': row, 'new': True, 'error': False, 'msg': msg}
+ return data
+
+ def _make_xml(self, invoice):
+ emisor = Emisor.select()[0]
+ certificado = Certificado.select()[0]
+ comprobante = {}
+ if invoice.serie:
+ comprobante['Serie'] = invoice.serie
+ if invoice.condiciones_pago:
+ comprobante['CondicionesDePago'] = invoice.condiciones_pago
+ if invoice.descuento:
+ comprobante['Descuento'] = invoice.descuento
+
+ comprobante['Folio'] = str(invoice.folio)
+ comprobante['Fecha'] = invoice.fecha.isoformat()[:19]
+ comprobante['FormaPago'] = invoice.forma_pago
+ comprobante['NoCertificado'] = certificado.serie
+ comprobante['Certificado'] = certificado.cer_txt
+ comprobante['SubTotal'] = FORMAT.format(invoice.subtotal)
+ comprobante['Moneda'] = invoice.moneda
+ comprobante['TipoCambio'] = '1'
+ if comprobante['Moneda'] != 'MXN':
+ comprobante['TipoCambio'] = FORMAT.format(invoice.tipo_cambio)
+ comprobante['Total'] = FORMAT.format(invoice.total)
+ comprobante['TipoDeComprobante'] = invoice.tipo_comprobante
+ comprobante['MetodoPago'] = invoice.metodo_pago
+ comprobante['LugarExpedicion'] = invoice.lugar_expedicion
+
+ emisor = {
+ 'Rfc': emisor.rfc,
+ 'Nombre': emisor.nombre,
+ 'RegimenFiscal': invoice.regimen_fiscal,
+ }
+
+ receptor = {
+ 'Rfc': invoice.cliente.rfc,
+ 'Nombre': invoice.cliente.nombre,
+ 'UsoCFDI': invoice.uso_cfdi,
+ }
+
+ conceptos = []
+ rows = FacturasDetalle.select().where(FacturasDetalle.factura==invoice)
+ for row in rows:
+ concepto = {
+ 'ClaveProdServ': row.producto.clave_sat,
+ 'NoIdentificacion': row.producto.clave,
+ 'Cantidad': FORMAT.format(row.cantidad),
+ 'ClaveUnidad': row.producto.unidad.key,
+ 'Unidad': row.producto.unidad.name,
+ 'Descripcion': row.producto.descripcion,
+ 'ValorUnitario': FORMAT.format(row.valor_unitario),
+ 'Importe': FORMAT.format(row.importe),
+ }
+
+ taxes = {}
+ traslados = []
+ retenciones = []
+
+ for impuesto in row.producto.impuestos:
+ if impuesto.tipo == 'E':
+ continue
+ import_tax = round(impuesto.tasa * row.importe, 2)
+ tipo_factor = 'Tasa'
+ if impuesto.factor != 'T':
+ tipo_factor = 'Cuota'
+ tax = {
+ "Base": FORMAT.format(row.importe),
+ "Impuesto": impuesto.key,
+ "TipoFactor": tipo_factor,
+ "TasaOCuota": str(impuesto.tasa),
+ "Importe": FORMAT.format(import_tax),
+ }
+ if impuesto.tipo == 'T':
+ traslados.append(tax)
+ else:
+ retenciones.append(tax)
+
+ taxes['traslados'] = traslados
+ taxes['retenciones'] = retenciones
+ concepto['impuestos'] = taxes
+ conceptos.append(concepto)
+
+ impuestos = {}
+ traslados = []
+ retenciones = []
+ if not invoice.total_trasladados is None:
+ impuestos['TotalImpuestosTrasladados'] = \
+ FORMAT.format(invoice.total_trasladados)
+ if not invoice.total_retenciones is None:
+ impuestos['TotalImpuestosRetenidos'] = \
+ FORMAT.format(invoice.total_retenciones)
+
+ taxes = (FacturasImpuestos
+ .select()
+ .where(FacturasImpuestos.factura==invoice))
+ for tax in taxes:
+ tipo_factor = 'Tasa'
+ if tax.impuesto.factor != 'T':
+ tipo_factor = 'Cuota'
+ if tax.impuesto.tipo == 'T':
+ traslado = {
+ "Impuesto": tax.impuesto.key,
+ "TipoFactor": tipo_factor,
+ "TasaOCuota": str(tax.impuesto.tasa),
+ "Importe": FORMAT.format(tax.importe),
+ }
+ traslados.append(traslado)
+ else:
+ retencion = {
+ "Impuesto": tax.impuesto.key,
+ "Importe": FORMAT.format(tax.importe),
+ }
+ retenciones.append(retencion)
+
+ impuestos['traslados'] = traslados
+ impuestos['retenciones'] = retenciones
+
+ data = {
+ 'comprobante': comprobante,
+ 'emisor': emisor,
+ 'receptor': receptor,
+ 'conceptos': conceptos,
+ 'impuestos': impuestos,
+ }
+ return util.make_xml(data, certificado)
+
+ @classmethod
+ def timbrar(cls, id):
+ obj = Facturas.get(Facturas.id == id)
+ obj.xml = cls._make_xml(cls, obj)
+ obj.estatus = 'Generada'
+ obj.save()
+
+ error = False
+ msg = 'Factura timbrada correctamente'
+ result = util.timbra_xml(obj.xml)
+ if result['ok']:
+ obj.xml = result['xml']
+ obj.uuid = result['uuid']
+ obj.fecha_timbrado = result['fecha']
+ obj.estatus = 'Timbrada'
+ obj.save()
+ row = {'uuid': obj.uuid, 'estatus': 'Timbrada'}
+ else:
+ error = True
+ msg = result['error']
+ obj.estatus = 'Error'
+ obj.error = msg
+ row = {'estatus': 'Error'}
+ obj.save()
+ return {'ok': result['ok'], 'msg': msg, 'row': row}
+
+
+class FacturasDetalle(BaseModel):
+ factura = ForeignKeyField(Facturas)
+ producto = ForeignKeyField(Productos, null=True)
+ cantidad = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ valor_unitario = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ descuento = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ precio_final = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ importe = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ descripcion = TextField(default='')
+ unidad = TextField(default='')
+ clave = TextField(default='')
+ clave_sat = TextField(default='')
+ categoria = TextField(default='')
+ aduana = TextField(default='')
+ pedimento = TextField(default='')
+ fecha_pedimento = DateField(null=True)
+ alumno = TextField(default='')
+ curp = TextField(default='')
+ nivel = TextField(default='')
+ autorizacion = TextField(default='')
+ cuenta_predial = TextField(default='')
+
+ class Meta:
+ order_by = ('factura',)
+
+
+class FacturasImpuestos(BaseModel):
+ factura = ForeignKeyField(Facturas)
+ impuesto = ForeignKeyField(SATImpuestos)
+ base = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+ importe = DecimalField(default=0.0, decimal_places=6, auto_round=True)
+
+ class Meta:
+ order_by = ('factura',)
+ indexes = (
+ (('factura', 'impuesto'), True),
+ )
+
+
+def authenticate(args):
+ respuesta = {'login': False, 'msg': 'No Autorizado', 'user': ''}
+ values = util.get_con(args['rfc'])
+ if not values:
+ return respuesta
+
+ conectar(values)
+ try:
+ obj = Usuarios.get(usuario=args['usuario'], es_activo=True)
+ except Usuarios.DoesNotExist:
+ return respuesta
+
+ if not obj.contraseña.check_password(args['contra']):
+ return respuesta
+
+ obj.ultimo_ingreso = util.now()
+ obj.save()
+ respuesta['msg'] = ''
+ respuesta['login'] = True
+ respuesta['user'] = str(obj)
+ respuesta['super'] = obj.es_superusuario
+ #~ desconectar()
+ return respuesta
+
+
+def get_cp(cp):
+ con = sqlite3.connect(PATH_CP)
+ cursor = con.cursor()
+ sql = """
+ SELECT colonia, municipio, estado
+ FROM colonias, municipios, estados
+ WHERE colonias.id_municipio=municipios.id
+ AND municipios.id_estado=estados.id
+ AND cp=?
+ ORDER BY colonia"""
+ cursor.execute(sql, (cp,))
+ rows = cursor.fetchall()
+ cursor.close()
+ con.close()
+
+ data = {}
+ if rows:
+ data = {
+ 'estado': rows[0][2],
+ 'municipio': rows[0][1],
+ }
+ if len(rows) == 1:
+ data['colonia'] = rows[0][0]
+ else:
+ data['colonia'] = [r[0] for r in rows]
+ return data
+
+
+def get_sat_key(key):
+ return util.get_sat_key('products', key)
+
+
+def _init_values():
+ data = (
+ {'key': 'version', 'value': VERSION},
+ {'key': 'rfc_publico', 'value': 'XAXX010101000'},
+ {'key': 'rfc_extranjero', 'value': 'XEXX010101000'},
+ )
+ for row in data:
+ try:
+ Configuration.create(**row)
+ except IntegrityError:
+ pass
+ log.info('Valores iniciales insertados...')
+ return
+
+
+def _crear_tablas():
+ tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion,
+ Emisor, Facturas, FacturasDetalle, FacturasImpuestos, Folios, Productos,
+ SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes,
+ SATUnidades, SATUsoCfdi, Socios, Tags, Usuarios,
+ Emisor.regimenes.get_through_model(),
+ Socios.tags.get_through_model(),
+ Productos.impuestos.get_through_model(),
+ Productos.tags.get_through_model(),
+ ]
+ database_proxy.create_tables(tablas, True)
+ log.info('Tablas creadas correctamente...')
+ return True
+
+
+def migrate_tables():
+ connect()
+ log.info('Tablas migradas correctamente...')
+ return
+
+
+def _agregar_superusuario():
+ args = util.get_con()
+ if not args:
+ return
+
+ conectar(args)
+ usuario = input('Introduce el nuevo nombre para el superusuario: ').strip()
+ if not usuario:
+ msg = 'El nombre de usuario es requerido'
+ log.erro(msg)
+ return
+ ok, contraseña = util.get_pass()
+ if not ok:
+ log.error(contraseña)
+ return
+ try:
+ obj = Usuarios.create(
+ usuario=usuario, contraseña=contraseña, es_superusuario=True)
+ except IntegrityError:
+ msg = 'El usuario ya existe'
+ log.error(msg)
+ return
+
+ log.info('SuperUsuario creado correctamente...')
+ return
+
+
+def _cambiar_contraseña():
+ args = util.get_con()
+ if not args:
+ return
+
+ conectar(args)
+ usuario = input('Introduce el nombre de usuario: ').strip()
+ if not usuario:
+ msg = 'El nombre de usuario es requerido'
+ log.error(msg)
+ return
+
+ try:
+ obj = Usuarios.get(usuario=usuario)
+ except Usuarios.DoesNotExist:
+ msg = 'El usuario no existe'
+ log.error(msg)
+ return
+
+ ok, contraseña = util.get_pass()
+ if not ok:
+ log.error(contraseña)
+ return
+
+ obj.contraseña = contraseña
+ obj.save()
+
+ log.info('Contraseña cambiada correctamente...')
+ return
+
+
+def _add_emisor(rfc, args):
+ con = sqlite3.connect(COMPANIES)
+ cursor = con.cursor()
+ sql = """
+ INSERT INTO names
+ VALUES (?, ?)"""
+ try:
+ cursor.execute(sql, (rfc, args))
+ except sqlite3.IntegrityError as e:
+ log.error(e)
+ return False
+
+ con.commit()
+ cursor.close()
+ con.close()
+ return True
+
+
+def _iniciar_bd():
+ rfc = input('Introduce el RFC: ').strip().upper()
+ if not rfc:
+ msg = 'El RFC es requerido'
+ log.error(msg)
+ return
+
+ args = util.get_con(rfc)
+ if not args:
+ return
+
+ conectar(args)
+ if _crear_tablas():
+ return
+
+ log.error('No se pudieron crear las tablas')
+ return
+
+
+def _agregar_rfc():
+ rfc = input('Introduce el nuevo RFC: ').strip().upper()
+ if not rfc:
+ msg = 'El RFC es requerido'
+ log.error(msg)
+ return
+
+ datos = input('Introduce los datos de conexión: ').strip()
+ if not datos:
+ msg = 'Los datos de conexión son requeridos'
+ log.error(msg)
+ return
+
+ opt = util.parse_con(datos)
+ if not opt:
+ log.error('Datos de conexión incompletos')
+ return
+
+ args = opt.copy()
+ if conectar(args):
+ if _add_emisor(rfc, util.dumps(opt)) and _crear_tablas():
+ log.info('RFC agregado correctamente...')
+ return
+
+ log.error('No se pudo agregar el RFC')
+ return
+
+
+def _listar_rfc():
+ data = util.get_rfcs()
+ for row in data:
+ msg = 'RFC: {}\n\t{}'.format(row[0], row[1])
+ log.info(msg)
+ return
+
+
+def _importar_valores(archivo):
+ rfc = input('Introduce el RFC: ').strip().upper()
+ if not rfc:
+ msg = 'El RFC es requerido'
+ log.error(msg)
+ return
+
+ args = util.get_con(rfc)
+ if not args:
+ return
+
+ conectar(args)
+
+ log.info('Importando datos...')
+ regimen = ''
+ rows = util.loads(open(archivo, 'r').read())
+ for row in rows:
+ log.info('\tImportando tabla: {}'.format(row['tabla']))
+ if row['tabla'] == 'Emisor' and 'regimen' in row:
+ regimen = row['regimen']
+ table = globals()[row['tabla']]
+ for r in row['datos']:
+ try:
+ table.create(**r)
+ except IntegrityError:
+ pass
+
+ if regimen:
+ emisor = Emisor.select()[0]
+ regimen = SATRegimenes.get(SATRegimenes.key == regimen)
+ emisor.regimenes.clear()
+ emisor.regimenes.add(regimen)
+
+ log.info('Importación terminada...')
+ return
+
+
+CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
+help_create_tables = 'Crea las tablas en la base de datos'
+help_migrate_db = 'Migra las tablas en la base de datos'
+help_superuser = 'Crea un nuevo super usuario'
+help_change_pass = 'Cambia la contraseña a un usuario'
+help_rfc = 'Agrega un nuevo RFC'
+help_br = 'Elimina un RFC'
+help_lr = 'Listar RFCs'
+
+@click.command(context_settings=CONTEXT_SETTINGS)
+@click.option('-bd', '--iniciar-bd',help=help_create_tables,
+ is_flag=True, default=False)
+@click.option('-m', '--migrar-bd', help=help_migrate_db,
+ is_flag=True, default=False)
+@click.option('-ns', '--nuevo-superusuario', help=help_superuser,
+ is_flag=True, default=False)
+@click.option('-cc', '--cambiar-contraseña', help=help_change_pass,
+ is_flag=True, default=False)
+@click.option('-rfc', '--rfc', help=help_rfc, is_flag=True, default=False)
+@click.option('-br', '--borrar-rfc', help=help_br, is_flag=True, default=False)
+@click.option('-lr', '--listar-rfc', help=help_lr, is_flag=True, default=False)
+@click.option('-i', '--importar_valores', is_flag=True, default=False)
+@click.option('-a', '--archivo')
+def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña, rfc,
+ borrar_rfc, listar_rfc, importar_valores, archivo):
+ opt = locals()
+
+ if opt['iniciar_bd']:
+ _iniciar_bd()
+ sys.exit(0)
+
+ if opt['migrar_bd']:
+ migrate_tables()
+ sys.exit(0)
+
+ if opt['nuevo_superusuario']:
+ _agregar_superusuario()
+ sys.exit(0)
+
+ if opt['cambiar_contraseña']:
+ _cambiar_contraseña()
+ sys.exit(0)
+
+ if opt['rfc']:
+ _agregar_rfc()
+ sys.exit(0)
+
+ if opt['borrar_rfc']:
+ _borrar_rfc()
+ sys.exit(0)
+
+ if opt['listar_rfc']:
+ _listar_rfc()
+ sys.exit(0)
+
+ if opt['importar_valores']:
+ if not opt['archivo']:
+ msg = 'Falta la ruta del archivo importar'
+ raise click.ClickException(msg)
+ if not util.is_file(opt['archivo']):
+ msg = 'No es un archivo'
+ raise click.ClickException(msg)
+
+ _importar_valores(opt['archivo'])
+ sys.exit(0)
+
+ return
+
+
+if __name__ == '__main__':
+ main()
+
diff --git a/source/app/settings.py b/source/app/settings.py
new file mode 100644
index 0000000..88b87ff
--- /dev/null
+++ b/source/app/settings.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+
+import logbook
+import os
+import sys
+from mako.lookup import TemplateLookup
+from logbook import Logger, StreamHandler, RotatingFileHandler
+logbook.set_datetime_format('local')
+
+
+DEBUG = True
+VERSION = '0.1.0'
+EMAIL_SUPPORT = ('soporte@empresalibre.net',)
+
+BASE_DIR = os.path.abspath(os.path.dirname(__file__))
+PATH_STATIC = os.path.abspath(os.path.join(BASE_DIR, '..'))
+PATH_TEMPLATES = os.path.abspath(os.path.join(BASE_DIR, '..', 'templates'))
+
+PATH_CP = os.path.abspath(os.path.join(BASE_DIR, '..', 'db', 'cp.db'))
+COMPANIES = os.path.abspath(os.path.join(BASE_DIR, '..', 'db', 'rfc.db'))
+DB_SAT = os.path.abspath(os.path.join(BASE_DIR, '..', 'db', 'sat.db'))
+
+PATH_XSLT = os.path.abspath(os.path.join(BASE_DIR, '..', 'xslt'))
+PATH_BIN = os.path.abspath(os.path.join(BASE_DIR, '..', 'bin'))
+
+template_lookup = TemplateLookup(directories=[PATH_TEMPLATES],
+ input_encoding='utf-8',
+ output_encoding='utf-8')
+
+LOG_PATH = 'empresalibre.log'
+LOG_NAME = 'API'
+LOG_LEVEL = 'INFO'
+
+format_string = '[{record.time:%d-%b-%Y %H:%M:%S}] ' \
+ '{record.level_name}: ' \
+ '{record.channel}: ' \
+ '{record.message}'
+
+if DEBUG:
+ LOG_LEVEL = 'DEBUG'
+ StreamHandler(
+ sys.stdout,
+ level=LOG_LEVEL,
+ format_string=format_string).push_application()
+else:
+ LOG_PATH = '/srv/log/empresalibre.log'
+ RotatingFileHandler(
+ LOG_PATH,
+ backup_count=10,
+ max_size=1073741824,
+ level=LOG_LEVEL,
+ format_string=format_string).push_application()
+
+log = Logger(LOG_NAME)
+
+
+PATH_XSLTPROC = 'xsltproc'
+PATH_OPENSSL = 'openssl'
+if 'win' in sys.platform:
+ PATH_XSLTPROC = os.path.join(PATH_BIN, 'xsltproc.exe')
+ PATH_OPENSSL = os.path.join(PATH_BIN, 'openssl.exe')
diff --git a/source/db/cp.db b/source/db/cp.db
new file mode 100644
index 0000000..2c0bfb5
Binary files /dev/null and b/source/db/cp.db differ
diff --git a/source/db/rfc.db b/source/db/rfc.db
new file mode 100644
index 0000000..c8e7c93
Binary files /dev/null and b/source/db/rfc.db differ
diff --git a/source/db/sat.db b/source/db/sat.db
new file mode 100644
index 0000000..f86398d
Binary files /dev/null and b/source/db/sat.db differ
diff --git a/source/db/valores_iniciales.json b/source/db/valores_iniciales.json
new file mode 100644
index 0000000..60fae31
--- /dev/null
+++ b/source/db/valores_iniciales.json
@@ -0,0 +1,116 @@
+[
+{
+ "tabla": "Categorias",
+ "datos": [
+ {"categoria": "Productos"},
+ {"categoria": "Servicios"}
+ ]
+},
+{
+ "tabla": "SATImpuestos",
+ "datos": [
+ {"key": "002", "name": "IVA", "tasa": 0.16, "activo": true, "default": true},
+ {"key": "001", "name": "ISR", "tasa": 0.10, "tipo": "R", "activo": true},
+ {"key": "002", "name": "IVA", "tasa": 0.0, "activo": true},
+ {"key": "002", "name": "IVA", "tasa": 0.10, "tipo": "R", "activo": true},
+ {"key": "002", "name": "IVA", "tasa": 0.666667, "tipo": "R", "activo": true},
+ {"key": "000", "name": "Exento", "tipo": "E", "factor": "E", "activo": true}
+ ]
+},
+{
+ "tabla": "SATUnidades",
+ "datos": [
+ {"key": "HUR", "name": "Hora", "activo": true},
+ {"key": "H87", "name": "Pieza", "activo": true},
+ {"key": "E48", "name": "Servicio", "activo": true},
+ {"key": "E51", "name": "Trabajo", "activo": false}
+ ]
+},
+{
+ "tabla": "SATMonedas",
+ "datos": [
+ {"key": "MXN", "name": "Peso Mexicano", "activo": true, "default": true},
+ {"key": "USD", "name": "Dólar americano", "activo": false},
+ {"key": "EUR", "name": "Euro", "activo": false}
+ ]
+},
+{
+ "tabla": "SATFormaPago",
+ "datos": [
+ {"key": "01", "name": "Efectivo", "activo": true},
+ {"key": "02", "name": "Cheque nominativo", "activo": true},
+ {"key": "03", "name": "Transferencia electrónica de fondos", "activo": true, "default": true},
+ {"key": "04", "name": "Tarjeta de crédito", "activo": true},
+ {"key": "05", "name": "Monedero electrónico", "activo": false},
+ {"key": "06", "name": "Dinero electrónico", "activo": false},
+ {"key": "08", "name": "Vales de despensa", "activo": false},
+ {"key": "12", "name": "Dación en pago", "activo": false},
+ {"key": "13", "name": "Pago por subrogación", "activo": false},
+ {"key": "14", "name": "Pago por consignación", "activo": false},
+ {"key": "15", "name": "Condonación", "activo": false},
+ {"key": "17", "name": "Compensación", "activo": false},
+ {"key": "23", "name": "Novación", "activo": false},
+ {"key": "24", "name": "Confusión", "activo": false},
+ {"key": "25", "name": "Remisión de deuda", "activo": false},
+ {"key": "26", "name": "Prescripción o caducidad", "activo": false},
+ {"key": "27", "name": "A satisfacción del acreedor", "activo": false},
+ {"key": "28", "name": "Tarjeta de débito", "activo": true},
+ {"key": "29", "name": "Tarjeta de servicios", "activo": false},
+ {"key": "30", "name": "Aplicación de anticipos", "activo": false},
+ {"key": "99", "name": "Por definir", "activo": true}
+ ]
+},
+{
+ "tabla": "SATRegimenes",
+ "datos": [
+ {"key": "601", "name": "General de Ley Personas Morales", "moral": true, "activo": true, "default": true},
+ {"key": "603", "name": "Personas Morales con Fines no Lucrativos", "moral": true, "activo": true},
+ {"key": "605", "name": "Sueldos y Salarios e Ingresos Asimilados a Salarios", "fisica": true, "activo": true},
+ {"key": "606", "name": "Arrendamiento", "fisica": true, "activo": true},
+ {"key": "608", "name": "Demás ingresos", "fisica": true, "activo": false},
+ {"key": "609", "name": "Consolidación", "moral": true, "activo": false},
+ {"key": "610", "name": "Residentes en el Extranjero sin Establecimiento Permanente en México", "fisica": true, "moral": true, "activo": false},
+ {"key": "611", "name": "Ingresos por Dividendos (socios y accionistas)", "fisica": true, "activo": false},
+ {"key": "612", "name": "Personas Físicas con Actividades Empresariales y Profesionales", "fisica": true, "activo": true, "default": true},
+ {"key": "614", "name": "Ingresos por intereses", "fisica": true, "activo": false},
+ {"key": "616", "name": "Sin obligaciones fiscales", "fisica": true, "activo": false},
+ {"key": "620", "name": "Sociedades Cooperativas de Producción que optan por diferir sus ingresos", "moral": true, "activo": false},
+ {"key": "621", "name": "Incorporación Fiscal", "fisica": true, "activo": true},
+ {"key": "622", "name": "Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras", "fisica": true, "moral": true, "activo": false},
+ {"key": "623", "name": "Opcional para Grupos de Sociedades", "moral": true, "activo": false},
+ {"key": "624", "name": "Coordinados", "moral": true, "activo": false},
+ {"key": "628", "name": "Hidrocarburos", "moral": true, "activo": false},
+ {"key": "607", "name": "Régimen de Enajenación o Adquisición de Bienes", "moral": true, "activo": false},
+ {"key": "629", "name": "De los Regímenes Fiscales Preferentes y de las Empresas Multinacionales", "fisica": true, "activo": false},
+ {"key": "630", "name": "Enajenación de acciones en bolsa de valores", "fisica": true, "activo": false},
+ {"key": "615", "name": "Régimen de los ingresos por obtención de premios", "fisica": true, "activo": false}
+ ]
+},
+{
+ "tabla": "SATUsoCfdi",
+ "datos": [
+ {"key": "G01", "name": "Adquisición de mercancias", "moral": true, "activo": true},
+ {"key": "G02", "name": "Devoluciones, descuentos o bonificaciones", "moral": true, "activo": true},
+ {"key": "G03", "name": "Gastos en general", "moral": true, "activo": true, "default": true},
+ {"key": "I01", "name": "Construcciones", "moral": true, "activo": false},
+ {"key": "I02", "name": "Mobilario y equipo de oficina por inversiones", "moral": true, "activo": false},
+ {"key": "I03", "name": "Equipo de transporte", "moral": true, "activo": false},
+ {"key": "I04", "name": "Equipo de computo y accesorios", "moral": true, "activo": false},
+ {"key": "I05", "name": "Dados, troqueles, moldes, matrices y herramental", "moral": true, "activo": false},
+ {"key": "I06", "name": "Comunicaciones telefónicas", "moral": true, "activo": false},
+ {"key": "I07", "name": "Comunicaciones satelitales", "moral": true, "activo": false},
+ {"key": "I08", "name": "Otra maquinaria y equipo", "moral": true, "activo": false},
+ {"key": "D01", "name": "Honorarios médicos, dentales y gastos hospitalarios.", "activo": false},
+ {"key": "D02", "name": "Gastos médicos por incapacidad o discapacidad", "activo": false},
+ {"key": "D03", "name": "Gastos funerales.", "activo": false},
+ {"key": "D04", "name": "Donativos.", "activo": true},
+ {"key": "D05", "name": "Intereses reales efectivamente pagados por créditos hipotecarios (casa habitación).", "activo": false},
+ {"key": "D06", "name": "Aportaciones voluntarias al SAR.", "activo": false},
+ {"key": "D07", "name": "Primas por seguros de gastos médicos.", "activo": false},
+ {"key": "D08", "name": "Gastos de transportación escolar obligatoria.", "activo": false},
+ {"key": "D09", "name": "Depósitos en cuentas para el ahorro, primas que tengan como base planes de pensiones.", "activo": false},
+ {"key": "D10", "name": "Pagos por servicios educativos (colegiaturas)", "activo": true},
+ {"key": "P01", "name": "Por definir", "moral": true, "activo": true}
+ ]
+}
+]
diff --git a/source/static/css/air.css b/source/static/css/air.css
new file mode 100644
index 0000000..9e9f14a
--- /dev/null
+++ b/source/static/css/air.css
@@ -0,0 +1,1403 @@
+/*
+@license
+webix UI v.4.3.0
+This software is covered by Webix Commercial License.
+Usage without proper license is prohibited.
+(c) XB Software Ltd.
+*/
+.webix_view{font-family:Helvetica,Verdana;font-size:13px;color:#1e2022;-webkit-font-smoothing:antialiased;cursor:default;overflow:hidden;border:0 solid #a4bed4;background-color:#fff;white-space:normal;-webkit-appearance:none}
+.webix_view.webix_form{background-color:#fff}
+body{-webkit-tap-highlight-color:transparent!important}
+.webix_abslayout{position:relative}
+.webix_abslayout>.webix_view{position:absolute}
+.webix_layout_space,.webix_layout_wide{background-color:#ebebeb}
+.webix_layout_accordion,.webix_layout_clean,.webix_layout_line,.webix_multiview{background:0 0}
+.webix_overlay{width:100%;height:100%;position:absolute;z-index:10;text-align:center;padding-top:10px}
+.webix_view>.webix_disabled{width:100%;height:100%;position:absolute;top:0;left:0;background-color:#ddd;opacity:.4;filter:alpha(opacity=40);z-index:1}
+.webix_disabled_view{overflow:hidden!important}
+body.webix_full_screen{margin:0;padding:0;overflow:hidden}
+.webix_noselect,.webix_noselect div{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_selectable{-moz-user-select:text;-webkit-user-select:text;user-select:text}
+.webix_template{height:100%;padding:10px;padding-left:10px 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_clean{background:0 0}
+.webix_clean .webix_template{padding:0}
+.webix_section{padding-left:30px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAUCAIAAADDbMD2AAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHElEQVR4nGP4//8/EwMDA158/vx5BmLUMTAwAADGhQiMQPqPwgAAAABJRU5ErkJggg==);background-repeat:repeat-x;background-position:8.5px;color:#444;font-size:10px;text-transform:uppercase;line-height:34px}
+.webix_section>.webix_template{padding:0 8px;background-color:#fff;display:inline}
+.webix_layout_space>.webix_section>.webix_template,.webix_layout_wide>.webix_section>.webix_template{padding:0 8px;background-color:#ebebeb}
+.webix_layout_clean>.webix_section>.webix_template,.webix_layout_line>.webix_section>.webix_template{padding:0 8px;background-color:#fff}
+.webix_header>div{padding-left:10px;font-family:Helvetica,Verdana;font-size:13px;font-weight:700;color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);line-height:32px;line-height:34px;padding-top:0;padding-bottom:0}
+.webix_header>div .webix_el_label,.webix_header>div .webix_inp_label{color:#1e2022}
+.webix_spacer{background:0 0}
+.webix_view_animate{position:relative;width:100%;height:100%}
+x\:ui{display:none}
+.webix_flexlayout{display:flex!important;flex-wrap:wrap;flex-direction:row;overflow:hidden;box-sizing:border-box}
+.webix_flexlayout>div{display:block!important}
+.webix_view_align{background:0 0}
+.webix_view a.webix_list_item:focus,.webix_view div:focus,.webix_view span:focus,.webix_view.webix_window:focus{outline:#727981 dotted 1px}
+.webix_view a.webix_list_item:active,.webix_view div.webix_inp_static:focus,.webix_view div:active,.webix_view span:active,button,input,select,textarea{outline:0}
+.webix_resize_area{position:absolute;top:0;left:0;width:100%;height:100%}
+.webix_resize_handle_x .webix_handle_content,.webix_resize_handle_y .webix_handle_content{width:100%;height:100%;background:rgba(100,100,100,.1);border:1px dotted #9fa5aa}
+.webix_resize_handle_x{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:e-resize;width:1px;height:100%;position:absolute;z-index:2;top:0}
+.webix_resize_handle_x .webix_handle_content{border-width:0 1px}
+.webix_resize_origin_x{cursor:e-resize;width:3px;height:100%;position:absolute;z-index:2;top:0}
+.webix_resize_handle_y{cursor:n-resize;height:1px;width:100%;position:absolute;z-index:2;left:0}
+.webix_resize_handle_y .webix_handle_content{border-width:1px 0}
+.webix_resize_origin_y{cursor:n-resize;height:3px;width:100%;position:absolute;z-index:2;left:0}
+.webix_resizer.webix_disabled_view{cursor:default}
+.webix_resizer_vy{cursor:n-resize;margin-top:0!important;border:0!important;padding:0!important;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==) center center no-repeat}
+.webix_resizer_vx{cursor:e-resize;margin-left:0!important;border:0!important;padding:0!important;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC) center center no-repeat}
+.webix_resizer_y{cursor:n-resize;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==) center center no-repeat #fff}
+.webix_resizer_x{cursor:e-resize;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC) center center no-repeat #fff}
+.webix_accordionitem_body{position:relative}
+.webix_accordionitem_header{border-bottom:1px solid #a4bed4;position:relative;z-index:2;font-family:Helvetica,Verdana;font-size:13px;font-weight:700;color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);line-height:32px;cursor:pointer;overflow:hidden}
+.webix_accordionitem_header .webix_el_label,.webix_accordionitem_header .webix_inp_label{color:#1e2022}
+.webix_ie.horizontal>.webix_accordionitem_header.collapsed{-ms-writing-mode:tb-lr}
+.webix_ie.horizontal>.webix_accordionitem_header.collapsed .webix_accordionitem_label{padding-left:0;padding-top:10px}
+.webix_ie.horizontal>.webix_accordionitem_header.collapsed .webix_accordionitem_button{margin:0}
+.webix_accordionitem_label{height:100%;padding-left:10px}
+.webix_accordionitem_button{float:right;position:relative;height:11px;width:11px;margin:14px}
+.webix_carousel{position:relative}
+.webix_nav_panel{bottom:15px;height:auto;line-height:8px;overflow:hidden;position:absolute;text-align:center}
+.webix_nav_item{display:inline-block;height:8px;padding:6px 5px 6px 4px;width:8px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_nav_item div{border-radius:50%;display:block;height:8px;width:8px}
+.webix_nav_inactive div{border:1px solid rgba(0,0,0,.15);filter:alpha(opacity=60);opacity:.6;background:#fff}
+.webix_nav_active div{border:1px solid rgba(0,0,0,.1);background:#fff}
+.webix_nav_button_next,.webix_nav_button_prev{cursor:pointer;display:block;height:24px;position:absolute;width:24px}
+.webix_nav_button_next .webix_nav_button_inner,.webix_nav_button_prev .webix_nav_button_inner{height:100%;width:100%}
+.webix_nav_button_prev .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAkFBMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9oY44IAAAAL3RSTlMA5gMYAUkXBucVVEocD8fDs9UOpxPMrJ/d0Zo9Vtuc2KHTqc8RBa7KtsUMwNoZ5NXTkv8AAAB+SURBVHhepZFFEsNADARnwY6zhiAzM/z/d9ED+mYd1aUakDL3g3GZbI9EhnHagl5ICJqhcgKTWp0+gMVYfgoag678CMTfH8UZuJpXikuyu5LWmGNjF1sMuMvl95j8YK6OWMnprMsVu7pZ8jt29XgqcLuvkFo8yjEoVBYEvuUf4K9fs/aQs0YAAAAASUVORK5CYII=)}
+.webix_nav_button_next .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAllBMVEX////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////MC6PrAAAAMXRSTlMA5gMBGA9JFecGSlXMrBPRwxfVn8ezp5oc3Fc8nBvboRbXqdOuBRHPtsoMxVTAGdrkjQ/x3gAAAHlJREFUeF6l0TUSxUAAAlDW4v7d3ZX7Xy4XoAvtKxgGRIYiJoIhpYA6HAC5bzS0CGMJkxShUMDSoqoVcGoRdwo4cvj+FHDmMF8o4BJYKVg7bLYCdhb7g+g4WsQnseN8wfUmdtxThAcFeDxfVPD2n6FHGQ0JskTBP+sBkWlj0yhGTYEAAAAASUVORK5CYII=)}
+.webix_nav_panel_corner{right:73px}
+.webix_nav_button_corner.webix_nav_button_prev{bottom:13px;right:37px}
+.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:hover{opacity:1}
+.webix_nav_button_corner.webix_nav_button_next{bottom:13px;right:7px}
+.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:hover{opacity:1}
+.webix_nav_panel_side{margin:0 auto;left:0;width:100%}
+.webix_nav_button_side{height:34px;width:21px;top:50%;margin-top:-17px}
+.webix_nav_button_side.webix_nav_button_next{left:auto;right:15px}
+.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAMAAACHtmKxAAAAY1BMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Dm4mgAAAAIHRSTlMAeoGDeXuCgH94fHaE+Xdn/OXaWa6xVBPgqn4SpPffYIKC8HcAAABrSURBVHherchHDoAgEADAVbBh7135/yst2YOQjWJ0jgNtFRcl6Gq5C/XNJNW5PCXqppLsCDswanbf3KhdbOtL29jOqxZqe2RzXPZjWpiucdqP6bxO75qCygbTh6uOSoiphP7IATTjNC+rnhuwqx1LOFJshAAAAABJRU5ErkJggg==)}
+.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover{opacity:1}
+.webix_nav_button_side.webix_nav_button_prev{left:15px;right:auto}
+.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAMAAACHtmKxAAAARVBMVEX///////////////////////////////////////////////////////////////////////////////////////////+QFj7cAAAAFnRSTlMADxBTWV9ndXx9g4SlqKrZ29zh8vb3FGTUtQAAAEZJREFUeF7lyDcSgDAMBMBzIsqBYP3/qVBQaa6kYdhyYYXWi7c56S2z1JOlbiw1sZx/mFieHfF+rx/vSLuC9QHWAmvYu7gLhysVAAFZzegAAAAASUVORK5CYII=)}
+.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover{opacity:1}
+.webix_carousel>.webix_scroll_x,.webix_carousel>.webix_scroll_y{background-color:transparent}
+.webix_dark .webix_nav_inactive div{background-color:#95a5a6}
+.webix_dark .webix_nav_active div{background-color:#7f8c8d}
+.webix_dark .webix_nav_button_prev .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSIURgotfwAAASxJREFUSMfNlbErhlEUh5/vJZOSQSijshgsFiklhdj0lcHw5SP7uX+A8we4d1c+g2RgsIjIxmCxGCzKRO9bMjCSWE5WpXPrO9MZbs9T5577u7XNrTgPtIBBfKsEmkUmOMZsFZngv5KCzNW2gmsbbT2H4AZY0CAVcOUtuAXmNMi7xtQF7HgK7oBZDfKmMXUAB8Cil+AemNEgrwbfB5a8LvnB4C8aU83Gsuy1RY/AtAYpDb4NNDzXtKFBnqyvA+ve72BXYxqy/shyy1UwDFxqTP0a5BvYAPa8X/KISfo0yBewChx6R8UocKEx9ZpkBTj2zqIx4Fxj6tEgn7aqZ95RMQ6cakzdGuTDxuUedhPAicY0AEz+dbjzn3E9ZX9ue3w4ZUZ+VQBrQJUB/gw0fwC/UlVpnH2f9AAAAABJRU5ErkJggg==)}
+.webix_dark .webix_nav_button_next .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSENCUzWfAAAAS1JREFUSMfN1TFLXEEUhuFnr8FKCBaGiK2FRQobG7GSgBG2E8IWFmE3wX7uD3B+QOb2QpaAiMWmsAkJBtMEizQ2FmmCXcIuhBRpDZI0g7XCXNhTD+8L53znTGf/ddrGEIvK1hiDqiW4zBxWLcFvJZWWayoEz3Mbz9sSfIl1mKCLr20I3sTUzMY6/MEzXJQWdHEcUzOTJVu4LD3kHRxlyW88xbfSKerldnViHX5lyffSMX2BgywZYxNXpffgVY6uWIcfWVpUMMQIYmqW8Lak4BB7sQ7/Ymoe4QzLpQQj9GMdbmJqFvAZK6WGfILdDJ/HJzwpFdOP6MU6/I2peYhTrJZctH6sw3VMzRw+YK30qdiIqXmM91i/b+Qe3OHNu6n/cMYt8icVXmLSAvwnBv8B+EFU7qlZ1xIAAAAASUVORK5CYII=)}
+.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSI77dsQJgAAARxJREFUSMet1jFqAkEUxvH/rkIqLVN5ES2CjScQG6tUESx3SWOMLKgggt7BC6SxsnIr9w4ewAsEEis3RTBE3N3ZmfemHB4/HsPMm89L0xTJilbrLrAAGsAWeKkKwTEw/bfVAy6ea6cZ4HV9+8ogwMm6UwMI8Owrg5MoDDa+MjgF8LXBUqgtaERdwELUFcxFJWAmKgXvUA3wBtUC/1BNEKBCra4KXjt9MNScbadYJd7t9nGSVIGnnJpOnCRf7VbzYNMpURi8A7OCumW0Wr9aodrw7T39hedS+P5FhcFYCme/fSGcP6UEcPE8dYTNk98BLvdHWcLlf1ML2CVMzIC3gpK+U5YywEdJQMuDP50CmuGMt55C6B0AI+AR+ACGPw26r6m12WOpAAAAAElFTkSuQmCC)}
+.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSE1IU5u4gAAAW1JREFUSMet1rtOwzAUgOG/5jbBwsQD8BAwIAa2TggegjmRgELbuFeo1GRlQEJMMDN264CUiYdgg0dolzIkFUEk9nHSbLGtT76cc+xaMA53gUegDnwCgfa9Vyp8CngCToFNYB940WF0WRWt57SPqsAK+C7oG+kwuiqLdg3992Xgtelk8jGN4w3gqGDMyTSOZ8eHB+8uM0X7XhMYGMbd6TC6dkIzcH8VsMr+aN9rCeCGEyqEhzZY5TWmcM8C3zihKdy2wIMiWJmWURZWtk1P4a4FvnVCUziwwP0srKQBLYSbALXFYuGU1zqMNBAYhrRUiSI0s/RvKcdZNoChcQt8Tz5TKSg/fQdQFqdJcJvAXha0Z1QCDixgW577drCbBxZXKRkYyOtpkm6lwf+VPwH7VcC/d5Qd7EjA39s0KQQ2UIvvfbZ3zoEHU2Rp3+u4vlDGqwSX6N4qwSX6ltMelAUB1oELYA6cAV/poTxXeZ/+AOFqn1e/Gh7yAAAAAElFTkSuQmCC)}
+.webix_list_item{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2px 10px;line-height:23px;cursor:pointer;border-bottom:1px solid #ebebeb;text-align:left}
+.webix_list_item.webix_invalid{background-color:#fee}
+.webix_list_item.webix_selected{color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f)}
+.webix_list .webix_list_item.webix_selected{border-bottom:1px solid #ffd47b;box-shadow:0 1px #ffe3a9 inset;padding:2px 10px}
+.webix_group{position:relative}
+.webix_group_back,.webix_group_back.webix_selected{position:relative;color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%)}
+.webix_arrow_icon{position:absolute;top:50%;bottom:50%;margin-top:-12px;right:15px;width:9px;height:22px;line-height:22px;color:#1e2022;font-size:18px;font-family:FontAwesome}
+.webix_arrow_icon:before{content:'\f105'}
+.webix_group_back{padding-left:29px}
+.webix_group_back .webix_arrow_icon{left:11px}
+.webix_group_back .webix_arrow_icon:before{content:'\f104'}
+.dhx_pagelist{position:relative}
+.webix_list_count{float:right;width:25px;font-size:14px;text-align:center;margin-right:45px;box-shadow:0 1px 0 #000;text-shadow:0 -1px 0 rgba(0,0,0,.6)}
+.webix_unit_header{padding:0 10px;line-height:19px;text-align:left;background-color:#d6e8ff}
+.webix_list-x .webix_list_item{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;border-bottom:none}
+.webix_list-x .webix_list_item.webix_selected{border-right:1px solid #ffd47b;border-left:1px solid #ffd47b;padding-left:9px}
+.webix_list-x .webix_scroll_cont{display:inline}
+.webix_view.webix_list-x{white-space:nowrap}
+.webix_list_item.webix_disabled{color:#8b949e}
+.webix_list_item.webix_disabled .webix_submenu_icon{visibility:hidden}
+.webix_view.webix_pager{padding:2px 0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:transparent}
+.webix_pager_item,.webix_pager_item_selected{padding:0 6px;text-align:center;height:100%;width:32px;border:1px solid #a4bed4;margin:0 2px;cursor:pointer;background-color:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:Helvetica,Verdana;font-size:13px}
+.webix_pager_item_selected{cursor:default;background-color:#ffdb8f;border:1px solid #ffd47b}
+.webix_animation .webix_ss_header{position:relative;z-index:10}
+.webix_animation .webix_ss_footer,.webix_animation .webix_vscroll_x{position:absolute;bottom:0;z-index:10}
+.webix_allow_selection{-moz-user-select:text;-webkit-user-select:text;user-select:text}
+.webix_dataview_item{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2px 10px;line-height:23px;cursor:pointer;border-bottom:1px solid #ebebeb;text-align:left;border-right:1px solid #ebebeb}
+.webix_dataview_item.webix_selected{color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f);border-bottom:1px solid #ffd47b;border-right:1px solid #ffd47b}
+.webix_chart{position:relative;font-family:Helvetica,Verdana;font-size:13px;color:#1e2022;overflow:hidden;z-index:1}
+.webix_chart canvas{position:absolute}
+.webix_canvas_text{position:absolute;text-align:center;overflow:hidden;white-space:nowrap;font-size:12px;z-index:100}
+.webix_map_img{width:100%;height:100%;position:absolute;top:0;left:0;border:0;filter:alpha(opacity=0);opacity:0}
+.webix_axis_item_y{position:absolute;height:18px;line-height:18px;margin-top:-4px;text-align:right}
+.webix_axis_item_x{padding-top:2px}
+.webix_axis_title_x{text-align:center;font-size:13px}
+.webix_axis_title_y{text-align:center;font-family:Verdana;font-size:13px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);padding-left:3px}
+.webix_ie_filter{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}
+.webix_chart_legend{position:absolute;z-index:1000}
+.webix_chart_legend_item{height:18px;line-height:18px;padding:2px}
+.webix_chart_legend_item.hidden{color:#9aa0a5}
+.webix_axis_item_y.webix_radar{color:#555;font-size:11px;padding-right:3px;height:13px;line-height:13px;margin-top:0}
+.webix_canvas_text.webix_axis_radar_title{margin-top:0;padding-top:0;color:#4e5358;font-size:12px}
+.webix_axis_item_x,.webix_axis_item_y{color:#4e5358}
+.webix_chart_frame{background-color:#a0cfef;height:100%;opacity:.3;position:absolute;top:0;z-index:150;border-left:1px solid #3498db;border-right:1px solid #3498db;cursor:w-resize}
+.webix_chart_resizer{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==);background-position:3px center;background-repeat:no-repeat;border-radius:2px;height:20px;bottom:0;width:11px;z-index:200;position:absolute;background-color:#fff;border:1px solid #ccc;cursor:w-resize}
+.webix_wresize_cursor{cursor:w-resize}
+.webix_vscroll_x{height:0;width:100%;overflow-y:hidden;overflow-x:scroll}
+.webix_vscroll_y{width:0;height:100%;overflow-x:hidden;overflow-y:scroll}
+.webix_vscroll_body{width:16px;height:16px}
+.webix_scroll_x{width:50px;height:4px!important;left:1px;bottom:3px;background-color:silver;background:rgba(0,0,0,.4);position:absolute;border-radius:4px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_scroll_y{width:4px!important;height:50px;top:1px;right:3px;background-color:silver;background:rgba(0,0,0,.4);position:absolute;border-radius:4px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_c_scroll_y{position:absolute;z-index:3;width:10px;right:0}
+.webix_c_scroll_y>div{-moz-transition:width .3s .2s,margin .3s .2s;-webkit-transition:width .3s .2s,margin .3s .2s;-o-transition:width .3s .2s,margin .3s .2s;-ms-transition:width .3s .2s,margin .3s .2s;width:4px;height:100%;background-color:silver;background:rgba(0,0,0,.4);border-radius:4px;margin:0 3px}
+.webix_c_scroll_y.webix_scroll_active div,.webix_c_scroll_y:hover>div{width:10px;margin:0}
+.webix_c_scroll_x{position:absolute;z-index:3;height:10px;bottom:0}
+.webix_c_scroll_x>div{-moz-transition:height .3s .2s,margin .3s .2s;-webkit-transition:height .3s .2s,margin .3s .2s;-o-transition:height .3s .2s,margin .3s .2s;-ms-transition:height .3s .2s,margin .3s .2s;height:4px;width:100%;background-color:silver;background:rgba(0,0,0,.4);border-radius:4px;margin:3px 0}
+.webix_c_scroll_x.webix_scroll_active div,.webix_c_scroll_x:hover>div{height:10px;margin:0}
+.webix_c_scroll_bar_x,.webix_c_scroll_bar_y{position:absolute;background:rgba(0,0,0,.05)}
+.webix_c_scroll_bar_y{height:100%;width:10px;right:0}
+.webix_c_scroll_bar_x{width:100%;height:10px;bottom:0}
+.webix_scroll_cont{width:100%;height:auto;overflow:hidden;clear:both}
+.webix_scroll_touch_ie{touch-action:none}
+.webix_dt_editor{position:absolute;z-index:2;overflow:visible;background:#fff}
+.webix_dt_editor input,.webix_dt_editor select{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:1px 8px 0 9px;margin:0;border:1px solid gold;height:100%;font-family:Helvetica,Verdana;font-size:13px;color:#1e2022}
+.webix_dt_editor input[type=checkbox]{margin:6px 8px 4px 14px;height:auto;width:auto}
+.webix_dt_editor select{padding-right:0;padding-left:5px}
+.webix_clipbuffer{width:1px;height:1px;left:3px;top:3px;position:fixed;white-space:nowrap;filter:alpha(opacity=0);opacity:0}
+.webix_message_area{position:fixed;right:5px;width:250px;z-index:1000}
+.webix_info{min-width:120px;font-family:Tahoma,Arial;z-index:10000;overflow:hidden;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}
+.webix_no_transition{-webkit-transition:none;-moz-transition:none;transition:none}
+.webix_info.hidden{height:0;min-height:0;padding-top:0;padding-bottom:0;border-width:0;margin-top:0;margin-bottom:0;overflow:hidden}
+.webix_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;background-color:#fff;box-shadow:0 3px 6px #c8c8c8;font-family:Helvetica,Verdana;z-index:20000;border-radius:0;outline:0}
+.webix_popup_title{border-top-left-radius:-1px;border-top-right-radius:-1px;border-width:0}
+.webix_button,.webix_info,.webix_popup_button{cursor:pointer}
+.webix_popup_text{overflow:hidden}
+.webix_popup_controls{border-radius:6px;padding:5px 10px 10px}
+.webix_button,.webix_popup_button{height:28px;line-height:28px;display:inline-block;margin:0 5px;border-radius:6px}
+.webix_popup_button div{border-radius:6px}
+.webix_popup_button{min-width:100px}
+div.webix_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=10);opacity:.1;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}
+.webix_info img,.webix_modal_box img{float:left;margin-right:20px}
+.webix_alert_error .webix_popup_title,.webix_confirm_error .webix_popup_title{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAsCAIAAAArRUU2AAAATklEQVR4nIWLuw2AMBBDjVuQiBT2oWbRDATrnB0KQOJoqPzRe3BrHI6dcBASYREKovtK6/6DsDOX+stN+3H1YX9ciRgnYq5EWYhS2dftBIuLT4JyIrPCAAAAAElFTkSuQmCC)}
+.webix_alert_error,.webix_confirm_error{border:1px solid red}
+.webix_button,.webix_popup_button{border:1px solid #a4bed4}
+.webix_button input,.webix_popup_button div{font-size:13px;color:#1e2022;background:#e6e6e6;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#e6e6e6));background:-webkit-linear-gradient(#fff,#e6e6e6);background:-moz-linear-gradient(#fff,#e6e6e6);background:-ms-linear-gradient(top,#fff,#e6e6e6);background:-o-linear-gradient(top,#fff,#e6e6e6);height:28px;line-height:28px}
+.webix_popup_button.confirm div{color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%)}
+.webix_popup_title{color:#fff;height:40px;line-height:40px}
+.webix_popup_text{margin:0 0 5px;padding-top:25px;font-size:13px;color:#1e2022;min-height:60px}
+.webix_error,.webix_info{font-size:13px;color:#333;box-shadow:0 0 10px #888;padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}
+.webix_info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #B8B8B8}
+.webix_error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:0 0 10px #000}
+.webix_error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}
+.webix_drag_zone{position:absolute;box-shadow:1px 1px 5px #a4bed4;background-color:#fff;font-family:Helvetica,Verdana;font-size:13px;color:#1e2022;pointer-events:none}
+.webix_drag_zone .borderless{padding:2px 20px 2px 2px}
+.webix_drag_over,.webix_drop_zone{background-color:#e6e6e6}
+.webix_transparent{opacity:0}
+.webix_column{position:absolute;top:0}
+.webix_cell{overflow:hidden;line-height:31px;white-space:nowrap}
+.webix_hcell{width:100%;overflow:hidden}
+.webix_ss_body{overflow:hidden;position:relative}
+.webix_hs_center,.webix_hs_left,.webix_hs_right,.webix_ss_center,.webix_ss_left,.webix_ss_right{overflow:hidden;float:left}
+.webix_ss_center,.webix_ss_right{position:relative}
+.webix_ss_footer table,.webix_ss_header table{table-layout:fixed}
+.webix_ss_center_scroll{height:100%;position:relative;overflow:hidden;min-height:1px}
+.webix_ss_hscroll{bottom:0}
+.webix_ss_vscroll{position:absolute;top:0;right:0;z-index:2}
+.webix_ss_vscroll_footer{position:absolute;bottom:0;right:0;border-left:1px solid #fff;border-top:1px solid #a4bed4;z-index:1}
+.webix_ss_vscroll_header{position:absolute;top:0;right:0;border-left:1px solid #a4bed4;border-bottom:1px solid #a4bed4;z-index:1}
+.webix_dtable{position:relative;cursor:default;z-index:0}
+.webix_ss_footer,.webix_ss_header{clear:both;overflow:hidden}
+.webix_block_selection,.webix_cell,.webix_hcell,.webix_ss_footer td,.webix_ss_header td,.webix_table_cell,.webix_view.webix_table_cell{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_block_selection{position:absolute}
+.webix_ss_sort_asc,.webix_ss_sort_desc{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_hcell.webix_ss_filter{padding:2px 5px}
+.webix_ss_filter input,.webix_ss_filter select{width:100%;font-size:inherit;color:#1e2022!important;height:30px;margin-top:-2px;padding:0 3px;vertical-align:top;border:1px solid #a4bed4;line-height:30px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:Helvetica,Verdana}
+.webix_richfilter{margin-top:1px}
+.webix_ss_filter select{padding:3px}
+.webix_dd_drag_column,.webix_ss_header,.webix_ss_header TD,.webix_ss_vscroll_header{color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%)}
+.webix_ss_footer TD,.webix_ss_vscroll_footer{background:#fafafa}
+.webix_hcell{padding:0 10px;text-align:left}
+.webix_ss_header td{border-right:1px solid #a4bed4;border-bottom:1px solid #a4bed4}
+.webix_ss_footer td{border-right:1px solid #ebebeb;border-top:1px solid #ebebeb}
+.webix_column.webix_last>div,.webix_hs_center td.webix_last,.webix_hs_right td.webix_last{border-right-width:0}
+.webix_hs_right td.webix_first,.webix_ss_right .webix_column.webix_first>div{border-left:1px solid #a4bed4}
+.webix_ss_left .webix_column.webix_last>div{border-right:1px solid #a4bed4}
+.webix_last_topcell.webix_cell{border-bottom:1px solid #a4bed4}
+.webix_column>div,.webix_table_cell{border-right:1px solid #ebebeb;border-bottom:1px solid #ebebeb;padding:0 10px}
+.webix_column{text-align:left}
+.webix_column>div:nth-child(even){background-color:#f7f7f7}
+.webix_dd_over_column,.webix_sel_hcell{background-color:#c9eaf5}
+.webix_block_selection{background:rgba(0,0,0,.1);border:2px solid #ffd47b}
+.webix_dd_drag{white-space:nowrap;overflow:hidden;border-left:1px solid #ebebeb;height:34px}
+.webix_dd_drag>div{display:inline-block;vertical-align:top;background:#fff;border-top:1px solid #ebebeb;border-right:1px solid #ebebeb;border-bottom:1px solid #ebebeb;padding:5px 10px;height:34px;line-height:26px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_dd_drag_column{padding:5px 10px}
+.webix_column>.webix_drag_over.webix_cell{background-color:#e6e6e6;color:#1e2022}
+.webix_ss_header table,.webix_ss_header td,.webix_ss_header th{padding:0;margin:0}
+.webix_cell.webix_invalid,.webix_column>.webix_cell.webix_invalid:nth-child(even){background-color:#fee}
+.webix_invalid_cell{position:relative}
+.webix_invalid_cell:after{content:"";position:absolute;top:0;right:0;width:0;height:1px;border-top:8px solid #f44;border-left:8px solid transparent}
+.webix_column>div.webix_cell_select,.webix_column>div.webix_column_select,.webix_column>div.webix_row_select{color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f)}
+.webix_column>div.webix_cell_select{border-bottom:1px solid #ffd47b;box-shadow:0 1px #ffe3a9 inset;border-right:1px solid #ffd47b;border-left:1px solid #ffd47b;padding-top:0;padding-left:9px}
+.webix_ss_right .webix_column.webix_first>div.webix_cell_select{padding-left:10px}
+.webix_column>div.webix_invalid.webix_row_select:nth-child(even),.webix_column>div.webix_row_select{border-bottom:1px solid #ffd47b;box-shadow:0 1px #ffe3a9 inset;padding-top:0}
+.webix_column>div.webix_column_select{border-right:1px solid #ffd47b;border-left:1px solid #ffd47b;padding-left:9px}
+.webix_column>.webix_cell.webix_invalid.webix_cell_select:nth-child(even){color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f)}
+.webix_dtable_colrow,.webix_dtable_subrow,.webix_dtable_subview{position:absolute;left:0;top:0;background-color:#fff;width:100%;padding-right:28px;padding-left:10px;padding-top:1px;border-bottom:1px solid #ebebeb}
+.webix_dtable_subrow{border-top:1px solid #ebebeb;text-align:right}
+.webix_dtable_subview{background:#ebebeb;border-top:1px solid #ebebeb;padding:0 0 0 10px;box-sizing:border-box}
+.number .webix_cell{text-align:right}
+.webix_rotate{transform:rotate(-90deg);-webkit-transform:rotate(-90deg);line-height:normal}
+.webix_measure_rotate{line-height:normal;white-space:normal;padding:10px}
+.webix_span_layer{background:0 0;position:absolute;left:0;top:0;height:0;width:0;overflow:visible}
+.webix_dtable_span{position:absolute;background:#fff}
+.webix_dtable_span.webix_selected{color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f)}
+.webix_hcell span.webix_input_icon{background-color:#a4bed4}
+.webix_area_selection_layer{position:absolute;z-index:1}
+.webix_area_selection{position:absolute;background:#1e2022}
+.webix_area_selection_bottom,.webix_area_selection_top{height:2px}
+.webix_area_selection_left,.webix_area_selection_right{width:2px}
+.webix_area_selection_handle{position:absolute;width:6px;height:6px;border:1px solid #fff;background:#1e2022;cursor:crosshair;margin:-6px 0 0 -6px}
+.webix_topcell{position:relative;background:#fff;z-index:1}
+.webix_window{position:absolute;box-shadow:1px 3px 4px #c8c8c8}
+.webix_win_body{overflow:hidden}
+.webix_win_body,.webix_win_body>.webix_view,.webix_win_body>.webix_view .webix_cal_month,.webix_win_content,.webix_window{border-radius:0}
+.webix_win_head{border-bottom:1px solid silver}
+.webix_win_head>.webix_view>.webix_template{font-family:Helvetica,Verdana;font-size:13px;font-weight:700;color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);padding:0;text-align:center;line-height:34px}
+.webix_win_head>.webix_view>.webix_template .webix_el_label,.webix_win_head>.webix_view>.webix_template .webix_inp_label{color:#1e2022}
+.webix_win_content{height:auto;width:auto;overflow:hidden}
+.webix_modal{width:100%;height:100%;position:fixed;top:0;left:0;background-color:#000;filter:alpha(opacity=20);opacity:.2}
+.webix_point_bottom,.webix_point_left,.webix_point_right,.webix_point_top{position:absolute}
+.webix_point_bottom,.webix_point_top{width:13px;height:7px}
+.webix_point_left,.webix_point_right{width:7px;height:13px}
+.webix_point_bottom,.webix_point_left,.webix_point_right,.webix_point_top{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAArCAIAAADHSy4DAAAABnRSTlMAAAAAAABupgeRAAAACXBIWXMAAABPAAAATwFjiv3XAAAAhElEQVR4nMXVQQoAIQhAUe9/FC/pLAYayUm/EeT6YWGmoqpWharKG7n+XK5nt9L/LurMeV27oZHrReN0M6Oupr5S1GU0vhN1J7L27hp1QYXX1WtE5UxnNXI0ep7+pEGRpr95ooWObbXUm1npXWkFaF3vTqj9c+h8pVOb7gK6Yeje4tvwARi4FgcAh2V/AAAAAElFTkSuQmCC)}
+.webix_point_top{background-position:0 -36px}
+.webix_point_bottom{background-position:0 0}
+.webix_point_right{background-position:0 -22px}
+.webix_point_left{background-position:0 -9px}
+.webix_resize_handle{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize}
+.webix_resize_frame{position:absolute;filter:alpha(opacity=10);opacity:.1;background:#d6e8ff;display:block;border:1px solid #70afff;box-shadow:1px 3px 6px #000}
+.webix_resize_cursor{cursor:nw-resize}
+.webix_tree .webix_scroll_cont>.webix_tree_leaves{padding:9px 10px 9px 9px}
+.webix_tree_item{clear:both;height:22px;line-height:22px;white-space:nowrap}
+.webix_tree_item.webix_selected{background:0 0}
+.webix_tree_item.webix_selected span{padding:4px 10px 4px 4px;margin-left:-4px;color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f)}
+.webix_tree_checkbox{margin:1px 0 0;padding:0;float:left;vertical-align:middle;height:100%;width:13px}
+.webix_indeterminate{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcCCSwfRyGesAAAAAxpVFh0Q29tbWVudAAAAAAAvK6ymQAAAExJREFUKM9jLCgo+M9AAmBhYGBgaGtrY+Tk5MSrsLCwkIGBgeE/EwOJgGQNLMgcJSUlBgYGBnQ/Md67d498G+jsB6hbGQfWSYykJg0AUMsPVoNrFX0AAAAASUVORK5CYII=);background-repeat:no-repeat;background-position:left center;height:100%;width:13px;margin-top:0!important}
+.webix_measure_size input,.webix_measure_size select,.webix_measure_size textarea{width:5px}
+.webix_measure_size div{margin-left:-5px;float:none}
+.webix_measure_size a,.webix_measure_size div{display:inline-block!important}
+.webix_tree_close,.webix_tree_file,.webix_tree_folder,.webix_tree_folder_open,.webix_tree_none,.webix_tree_open{float:left;width:20px;height:100%;cursor:pointer;margin:0;background-repeat:no-repeat}
+.webix_tree_close,.webix_tree_none,.webix_tree_open{background-position:center center}
+.webix_cell .webix_tree_close,.webix_cell .webix_tree_none,.webix_cell .webix_tree_open{background-color:transparent}
+.webix_tree_file,.webix_tree_folder,.webix_tree_folder_open{background-position:0 center;margin:0 2px}
+.webix_tree_leaves .webix_tree_leaves{margin-left:18px}
+.webixLineTree .webix_tree_leaves{margin-left:0}
+.webix_tree_close{background-image:url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAIqnI+py+0Powq01haA3iDgLWwek2mhNi6ZwLLdZ4owcL4kJ5OWJfX+DykAADs=)}
+.webix_tree_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAImnI+py+0Powq01haA3iBgvnlMBnafgKLmWK4LCYpvK0+WJeX6DhUAOw==)}
+.webix_tree_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQVAPv7+2RkZPf39/r6+vj4+Pn5+fT09Pb29vX19fHx8fDw8Onp6fLy8u7u7uzs7PPz8+vr6+rq6uXl5ejo6O/v7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABUALAAAAAASABIAAAV4YCWOZGkGaKqaVSAMQCwLQnAOj6ErzUTXpQDgQDgcGJTFDzgSEp4HRCKytDUBMKzAoIAsJACrSCjTGhINR5hELg8ECEZifS3HCgQEgj62xwZPAnwtbgMDBQU0g21Yh4iIi3aGkzBihH52lgEEmDIEli0qoigspSYhADs=)}
+.webix_tree_folder{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAPvjpP/24fPHVvnUdvzotdSiKv/23vvrw/LCS/C+RfnelvPMaf/88/nbi/rsyerYq/TLYv7y1v7wzeCsLO+8P86dJfvv0MuaIsydKPPOc+SqGKGEPe/AS+zVneWwLf///yH5BAEAAB8ALAAAAAASABIAAAWZ4CdeZGleYvpdA+O+zNUBqHoZOB4EceHUqVtuF+n9VCtdQCI5BC6FA3BkCEQkBALAACVMV9eDVhGJQGnIixigaAwiG6jie2G7BxDLpVJozG13EAICPxUeGRleQQMLgggJUhiHC3pBggKPFJETGZRAF5gJCRSaFxgTC55BCByioz+nEKojGgmtHBwPJAUCELo2J8FfSMTFxsUhADs=)}
+.webix_tree_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAPXMWPK9N/fipOzLbPrVaP/89frqwv3tuvvprfLES+7PdP7xyP7z0vPAQfvtyMuaIv/32/735OSqFv3de+7ReP7lmf7gh/nv0v/67unFXfb29vK/PenFSaGEPfLnyv///yH5BAEAAB8ALAAAAAASABIAAAWS4Cc+ZGk+YvqZRVtgGiag6sNBThlFWnTQqQcE4sqRFj/VashsYR6HZI0JWSAjDwQCOGIgERULg/EQzJRQsGVCYHTK51qYTQDkFPj4iA4AJHIUgQoGQA8EdX4NhHgKAxeFfQkJGwGLeI6Fkg2UlQ8Dn5hBCZuchKChIxKkGw05Ga8DHlwkqg2tJ1xBtDlKvTUkviEAOw==)}
+.webix_tree_img{background:0 0;float:left;width:18px;height:22px}
+.webix_tree_plus2{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAFSWrmi52FCPplORqVmet8HBwfn//02KoE+NpEyIn2a21E2Jn2u/3mzB4Vqguk6LomGtyWGuy27E5VqivG/H51OUrE+OpVyhu1eXr2CqxV6lwFaas06LoXHJ6lKTqgAAACH5BAEAAB8ALAAAAAASABIAAAVZ4CeOYkGeaJmuKpuaLgrHX7IcD2IJrs0hAk8FAGAlDoiBYUNwTIyPAcagyUAirAXCwOUGAoVwmHSwVAiGSIDRYB0EgIthLaG44RN1g9JxwR0QdDSDhIWGKyEAOw==);background-repeat:no-repeat}
+.webix_tree_plus3{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAFSWrmi52FCPplORqVmet8HBwfn//02KoE+NpEyIn2a21E2Jn2u/3mzB4Vqguk6LomGtyWGuy27E5VqivG/H51OUrE+OpVyhu1eXr2CqxV6lwFaas06LoXHJ6lKTqgAAACH5BAEAAB8ALAAAAAASABIAAAVb4CeOYkGeaJmuKpuaLgrHX7IcD2IJrs0hAk8FAGAlDoiBYUNwTIyPAcagyUAirAXCwOUGAoVwmHSwVAiGSIDRYB0EgIthLaG44RN1g9JxwR0QdDQtg4SFM4csIQA7)}
+.webix_tree_plus4{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAFSWrmi52FCPplORqVmet/n//8HBwU2KoE+NpEyIn2a21E2Jn2u/3mzB4VqgumGtyWGuy27E5VqivE6Lom/H51OUrE+OpVyhu1eXr2CqxV6lwFaas06LoVKTqnHJ6gAAACH5BAEAAB8ALAAAAAASABIAAAVY4CeOZGmeaKqubEsmyzEhlqDCHCJ0FQCkiQNiUNgQHBLgZIApaDIPSGqBKFitgYBhuyUdLBVCARJgNFIHAeBSKEcoaLWE3KB4VGrHw+0yuEZ+fx+Bf4QmIQA7)}
+.webix_tree_minus2{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAFOUrGi52Fiet8HBwU2KoPn//0+NpGa31VCPp1qgumGtyWu/3lSWrlCPpk2Jn0yIn1qivG7E5W/H52zB4V6pxGGuy06Lok+OpVSXr1ykv2Sz0HHJ6laas06LoUyHngAAACH5BAEAAB8ALAAAAAASABIAAAVc4CeO4kCeaJmuKpuaLgrH3+MQlnE1rud0BkQDwMCwHgQDAMARJCBHCwIgyFAUFZbDUOh2D4GBWEwiXKgUTWAxYREajITisIhI3AgMpBKYSDYucHJ0ETSGh4iJKyEAOw==);background-repeat:no-repeat}
+.webix_tree_minus3{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAFOUrGi52Fiet8HBwU2KoPn//0+NpGa31VCPp1qgumGtyWu/3lSWrlCPpk2Jn0yIn1qivG7E5W/H52zB4V6pxGGuy06Lok+OpVSXr1ykv2Sz0HHJ6laas06LoUyHngAAACH5BAEAAB8ALAAAAAASABIAAAVe4CeO4kCeaJmuKpuaLgrH3+MQlnE1rud0BkQDwMCwHgQDAMARJCBHCwIgyFAUFZbDUOh2D4GBWEwiXKgUTWAxYREajITisIhI3AgMpBKYSDYucHJ0ETQthoeIM4osIQA7)}
+.webix_tree_minus4{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAFOUrGi52Fiet8HBwU2KoPn//0+NpGa31VCPp1qgumGtyWu/3lSWrlCPpk2Jn0yIn1qivG7E5W/H52zB4V6pxGGuy06Lok+OpVSXr1ykv2Sz0HHJ6laas06LoUyHngAAACH5BAEAAB8ALAAAAAASABIAAAVb4CeOZGmeaKqubEs+DmEZV6N6TmcgDcBgqQfBAABwBAlI0IIACDIURSXlMBSu10NgwOWSCBcnRRNYTFKEBiOhOCwiEjQCA6kEJpKNSs12R1wDLiOBgh+EgocmIQA7)}
+.webix_tree_line1{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQBAMHBwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAASABIAAAUmYCCOIkCeaJmuKpuaLgrH5Ey3N57bN0/7MaBLyCKujK/cCCljhQAAOw==)}
+.webix_tree_line2{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQBAMHBwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAASABIAAAUiYCCOIkCeaJmuKpuaLgrH5Ey3N57bN+D/wJxwSCwaj0hSCAA7);background-repeat:no-repeat}
+.webix_tree_line3{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQBAMHBwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAASABIAAAUoYCCOIkCeaJmuKpuaLgrH5Ey3N57bN+D/wBWPNowVXUdWUpgbLV+sEAA7)}
+.webix_tree_line4{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQBAMHBwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAASABIAAAUcYCCOZGmeaKqubOu+MAzMdI0CMS7n/O6/OmAqBAA7)}
+.webix_tree_blank{background-image:url(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)}
+.webix_tree_img{background-color:#fff}
+.webix_cal_month{height:22px;line-height:20px;text-align:center;position:relative;font-size:14px;font-weight:700;padding-top:17px;padding-bottom:5px;box-sizing:content-box}
+.webix_cal_next_button,.webix_cal_prev_button{cursor:pointer;position:absolute;top:17px;width:30px;height:28px;background-position:11.5px 4px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_cal_prev_button{left:17px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAASUlEQVR42p2QMQoAQQgD79EZ0Mqn5xCu2cPdYgUbJ0rMMxXgLeiuKq8gsJAz8weQ0QiwJEfECnr4wdlEnwJ68+yyhReC+c85oRecj0Um+pmo9wAAAABJRU5ErkJggg==);background-repeat:no-repeat}
+.webix_cal_next_button{right:17px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAARElEQVR42qXPsQoAIAhF0T76PdDJT7cUmtQhcmk4N8QVQ9JXN2bmgWOgqp+BiCRG2AYAMoi3/LxYdyagAnhA6G93TrABZaJFJjrFY8IAAAAASUVORK5CYII=);background-repeat:no-repeat}
+.webix_view>.webix_cal_header{margin:0 17px 10px;height:auto}
+.webix_view>.webix_cal_header div{float:left;text-align:center;height:19px;font-size:11px;color:#1e2022;border-bottom:#cecece 1px solid;margin-bottom:7px}
+.webix_cal_body{margin:0 17px}
+.webix_cal_body .webix_cal_row{clear:both}
+.webix_cal_body .webix_cal_row>div{float:left;text-align:center;height:100%}
+.webix_cal_body .webix_cal_select,.webix_cal_body .webix_cal_select.webix_cal_today,.webix_cal_body .webix_selected{color:#1e2022;background:#ffdb8f}
+.webix_cal_day,.webix_cal_week_num{cursor:pointer;font-size:12px;color:#1e2022;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_cal_week_num{color:#727981;cursor:default;margin-right:0;border-right:1px solid #cecece}
+.webix_cal_event{font-weight:700;color:#C66200}
+.webix_cal_outside{color:#7e868e}
+.webix_cal_inactive{background:#888}
+.webix_cal_day_disabled,.webix_cal_day_disabled.webix_cal_event{color:#7e868e;background:#f0f0f0}
+.webix_hours .webix_cal_day_disabled,.webix_hours .webix_cal_day_disabled.webix_cal_event,.webix_minutes .webix_cal_day_disabled,.webix_minutes .webix_cal_day_disabled.webix_cal_event{background:#fff;font-weight:400;text-decoration:line-through}
+.webix_cal_month_name{cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_cal_block{float:left;text-align:center;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_selected{background:#ffdb8f;color:#1e2022}
+.webix_cal_footer{text-align:center;font-size:12px;color:#444;margin:4px 17px;padding-top:2px;cursor:pointer}
+.webix_cal_icons{float:right;padding:4px}
+.webix_cal_time{padding:2px 4px}
+.webix_cal_time_icons{float:left}
+.webix_cal_icons .webix_cal_icon{text-align:center;padding:2px 4px}
+.webix_cal_icon:hover,.webix_cal_month_name:hover,.webix_cal_time:hover{text-decoration:underline;color:#d6e8ff}
+.webix_cal_month_name.webix_readonly:hover{text-decoration:none;color:#1e2022;cursor:default}
+.webix_time_header{padding:17px 17px 1px}
+.webix_time_header .webix_cal_hours,.webix_time_header .webix_cal_minutes{display:inline-block;font-size:14px;text-align:center;height:26px;line-height:22px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #a4bed4}
+.webix_time_header .webix_cal_minutes{padding-left:1px;border-left:none}
+.webix_time_header .webix_cal_hours{border-right:none!important}
+.webix_cal_body .webix_hours{float:left;border-right:1px solid #cecece;padding-right:1px}
+.webix_cal_body .webix_minutes{float:left;padding-left:1px}
+.webix_cal_block_empty{float:left;text-align:center}
+.webix_time_footer{text-align:center;font-size:12px;padding:7px 17px 0;cursor:pointer}
+.webix_cal_done{margin-top:3px;padding:2px 7px;font-size:12px;border-radius:6px;border:1px solid #a4bed4;color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);float:right}
+.webix_cal_blurred_hours{background-color:#f7f7f7}
+.webix_property_line{clear:both;width:100%;min-height:24px;height:auto}
+.webix_property_line:nth-child(odd){background-color:#f7f7f7}
+.webix_property_label,.webix_property_value{height:24px;line-height:24px;padding-left:10px;float:left;border-bottom:1px solid #a4bed4;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}
+.webix_property_label{border-right:1px solid #a4bed4}
+.webix_property_label_line{padding-left:10px;font-family:Helvetica,Verdana;font-size:13px;font-weight:700;color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);line-height:32px;line-height:23px;border-bottom:1px solid #ebebeb}
+.webix_property_label_line .webix_el_label,.webix_property_label_line .webix_inp_label{color:#1e2022}
+.webix_property_col_val{width:100%;height:100%;-moz-user-select:text;-webkit-user-select:text;user-select:text}
+.webix_property_col_ind{float:right;border:1px solid #a4bed4;border-radius:2px;width:30px;cursor:pointer;height:13px;margin:3px 10px 3px 0}
+.webix_property_value{text-overflow:ellipsis;white-space:nowrap}
+.webix_property_check{margin-top:5px}
+.webix_tooltip{display:none;white-space:pre;position:absolute;z-index:10000;background-color:#fff;padding:5px 10px;border:1px solid #a4bed4;font-family:Helvetica,Verdana;font-size:13px;color:#1e2022;border-radius:0;box-shadow:1px 1px 0 0 #CCC}
+.webix_color_row{clear:both;white-space:nowrap}
+.webix_color_palette{text-align:left;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_color_row,.webix_color_row div,.webix_color_selector{line-height:0;font-size:0}
+.webix_color_row div{display:inline-block;width:15px;height:15px;cursor:default}
+.webix_color_selector{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;border:2px solid #f3f3f3}
+.webix_daterange .webix_view{background-color:#fff}
+.webix_daterange .webix_range_0 .webix_cal_next_button,.webix_daterange .webix_range_1 .webix_cal_next_button,.webix_daterange .webix_range_1 .webix_cal_prev_button,.webix_daterange .webix_range_N .webix_cal_prev_button{visibility:hidden}
+.webix_daterange .webix_range_1 .webix_cal_next_button:hover,.webix_daterange .webix_range_1 .webix_cal_prev_button:hover{cursor:default}
+.webix_daterange .webix_range_1 .webix_cal_month_name:hover{text-decoration:none;color:inherit;cursor:default}
+.webix_daterange .webix_range_left .webix_cal_next_button:hover,.webix_daterange .webix_range_right .webix_cal_prev_button:hover{cursor:default}
+.webix_cal_range_start{border-radius:3px 0 0 3px}
+.webix_cal_range_end{border-radius:0 3px 3px 0}
+.webix_cal_body .webix_cal_today.webix_cal_range_end,.webix_cal_body .webix_cal_today.webix_cal_range_start,.webix_cal_event.webix_cal_range_end,.webix_cal_event.webix_cal_range_start,.webix_cal_range_end,.webix_cal_range_start{background-color:#ffdb8f;color:#1e2022}
+.webix_cal_body .webix_cal_outside.webix_cal_range_end,.webix_cal_body .webix_cal_outside.webix_cal_range_start,.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_end,.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_start,.webix_cal_outside.webix_cal_range{background-color:transparent;color:#7e868e}
+.webix_daterange .webix_cal_icons{text-align:right;padding:0 4px}
+.webix_daterange .webix_cal_icons .webix_cal_icon{border-top:1px solid #a4bed4}
+.webix_daterange .webix_cal_time{display:none}
+.webix_daterange .webix_cal_timepicker .webix_range_time_start,.webix_daterange .webix_range_timepicker .webix_cal_time{display:block}
+.webix_daterange .webix_range_timepicker .webix_range_time_start{float:left}
+.webix_daterange .webix_range_timepicker .webix_range_time_end{float:right}
+.webix_daterange .webix_range_footer .webix_cal_footer{padding:0}
+.webix_view.webix_toolbar .webix_el_button{background:0 0}
+.webix_el_button button,.webix_el_button input,.webix_el_toggle button,.webix_el_toggle input,.webixbutton{border-radius:6px;border:1px solid #a4bed4;height:100%;width:100%;cursor:pointer;font-size:13px;font-family:Helvetica,Verdana;-webkit-appearance:none}
+.webix_el_button .webix_img_btn,.webix_el_button .webix_img_btn .webix_img_btn_text,.webix_el_button .webix_img_btn_top,.webix_el_button .webix_img_btn_top .webix_img_btn_text,.webix_el_toggle .webix_img_btn,.webix_el_toggle .webix_img_btn .webix_img_btn_text,.webix_el_toggle .webix_img_btn_top,.webix_el_toggle .webix_img_btn_top .webix_img_btn_text{color:#1e2022}
+.webix_el_button .webix_img_btn,.webix_el_button .webix_img_btn_top,.webix_el_toggle .webix_img_btn,.webix_el_toggle .webix_img_btn_top{border:0}
+.webixbutton,.webixtype_base,.webixtype_next,.webixtype_prev{color:#1e2022;background:#e6e6e6;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#e6e6e6));background:-webkit-linear-gradient(#fff,#e6e6e6);background:-moz-linear-gradient(#fff,#e6e6e6);background:-ms-linear-gradient(top,#fff,#e6e6e6);background:-o-linear-gradient(top,#fff,#e6e6e6);font-size:13px;font-family:Helvetica,Verdana;padding:0;border:0}
+.webixtype_form{color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%)}
+.webixtype_form:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background:no-repeat #d6e8ff}
+.webix_el_button .webixtype_danger{background:#c10;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e7877e),color-stop(100%,#c10));background:-webkit-linear-gradient(#e7877e,#c10);background:-moz-linear-gradient(#e7877e,#c10);background:-ms-linear-gradient(top,#e7877e,#c10);background:-o-linear-gradient(top,#e7877e,#c10);border:none!important;color:#fff}
+.webix_el_button .webix_el_box,.webix_el_toggle .webix_el_box{position:relative}
+.webix_el_button .webix_el_arrow,.webix_el_toggle .webix_el_arrow{position:absolute;z-index:1}
+.webixtype_next,.webixtype_prev{position:absolute;z-index:2;top:0}
+input.webixtype_prev{border-left-width:0;border-radius:0 6px 6px 0;-webkit-border-radius:0 6px 6px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}
+input.webixtype_next{border-right-width:0;border-radius:6px 0 0 6px;-webkit-border-radius:6px 0 0 6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}
+.webix_el_arrow{width:18px;height:18px;color:#1e2022;background:#e6e6e6;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#e6e6e6));background:-webkit-linear-gradient(#fff,#e6e6e6);background:-moz-linear-gradient(#fff,#e6e6e6);background:-ms-linear-gradient(top,#fff,#e6e6e6);background:-o-linear-gradient(top,#fff,#e6e6e6);border:1px solid #a4bed4}
+.webixtype_prev_arrow{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg)}
+.webixtype_next_arrow{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg)}
+.webix_img_btn_abs_top .webix_icon,.webix_img_btn_top .webix_icon{font-size:22px;position:absolute;top:8px;left:50%}
+.webix_img_btn_abs .webix_icon{margin-left:6px}
+.webix_img_btn_abs.webix_img_btn_abs_top .webix_icon,.webix_img_btn_top .webix_icon{margin-left:-10px}
+.webix_img_btn,.webix_img_btn_top{vertical-align:top;background-color:transparent;border:none;width:100%;padding:0}
+.webix_img_btn,.webix_img_btn_abs{cursor:pointer;text-align:left;background-repeat:no-repeat;background-position:2px center;height:100%;font-size:13px}
+.webix_img_btn .webix_icon,.webix_img_btn_abs .webix_icon{color:#1e2022}
+.webix_img_btn,.webix_img_btn_abs{padding:0}
+.webix_img_btn .webix_image,.webix_img_btn_abs .webix_image{background-repeat:no-repeat;background-position:center center;float:left;vertical-align:top}
+.webix_img_btn_top .webix_image{background-repeat:no-repeat;background-position:center top}
+.webix_img_btn_abs.webix_img_btn_abs_top .webix_image{background-position:center 5px}
+.webix_img_btn_top{text-align:center;background-repeat:no-repeat}
+.webix_img_btn_text{position:absolute;left:0;bottom:3px;width:100%;text-align:center;cursor:pointer;color:#1e2022}
+.webix_img_btn_abs{background-position:center center}
+.webix_img_btn_top{background-position:center top;vertical-align:top}
+.webix_img_btn_abs .webix_img_btn_text{bottom:8px}
+.webix_pressed .webix_img_btn,.webix_pressed .webix_img_btn_top{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background-color:rgba(0,0,0,.05)}
+.webix_control .webix_disabled_box .webix_el_arrow,.webix_control .webix_disabled_box .webix_img_btn,.webix_control .webix_disabled_box .webixtype_base,.webix_control .webix_disabled_box .webixtype_danger,.webix_control .webix_disabled_box .webixtype_form,.webix_control .webix_disabled_box .webixtype_next,.webix_control .webix_disabled_box .webixtype_prev{color:#aaa!important;background:#e9e9e9;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fbfbfb),color-stop(100%,#e9e9e9));background:-webkit-linear-gradient(#fbfbfb,#e9e9e9);background:-moz-linear-gradient(#fbfbfb,#e9e9e9);background:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background:-o-linear-gradient(top,#fbfbfb,#e9e9e9);border-color:#d5d5d5!important}
+.webix_control .webix_disabled_box .webix_img_btn_text{color:#aaa}
+.webix_control .webix_disabled_box .webix_image{opacity:.4}
+.webix_disabled_view.webix_control .webix_icon,.webix_disabled_view.webix_control .webix_icon_btn,.webix_layout_toolbar.webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,.webix_layout_toolbar.webix_toolbar .webix_disabled_view.webix_control .webix_icon,.webix_layout_toolbar.webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn{color:#aaa}
+.webixbutton{width:auto;height:auto;padding:8px 15px}
+.webix_richtext_editor{height:100%}
+.webix_template .webix_richtext_editor:focus{outline:0}
+.webix_richtext_container .webix_template{padding:10px;overflow-x:auto;border:solid #ccc;border-width:0 1px 1px;border-radius:0 0 6px 6px}
+.webix_control{background:0 0}
+.webix_control button,.webix_control input,.webix_control textarea,.webix_el_label,.webix_inp_bottom_label,.webix_inp_label,.webix_inp_top_label{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:Helvetica,Verdana}
+.webix_el_box{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2px;height:100%;width:100%;font-size:13px;overflow:hidden}
+.webix_el_colorpicker input,.webix_el_combo input,.webix_el_datepicker input,.webix_el_search input,.webix_el_text input{height:100%;padding:0 10px;border:1px solid #a4bed4;color:#1e2022;font-size:13px;font-family:Helvetica,Verdana;-webkit-appearance:none;border-radius:0}
+.webix_inp_label,.webix_inp_top_label,.webix_label_right{color:#1e2022;text-transform:none;font-size:13px}
+.webix_inp_label{float:left;padding-top:1px;padding-left:2px;padding-right:7.5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
+.webix_inp_top_label{float:none;padding:2px 2px 0}
+.webix_inp_bottom_label{font-size:11px;color:#2a2d30}
+.webix_label_right{padding-left:7.5px}
+.webix_el_checkbox .webix_label_right{display:inline-block;padding-top:2px}
+.webix_el_label{color:#1e2022;line-height:30px;padding:2px}
+.webix_toolbar .webix_el_label{padding-left:10px;text-transform:none}
+.webix_el_select select{height:100%;font-size:13px;font-family:Helvetica,Verdana;border:1px solid #a4bed4}
+body:not(:-moz-handler-blocked) .webix_el_select select{padding:.2em}
+.webix_all_segments,.webix_el_group{height:100%;white-space:nowrap}
+.webix_inp_counter_next,.webix_inp_counter_prev,.webix_inp_counter_value{border:1px solid #a4bed4;cursor:pointer;-webkit-appearance:none;width:20px;height:100%;vertical-align:top}
+.webix_inp_counter_value{font-size:13px;width:50px;color:#1e2022;text-align:center;border-left-width:0;border-right-width:0;-webkit-appearance:none;border-radius:0}
+.webix_inp_counter_prev{padding-left:6px;color:#1e2022;background:#e6e6e6;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#e6e6e6));background:-webkit-linear-gradient(#fff,#e6e6e6);background:-moz-linear-gradient(#fff,#e6e6e6);background:-ms-linear-gradient(top,#fff,#e6e6e6);background:-o-linear-gradient(top,#fff,#e6e6e6);-webkit-border-radius:6px 0 0 6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:6px 0 0 6px}
+.webix_inp_counter_next{padding-left:6px;color:#1e2022;background:#e6e6e6;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#e6e6e6));background:-webkit-linear-gradient(#fff,#e6e6e6);background:-moz-linear-gradient(#fff,#e6e6e6);background:-ms-linear-gradient(top,#fff,#e6e6e6);background:-o-linear-gradient(top,#fff,#e6e6e6);-webkit-border-radius:0 6px 6px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px;border-radius:0 6px 6px 0}
+.webix_el_textarea textarea{border:1px solid #a4bed4;height:100%;margin:0;padding:5px 10px;color:#1e2022;resize:none;font-size:13px;font-family:Helvetica,Verdana}
+.webix_el_textarea .webix_inp_label{padding-top:8.5px}
+.webix_segment_0,.webix_segment_1{border:1px solid #a4bed4;border-right-width:0;height:100%}
+.webix_segment_0{-webkit-border-radius:6px 0 0 6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:6px 0 0 6px}
+.webix_segment_N{border:1px solid #a4bed4;height:100%;-webkit-border-radius:0 6px 6px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px;border-radius:0 6px 6px 0}
+.webix_segment_N:first-child{-webkit-border-radius:6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px;border-radius:6px}
+.webix_segment_0,.webix_segment_1,.webix_segment_N{-webkit-appearance:none;color:#1e2022;background:#e6e6e6;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#e6e6e6));background:-webkit-linear-gradient(#fff,#e6e6e6);background:-moz-linear-gradient(#fff,#e6e6e6);background:-ms-linear-gradient(top,#fff,#e6e6e6);background:-o-linear-gradient(top,#fff,#e6e6e6);font-size:13px;font-family:Helvetica,Verdana;cursor:pointer;padding:0}
+.webix_segment_0.webix_selected,.webix_segment_1.webix_selected,.webix_segment_N.webix_selected{color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f)}
+.webix_inp_static{border:1px solid #a4bed4;background:#fff;overflow:hidden;padding:0 10px;height:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;float:left}
+.webix_inp_static .webix_placeholder{color:#666d73}
+.webix_el_colorpicker,.webix_el_combo,.webix_el_datepicker,.webix_el_richselect,.webix_el_search{font-size:13px}
+.webix_el_colorpicker .webix_el_box,.webix_el_combo .webix_el_box,.webix_el_datepicker .webix_el_box,.webix_el_richselect .webix_el_box,.webix_el_search .webix_el_box{color:#1e2022;position:relative}
+.webix_el_colorpicker .webix_inp_static,.webix_el_colorpicker input,.webix_el_combo .webix_inp_static,.webix_el_combo input,.webix_el_datepicker .webix_inp_static,.webix_el_datepicker input,.webix_el_richselect .webix_inp_static,.webix_el_richselect input,.webix_el_search .webix_inp_static,.webix_el_search input{color:#1e2022;padding-right:24px;font-family:Helvetica,Verdana;-webkit-appearance:none}
+.webix_el_colorpicker .webix_input_icon,.webix_el_combo .webix_input_icon,.webix_el_datepicker .webix_input_icon,.webix_el_richselect .webix_input_icon,.webix_el_search .webix_input_icon{right:2px;background:0 0;z-index:1;position:absolute}
+.webix_el_combo .webix_input_icon,.webix_el_richselect .webix_input_icon{padding-left:7px;width:19px}
+.webix_el_colorpicker .webix_input_icon,.webix_el_datepicker .webix_input_icon,.webix_el_search .webix_input_icon{padding-left:5px;width:21px}
+.webix_view button::-moz-focus-inner{padding:0;border:0}
+.webix_el_radio .webix_inp_label{line-height:normal!important;padding-top:6.5px}
+.webix_el_checkbox input,.webix_inp_radio_border input{margin:0;padding:0;float:left}
+.webix_line_break{clear:both}
+.webix_custom_checkbox,.webix_custom_radio{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_radio_option{display:table;float:left;height:27px;margin-right:20px}
+.webix_el_radio .webix_label_right,.webix_inp_radio_border{display:table-cell;vertical-align:middle}
+.webix_invalid .webix_custom_radio,.webix_invalid .webix_el_box .webix_inp_static,.webix_invalid .webix_el_box input,.webix_invalid .webix_el_box select,.webix_invalid .webix_el_box textarea,input.webix_invalid,select.webix_invalid,textarea.webix_invalid{background-color:#fff6f6;border-color:#fea5a8}
+.webix_invalid .webix_inp_bottom_label{font-size:11px;color:#fd595f}
+.webix_el_colorpicker .webix_input_icon{padding-left:0;top:6px;right:8px;width:22px;height:22px;border-radius:6px}
+.webix_el_search .webix_el_box{position:relative}
+.webix_el_search input{padding-right:30px}
+.webix_el_search span{position:absolute;right:17px;cursor:pointer;padding-left:7px}
+.webix_view.webix_control>.webix_disabled{filter:alpha(opacity=0);opacity:0}
+.webix_disabled_view.webix_control .webix_image{-webkit-filter:grayscale(100%);filter:grayscale(100%)}
+.webix_view.webix_control .webix_disabled_box .webix_input_icon,.webix_view.webix_control .webix_disabled_box button,.webix_view.webix_control .webix_disabled_box label{color:#aaa}
+.webix_view.webix_control .webix_disabled_box .webix_inp_static,.webix_view.webix_control .webix_disabled_box input,.webix_view.webix_control .webix_disabled_box select,.webix_view.webix_control .webix_disabled_box textarea{color:#aaa;background:#eee}
+.webix_view.webix_control .webix_disabled_box .webix_inp_counter_next,.webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,.webix_view.webix_control .webix_disabled_box .webix_segment_0,.webix_view.webix_control .webix_disabled_box .webix_segment_1,.webix_view.webix_control .webix_disabled_box .webix_segment_N{color:#aaa!important;background:#e9e9e9;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fbfbfb),color-stop(100%,#e9e9e9));background:-webkit-linear-gradient(#fbfbfb,#e9e9e9);background:-moz-linear-gradient(#fbfbfb,#e9e9e9);background:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background:-o-linear-gradient(top,#fbfbfb,#e9e9e9);border-color:#d5d5d5!important}
+.webix_disabled_top_label{color:#aaa}
+label.webix_required:after{padding-left:4px;content:"*";color:red}
+.webix_multicombo .webix_inp_static{padding:0 3px}
+.webix_el_text .webix_multicombo_input{background-color:transparent;border:0;float:left;vertical-align:middle;padding:0;color:#1e2022;font-size:13px;font-family:Helvetica,Verdana;margin-left:7px}
+.webix_el_text .webix_multicombo_input:focus{border:0;box-shadow:none}
+.webix_multicombo_listbox{width:auto;line-height:1;margin:0;padding:0;list-style:none}
+.webix_multicombo_tag,.webix_multicombo_value{padding:0 5px 0 7px;background-color:#f2f2f2;display:inline-block;margin:3px;float:left;border-radius:6px}
+.webix_multicombo_tag{min-width:15px;text-align:center;padding:0 5px}
+.webix_multicombo_delete{margin-left:10px;padding:0 5px;color:#000;cursor:pointer}
+.webix_multilist .webix_selected{background:#f2f2f2;color:#1e2022}
+.webix_el_tabbar{background:0 0}
+.webix_all_tabs{height:100%;display:table}
+.webix_tab_filler{display:table-cell;background:0 0;font-size:1px;border-bottom:1px solid #a4bed4;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_tab_filler:first-child{border-right:1px solid #a4bed4}
+.webix_item_tab:first-child{border-left:1px solid #a4bed4}
+.webix_item_tab{display:table-cell;text-align:center;vertical-align:middle;overflow:hidden;cursor:pointer;border:1px solid #a4bed4;border-left-width:0;color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);-webkit-border-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webixtype_bottom .webix_item_tab{border-radius:0}
+.webix_item_tab.webix_selected{border-bottom-width:0;background:#fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e5f1ff),color-stop(100%,#fff));background:-webkit-linear-gradient(#e5f1ff,#fff);background:-moz-linear-gradient(#e5f1ff,#fff);background:-ms-linear-gradient(top,#e5f1ff,#fff);background:-o-linear-gradient(top,#e5f1ff,#fff)}
+.webixtype_bottom .webix_item_tab.webix_selected{border-bottom-width:1px;color:#1e2022;background:#ffdb8f;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ffebc2),color-stop(100%,#ffdb8f));background:-webkit-linear-gradient(#ffebc2,#ffdb8f);background:-moz-linear-gradient(#ffebc2,#ffdb8f);background:-ms-linear-gradient(top,#ffebc2,#ffdb8f);background:-o-linear-gradient(top,#ffebc2,#ffdb8f)}
+.webix_before_all_tabs{width:100%}
+.webix_after_all_tabs{width:100%;border-left:1px solid #a4bed4;border-right:1px solid #a4bed4;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_view.webix_control .webix_disabled_box .webix_item_tab{color:#aaa!important;background:#e9e9e9;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fbfbfb),color-stop(100%,#e9e9e9));background:-webkit-linear-gradient(#fbfbfb,#e9e9e9);background:-moz-linear-gradient(#fbfbfb,#e9e9e9);background:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background:-o-linear-gradient(top,#fbfbfb,#e9e9e9);border-color:#d5d5d5!important}
+.webix_el_tabbar .webixtype_icon .webix_img_btn{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 auto;text-align:center}
+.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 3px}
+.webix_el_tabbar .webixtype_icon .webix_item_tab,.webix_el_tabbar .webixtype_iconTop .webix_item_tab,.webix_el_tabbar .webixtype_image .webix_item_tab{padding:2px 0;border-radius:0}
+.webix_el_tabbar .webixtype_icon .webix_img_btn_top,.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top,.webix_el_tabbar .webixtype_image .webix_img_btn_top{background-position:center 0;position:relative;height:100%}
+.webix_tab_more_icon{cursor:pointer;display:table-cell;overflow:hidden;text-align:center;box-sizing:border-box;vertical-align:middle;padding:0 3px}
+.webix_tab_more_icon .webix_icon{width:100%}
+.webix_tab_list .webix_list_item:last-child{border-bottom:none}
+.webix_icon.webix_tab_close{font-size:12px;float:right;padding:4px;margin-top:-4px}
+.webix_menu .webix_list_item:active,.webix_menu .webix_list_item:focus,.webix_menu .webix_list_item:hover,.webix_menu-x .webix_list_item:active,.webix_menu-x .webix_list_item:focus,.webix_menu-x .webix_list_item:hover{background:rgba(100,100,100,.1)}
+.webix_menu .webix_list_item,.webix_menu-x .webix_list_item{border:none;text-decoration:none;background:#fff;height:34px}
+.webix_menu .webix_list_item .webix_submenu_icon,.webix_menu-x .webix_list_item .webix_submenu_icon{float:right;text-align:right;position:relative;margin-left:4px}
+.webix_menu-x .webix_list_item:first-child{margin-left:0}
+.webix_menu-x .webix_submenu_icon{top:13px}
+.webix_menu-x{color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%)}
+.webix_menu-x .webix_list_item{display:inline-block;line-height:30px;-moz-background-size:1px 100%,100% 100%,1px 100%;background-size:1px 100%,100% 100%,1px 100%;background-color:transparent;margin:1px 0;background-position:0 0,1px 0,100% 0;background-repeat:no-repeat;background-image:-webkit-gradient(linear,left top,left bottom,#f0f6ff,#fff,#f0f6ff),-webkit-gradient(linear,left top,left bottom,transparent,transparent),-webkit-gradient(linear,left top,left bottom,#f0f6ff,#a4bed4,#f0f6ff);background-image:-webkit-linear-gradient(#f0f6ff,#fff,#f0f6ff),-webkit-linear-gradient(transparent,transparent),-webkit-linear-gradient(#f0f6ff,#a4bed4,#f0f6ff);background-image:-moz-linear-gradient(#f0f6ff,#fff,#f0f6ff),-moz-linear-gradient(transparent,transparent),-moz-linear-gradient(#f0f6ff,#a4bed4,#f0f6ff);background-image:-ms-linear-gradient(top,#f0f6ff,#fff,#f0f6ff),-ms-linear-gradient(transparent,transparent),-ms-linear-gradient(top,#f0f6ff,#a4bed4,#f0f6ff);background-image:-o-linear-gradient(top,#f0f6ff,#fff,#f0f6ff),-o-linear-gradient(transparent,transparent),-o-linear-gradient(top,#f0f6ff,#a4bed4,#f0f6ff)}
+.webix_menu-x .webix_list_item:last-child{background-size:1px 100%,100% 100%,1px 100%;background-repeat:no-repeat;background-image:-webkit-gradient(linear,left top,left bottom,#f0f6ff,#fff,#f0f6ff),-webkit-gradient(linear,left top,left bottom,transparent,transparent),-webkit-gradient(linear,left top,left bottom,transparent,transparent);background-image:-webkit-linear-gradient(#f0f6ff,#fff,#f0f6ff),-webkit-linear-gradient(transparent,transparent),-webkit-linear-gradient(transparent,transparent);background-image:-moz-linear-gradient(#f0f6ff,#fff,#f0f6ff),-moz-linear-gradient(transparent,transparent),-moz-linear-gradient(transparent,transparent);background-image:-ms-linear-gradient(top,#f0f6ff,#fff,#f0f6ff),-ms-linear-gradient(transparent,transparent),-ms-linear-gradient(transparent,transparent);background-image:-o-linear-gradient(top,#f0f6ff,#fff,#f0f6ff),-o-linear-gradient(transparent,transparent),-o-linear-gradient(transparent,transparent);border-right:0}
+.webix_menu{background:#fff;border:1px solid #a4bed4;border-radius:0}
+.webix_menu .webix_list_item{display:block}
+.webix_menu .webix_context_separator{height:3px;padding:1px 3px 0}
+.webix_menu .webix_context_separator .sep_line{height:1px;border-top:1px solid #a4bed4}
+.webix_menu .webix_submenu_icon{top:11px}
+.webix_menu .webix_context_spacer{height:28px}
+.webix_menu_link{color:inherit;text-decoration:none;display:block;height:100%}
+.webix_layout_toolbar,.webix_toolbar.webix_layout_subbar{color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%)}
+.webix_toolbar .webix_layout_clean,.webix_toolbar .webix_layout_line,.webix_toolbar .webix_layout_toolbar{background:0 0}
+.webix_el_button .webix_hidden_upload,.webix_hidden_upload{height:1px;width:1px;border:0!important;font-size:1px;position:absolute;top:0;left:0;z-index:-1}
+.webix_upload_client,.webix_upload_error,.webix_upload_server{width:60px;text-align:center;float:right}
+.cancel_icon,.error_icon{display:inline-block;background-repeat:no-repeat}
+.error_icon{width:18px;height:16px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFMDdENjlDNjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFMDdENjlENjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkUwN0Q2OUE2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkUwN0Q2OUI2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ZJnE7AAABdklEQVR42mK80aLPgAcwA/EcIOYB4mgg/oWuQL36AphmYcAPYvl5WBOYmBgY3n/6fQTIn4hLIRMeQ0CuaBHgY2EQ4GMF8euAWIgcg6qF+NmkOdiZGdhYmRiEBdhAhrSQapAKEBcJC7DCBUQE2UBUGhAbkGLQBDEhdjYmJkaGtHVMDD4LmBk+/2RgEBdhBwX+ZGINcuLiZPYW5Ie45tknRrAhIFqAl5WBh4vFBijsR8ggkI29IA0wwMsOo/+DaWjA9wIxGz6D0oAKDXi5EalCkvc/2DApPgifm5OZQZCPFRyGuAwCxwqya0AAZADMVTAgyA92TDUQS2MzqAUUxcAgRjPoP9hVyICVhREUi6B01g4TY4RmES0gvqSuyMPMQAK4ef/LXyBlAswmF2DWd4kJs2M1pGgLIvrRAXJyAIWqNzcXi7cgHysDqQAUnt9//LW52WoQBfLaDRlxDnWgYQzkAKBBDI+ef38E0n3nycsf6gyUgUcAAQYA9DZJKVXGocQAAAAASUVORK5CYII=)}
+.webix_upload_server{color:green}
+.webix_remove_upload{float:right}
+.cancel_icon{margin-top:5px;width:14px;height:14px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAsElEQVR4XoVQUQbDQBScAywIuUcpKCWglBJCDlBKf0vpbymhd5mDhIDcoAcoJQSEsn2G5KmWzMDsPG92ZyGAgVfWfBtrUwEOZnwwOu2UjaPCbScLAEzYmzxyxafMgaUlRXMTsJJ1B7jgy0Y7gHt5FdgyimeAS+a6ZpDTQkLkCQbmk9OBHaPv+p6x99jLFFuOsTMPSlXl8FVlrSopFBP/sIQAbn6+bwsHA29sNGhMBQgf1cri4JYEbDkAAAAASUVORK5CYII=)}
+.webix_upload_flash{width:100%;height:100%;position:absolute;bottom:0;left:0;background:#fff;filter:alpha(opacity=0)}
+.webix_drop_file{background:#f4f4f4;position:relative}
+.webix_drop_file::before{position:absolute;bottom:10px;left:0;width:100%;text-align:center;pointer-events:none}
+.webix_fieldset fieldset{border:1px solid #81a5c4;margin:0;padding:5px 8px}
+.webix_fieldset legend{color:#1e2022;font-size:12px}
+.webix_forminput fieldset{border:none;margin:0;padding:0}
+.webix_forminput legend{color:#1e2022;line-height:30px;padding:2px 7.5px 2px 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:Helvetica,Verdana;float:left}
+.webix_slider_box{position:relative;padding:11px 10px 0;height:100%;float:left;border-radius:5px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_slider_box .webix_slider_left{height:10px;float:left;width:100px;border:1px solid #b5cadc;-webkit-border-radius:5px 0 0 5px;-moz-border-radius-topleft:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:5px 0 0 5px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_slider_box .webix_slider_right{height:10px;float:left;width:100px;background:#fff;-webkit-border-radius:0 5px 5px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:5px;border-radius:0 5px 5px 0;border:1px solid #b5cadc;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_slider_box .webix_slider_handle{z-index:1;position:absolute;width:15px;height:15px;top:7px;border-radius:8px}
+.webix_slider_box .webix_slider_left{background:#f5f9ff}
+.webix_slider_box .webix_slider_handle{border:1px solid #a4bed4;-moz-box-shadow:inset 0 1px 1px 1px #fff;-webkit-box-shadow:inset 0 1px 1px 1px #fff;box-shadow:inset 0 1px 1px #fff;background:#fafcff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#d6e8ff),color-stop(100%,#fafcff));background:-webkit-linear-gradient(#d6e8ff,#fafcff);background:-moz-linear-gradient(#d6e8ff,#fafcff);background:-ms-linear-gradient(top,#d6e8ff,#fafcff);background:-o-linear-gradient(top,#d6e8ff,#fafcff)}
+.webix_rangeslider .webix_slider_box .webix_slider_left{position:absolute}
+.webix_rangeslider .webix_slider_box .webix_slider_active{z-index:1}
+.webix_rangeslider .webix_slider_box .webix_slider_right{border-radius:5px}
+.webix_slider_alt .webix_slider_box .webix_slider_left,.webix_slider_alt .webix_slider_box .webix_slider_right{border:1px solid #e1e1e1}
+.webix_slider_alt .webix_slider_box .webix_slider_handle{width:11px;margin:0 2px;height:20px;top:4.5px;border-radius:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==);background-repeat:no-repeat;background-position:3px center}
+.webix_slider_alt .webix_slider_box .webix_slider_left{background:#f0f6ff}
+.webix_slider_alt .webix_slider_box .webix_slider_right{background:#eee}
+.webix_slider_alt .webix_slider_box .webix_slider_handle{background-color:#f5f9ff}
+.webix_slider_title{margin-bottom:-11px;text-align:center}
+.webix_progress_bottom,.webix_progress_top{width:100%;position:absolute;top:0;left:0;height:6px;overflow:hidden;z-index:20}
+.webix_progress_bottom{bottom:0;top:auto;height:17px}
+.webix_progress_bottom .webix_progress_state,.webix_progress_top .webix_progress_state{width:0;height:6px;background:#ffdb8f;-moz-transition:width 3s;transition:width 3s}
+.webix_progress_bottom .webix_progress_state{height:17px}
+.webix_progress_icon{width:100%;height:100%;position:absolute;top:0;left:0;z-index:20}
+.webix_progress_icon .webix_progress_state{font-family:FontAwesome;font-size:50px;position:absolute;left:50%;top:50%;margin-left:-25px;margin-top:-25px;display:inline-block;color:#666d73}
+.webix_gage{height:100%;width:100%;transform:rotate(180deg)}
+.webix_gage_label{font-size:.9em;text-align:center;margin-top:10px}
+.webix_gage_placeholder{margin-top:-20px}
+.webix_gage_info{text-align:center;font-size:.7em;position:relative;margin:0 auto 10px}
+.webix_gage_min_range{left:-74px}
+.webix_gage_max_range{right:-74px}
+.webix_gage_max_range,.webix_gage_min_range{display:inline-block;margin-top:20px;position:absolute;text-align:center;width:150px}
+.webix_gage_range_info{font-size:1.2em;line-height:1}
+.webix_gage-value{font-size:2.2em;color:#404040}
+.webix_gage_gradient_point_animated{transition:transform 1.3s linear}
+.webix_gage_animated{stroke:#0f0;animation:gage_dash 1.3s linear forwards;transition:stroke 1.3s linear,stroke-dasharray 1.3s linear}
+.webix_gage_animated_first_load{stroke:#0f0;animation:gage_dash 1.3s linear forwards;transition:stroke 1.3s linear}
+@keyframes gage_dash{to{stroke-dashoffset:0}}
+.webix_bullet_name{width:100}
+.webix_bullet_header{font-weight:700;font-size:15px}
+.webix_bullet_subheader{font-size:15px}
+.webix_bullet_scale{font-size:12px;font-weight:700}
+.webix_organogram canvas{position:absolute}
+.webix_organogram_item{position:absolute;z-index:1;text-align:center;border-radius:4px;background-color:#e3f2fd;border:1px solid #bbdefb;padding:7px 7px 10px;box-sizing:border-box}
+.webix_organogram_item.webix_selected{background-color:#ffdb8f;border-color:#ffdb8f}
+.webix_organogram_list{border-radius:4px;position:absolute;z-index:1;height:auto;border:1px solid #ddd;box-sizing:border-box}
+.webix_organogram_list .webix_organogram_list_item{border:none;text-align:left;position:static;padding:5px;border-radius:0;box-sizing:border-box}
+/*!
+ * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.7.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.7.0) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}
+.fa,.webix_icon,.webix_icon_btn,.webix_input_icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}
+.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}
+.fa-2x{font-size:2em}
+.fa-3x{font-size:3em}
+.fa-4x{font-size:4em}
+.fa-5x{font-size:5em}
+.fa-fw{width:1.28571429em;text-align:center}
+.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}
+.fa-ul>li{position:relative}
+.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}
+.fa-li.fa-lg{left:-1.85714286em}
+.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}
+.fa-pull-left{float:left}
+.fa-pull-right{float:right}
+.fa.fa-pull-left{margin-right:.3em}
+.fa.fa-pull-right{margin-left:.3em}
+.pull-right{float:right}
+.pull-left{float:left}
+.fa.pull-left{margin-right:.3em}
+.fa.pull-right{margin-left:.3em}
+.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}
+.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}
+@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}
+100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}
+100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}
+.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}
+.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}
+.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}
+.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}
+:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}
+.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}
+.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}
+.fa-stack-1x{line-height:inherit}
+.fa-stack-2x{font-size:2em}
+.fa-inverse{color:#fff}
+.fa-glass:before{content:"\f000"}
+.fa-music:before{content:"\f001"}
+.fa-search:before{content:"\f002"}
+.fa-envelope-o:before{content:"\f003"}
+.fa-heart:before{content:"\f004"}
+.fa-star:before{content:"\f005"}
+.fa-star-o:before{content:"\f006"}
+.fa-user:before{content:"\f007"}
+.fa-film:before{content:"\f008"}
+.fa-th-large:before{content:"\f009"}
+.fa-th:before{content:"\f00a"}
+.fa-th-list:before{content:"\f00b"}
+.fa-check:before{content:"\f00c"}
+.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}
+.fa-search-plus:before{content:"\f00e"}
+.fa-search-minus:before{content:"\f010"}
+.fa-power-off:before{content:"\f011"}
+.fa-signal:before{content:"\f012"}
+.fa-cog:before,.fa-gear:before{content:"\f013"}
+.fa-trash-o:before{content:"\f014"}
+.fa-home:before{content:"\f015"}
+.fa-file-o:before{content:"\f016"}
+.fa-clock-o:before{content:"\f017"}
+.fa-road:before{content:"\f018"}
+.fa-download:before{content:"\f019"}
+.fa-arrow-circle-o-down:before{content:"\f01a"}
+.fa-arrow-circle-o-up:before{content:"\f01b"}
+.fa-inbox:before{content:"\f01c"}
+.fa-play-circle-o:before{content:"\f01d"}
+.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}
+.fa-refresh:before{content:"\f021"}
+.fa-list-alt:before{content:"\f022"}
+.fa-lock:before{content:"\f023"}
+.fa-flag:before{content:"\f024"}
+.fa-headphones:before{content:"\f025"}
+.fa-volume-off:before{content:"\f026"}
+.fa-volume-down:before{content:"\f027"}
+.fa-volume-up:before{content:"\f028"}
+.fa-qrcode:before{content:"\f029"}
+.fa-barcode:before{content:"\f02a"}
+.fa-tag:before{content:"\f02b"}
+.fa-tags:before{content:"\f02c"}
+.fa-book:before{content:"\f02d"}
+.fa-bookmark:before{content:"\f02e"}
+.fa-print:before{content:"\f02f"}
+.fa-camera:before{content:"\f030"}
+.fa-font:before{content:"\f031"}
+.fa-bold:before{content:"\f032"}
+.fa-italic:before{content:"\f033"}
+.fa-text-height:before{content:"\f034"}
+.fa-text-width:before{content:"\f035"}
+.fa-align-left:before{content:"\f036"}
+.fa-align-center:before{content:"\f037"}
+.fa-align-right:before{content:"\f038"}
+.fa-align-justify:before{content:"\f039"}
+.fa-list:before{content:"\f03a"}
+.fa-dedent:before,.fa-outdent:before{content:"\f03b"}
+.fa-indent:before{content:"\f03c"}
+.fa-video-camera:before{content:"\f03d"}
+.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}
+.fa-pencil:before{content:"\f040"}
+.fa-map-marker:before{content:"\f041"}
+.fa-adjust:before{content:"\f042"}
+.fa-tint:before{content:"\f043"}
+.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}
+.fa-share-square-o:before{content:"\f045"}
+.fa-check-square-o:before{content:"\f046"}
+.fa-arrows:before{content:"\f047"}
+.fa-step-backward:before{content:"\f048"}
+.fa-fast-backward:before{content:"\f049"}
+.fa-backward:before{content:"\f04a"}
+.fa-play:before{content:"\f04b"}
+.fa-pause:before{content:"\f04c"}
+.fa-stop:before{content:"\f04d"}
+.fa-forward:before{content:"\f04e"}
+.fa-fast-forward:before{content:"\f050"}
+.fa-step-forward:before{content:"\f051"}
+.fa-eject:before{content:"\f052"}
+.fa-chevron-left:before{content:"\f053"}
+.fa-chevron-right:before{content:"\f054"}
+.fa-plus-circle:before{content:"\f055"}
+.fa-minus-circle:before{content:"\f056"}
+.fa-times-circle:before{content:"\f057"}
+.fa-check-circle:before{content:"\f058"}
+.fa-question-circle:before{content:"\f059"}
+.fa-info-circle:before{content:"\f05a"}
+.fa-crosshairs:before{content:"\f05b"}
+.fa-times-circle-o:before{content:"\f05c"}
+.fa-check-circle-o:before{content:"\f05d"}
+.fa-ban:before{content:"\f05e"}
+.fa-arrow-left:before{content:"\f060"}
+.fa-arrow-right:before{content:"\f061"}
+.fa-arrow-up:before{content:"\f062"}
+.fa-arrow-down:before{content:"\f063"}
+.fa-mail-forward:before,.fa-share:before{content:"\f064"}
+.fa-expand:before{content:"\f065"}
+.fa-compress:before{content:"\f066"}
+.fa-plus:before{content:"\f067"}
+.fa-minus:before{content:"\f068"}
+.fa-asterisk:before{content:"\f069"}
+.fa-exclamation-circle:before{content:"\f06a"}
+.fa-gift:before{content:"\f06b"}
+.fa-leaf:before{content:"\f06c"}
+.fa-fire:before{content:"\f06d"}
+.fa-eye:before{content:"\f06e"}
+.fa-eye-slash:before{content:"\f070"}
+.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}
+.fa-plane:before{content:"\f072"}
+.fa-calendar:before{content:"\f073"}
+.fa-random:before{content:"\f074"}
+.fa-comment:before{content:"\f075"}
+.fa-magnet:before{content:"\f076"}
+.fa-chevron-up:before{content:"\f077"}
+.fa-chevron-down:before{content:"\f078"}
+.fa-retweet:before{content:"\f079"}
+.fa-shopping-cart:before{content:"\f07a"}
+.fa-folder:before{content:"\f07b"}
+.fa-folder-open:before{content:"\f07c"}
+.fa-arrows-v:before{content:"\f07d"}
+.fa-arrows-h:before{content:"\f07e"}
+.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}
+.fa-twitter-square:before{content:"\f081"}
+.fa-facebook-square:before{content:"\f082"}
+.fa-camera-retro:before{content:"\f083"}
+.fa-key:before{content:"\f084"}
+.fa-cogs:before,.fa-gears:before{content:"\f085"}
+.fa-comments:before{content:"\f086"}
+.fa-thumbs-o-up:before{content:"\f087"}
+.fa-thumbs-o-down:before{content:"\f088"}
+.fa-star-half:before{content:"\f089"}
+.fa-heart-o:before{content:"\f08a"}
+.fa-sign-out:before{content:"\f08b"}
+.fa-linkedin-square:before{content:"\f08c"}
+.fa-thumb-tack:before{content:"\f08d"}
+.fa-external-link:before{content:"\f08e"}
+.fa-sign-in:before{content:"\f090"}
+.fa-trophy:before{content:"\f091"}
+.fa-github-square:before{content:"\f092"}
+.fa-upload:before{content:"\f093"}
+.fa-lemon-o:before{content:"\f094"}
+.fa-phone:before{content:"\f095"}
+.fa-square-o:before{content:"\f096"}
+.fa-bookmark-o:before{content:"\f097"}
+.fa-phone-square:before{content:"\f098"}
+.fa-twitter:before{content:"\f099"}
+.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}
+.fa-github:before{content:"\f09b"}
+.fa-unlock:before{content:"\f09c"}
+.fa-credit-card:before{content:"\f09d"}
+.fa-feed:before,.fa-rss:before{content:"\f09e"}
+.fa-hdd-o:before{content:"\f0a0"}
+.fa-bullhorn:before{content:"\f0a1"}
+.fa-bell:before{content:"\f0f3"}
+.fa-certificate:before{content:"\f0a3"}
+.fa-hand-o-right:before{content:"\f0a4"}
+.fa-hand-o-left:before{content:"\f0a5"}
+.fa-hand-o-up:before{content:"\f0a6"}
+.fa-hand-o-down:before{content:"\f0a7"}
+.fa-arrow-circle-left:before{content:"\f0a8"}
+.fa-arrow-circle-right:before{content:"\f0a9"}
+.fa-arrow-circle-up:before{content:"\f0aa"}
+.fa-arrow-circle-down:before{content:"\f0ab"}
+.fa-globe:before{content:"\f0ac"}
+.fa-wrench:before{content:"\f0ad"}
+.fa-tasks:before{content:"\f0ae"}
+.fa-filter:before{content:"\f0b0"}
+.fa-briefcase:before{content:"\f0b1"}
+.fa-arrows-alt:before{content:"\f0b2"}
+.fa-group:before,.fa-users:before{content:"\f0c0"}
+.fa-chain:before,.fa-link:before{content:"\f0c1"}
+.fa-cloud:before{content:"\f0c2"}
+.fa-flask:before{content:"\f0c3"}
+.fa-cut:before,.fa-scissors:before{content:"\f0c4"}
+.fa-copy:before,.fa-files-o:before{content:"\f0c5"}
+.fa-paperclip:before{content:"\f0c6"}
+.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}
+.fa-square:before{content:"\f0c8"}
+.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}
+.fa-list-ul:before{content:"\f0ca"}
+.fa-list-ol:before{content:"\f0cb"}
+.fa-strikethrough:before{content:"\f0cc"}
+.fa-underline:before{content:"\f0cd"}
+.fa-table:before{content:"\f0ce"}
+.fa-magic:before{content:"\f0d0"}
+.fa-truck:before{content:"\f0d1"}
+.fa-pinterest:before{content:"\f0d2"}
+.fa-pinterest-square:before{content:"\f0d3"}
+.fa-google-plus-square:before{content:"\f0d4"}
+.fa-google-plus:before{content:"\f0d5"}
+.fa-money:before{content:"\f0d6"}
+.fa-caret-down:before{content:"\f0d7"}
+.fa-caret-up:before{content:"\f0d8"}
+.fa-caret-left:before{content:"\f0d9"}
+.fa-caret-right:before{content:"\f0da"}
+.fa-columns:before{content:"\f0db"}
+.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}
+.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}
+.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}
+.fa-envelope:before{content:"\f0e0"}
+.fa-linkedin:before{content:"\f0e1"}
+.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}
+.fa-gavel:before,.fa-legal:before{content:"\f0e3"}
+.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}
+.fa-comment-o:before{content:"\f0e5"}
+.fa-comments-o:before{content:"\f0e6"}
+.fa-bolt:before,.fa-flash:before{content:"\f0e7"}
+.fa-sitemap:before{content:"\f0e8"}
+.fa-umbrella:before{content:"\f0e9"}
+.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}
+.fa-lightbulb-o:before{content:"\f0eb"}
+.fa-exchange:before{content:"\f0ec"}
+.fa-cloud-download:before{content:"\f0ed"}
+.fa-cloud-upload:before{content:"\f0ee"}
+.fa-user-md:before{content:"\f0f0"}
+.fa-stethoscope:before{content:"\f0f1"}
+.fa-suitcase:before{content:"\f0f2"}
+.fa-bell-o:before{content:"\f0a2"}
+.fa-coffee:before{content:"\f0f4"}
+.fa-cutlery:before{content:"\f0f5"}
+.fa-file-text-o:before{content:"\f0f6"}
+.fa-building-o:before{content:"\f0f7"}
+.fa-hospital-o:before{content:"\f0f8"}
+.fa-ambulance:before{content:"\f0f9"}
+.fa-medkit:before{content:"\f0fa"}
+.fa-fighter-jet:before{content:"\f0fb"}
+.fa-beer:before{content:"\f0fc"}
+.fa-h-square:before{content:"\f0fd"}
+.fa-plus-square:before{content:"\f0fe"}
+.fa-angle-double-left:before{content:"\f100"}
+.fa-angle-double-right:before{content:"\f101"}
+.fa-angle-double-up:before{content:"\f102"}
+.fa-angle-double-down:before{content:"\f103"}
+.fa-angle-left:before{content:"\f104"}
+.fa-angle-right:before{content:"\f105"}
+.fa-angle-up:before{content:"\f106"}
+.fa-angle-down:before{content:"\f107"}
+.fa-desktop:before{content:"\f108"}
+.fa-laptop:before{content:"\f109"}
+.fa-tablet:before{content:"\f10a"}
+.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}
+.fa-circle-o:before{content:"\f10c"}
+.fa-quote-left:before{content:"\f10d"}
+.fa-quote-right:before{content:"\f10e"}
+.fa-spinner:before{content:"\f110"}
+.fa-circle:before{content:"\f111"}
+.fa-mail-reply:before,.fa-reply:before{content:"\f112"}
+.fa-github-alt:before{content:"\f113"}
+.fa-folder-o:before{content:"\f114"}
+.fa-folder-open-o:before{content:"\f115"}
+.fa-smile-o:before{content:"\f118"}
+.fa-frown-o:before{content:"\f119"}
+.fa-meh-o:before{content:"\f11a"}
+.fa-gamepad:before{content:"\f11b"}
+.fa-keyboard-o:before{content:"\f11c"}
+.fa-flag-o:before{content:"\f11d"}
+.fa-flag-checkered:before{content:"\f11e"}
+.fa-terminal:before{content:"\f120"}
+.fa-code:before{content:"\f121"}
+.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}
+.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}
+.fa-location-arrow:before{content:"\f124"}
+.fa-crop:before{content:"\f125"}
+.fa-code-fork:before{content:"\f126"}
+.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}
+.fa-question:before{content:"\f128"}
+.fa-info:before{content:"\f129"}
+.fa-exclamation:before{content:"\f12a"}
+.fa-superscript:before{content:"\f12b"}
+.fa-subscript:before{content:"\f12c"}
+.fa-eraser:before{content:"\f12d"}
+.fa-puzzle-piece:before{content:"\f12e"}
+.fa-microphone:before{content:"\f130"}
+.fa-microphone-slash:before{content:"\f131"}
+.fa-shield:before{content:"\f132"}
+.fa-calendar-o:before{content:"\f133"}
+.fa-fire-extinguisher:before{content:"\f134"}
+.fa-rocket:before{content:"\f135"}
+.fa-maxcdn:before{content:"\f136"}
+.fa-chevron-circle-left:before{content:"\f137"}
+.fa-chevron-circle-right:before{content:"\f138"}
+.fa-chevron-circle-up:before{content:"\f139"}
+.fa-chevron-circle-down:before{content:"\f13a"}
+.fa-html5:before{content:"\f13b"}
+.fa-css3:before{content:"\f13c"}
+.fa-anchor:before{content:"\f13d"}
+.fa-unlock-alt:before{content:"\f13e"}
+.fa-bullseye:before{content:"\f140"}
+.fa-ellipsis-h:before{content:"\f141"}
+.fa-ellipsis-v:before{content:"\f142"}
+.fa-rss-square:before{content:"\f143"}
+.fa-play-circle:before{content:"\f144"}
+.fa-ticket:before{content:"\f145"}
+.fa-minus-square:before{content:"\f146"}
+.fa-minus-square-o:before{content:"\f147"}
+.fa-level-up:before{content:"\f148"}
+.fa-level-down:before{content:"\f149"}
+.fa-check-square:before{content:"\f14a"}
+.fa-pencil-square:before{content:"\f14b"}
+.fa-external-link-square:before{content:"\f14c"}
+.fa-share-square:before{content:"\f14d"}
+.fa-compass:before{content:"\f14e"}
+.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}
+.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}
+.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}
+.fa-eur:before,.fa-euro:before{content:"\f153"}
+.fa-gbp:before{content:"\f154"}
+.fa-dollar:before,.fa-usd:before{content:"\f155"}
+.fa-inr:before,.fa-rupee:before{content:"\f156"}
+.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}
+.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}
+.fa-krw:before,.fa-won:before{content:"\f159"}
+.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}
+.fa-file:before{content:"\f15b"}
+.fa-file-text:before{content:"\f15c"}
+.fa-sort-alpha-asc:before{content:"\f15d"}
+.fa-sort-alpha-desc:before{content:"\f15e"}
+.fa-sort-amount-asc:before{content:"\f160"}
+.fa-sort-amount-desc:before{content:"\f161"}
+.fa-sort-numeric-asc:before{content:"\f162"}
+.fa-sort-numeric-desc:before{content:"\f163"}
+.fa-thumbs-up:before{content:"\f164"}
+.fa-thumbs-down:before{content:"\f165"}
+.fa-youtube-square:before{content:"\f166"}
+.fa-youtube:before{content:"\f167"}
+.fa-xing:before{content:"\f168"}
+.fa-xing-square:before{content:"\f169"}
+.fa-youtube-play:before{content:"\f16a"}
+.fa-dropbox:before{content:"\f16b"}
+.fa-stack-overflow:before{content:"\f16c"}
+.fa-instagram:before{content:"\f16d"}
+.fa-flickr:before{content:"\f16e"}
+.fa-adn:before{content:"\f170"}
+.fa-bitbucket:before{content:"\f171"}
+.fa-bitbucket-square:before{content:"\f172"}
+.fa-tumblr:before{content:"\f173"}
+.fa-tumblr-square:before{content:"\f174"}
+.fa-long-arrow-down:before{content:"\f175"}
+.fa-long-arrow-up:before{content:"\f176"}
+.fa-long-arrow-left:before{content:"\f177"}
+.fa-long-arrow-right:before{content:"\f178"}
+.fa-apple:before{content:"\f179"}
+.fa-windows:before{content:"\f17a"}
+.fa-android:before{content:"\f17b"}
+.fa-linux:before{content:"\f17c"}
+.fa-dribbble:before{content:"\f17d"}
+.fa-skype:before{content:"\f17e"}
+.fa-foursquare:before{content:"\f180"}
+.fa-trello:before{content:"\f181"}
+.fa-female:before{content:"\f182"}
+.fa-male:before{content:"\f183"}
+.fa-gittip:before,.fa-gratipay:before{content:"\f184"}
+.fa-sun-o:before{content:"\f185"}
+.fa-moon-o:before{content:"\f186"}
+.fa-archive:before{content:"\f187"}
+.fa-bug:before{content:"\f188"}
+.fa-vk:before{content:"\f189"}
+.fa-weibo:before{content:"\f18a"}
+.fa-renren:before{content:"\f18b"}
+.fa-pagelines:before{content:"\f18c"}
+.fa-stack-exchange:before{content:"\f18d"}
+.fa-arrow-circle-o-right:before{content:"\f18e"}
+.fa-arrow-circle-o-left:before{content:"\f190"}
+.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}
+.fa-dot-circle-o:before{content:"\f192"}
+.fa-wheelchair:before{content:"\f193"}
+.fa-vimeo-square:before{content:"\f194"}
+.fa-try:before,.fa-turkish-lira:before{content:"\f195"}
+.fa-plus-square-o:before{content:"\f196"}
+.fa-space-shuttle:before{content:"\f197"}
+.fa-slack:before{content:"\f198"}
+.fa-envelope-square:before{content:"\f199"}
+.fa-wordpress:before{content:"\f19a"}
+.fa-openid:before{content:"\f19b"}
+.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}
+.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}
+.fa-yahoo:before{content:"\f19e"}
+.fa-google:before{content:"\f1a0"}
+.fa-reddit:before{content:"\f1a1"}
+.fa-reddit-square:before{content:"\f1a2"}
+.fa-stumbleupon-circle:before{content:"\f1a3"}
+.fa-stumbleupon:before{content:"\f1a4"}
+.fa-delicious:before{content:"\f1a5"}
+.fa-digg:before{content:"\f1a6"}
+.fa-pied-piper-pp:before{content:"\f1a7"}
+.fa-pied-piper-alt:before{content:"\f1a8"}
+.fa-drupal:before{content:"\f1a9"}
+.fa-joomla:before{content:"\f1aa"}
+.fa-language:before{content:"\f1ab"}
+.fa-fax:before{content:"\f1ac"}
+.fa-building:before{content:"\f1ad"}
+.fa-child:before{content:"\f1ae"}
+.fa-paw:before{content:"\f1b0"}
+.fa-spoon:before{content:"\f1b1"}
+.fa-cube:before{content:"\f1b2"}
+.fa-cubes:before{content:"\f1b3"}
+.fa-behance:before{content:"\f1b4"}
+.fa-behance-square:before{content:"\f1b5"}
+.fa-steam:before{content:"\f1b6"}
+.fa-steam-square:before{content:"\f1b7"}
+.fa-recycle:before{content:"\f1b8"}
+.fa-automobile:before,.fa-car:before{content:"\f1b9"}
+.fa-cab:before,.fa-taxi:before{content:"\f1ba"}
+.fa-tree:before{content:"\f1bb"}
+.fa-spotify:before{content:"\f1bc"}
+.fa-deviantart:before{content:"\f1bd"}
+.fa-soundcloud:before{content:"\f1be"}
+.fa-database:before{content:"\f1c0"}
+.fa-file-pdf-o:before{content:"\f1c1"}
+.fa-file-word-o:before{content:"\f1c2"}
+.fa-file-excel-o:before{content:"\f1c3"}
+.fa-file-powerpoint-o:before{content:"\f1c4"}
+.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}
+.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}
+.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}
+.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}
+.fa-file-code-o:before{content:"\f1c9"}
+.fa-vine:before{content:"\f1ca"}
+.fa-codepen:before{content:"\f1cb"}
+.fa-jsfiddle:before{content:"\f1cc"}
+.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}
+.fa-circle-o-notch:before{content:"\f1ce"}
+.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}
+.fa-empire:before,.fa-ge:before{content:"\f1d1"}
+.fa-git-square:before{content:"\f1d2"}
+.fa-git:before{content:"\f1d3"}
+.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}
+.fa-tencent-weibo:before{content:"\f1d5"}
+.fa-qq:before{content:"\f1d6"}
+.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}
+.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}
+.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}
+.fa-history:before{content:"\f1da"}
+.fa-circle-thin:before{content:"\f1db"}
+.fa-header:before{content:"\f1dc"}
+.fa-paragraph:before{content:"\f1dd"}
+.fa-sliders:before{content:"\f1de"}
+.fa-share-alt:before{content:"\f1e0"}
+.fa-share-alt-square:before{content:"\f1e1"}
+.fa-bomb:before{content:"\f1e2"}
+.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}
+.fa-tty:before{content:"\f1e4"}
+.fa-binoculars:before{content:"\f1e5"}
+.fa-plug:before{content:"\f1e6"}
+.fa-slideshare:before{content:"\f1e7"}
+.fa-twitch:before{content:"\f1e8"}
+.fa-yelp:before{content:"\f1e9"}
+.fa-newspaper-o:before{content:"\f1ea"}
+.fa-wifi:before{content:"\f1eb"}
+.fa-calculator:before{content:"\f1ec"}
+.fa-paypal:before{content:"\f1ed"}
+.fa-google-wallet:before{content:"\f1ee"}
+.fa-cc-visa:before{content:"\f1f0"}
+.fa-cc-mastercard:before{content:"\f1f1"}
+.fa-cc-discover:before{content:"\f1f2"}
+.fa-cc-amex:before{content:"\f1f3"}
+.fa-cc-paypal:before{content:"\f1f4"}
+.fa-cc-stripe:before{content:"\f1f5"}
+.fa-bell-slash:before{content:"\f1f6"}
+.fa-bell-slash-o:before{content:"\f1f7"}
+.fa-trash:before{content:"\f1f8"}
+.fa-copyright:before{content:"\f1f9"}
+.fa-at:before{content:"\f1fa"}
+.fa-eyedropper:before{content:"\f1fb"}
+.fa-paint-brush:before{content:"\f1fc"}
+.fa-birthday-cake:before{content:"\f1fd"}
+.fa-area-chart:before{content:"\f1fe"}
+.fa-pie-chart:before{content:"\f200"}
+.fa-line-chart:before{content:"\f201"}
+.fa-lastfm:before{content:"\f202"}
+.fa-lastfm-square:before{content:"\f203"}
+.fa-toggle-off:before{content:"\f204"}
+.fa-toggle-on:before{content:"\f205"}
+.fa-bicycle:before{content:"\f206"}
+.fa-bus:before{content:"\f207"}
+.fa-ioxhost:before{content:"\f208"}
+.fa-angellist:before{content:"\f209"}
+.fa-cc:before{content:"\f20a"}
+.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}
+.fa-meanpath:before{content:"\f20c"}
+.fa-buysellads:before{content:"\f20d"}
+.fa-connectdevelop:before{content:"\f20e"}
+.fa-dashcube:before{content:"\f210"}
+.fa-forumbee:before{content:"\f211"}
+.fa-leanpub:before{content:"\f212"}
+.fa-sellsy:before{content:"\f213"}
+.fa-shirtsinbulk:before{content:"\f214"}
+.fa-simplybuilt:before{content:"\f215"}
+.fa-skyatlas:before{content:"\f216"}
+.fa-cart-plus:before{content:"\f217"}
+.fa-cart-arrow-down:before{content:"\f218"}
+.fa-diamond:before{content:"\f219"}
+.fa-ship:before{content:"\f21a"}
+.fa-user-secret:before{content:"\f21b"}
+.fa-motorcycle:before{content:"\f21c"}
+.fa-street-view:before{content:"\f21d"}
+.fa-heartbeat:before{content:"\f21e"}
+.fa-venus:before{content:"\f221"}
+.fa-mars:before{content:"\f222"}
+.fa-mercury:before{content:"\f223"}
+.fa-intersex:before,.fa-transgender:before{content:"\f224"}
+.fa-transgender-alt:before{content:"\f225"}
+.fa-venus-double:before{content:"\f226"}
+.fa-mars-double:before{content:"\f227"}
+.fa-venus-mars:before{content:"\f228"}
+.fa-mars-stroke:before{content:"\f229"}
+.fa-mars-stroke-v:before{content:"\f22a"}
+.fa-mars-stroke-h:before{content:"\f22b"}
+.fa-neuter:before{content:"\f22c"}
+.fa-genderless:before{content:"\f22d"}
+.fa-facebook-official:before{content:"\f230"}
+.fa-pinterest-p:before{content:"\f231"}
+.fa-whatsapp:before{content:"\f232"}
+.fa-server:before{content:"\f233"}
+.fa-user-plus:before{content:"\f234"}
+.fa-user-times:before{content:"\f235"}
+.fa-bed:before,.fa-hotel:before{content:"\f236"}
+.fa-viacoin:before{content:"\f237"}
+.fa-train:before{content:"\f238"}
+.fa-subway:before{content:"\f239"}
+.fa-medium:before{content:"\f23a"}
+.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}
+.fa-optin-monster:before{content:"\f23c"}
+.fa-opencart:before{content:"\f23d"}
+.fa-expeditedssl:before{content:"\f23e"}
+.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}
+.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}
+.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}
+.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}
+.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}
+.fa-mouse-pointer:before{content:"\f245"}
+.fa-i-cursor:before{content:"\f246"}
+.fa-object-group:before{content:"\f247"}
+.fa-object-ungroup:before{content:"\f248"}
+.fa-sticky-note:before{content:"\f249"}
+.fa-sticky-note-o:before{content:"\f24a"}
+.fa-cc-jcb:before{content:"\f24b"}
+.fa-cc-diners-club:before{content:"\f24c"}
+.fa-clone:before{content:"\f24d"}
+.fa-balance-scale:before{content:"\f24e"}
+.fa-hourglass-o:before{content:"\f250"}
+.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}
+.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}
+.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}
+.fa-hourglass:before{content:"\f254"}
+.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}
+.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}
+.fa-hand-scissors-o:before{content:"\f257"}
+.fa-hand-lizard-o:before{content:"\f258"}
+.fa-hand-spock-o:before{content:"\f259"}
+.fa-hand-pointer-o:before{content:"\f25a"}
+.fa-hand-peace-o:before{content:"\f25b"}
+.fa-trademark:before{content:"\f25c"}
+.fa-registered:before{content:"\f25d"}
+.fa-creative-commons:before{content:"\f25e"}
+.fa-gg:before{content:"\f260"}
+.fa-gg-circle:before{content:"\f261"}
+.fa-tripadvisor:before{content:"\f262"}
+.fa-odnoklassniki:before{content:"\f263"}
+.fa-odnoklassniki-square:before{content:"\f264"}
+.fa-get-pocket:before{content:"\f265"}
+.fa-wikipedia-w:before{content:"\f266"}
+.fa-safari:before{content:"\f267"}
+.fa-chrome:before{content:"\f268"}
+.fa-firefox:before{content:"\f269"}
+.fa-opera:before{content:"\f26a"}
+.fa-internet-explorer:before{content:"\f26b"}
+.fa-television:before,.fa-tv:before{content:"\f26c"}
+.fa-contao:before{content:"\f26d"}
+.fa-500px:before{content:"\f26e"}
+.fa-amazon:before{content:"\f270"}
+.fa-calendar-plus-o:before{content:"\f271"}
+.fa-calendar-minus-o:before{content:"\f272"}
+.fa-calendar-times-o:before{content:"\f273"}
+.fa-calendar-check-o:before{content:"\f274"}
+.fa-industry:before{content:"\f275"}
+.fa-map-pin:before{content:"\f276"}
+.fa-map-signs:before{content:"\f277"}
+.fa-map-o:before{content:"\f278"}
+.fa-map:before{content:"\f279"}
+.fa-commenting:before{content:"\f27a"}
+.fa-commenting-o:before{content:"\f27b"}
+.fa-houzz:before{content:"\f27c"}
+.fa-vimeo:before{content:"\f27d"}
+.fa-black-tie:before{content:"\f27e"}
+.fa-fonticons:before{content:"\f280"}
+.fa-reddit-alien:before{content:"\f281"}
+.fa-edge:before{content:"\f282"}
+.fa-credit-card-alt:before{content:"\f283"}
+.fa-codiepie:before{content:"\f284"}
+.fa-modx:before{content:"\f285"}
+.fa-fort-awesome:before{content:"\f286"}
+.fa-usb:before{content:"\f287"}
+.fa-product-hunt:before{content:"\f288"}
+.fa-mixcloud:before{content:"\f289"}
+.fa-scribd:before{content:"\f28a"}
+.fa-pause-circle:before{content:"\f28b"}
+.fa-pause-circle-o:before{content:"\f28c"}
+.fa-stop-circle:before{content:"\f28d"}
+.fa-stop-circle-o:before{content:"\f28e"}
+.fa-shopping-bag:before{content:"\f290"}
+.fa-shopping-basket:before{content:"\f291"}
+.fa-hashtag:before{content:"\f292"}
+.fa-bluetooth:before{content:"\f293"}
+.fa-bluetooth-b:before{content:"\f294"}
+.fa-percent:before{content:"\f295"}
+.fa-gitlab:before{content:"\f296"}
+.fa-wpbeginner:before{content:"\f297"}
+.fa-wpforms:before{content:"\f298"}
+.fa-envira:before{content:"\f299"}
+.fa-universal-access:before{content:"\f29a"}
+.fa-wheelchair-alt:before{content:"\f29b"}
+.fa-question-circle-o:before{content:"\f29c"}
+.fa-blind:before{content:"\f29d"}
+.fa-audio-description:before{content:"\f29e"}
+.fa-volume-control-phone:before{content:"\f2a0"}
+.fa-braille:before{content:"\f2a1"}
+.fa-assistive-listening-systems:before{content:"\f2a2"}
+.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}
+.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}
+.fa-glide:before{content:"\f2a5"}
+.fa-glide-g:before{content:"\f2a6"}
+.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}
+.fa-low-vision:before{content:"\f2a8"}
+.fa-viadeo:before{content:"\f2a9"}
+.fa-viadeo-square:before{content:"\f2aa"}
+.fa-snapchat:before{content:"\f2ab"}
+.fa-snapchat-ghost:before{content:"\f2ac"}
+.fa-snapchat-square:before{content:"\f2ad"}
+.fa-pied-piper:before{content:"\f2ae"}
+.fa-first-order:before{content:"\f2b0"}
+.fa-yoast:before{content:"\f2b1"}
+.fa-themeisle:before{content:"\f2b2"}
+.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}
+.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}
+.fa-handshake-o:before{content:"\f2b5"}
+.fa-envelope-open:before{content:"\f2b6"}
+.fa-envelope-open-o:before{content:"\f2b7"}
+.fa-linode:before{content:"\f2b8"}
+.fa-address-book:before{content:"\f2b9"}
+.fa-address-book-o:before{content:"\f2ba"}
+.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}
+.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}
+.fa-user-circle:before{content:"\f2bd"}
+.fa-user-circle-o:before{content:"\f2be"}
+.fa-user-o:before{content:"\f2c0"}
+.fa-id-badge:before{content:"\f2c1"}
+.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}
+.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}
+.fa-quora:before{content:"\f2c4"}
+.fa-free-code-camp:before{content:"\f2c5"}
+.fa-telegram:before{content:"\f2c6"}
+.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}
+.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}
+.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}
+.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}
+.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}
+.fa-shower:before{content:"\f2cc"}
+.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}
+.fa-podcast:before{content:"\f2ce"}
+.fa-window-maximize:before{content:"\f2d0"}
+.fa-window-minimize:before{content:"\f2d1"}
+.fa-window-restore:before{content:"\f2d2"}
+.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}
+.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}
+.fa-bandcamp:before{content:"\f2d5"}
+.fa-grav:before{content:"\f2d6"}
+.fa-etsy:before{content:"\f2d7"}
+.fa-imdb:before{content:"\f2d8"}
+.fa-ravelry:before{content:"\f2d9"}
+.fa-eercast:before{content:"\f2da"}
+.fa-microchip:before{content:"\f2db"}
+.fa-snowflake-o:before{content:"\f2dc"}
+.fa-superpowers:before{content:"\f2dd"}
+.fa-wpexplorer:before{content:"\f2de"}
+.fa-meetup:before{content:"\f2e0"}
+.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}
+.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
+.webix_icon,.webix_input_icon{font-size:17px;display:inline-block;width:20px}
+.webix_input_icon{float:right;font-size:19px;color:#888}
+.webix_icon_button{background-color:transparent;border:none;padding:0;cursor:pointer;position:relative}
+.webix_icon_button .webix_icon{font-size:20px;height:23px;width:21px;display:inline-block;text-align:center;color:#606060}
+.webix_icon_btn{font-size:17px;display:inline-block;text-align:center;width:24px;color:#606060}
+.webix_el_iconBbutton .webix_icon_btn{text-align:center;width:100%;padding:5px 0}
+.webix_el_icon{cursor:pointer}
+.webix_badge{background-color:#ff8839;color:#fff;border-radius:50%;font-size:12px;height:22px;min-width:22px;box-sizing:border-box;padding:0 4px;text-align:center;line-height:21px;position:absolute;right:0;top:0}
+.webix_list_item .webix_badge{position:static;float:right;margin:4px -5px 0 10px}
+.webixtype_base .webix_badge{top:50%;margin-top:-11px;margin-right:8px}
+.webix_treemap{background-color:#f5f5f5}
+.webix_treemap .webix_scroll_cont{position:relative;height:100%;width:100%}
+.webix_treemap_item{position:absolute;color:#444;overflow:hidden;text-align:left;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3px 5px;border-width:0 1px 1px 0;border-style:solid;border-color:rgba(0,0,0,.2);background:0 0}
+.webix_treemap_level_top{z-index:1;border-color:rgba(0,0,0,.4)}
+.webix_treemap_item_bottom{border-bottom-width:0}
+.webix_treemap_item_right{border-right-width:0}
+.webix_treemap_item:hover{box-shadow:inset 0 0 5px #666}
+.webix_treemap_item.webix_selected{border-color:#ffdb8f;box-shadow:inset 0 0 1px 2px #ffdb8f}
+.webix_treemap_header{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 10px;border-bottom:1px solid #a4bed4}
+.webix_treemap_header_item{cursor:pointer}
+.webix_treemap_header_item:last-child{cursor:default}
+.webix_treemap_reset{float:right;width:25px;text-align:center}
+.webix_treemap_reset:before{content:"\f00d";color:#1e2022;font-family:FontAwesome;font-size:16px;display:block;cursor:pointer}
+.webix_treemap_path_icon{width:20px;text-align:center}
+.webix_barcode{position:relative}
+.webix_barcode .webix_canvas_text{font-size:13px;padding:0 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.portlet_drag{position:absolute;z-index:1;top:5px;right:5px;width:18px;opacity:.5;cursor:pointer}
+.portlet_in_drag{opacity:.4}
+.portlet_marker,.portlet_markerbottom,.portlet_markerleft,.portlet_markerright,.portlet_markertop{opacity:.5;background:#9169BE;position:absolute;transition:top .5s,left .5s,width .5s,height .5s;top:0;left:0;width:100%;height:100%}
+.portlet_markertop{height:50%}
+.portlet_markerbottom{height:50%;top:50%}
+.portlet_markerleft{width:50%}
+.portlet_markerright{width:50%;left:50%}
+.webix_popup.webix_sidemenu.webix_sidemenu_left{border-width:0 1px 0 0;box-shadow:2px 0 2px rgba(0,0,0,.05)}
+.webix_sidemenu_left.webix_animate{transition:left .6s}
+.webix_popup.webix_sidemenu.webix_sidemenu_right{left:auto;border-width:0 0 0 1px;box-shadow:-2px 0 2px rgba(0,0,0,.05)}
+.webix_sidemenu_right.webix_animate{transition:right .6s}
+.webix_popup.webix_sidemenu.webix_sidemenu_top{border-width:0 0 1px;box-shadow:0 2px 2px rgba(0,0,0,.05)}
+.webix_sidemenu_top .webix_win_body{position:relative}
+.webix_sidemenu_top .webix_win_body>.webix_view{position:absolute;top:auto;left:0;bottom:0}
+.webix_sidemenu_top.webix_animate,.webix_sidemenu_top.webix_animate .webix_win_body{transition:height .6s}
+.webix_popup.webix_sidemenu.webix_sidemenu_bottom{border-width:1px 0 0;top:auto;box-shadow:0 -2px 2px rgba(0,0,0,.05)}
+.webix_sidemenu_bottom.webix_animate,.webix_sidemenu_bottom.webix_animate .webix_win_body{transition:height .6s}
+.webix_view.webix_pdf{background-color:#404040;overflow:auto;-webkit-overflow-scrolling:touch}
+.webix_pdf .canvas_wrapper{margin:0 auto;box-shadow:5px 5px 15px #1c1c1c;width:100%;height:100%}
+.webix_toolbar.pdf_bar{background-color:#474747}
+.webix_toolbar.pdf_bar .webix_icon_btn{font-size:15px}
+.webix_toolbar.pdf_bar .webix_img_btn:focus,.webix_toolbar.pdf_bar .webix_img_btn:hover{background-color:#404040}
+.webix_toolbar.pdf_bar .webix_template{background-color:#3498db;color:#fff;line-height:2em}
+.webix_toolbar.pdf_bar .webix_el_box input,.webix_toolbar.pdf_bar .webix_inp_static{background-color:#5c5c5c;color:#fff;border-color:#404040}
+.webix_toolbar.pdf_bar .webix_el_box input:focus,.webix_toolbar.pdf_bar .webix_inp_static:focus{border-color:#333}
+.webix_toolbar.pdf_bar .webix_el_box .webix_input_icon{color:#fff}
+.webix_view.webix_popup.pdf_opt_list{box-shadow:5px 5px 15px #1c1c1c;border:none}
+.pdf_opt_list .webix_list{background-color:#404040;color:#fff}
+.pdf_opt_list .webix_list .webix_list_item{border-color:#474747;line-height:1.5em}
+.pdf_opt_list .webix_list .webix_list_item.webix_selected,.pdf_opt_list .webix_list .webix_list_item:hover{color:#404040;background-color:#fff}
+.webix_dbllist .webix_list{background:#ededed}
+.webix_dbllist .webix_list_item{background:#fff;margin:3px 4px 0;box-sizing:border-box}
+.webix_dbllist .webix_list_item.webix_selected{color:#FFF;background:#27ae60}
+.webix_dbllist button{width:45%;height:30px;margin-top:5px;background:#fff;border-radius:6px;border:1px solid #a4bed4;cursor:pointer;font-size:13px;font-family:Helvetica,Verdana}
+.webix_dbllist button:active{box-shadow:inset 1px 1px 0 silver}
+.webix_dbllist button .webix_icon{color:#888;font-size:26px}
+.webix_dbllist button:first-child{margin-top:32px;margin-right:5%}
+.webix_dbllist button:last-child{margin-left:5%}
+.webix_dbllist .bottom_label{font-size:10px;text-transform:uppercase;background:#ededed;padding-left:13px}
+.webix_toolbar .webix_el_label,.webix_toolbar .webix_inp_label{color:#1e2022}
+.webix_ss_sort_asc{position:absolute;float:right;right:3px;top:8px;width:7px;height:13px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}
+.webix_ss_sort_desc{position:absolute;right:3px;top:8px;width:7px;height:13px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}
+.webix_group_back .webix_arrow_icon{color:#1e2022}
+.webix_menu-x .webix_list_item:active,.webix_menu-x .webix_list_item:focus,.webix_menu-x .webix_list_item:hover{background-color:rgba(255,255,255,.4)!important}
+.webix_menu .webix_list_item:active,.webix_menu .webix_list_item:hover{background-color:rgba(0,0,0,.05)!important}
+.webix_list_item .webix_submenu_icon{width:0;height:0;border-width:4px;border-style:solid}
+.webix_menu-x .webix_list_item .webix_submenu_icon{border-color:#375975 transparent transparent}
+.webix_menu .webix_list_item .webix_submenu_icon{border-color:transparent transparent transparent #375975}
+.webix_popup_title{color:#1e2022!important;background:#e3e3e3!important;font-size:15px!important;font-weight:700;border-bottom:1px solid #dedede!important;text-shadow:none!important}
+.webix_modal_box{background:#ebebeb!important;border:1px solid #a4bed4!important}
+.confirmButton{color:#1e2022!important;box-shadow:0 1px 1px #fff inset;background:0 1px repeat-x #e5f1ff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eaf3ff),color-stop(50%,#e5f1ff),color-stop(100%,#d6e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#eaf3ff 0,#e5f1ff 50%,#d6e8ff 100%);background-image:-moz-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-ms-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%);background-image:-o-linear-gradient(top,#eaf3ff 0,#e5f1ff 60%,#d6e8ff 100%)}
+.confirmButtonActive{background:#fff}
+.webix_item_tab{font-size:13px}
+.buttonStyle{font-size:13px;font-family:Helvetica,Verdana}
+.activeShadow{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_img_btn_abs:active+input,.webix_inp_counter_next:active,.webix_inp_counter_prev:active,.webixtype_base:active{background:none #f5f5f5;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_icon_button:active,.webix_img_btn:active,.webix_img_btn_top:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background-color:rgba(0,0,0,.05)}
+.webix_pressed .webix_img_btn_abs+input,.webix_pressed .webixtype_base{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background:#f5f5f5!important}
+.webix_accordionitem_label .webix_icon{font-size:19px;width:25px}
+.webix_accordionitem.vertical>.webix_accordionitem_header .webix_accordionitem_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAARUlEQVR42o2PAQYAMAwD9+iEFvTpnZYZU7EQRa4kaxKAXD9y9yTZluCBALRJpATNrIG6rAdjjmBVeCuB6EyAYkNEiDE33yMJRSaycR8/AAAAAElFTkSuQmCC);background-repeat:no-repeat}
+.webix_accordionitem.vertical.collapsed>.webix_accordionitem_header .webix_accordionitem_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAASElEQVR42n2PMQoAMAgD++gEdPLpFkshS9oDEcxlcA1V1euNcpI9k5m2MPfrqABCBS8KBptAR8QJZks0kGjgjMQn/oc/AKy4Acp9RSZl+HEYAAAAAElFTkSuQmCC);background-repeat:no-repeat}
+.webix_accordionitem.horizontal>.webix_accordionitem_header .webix_accordionitem_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAASUlEQVR42p2QMQoAQQgD79EZ0Mqn5xCu2cPdYgUbJ0rMMxXgLeiuKq8gsJAz8weQ0QiwJEfECnr4wdlEnwJ68+yyhReC+c85oRecj0Um+pmo9wAAAABJRU5ErkJggg==);background-repeat:no-repeat}
+.webix_accordionitem.horizontal:last-child>.webix_accordionitem_header .webix_accordionitem_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAARElEQVR42qXPsQoAIAhF0T76PdDJT7cUmtQhcmk4N8QVQ9JXN2bmgWOgqp+BiCRG2AYAMoi3/LxYdyagAnhA6G93TrABZaJFJjrFY8IAAAAASUVORK5CYII=);background-repeat:no-repeat}
+.webix_accordionitem.horizontal.collapsed:last-child>.webix_accordionitem_header .webix_accordionitem_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAASElEQVR42n2PMQoAMAgD++gEdPLpFkshS9oDEcxlcA1V1euNcpI9k5m2MPfrqABCBS8KBptAR8QJZks0kGjgjMQn/oc/AKy4Acp9RSZl+HEYAAAAAElFTkSuQmCC);background-repeat:no-repeat}
+.webix_accordionitem.horizontal.collapsed>.webix_accordionitem_header .webix_accordionitem_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAARUlEQVR42o2PAQYAMAwD9+iEFvTpnZYZU7EQRa4kaxKAXD9y9yTZluCBALRJpATNrIG6rAdjjmBVeCuB6EyAYkNEiDE33yMJRSaycR8/AAAAAElFTkSuQmCC);background-repeat:no-repeat}
+.webix_progress_bottom,.webix_progress_top{background:0 1px repeat-x #f7f7f7;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#f2f2f2),color-stop(50%,#f7f7f7),color-stop(100%,#f2f2f2)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#f2f2f2 0,#f7f7f7 50%,#f2f2f2 100%);background-image:-moz-linear-gradient(top,#f2f2f2 0,#f7f7f7 60%,#f2f2f2 100%);background-image:-ms-linear-gradient(top,#f2f2f2 0,#f7f7f7 60%,#f2f2f2 100%);background-image:-o-linear-gradient(top,#f2f2f2 0,#f7f7f7 60%,#f2f2f2 100%)}
+.webix_daterange .webix_range_timepicker .webix_cal_time{padding:5px 15px}
+.webix_daterange .webix_range_footer .webix_template{padding:10px 0}
+.webix_cal_range{background-color:#fff4dc}
+.webix_item_tab .webix_icon{width:30px;font-size:19px}
+.webix_tab_more_icon{border-bottom:1px solid #a4bed4}
+.webix_skin_mark{height:110px}
+.webix_sparklines{padding:1px 0;box-sizing:border-box}
+.webix_sparklines svg{box-sizing:border-box}
+.webix_sparklines_line{stroke:#3498db;stroke-width:1;fill:transparent;stroke-linecap:round}
+.webix_sparklines_item{fill:#3498db;stroke-width:1}
+.webix_sparklines_bar{fill:#6dbcf0}
+.webix_sparklines_bar_negative{fill:#d86c79}
+.webix_sparklines_area{fill:#e5eef4}
+.webix_sparklines_origin{stroke:#888;stroke-width:1}
+.webix_sparklines_event_area{fill:transparent}
+.webix_sparklines_area_chart .webix_sparklines_event_area:hover,.webix_sparklines_line_chart .webix_sparklines_event_area:hover,.webix_sparklines_splinearea_chart .webix_sparklines_event_area:hover{fill:rgba(220,220,220,.4);stroke:rgba(255,255,255,.6)}
+.webix_sparklines_bar_chart .webix_sparklines_event_area:hover,.webix_sparklines_pie_chart .webix_sparklines_event_area:hover{fill:rgba(255,255,255,.3)}
+.webix_strong{font-weight:700;white-space:nowrap}
+.webix_light{color:#666d73}
+.webix_debug div{border:1px solid orange;background-color:#FF9;color:#000}
+.webix_debug{background-color:#ff9;border:1px solid #ff9}
+.webix_input_icon,.webix_view{box-sizing:content-box}
+.webix_view.webix_el_label{box-sizing:border-box}
+.webix_inp_label,.webix_inp_top_label,.webix_label_right{margin-bottom:0}
+.webix_view table{border-collapse:initial}
\ No newline at end of file
diff --git a/source/static/css/app.css b/source/static/css/app.css
new file mode 100644
index 0000000..4e8eb53
--- /dev/null
+++ b/source/static/css/app.css
@@ -0,0 +1,61 @@
+
+.login_header {
+ text-align: center;
+ font-weight: bold;
+ font-size: 150%;
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+.cmd_edit_parter {
+ max-width: 32px,
+ padding-left: 5px;
+}
+
+.center {
+ text-align: center;
+}
+
+.right {
+ text-align: right;
+}
+.right_footer {
+ text-align: right;
+ font-weight: bold;
+ font-size: 125%;
+ color: DarkRed;
+}
+
+.lbl_partner {
+ font-weight: bold;
+ font-size: 125%;
+}
+
+.delete {
+ text-align: center;
+ font-weight: bold;
+ font-size: 250%;
+ color: red;
+}
+
+
+.cmd_close_partner div button {
+ background-color: red !important;
+ border-color: red !important;
+ border-bottom: 1px solid red !important;
+}
+
+/*
+.webix_message_area {
+ position: absolute;
+ margin-top: 25%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ width: 40%;
+}
+*/
+
+.webix_success div {
+ background-color: #00a65a !important;
+ font-size: 1vw;
+ color: white;
+}
diff --git a/source/static/css/sidebar.css b/source/static/css/sidebar.css
new file mode 100644
index 0000000..ea4e193
--- /dev/null
+++ b/source/static/css/sidebar.css
@@ -0,0 +1,95 @@
+
+/* SideBar*/
+.webix_sidebar{
+ background: #ECEFF1;
+}
+.webix_sidebar .webix_tree_item {
+ color: #454545;
+ height: 35px;
+ line-height: 35px;
+}
+.webix_sidebar .webix_scroll_cont > .webix_tree_leaves {
+ padding: 0;
+}
+.webix_sidebar .webix_tree_leaves .webix_tree_leaves {
+ margin-left: 0px;
+}
+.webix_sidebar_selected,
+.webix_sidebar_expanded .webix_tree_item:hover{
+ background-color: rgba(0,0,0,0.02);
+}
+.webix_sidebar .webix_tree_item.webix_selected,
+.webix_sidebar .webix_tree_item.webix_selected span{
+ background-color: #27ae60;
+ padding-right:0;
+}
+.webix_sidebar .webix_tree_branch_1 .webix_tree_item{
+ padding-left:40px;
+}
+.webix_sidebar .webix_tree_branch_1>.webix_tree_item{
+ height: 40px;
+ line-height: 40px;
+ padding-left:0;
+}
+.webix_sidebar .webix_tree_branch_1{
+ border-bottom:1px solid #e5e5e5;
+}
+.webix_sidebar .webix_tree_item.webix_selected span,
+.webix_sidebar .webix_tree_item span{
+ margin:0;
+ padding:0px;
+}
+.webix_sidebar_icon{
+ width: 40px;
+ text-align: center;
+}
+
+.webix_sidebar_dir_icon{
+ float: right;
+ line-height: inherit;
+}
+
+/*SubMenu (Popup) */
+.webix_sidebar_popup{
+ border:none !important;
+ box-shadow: 2px 3px 3px #ddd;
+}
+.webix_sidebar_popup, .webix_sidebar_popup .webix_list_item{
+ border-radius:0;
+}
+.webix_sidebar_popup_right{
+ box-shadow: -1px 3px 3px #ddd;
+}
+/*SubMenu: title*/
+.webix_sidebar_popup_title{
+ background: #ECEFF1;
+}
+.webix_sidebar_popup_title.webix_selected{
+ border-left-color: #27ae60;
+ background: #27ae60;
+}
+.webix_sidebar_popup_title .webix_template{
+ line-height: 40px;
+ padding: 0 10px;
+ border: 1px solid #E5E5E5;
+ border-left:none;
+}
+.webix_sidebar_selected.webix_sidebar_popup_title .webix_template{
+ background: rgba(0,0,0,0.03);
+ border-left: none;
+}
+.webix_sidebar_popup_list .webix_list_item{
+ border-left: 1px solid #E5E5E5;
+ border-right: 1px solid #E5E5E5;
+}
+/*SubMenu: list*/
+.webix_sidebar_popup_list .webix_list_item:first-child{
+ border-top: 1px solid #E5E5E5;
+}
+.webix_sidebar_popup_list .webix_list_item:hover{
+ background: #f6f9fb;
+}
+
+.webix_sidebar_popup_list .webix_list_item.webix_selected:hover{
+ background: #27ae60;
+}
\ No newline at end of file
diff --git a/source/static/css/sidebar_air.css b/source/static/css/sidebar_air.css
new file mode 100644
index 0000000..75fb5e8
--- /dev/null
+++ b/source/static/css/sidebar_air.css
@@ -0,0 +1,94 @@
+/* SideBar*/
+.webix_sidebar{
+ background: #ECEFF1;
+}
+.webix_sidebar .webix_tree_item {
+ color: #454545;
+ height: 35px;
+ line-height: 35px;
+}
+.webix_sidebar .webix_scroll_cont > .webix_tree_leaves {
+ padding: 0;
+}
+.webix_sidebar .webix_tree_leaves .webix_tree_leaves {
+ margin-left: 0px;
+}
+.webix_sidebar_selected,
+.webix_sidebar_expanded .webix_tree_item:hover{
+ background-color: rgba(0,0,0,0.02);
+}
+.webix_sidebar .webix_tree_item.webix_selected,
+.webix_sidebar .webix_tree_item.webix_selected span{
+ background-color: #ffdb8f;
+ padding-right:0;
+}
+.webix_sidebar .webix_tree_branch_1 .webix_tree_item{
+ padding-left:40px;
+}
+.webix_sidebar .webix_tree_branch_1>.webix_tree_item{
+ height: 40px;
+ line-height: 40px;
+ padding-left:0;
+}
+.webix_sidebar .webix_tree_branch_1{
+ border-bottom:1px solid #e5e5e5;
+}
+.webix_sidebar .webix_tree_item.webix_selected span,
+.webix_sidebar .webix_tree_item span{
+ margin:0;
+ padding:0px;
+}
+.webix_sidebar_icon{
+ width: 40px;
+ text-align: center;
+}
+
+.webix_sidebar_dir_icon{
+ float: right;
+ line-height: inherit;
+}
+
+/*SubMenu (Popup) */
+.webix_sidebar_popup{
+ border:none !important;
+ box-shadow: 2px 3px 3px #ddd;
+}
+.webix_sidebar_popup, .webix_sidebar_popup .webix_list_item{
+ border-radius:0;
+}
+.webix_sidebar_popup_right{
+ box-shadow: -1px 3px 3px #ddd;
+}
+/*SubMenu: title*/
+.webix_sidebar_popup_title{
+ background: #ECEFF1;
+}
+.webix_sidebar_popup_title.webix_selected{
+ border-left-color: #ffdb8f;
+ background: #ffdb8f;
+}
+.webix_sidebar_popup_title .webix_template{
+ line-height: 40px;
+ padding: 0 10px;
+ border: 1px solid #E5E5E5;
+ border-left:none;
+}
+.webix_sidebar_selected.webix_sidebar_popup_title .webix_template{
+ background: rgba(0,0,0,0.03);
+ border-left: none;
+}
+.webix_sidebar_popup_list .webix_list_item{
+ border-left: 1px solid #E5E5E5;
+ border-right: 1px solid #E5E5E5;
+}
+/*SubMenu: list*/
+.webix_sidebar_popup_list .webix_list_item:first-child{
+ border-top: 1px solid #E5E5E5;
+}
+.webix_sidebar_popup_list .webix_list_item:hover{
+ background: #f6f9fb;
+}
+
+.webix_sidebar_popup_list .webix_list_item.webix_selected:hover{
+ background: #ffdb8f;
+}
diff --git a/source/static/css/webix.css b/source/static/css/webix.css
new file mode 100644
index 0000000..70a77a0
--- /dev/null
+++ b/source/static/css/webix.css
@@ -0,0 +1,1742 @@
+/*
+@license
+webix UI v.4.3.0
+This software is covered by Webix Commercial License.
+Usage without proper license is prohibited.
+(c) XB Software Ltd.
+*/
+.webix_view{font-family:'PT Sans',Tahoma;font-size:15px;color:#666;-webkit-font-smoothing:antialiased;cursor:default;overflow:hidden;border:0 solid #ddd;background-color:#fff;white-space:normal;-webkit-appearance:none}
+.webix_view.webix_form{background-color:#fff}
+body{-webkit-tap-highlight-color:transparent!important}
+.webix_abslayout{position:relative}
+.webix_abslayout>.webix_view{position:absolute}
+.webix_layout_space,.webix_layout_wide{background-color:#ddd}
+.webix_layout_accordion,.webix_layout_clean,.webix_layout_line,.webix_multiview{background:0 0}
+.webix_overlay{width:100%;height:100%;position:absolute;z-index:10;text-align:center;padding-top:10px}
+.webix_view>.webix_disabled{width:100%;height:100%;position:absolute;top:0;left:0;background-color:#ddd;opacity:.4;filter:alpha(opacity=40);z-index:1}
+.webix_disabled_view{overflow:hidden!important}
+body.webix_full_screen{margin:0;padding:0;overflow:hidden}
+.webix_noselect,.webix_noselect div{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_selectable{-moz-user-select:text;-webkit-user-select:text;user-select:text}
+.webix_template{height:100%;padding:5px;padding-left:5px 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_clean{background:0 0}
+.webix_clean .webix_template{padding:0}
+.webix_section{padding-left:30px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAUCAIAAADDbMD2AAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHElEQVR4nGP4//8/EwMDA158/vx5BmLUMTAwAADGhQiMQPqPwgAAAABJRU5ErkJggg==);background-repeat:repeat-x;background-position:11.25px;color:#444;font-size:10px;text-transform:uppercase;line-height:45px}
+.webix_section>.webix_template{padding:0 8px;background-color:#fff;display:inline}
+.webix_layout_space>.webix_section>.webix_template,.webix_layout_wide>.webix_section>.webix_template{padding:0 8px;background-color:#ddd}
+.webix_layout_clean>.webix_section>.webix_template,.webix_layout_line>.webix_section>.webix_template{padding:0 8px;background-color:#fff}
+.webix_header>div{padding-left:10px;color:#fff;font-size:18px;background:#3498db;line-height:43px;line-height:45px;padding-top:0;padding-bottom:0}
+.webix_header>div .webix_el_button,.webix_header>div .webix_el_label,.webix_header>div .webix_inp_label{color:#fff}
+.webix_header>div .webix_el_label{font-size:18px}
+.webix_header>div .webix_inp_counter_next,.webix_header>div .webix_inp_counter_prev,.webix_header>div .webix_segment_0,.webix_header>div .webix_segment_1,.webix_header>div .webix_segment_N,.webix_header>div .webixtype_base,.webix_header>div .webixtype_next,.webix_header>div .webixtype_prev{border-color:#d9d9d9;background-color:transparent;color:#fff}
+.webix_header>div .webix_el_arrow.webixtype_next_arrow{border-left:none;border-bottom:none}
+.webix_header>div .webix_el_arrow.webixtype_prev_arrow{border-right:none;border-bottom:none}
+.webix_header>div .webix_inp_counter_next:hover,.webix_header>div .webix_inp_counter_prev:hover,.webix_header>div .webix_segment_0:hover,.webix_header>div .webix_segment_1:hover,.webix_header>div .webix_segment_N:hover,.webix_header>div .webixtype_base:hover{color:#fff;background-color:rgba(0,0,0,.05)}
+.webix_header>div .webix_inp_counter_next:active,.webix_header>div .webix_inp_counter_prev:active,.webix_header>div .webix_segment_0:active,.webix_header>div .webix_segment_1:active,.webix_header>div .webix_segment_N:active,.webix_header>div .webixtype_base:active{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_header>div .webix_inp_counter_next:focus,.webix_header>div .webix_inp_counter_prev:focus,.webix_header>div .webix_segment_0:focus,.webix_header>div .webix_segment_1:focus,.webix_header>div .webix_segment_N:focus,.webix_header>div .webixtype_base:focus{background-color:rgba(0,0,0,.07);color:#fff}
+.webix_header>div .webix_inp_static,.webix_header>div input[type=text]{border-color:#fff}
+.webix_header>div .webix_inp_static:focus,.webix_header>div input[type=text]:focus{border-color:#fff;box-shadow:none}
+.webix_header>div .webix_input_icon{border-color:#d9d9d9;background-color:transparent;color:#666}
+.webix_header>div .webix_input_icon:active,.webix_header>div .webix_input_icon:focus,.webix_header>div .webix_input_icon:hover{background-color:transparent;color:#666}
+.webix_header>div .webix_pressed .webix_el_arrow,.webix_header>div .webix_pressed .webix_inp_counter_next,.webix_header>div .webix_pressed .webix_inp_counter_prev,.webix_header>div .webix_pressed .webix_input_icon,.webix_header>div .webix_pressed .webix_segment_0,.webix_header>div .webix_pressed .webix_segment_1,.webix_header>div .webix_pressed .webix_segment_N,.webix_header>div .webix_pressed .webixtype_base,.webix_header>div .webix_pressed .webixtype_next,.webix_header>div .webix_pressed .webixtype_prev{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_header>div .webix_selected.webix_segment_0,.webix_header>div .webix_selected.webix_segment_1,.webix_header>div .webix_selected.webix_segment_N{border-color:#d9d9d9;background-color:#27ae60;color:#fff}
+.webix_header>div .webix_selected.webix_segment_0:hover,.webix_header>div .webix_selected.webix_segment_1:hover,.webix_header>div .webix_selected.webix_segment_N:hover{background-color:#24a259}
+.webix_header>div .webix_selected.webix_segment_0:active,.webix_header>div .webix_selected.webix_segment_0:focus,.webix_header>div .webix_selected.webix_segment_1:active,.webix_header>div .webix_selected.webix_segment_1:focus,.webix_header>div .webix_selected.webix_segment_N:active,.webix_header>div .webix_selected.webix_segment_N:focus{background-color:#295}
+.webix_header>div .webix_segment_1,.webix_header>div .webix_segment_N,.webix_header>div .webix_selected.webix_segment_1,.webix_header>div .webix_selected.webix_segment_N{margin-left:0;border-left:none}
+.webix_header>div .webix_img_btn:active,.webix_header>div .webix_img_btn_top:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_header>div .webix_img_btn:focus,.webix_header>div .webix_img_btn_top:focus{background-color:#2489cc}
+.webix_header>div .webix_img_btn:hover,.webix_header>div .webix_img_btn_top:hover{background-color:#268fd5}
+.webix_header>div .webix_icon_button{border-radius:6px}
+.webix_header>div .webix_el_icon,.webix_header>div .webix_icon_btn,.webix_header>div .webix_icon_button,.webix_header>div .webix_img_btn,.webix_header>div .webix_img_btn_abs,.webix_header>div .webix_img_btn_abs .webix_icon,.webix_header>div .webix_img_btn_abs .webix_img_btn_text,.webix_header>div .webix_img_btn_top .webix_icon,.webix_header>div .webix_img_btn_top .webix_img_btn_text{color:#fff}
+.webix_header>div .webix_el_box .webix_img_btn_abs:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_header>div .webix_el_icon .webix_icon_button:focus{background-color:rgba(0,0,0,.07)}
+.webix_header>div .webix_el_box .webix_img_btn_abs:hover,.webix_header>div .webix_el_icon .webix_icon_button:hover{background-color:rgba(0,0,0,.05)}
+.webix_header>div .webix_control{border-color:#3498db}
+.webix_header>div .webix_icon_button .webix_icon{font-size:23px;height:27px;width:27px;color:#fff}
+.webix_header>div .webix_img_btn,.webix_header>div .webix_img_btn_top{border-width:0}
+.webix_spacer{background:0 0}
+.webix_view_animate{position:relative;width:100%;height:100%}
+x\:ui{display:none}
+.webix_flexlayout{display:flex!important;flex-wrap:wrap;flex-direction:row;overflow:hidden;box-sizing:border-box}
+.webix_flexlayout>div{display:block!important}
+.webix_view_align{background:0 0}
+.webix_view a.webix_list_item:focus,.webix_view div:focus,.webix_view span:focus,.webix_view.webix_window:focus{outline:#bfbfbf dotted 1px}
+.webix_view a.webix_list_item:active,.webix_view div.webix_inp_static:focus,.webix_view div:active,.webix_view span:active,button,input,select,textarea{outline:0}
+.webix_resize_area{position:absolute;top:0;left:0;width:100%;height:100%}
+.webix_resize_handle_x .webix_handle_content,.webix_resize_handle_y .webix_handle_content{width:100%;height:100%;background:rgba(100,100,100,.1);border:1px dotted #ebebeb}
+.webix_resize_handle_x{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:e-resize;width:1px;height:100%;position:absolute;z-index:2;top:0}
+.webix_resize_handle_x .webix_handle_content{border-width:0 1px}
+.webix_resize_origin_x{cursor:e-resize;width:3px;height:100%;position:absolute;z-index:2;top:0}
+.webix_resize_handle_y{cursor:n-resize;height:1px;width:100%;position:absolute;z-index:2;left:0}
+.webix_resize_handle_y .webix_handle_content{border-width:1px 0}
+.webix_resize_origin_y{cursor:n-resize;height:3px;width:100%;position:absolute;z-index:2;left:0}
+.webix_resizer.webix_disabled_view{cursor:default}
+.webix_resizer_vy{cursor:n-resize;margin-top:0!important;border:0!important;padding:0!important;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==) center center no-repeat}
+.webix_resizer_vx{cursor:e-resize;margin-left:0!important;border:0!important;padding:0!important;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC) center center no-repeat}
+.webix_resizer_y{cursor:n-resize;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==) center center no-repeat #fff}
+.webix_resizer_x{cursor:e-resize;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC) center center no-repeat #fff}
+.webix_accordionitem_body{position:relative}
+.webix_accordionitem_header{border-bottom:1px solid #ddd;position:relative;z-index:2;color:#fff;font-size:18px;background:#3498db;line-height:43px;cursor:pointer;overflow:hidden}
+.webix_accordionitem_header .webix_el_button,.webix_accordionitem_header .webix_el_label,.webix_accordionitem_header .webix_inp_label{color:#fff}
+.webix_accordionitem_header .webix_el_label{font-size:18px}
+.webix_accordionitem_header .webix_inp_counter_next,.webix_accordionitem_header .webix_inp_counter_prev,.webix_accordionitem_header .webix_segment_0,.webix_accordionitem_header .webix_segment_1,.webix_accordionitem_header .webix_segment_N,.webix_accordionitem_header .webixtype_base,.webix_accordionitem_header .webixtype_next,.webix_accordionitem_header .webixtype_prev{border-color:#d9d9d9;background-color:transparent;color:#fff}
+.webix_accordionitem_header .webix_el_arrow.webixtype_next_arrow{border-left:none;border-bottom:none}
+.webix_accordionitem_header .webix_el_arrow.webixtype_prev_arrow{border-right:none;border-bottom:none}
+.webix_accordionitem_header .webix_inp_counter_next:hover,.webix_accordionitem_header .webix_inp_counter_prev:hover,.webix_accordionitem_header .webix_segment_0:hover,.webix_accordionitem_header .webix_segment_1:hover,.webix_accordionitem_header .webix_segment_N:hover,.webix_accordionitem_header .webixtype_base:hover{color:#fff;background-color:rgba(0,0,0,.05)}
+.webix_accordionitem_header .webix_inp_counter_next:active,.webix_accordionitem_header .webix_inp_counter_prev:active,.webix_accordionitem_header .webix_segment_0:active,.webix_accordionitem_header .webix_segment_1:active,.webix_accordionitem_header .webix_segment_N:active,.webix_accordionitem_header .webixtype_base:active{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_accordionitem_header .webix_inp_counter_next:focus,.webix_accordionitem_header .webix_inp_counter_prev:focus,.webix_accordionitem_header .webix_segment_0:focus,.webix_accordionitem_header .webix_segment_1:focus,.webix_accordionitem_header .webix_segment_N:focus,.webix_accordionitem_header .webixtype_base:focus{background-color:rgba(0,0,0,.07);color:#fff}
+.webix_accordionitem_header .webix_inp_static,.webix_accordionitem_header input[type=text]{border-color:#fff}
+.webix_accordionitem_header .webix_inp_static:focus,.webix_accordionitem_header input[type=text]:focus{border-color:#fff;box-shadow:none}
+.webix_accordionitem_header .webix_input_icon{border-color:#d9d9d9;background-color:transparent;color:#666}
+.webix_accordionitem_header .webix_input_icon:active,.webix_accordionitem_header .webix_input_icon:focus,.webix_accordionitem_header .webix_input_icon:hover{background-color:transparent;color:#666}
+.webix_accordionitem_header .webix_pressed .webix_el_arrow,.webix_accordionitem_header .webix_pressed .webix_inp_counter_next,.webix_accordionitem_header .webix_pressed .webix_inp_counter_prev,.webix_accordionitem_header .webix_pressed .webix_input_icon,.webix_accordionitem_header .webix_pressed .webix_segment_0,.webix_accordionitem_header .webix_pressed .webix_segment_1,.webix_accordionitem_header .webix_pressed .webix_segment_N,.webix_accordionitem_header .webix_pressed .webixtype_base,.webix_accordionitem_header .webix_pressed .webixtype_next,.webix_accordionitem_header .webix_pressed .webixtype_prev{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_accordionitem_header .webix_selected.webix_segment_0,.webix_accordionitem_header .webix_selected.webix_segment_1,.webix_accordionitem_header .webix_selected.webix_segment_N{border-color:#d9d9d9;background-color:#27ae60;color:#fff}
+.webix_accordionitem_header .webix_selected.webix_segment_0:hover,.webix_accordionitem_header .webix_selected.webix_segment_1:hover,.webix_accordionitem_header .webix_selected.webix_segment_N:hover{background-color:#24a259}
+.webix_accordionitem_header .webix_selected.webix_segment_0:active,.webix_accordionitem_header .webix_selected.webix_segment_0:focus,.webix_accordionitem_header .webix_selected.webix_segment_1:active,.webix_accordionitem_header .webix_selected.webix_segment_1:focus,.webix_accordionitem_header .webix_selected.webix_segment_N:active,.webix_accordionitem_header .webix_selected.webix_segment_N:focus{background-color:#295}
+.webix_accordionitem_header .webix_segment_1,.webix_accordionitem_header .webix_segment_N,.webix_accordionitem_header .webix_selected.webix_segment_1,.webix_accordionitem_header .webix_selected.webix_segment_N{margin-left:0;border-left:none}
+.webix_accordionitem_header .webix_img_btn:active,.webix_accordionitem_header .webix_img_btn_top:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_accordionitem_header .webix_img_btn:focus,.webix_accordionitem_header .webix_img_btn_top:focus{background-color:#2489cc}
+.webix_accordionitem_header .webix_img_btn:hover,.webix_accordionitem_header .webix_img_btn_top:hover{background-color:#268fd5}
+.webix_accordionitem_header .webix_icon_button{border-radius:6px}
+.webix_accordionitem_header .webix_el_icon,.webix_accordionitem_header .webix_icon_btn,.webix_accordionitem_header .webix_icon_button,.webix_accordionitem_header .webix_img_btn,.webix_accordionitem_header .webix_img_btn_abs,.webix_accordionitem_header .webix_img_btn_abs .webix_icon,.webix_accordionitem_header .webix_img_btn_abs .webix_img_btn_text,.webix_accordionitem_header .webix_img_btn_top .webix_icon,.webix_accordionitem_header .webix_img_btn_top .webix_img_btn_text{color:#fff}
+.webix_accordionitem_header .webix_el_box .webix_img_btn_abs:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_accordionitem_header .webix_el_icon .webix_icon_button:focus{background-color:rgba(0,0,0,.07)}
+.webix_accordionitem_header .webix_el_box .webix_img_btn_abs:hover,.webix_accordionitem_header .webix_el_icon .webix_icon_button:hover{background-color:rgba(0,0,0,.05)}
+.webix_accordionitem_header .webix_control{border-color:#3498db}
+.webix_accordionitem_header .webix_icon_button .webix_icon{font-size:23px;height:27px;width:27px;color:#fff}
+.webix_accordionitem_header .webix_img_btn,.webix_accordionitem_header .webix_img_btn_top{border-width:0}
+.webix_ie.horizontal>.webix_accordionitem_header.collapsed{-ms-writing-mode:tb-lr}
+.webix_ie.horizontal>.webix_accordionitem_header.collapsed .webix_accordionitem_label{padding-left:0;padding-top:10px}
+.webix_ie.horizontal>.webix_accordionitem_header.collapsed .webix_accordionitem_button{margin:0}
+.webix_accordionitem_label{height:100%;padding-left:10px}
+.webix_accordionitem_button{float:right;position:relative;height:11px;width:11px;margin:15px 13.5px}
+.webix_carousel{position:relative}
+.webix_nav_panel{bottom:15px;height:auto;line-height:8px;overflow:hidden;position:absolute;text-align:center}
+.webix_nav_item{display:inline-block;height:8px;padding:6px 5px 6px 4px;width:8px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_nav_item div{border-radius:50%;display:block;height:8px;width:8px}
+.webix_nav_inactive div{border:1px solid rgba(0,0,0,.15);filter:alpha(opacity=60);opacity:.6;background:#fff}
+.webix_nav_active div{border:1px solid rgba(0,0,0,.1);background:#fff}
+.webix_nav_button_next,.webix_nav_button_prev{cursor:pointer;display:block;height:24px;position:absolute;width:24px}
+.webix_nav_button_next .webix_nav_button_inner,.webix_nav_button_prev .webix_nav_button_inner{height:100%;width:100%}
+.webix_nav_button_prev .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowNDNEOTBEMTYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNDNEOTBEMjYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA0M0Q5MENGNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0M0Q5MEQwNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+yGPRLgAAAPBJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgteAINN5CCaokI3UcB2I+UNQBsTghxaRacAaI+aH62IB4MzUtuAjEwlA9zEC8hhhNxFpwFYhFkQxfTqyriLHgFhBLQtWC8s18UsKUkAV3gVgGyfBZpKYIQhbYQtWAcBg5BRIhC26j+WAOtS0AgRvQ9A6L4IXUtgAELqOlopXUtgAEzgOxIFQPKxCvo7YFIHAKLSdvo7YFIHAUiHmgeiUIKSanNLUC4i1ALAHENoQUD48a7TkNzX8BsiAFxKCB4U+BOBkgwAAsAiGcWMs58QAAAABJRU5ErkJggg==)}
+.webix_nav_button_next .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEODJBRDc2RTYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEODJBRDc2RjYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ4MkFENzZDNjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ4MkFENzZENjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+crpRPgAAAOhJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgsCAMGkdHyLKBiNQgDoomIOYH4uOkJiViLNgMxGxIlpyhtgUgsAaImaHqhYH4IrUtAIHlSJaIAvFValsAAvOBmBGqTxKIb1HbAhCYhWSJDBDfobYFIBAO1QvCNtS2YA6SD6SB+DY1LViIFNFiQHydmnGwEi0VXaZmKloHxKxQ9YJAfJ6a+WAbWk4+Re2cLAFVxwPER0lNEcSUpjZALAHEW4DYitTCdHjUaM9paP4LkAUpIAYNDH8KxMkAAQYAlwMhmq8XxigAAAAASUVORK5CYII=)}
+.webix_nav_panel_corner{right:73px}
+.webix_nav_button_corner.webix_nav_button_prev{bottom:13px;right:37px}
+.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:hover{opacity:1}
+.webix_nav_button_corner.webix_nav_button_next{bottom:13px;right:7px}
+.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:hover{opacity:1}
+.webix_nav_panel_side{margin:0 auto;left:0;width:100%}
+.webix_nav_button_side{height:34px;width:21px;top:50%;margin-top:-17px}
+.webix_nav_button_side.webix_nav_button_next{left:auto;right:15px}
+.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTc4MTkxODY2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTc4MTkxODU2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+D/KEcQAAAOhJREFUeNqs1jsOwjAMBuCKhR2uxsLGxg1a+hD0wVGYGJC4DgssnAFVQjLukKWk/WM7lv4OqfQ1UdLWCRGtOTdOz3lwtpzEkuFyp/9KreiX/JVa0DdNV6ZF9zRfmQYdcgbwQYNGhccDXQzYN4jgXIOa4bkntgAuNKgaDtlNMRx69hoAlxpUBEvfawRXGnRIjeBFIq8e3F9KZ5mDWXbS5QeBEjQYDEULALbSwy8GEYrARvpBUYNTaGkBfagZHKMIrKU/vioW6NANAE+aZuIVE3RoHxN06NUDHq2t5Ipz4Xw4T87O2vT+BBgAeQQKvezNqP0AAAAASUVORK5CYII=)}
+.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover{opacity:1}
+.webix_nav_button_side.webix_nav_button_prev{left:15px;right:auto}
+.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner{opacity:.8;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjIzRTVCQkY2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjIzRTVCQkU2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+wRT1eAAAAM9JREFUeNqs1jsKwlAQBdDBxlL3ZmVlmRXYaaVbCYg7kti4BQu1e85AhBDfZz73wm1ewsmfDKWUKNgNd+C+uVfuOgoe0n8uaFDyQoOSOxqU7NDgUfaDgxZUDWpRE6hBzWALdYE11A2W0BCYQ8PgHIWAUxQG/lAoKF0Q0ZLq+ZA1o35qnO3eevlweL4AgXOL5yhc2hCCa0d0w63744I1T9MMa989E2z5/NSw9Retgj3DRAveeseeGnyLDGgl+BkdJXNwH0WlHfcxDr09d/UVYADVjwptZ8mPvQAAAABJRU5ErkJggg==)}
+.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover{opacity:1}
+.webix_carousel>.webix_scroll_x,.webix_carousel>.webix_scroll_y{background-color:transparent}
+.webix_dark .webix_nav_inactive div{background-color:#95a5a6}
+.webix_dark .webix_nav_active div{background-color:#7f8c8d}
+.webix_dark .webix_nav_button_prev .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSIURgotfwAAASxJREFUSMfNlbErhlEUh5/vJZOSQSijshgsFiklhdj0lcHw5SP7uX+A8we4d1c+g2RgsIjIxmCxGCzKRO9bMjCSWE5WpXPrO9MZbs9T5577u7XNrTgPtIBBfKsEmkUmOMZsFZngv5KCzNW2gmsbbT2H4AZY0CAVcOUtuAXmNMi7xtQF7HgK7oBZDfKmMXUAB8Cil+AemNEgrwbfB5a8LvnB4C8aU83Gsuy1RY/AtAYpDb4NNDzXtKFBnqyvA+ve72BXYxqy/shyy1UwDFxqTP0a5BvYAPa8X/KISfo0yBewChx6R8UocKEx9ZpkBTj2zqIx4Fxj6tEgn7aqZ95RMQ6cakzdGuTDxuUedhPAicY0AEz+dbjzn3E9ZX9ue3w4ZUZ+VQBrQJUB/gw0fwC/UlVpnH2f9AAAAABJRU5ErkJggg==)}
+.webix_dark .webix_nav_button_next .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSENCUzWfAAAAS1JREFUSMfN1TFLXEEUhuFnr8FKCBaGiK2FRQobG7GSgBG2E8IWFmE3wX7uD3B+QOb2QpaAiMWmsAkJBtMEizQ2FmmCXcIuhBRpDZI0g7XCXNhTD+8L53znTGf/ddrGEIvK1hiDqiW4zBxWLcFvJZWWayoEz3Mbz9sSfIl1mKCLr20I3sTUzMY6/MEzXJQWdHEcUzOTJVu4LD3kHRxlyW88xbfSKerldnViHX5lyffSMX2BgywZYxNXpffgVY6uWIcfWVpUMMQIYmqW8Lak4BB7sQ7/Ymoe4QzLpQQj9GMdbmJqFvAZK6WGfILdDJ/HJzwpFdOP6MU6/I2peYhTrJZctH6sw3VMzRw+YK30qdiIqXmM91i/b+Qe3OHNu6n/cMYt8icVXmLSAvwnBv8B+EFU7qlZ1xIAAAAASUVORK5CYII=)}
+.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSI77dsQJgAAARxJREFUSMet1jFqAkEUxvH/rkIqLVN5ES2CjScQG6tUESx3SWOMLKgggt7BC6SxsnIr9w4ewAsEEis3RTBE3N3ZmfemHB4/HsPMm89L0xTJilbrLrAAGsAWeKkKwTEw/bfVAy6ea6cZ4HV9+8ogwMm6UwMI8Owrg5MoDDa+MjgF8LXBUqgtaERdwELUFcxFJWAmKgXvUA3wBtUC/1BNEKBCra4KXjt9MNScbadYJd7t9nGSVIGnnJpOnCRf7VbzYNMpURi8A7OCumW0Wr9aodrw7T39hedS+P5FhcFYCme/fSGcP6UEcPE8dYTNk98BLvdHWcLlf1ML2CVMzIC3gpK+U5YywEdJQMuDP50CmuGMt55C6B0AI+AR+ACGPw26r6m12WOpAAAAAElFTkSuQmCC)}
+.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSE1IU5u4gAAAW1JREFUSMet1rtOwzAUgOG/5jbBwsQD8BAwIAa2TggegjmRgELbuFeo1GRlQEJMMDN264CUiYdgg0dolzIkFUEk9nHSbLGtT76cc+xaMA53gUegDnwCgfa9Vyp8CngCToFNYB940WF0WRWt57SPqsAK+C7oG+kwuiqLdg3992Xgtelk8jGN4w3gqGDMyTSOZ8eHB+8uM0X7XhMYGMbd6TC6dkIzcH8VsMr+aN9rCeCGEyqEhzZY5TWmcM8C3zihKdy2wIMiWJmWURZWtk1P4a4FvnVCUziwwP0srKQBLYSbALXFYuGU1zqMNBAYhrRUiSI0s/RvKcdZNoChcQt8Tz5TKSg/fQdQFqdJcJvAXha0Z1QCDixgW577drCbBxZXKRkYyOtpkm6lwf+VPwH7VcC/d5Qd7EjA39s0KQQ2UIvvfbZ3zoEHU2Rp3+u4vlDGqwSX6N4qwSX6ltMelAUB1oELYA6cAV/poTxXeZ/+AOFqn1e/Gh7yAAAAAElFTkSuQmCC)}
+.webix_list_item{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2px 10px;line-height:29px;cursor:pointer;border-bottom:1px solid #ebebeb;text-align:left;border-color:#ebebeb}
+.webix_list_item.webix_invalid{background-color:#fee}
+.webix_list_item.webix_selected{color:#fff;background:#27ae60}
+.webix_list .webix_list_item.webix_selected{border-bottom:1px solid #ebebeb;padding:2px 10px}
+.webix_group{position:relative}
+.webix_group_back,.webix_group_back.webix_selected{position:relative;background:#d2e3ef;font-size:15px;color:#4a4a4a}
+.webix_arrow_icon{position:absolute;top:50%;bottom:50%;margin-top:-12px;right:15px;width:9px;height:22px;line-height:22px;color:#666;font-size:18px;font-family:FontAwesome}
+.webix_arrow_icon:before{content:'\f105'}
+.webix_group_back{padding-left:29px}
+.webix_group_back .webix_arrow_icon{left:11px}
+.webix_group_back .webix_arrow_icon:before{content:'\f104'}
+.dhx_pagelist{position:relative}
+.webix_list_count{float:right;width:25px;font-size:14px;text-align:center;margin-right:45px;box-shadow:0 1px 0 #000;text-shadow:0 -1px 0 rgba(0,0,0,.6)}
+.webix_unit_header{padding:0 10px;line-height:19px;text-align:left;background-color:#d2e3ef}
+.webix_list-x .webix_list_item{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;border-bottom:none;border-color:#ebebeb}
+.webix_list-x .webix_list_item.webix_selected{border-left:1px solid #ebebeb;border-right:1px solid #ebebeb;padding-left:9px}
+.webix_list-x .webix_scroll_cont{display:inline}
+.webix_view.webix_list-x{white-space:nowrap}
+.webix_list_item.webix_disabled{color:#8b949e}
+.webix_list_item.webix_disabled .webix_submenu_icon{visibility:hidden}
+.webix_view.webix_pager{padding:3px 0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:transparent}
+.webix_pager_item,.webix_pager_item_selected{padding:0 6px;text-align:center;height:100%;width:32px;border:1px solid #ddd;margin:0 2px;cursor:pointer;background-color:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:'PT Sans',Tahoma;font-size:15px}
+.webix_pager_item_selected{cursor:default;background-color:#27ae60;border:1px solid #ebebeb}
+.webix_animation .webix_ss_header{position:relative;z-index:10}
+.webix_animation .webix_ss_footer,.webix_animation .webix_vscroll_x{position:absolute;bottom:0;z-index:10}
+.webix_allow_selection{-moz-user-select:text;-webkit-user-select:text;user-select:text}
+.webix_dataview_item{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2px 10px;line-height:29px;cursor:pointer;border-bottom:1px solid #ebebeb;text-align:left;border-color:#ebebeb;border-right:1px solid #ebebeb}
+.webix_dataview_item.webix_selected{color:#fff;background:#27ae60;border-bottom:1px solid #ebebeb;border-right:1px solid #ebebeb}
+.webix_chart{position:relative;font-family:'PT Sans',Tahoma;font-size:13px;color:#666;overflow:hidden;z-index:1}
+.webix_chart canvas{position:absolute}
+.webix_canvas_text{position:absolute;text-align:center;overflow:hidden;white-space:nowrap;font-size:12px;z-index:100}
+.webix_map_img{width:100%;height:100%;position:absolute;top:0;left:0;border:0;filter:alpha(opacity=0);opacity:0}
+.webix_axis_item_y{position:absolute;height:18px;line-height:18px;margin-top:-4px;text-align:right}
+.webix_axis_item_x{padding-top:2px}
+.webix_axis_title_x{text-align:center;font-size:13px}
+.webix_axis_title_y{text-align:center;font-family:Verdana;font-size:13px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);padding-left:3px}
+.webix_ie_filter{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}
+.webix_chart_legend{position:absolute;z-index:1000}
+.webix_chart_legend_item{height:18px;line-height:18px;padding:2px}
+.webix_chart_legend_item.hidden{color:#e6e6e6}
+.webix_axis_item_y.webix_radar{color:#555;font-size:11px;padding-right:3px;height:13px;line-height:13px;margin-top:0}
+.webix_canvas_text.webix_axis_radar_title{margin-top:0;padding-top:0;color:#999;font-size:12px}
+.webix_axis_item_x,.webix_axis_item_y{color:#999}
+.webix_chart_frame{background-color:#a0cfef;height:100%;opacity:.3;position:absolute;top:0;z-index:150;border-left:1px solid #3498db;border-right:1px solid #3498db;cursor:w-resize}
+.webix_chart_resizer{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==);background-position:3px center;background-repeat:no-repeat;border-radius:2px;height:20px;bottom:0;width:11px;z-index:200;position:absolute;background-color:#fff;border:1px solid #ccc;cursor:w-resize}
+.webix_wresize_cursor{cursor:w-resize}
+.webix_vscroll_x{height:0;width:100%;overflow-y:hidden;overflow-x:scroll}
+.webix_vscroll_y{width:0;height:100%;overflow-x:hidden;overflow-y:scroll}
+.webix_vscroll_body{width:16px;height:16px}
+.webix_scroll_x{width:50px;height:4px!important;left:1px;bottom:3px;background-color:silver;background:rgba(0,0,0,.4);position:absolute;border-radius:4px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_scroll_y{width:4px!important;height:50px;top:1px;right:3px;background-color:silver;background:rgba(0,0,0,.4);position:absolute;border-radius:4px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_c_scroll_y{position:absolute;z-index:3;width:10px;right:0}
+.webix_c_scroll_y>div{-moz-transition:width .3s .2s,margin .3s .2s;-webkit-transition:width .3s .2s,margin .3s .2s;-o-transition:width .3s .2s,margin .3s .2s;-ms-transition:width .3s .2s,margin .3s .2s;width:4px;height:100%;background-color:silver;background:rgba(0,0,0,.4);border-radius:4px;margin:0 3px}
+.webix_c_scroll_y.webix_scroll_active div,.webix_c_scroll_y:hover>div{width:10px;margin:0}
+.webix_c_scroll_x{position:absolute;z-index:3;height:10px;bottom:0}
+.webix_c_scroll_x>div{-moz-transition:height .3s .2s,margin .3s .2s;-webkit-transition:height .3s .2s,margin .3s .2s;-o-transition:height .3s .2s,margin .3s .2s;-ms-transition:height .3s .2s,margin .3s .2s;height:4px;width:100%;background-color:silver;background:rgba(0,0,0,.4);border-radius:4px;margin:3px 0}
+.webix_c_scroll_x.webix_scroll_active div,.webix_c_scroll_x:hover>div{height:10px;margin:0}
+.webix_c_scroll_bar_x,.webix_c_scroll_bar_y{position:absolute;background:rgba(0,0,0,.05)}
+.webix_c_scroll_bar_y{height:100%;width:10px;right:0}
+.webix_c_scroll_bar_x{width:100%;height:10px;bottom:0}
+.webix_scroll_cont{width:100%;height:auto;overflow:hidden;clear:both}
+.webix_scroll_touch_ie{touch-action:none}
+.webix_dt_editor{position:absolute;z-index:2;overflow:visible;background:#fff}
+.webix_dt_editor input,.webix_dt_editor select{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:1px 8px 0 9px;margin:0;border:1px solid gold;height:100%;font-family:'PT Sans',Tahoma;font-size:15px;color:#666}
+.webix_dt_editor input[type=checkbox]{margin:6px 8px 4px 14px;height:auto;width:auto}
+.webix_dt_editor select{padding-right:0;padding-left:5px}
+.webix_clipbuffer{width:1px;height:1px;left:3px;top:3px;position:fixed;white-space:nowrap;filter:alpha(opacity=0);opacity:0}
+.webix_message_area{position:fixed;right:5px;width:250px;z-index:1000}
+.webix_info{min-width:120px;font-family:Tahoma,Arial;z-index:10000;overflow:hidden;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}
+.webix_no_transition{-webkit-transition:none;-moz-transition:none;transition:none}
+.webix_info.hidden{height:0;min-height:0;padding-top:0;padding-bottom:0;border-width:0;margin-top:0;margin-bottom:0;overflow:hidden}
+.webix_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;background-color:#fff;box-shadow:0 3px 6px #c8c8c8;font-family:'PT Sans',Tahoma;z-index:20000;border-radius:0;outline:0}
+.webix_popup_title{border-top-left-radius:-1px;border-top-right-radius:-1px;border-width:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAoCAMAAAAIaGBFAAAAhFBMVEVwcHBubm5sbGxqampoaGhmZmZlZWVjY2NhYWFfX19dXV1bW1taWlpYWFhWVlZUVFRSUlJRUVFPT09NTU1LS0tJSUlHR0dGRkZERERCQkJAQEA+Pj49PT09PT0+Pj5AQEBBQUFDQ0NERERGRkZHR0dJSUlKSkpMTExMTEw5OTk5OTk5OTkny8YEAAAAQklEQVQImQXBCRJCAAAAwKVSQqdyjSPXNP7/QLsIhA6OTiJnF7GrRCpzc/fw9PKW+/gqlCq1RqvTG/yMJrPF6m/bAVEhAxxnHG0oAAAAAElFTkSuQmCC);background:-webkit-linear-gradient(top,#707070 1%,#3d3d3d 70%,#4c4c4c 97%,#393939 97%);background:-moz-linear-gradient(top,#707070 1%,#3d3d3d 70%,#4c4c4c 97%,#393939 97%)}
+.webix_button,.webix_info,.webix_popup_button{cursor:pointer}
+.webix_popup_text{overflow:hidden}
+.webix_popup_controls{border-radius:6px;padding:5px 10px 10px}
+.webix_button,.webix_popup_button{height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:6px}
+.webix_popup_button div{border-radius:6px}
+.webix_popup_button{min-width:100px}
+div.webix_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=10);opacity:.1;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}
+.webix_info img,.webix_modal_box img{float:left;margin-right:20px}
+.webix_alert_error .webix_popup_title,.webix_confirm_error .webix_popup_title{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAsCAIAAAArRUU2AAAATklEQVR4nIWLuw2AMBBDjVuQiBT2oWbRDATrnB0KQOJoqPzRe3BrHI6dcBASYREKovtK6/6DsDOX+stN+3H1YX9ciRgnYq5EWYhS2dftBIuLT4JyIrPCAAAAAElFTkSuQmCC)}
+.webix_alert_error,.webix_confirm_error{border:1px solid red}
+.webix_button,.webix_popup_button{border:1px solid #ddd}
+.webix_button input,.webix_popup_button div{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;color:#fff;background:#3498db;border-bottom:1px solid #2386c8;height:30px;line-height:30px}
+.webix_popup_button.confirm div{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;background:#27ae60;border-color:#27ae60;border-bottom:1px solid #209150;box-shadow:none;text-shadow:none;color:#fff}
+.webix_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}
+.webix_popup_text{margin:0 0 5px;padding-top:25px;color:#666;min-height:60px}
+.webix_error,.webix_info{font-size:15px;color:#333;box-shadow:0 0 10px #888;padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}
+.webix_info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #B8B8B8}
+.webix_error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:0 0 10px #000}
+.webix_error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}
+.webix_drag_zone{position:absolute;box-shadow:1px 1px 5px #ddd;background-color:#fff;font-family:'PT Sans',Tahoma;font-size:15px;color:#666;pointer-events:none}
+.webix_drag_zone .borderless{padding:2px 20px 2px 2px}
+.webix_drag_over,.webix_drop_zone{background-color:#e6e6e6}
+.webix_transparent{opacity:0}
+.webix_column{position:absolute;top:0}
+.webix_cell{overflow:hidden;line-height:31px;white-space:nowrap}
+.webix_hcell{width:100%;overflow:hidden}
+.webix_ss_body{overflow:hidden;position:relative}
+.webix_hs_center,.webix_hs_left,.webix_hs_right,.webix_ss_center,.webix_ss_left,.webix_ss_right{overflow:hidden;float:left}
+.webix_ss_center,.webix_ss_right{position:relative}
+.webix_ss_footer table,.webix_ss_header table{table-layout:fixed}
+.webix_ss_center_scroll{height:100%;position:relative;overflow:hidden;min-height:1px}
+.webix_ss_hscroll{bottom:0}
+.webix_ss_vscroll{position:absolute;top:0;right:0;z-index:2}
+.webix_ss_vscroll_footer{position:absolute;bottom:0;right:0;border-left:1px solid #fff;border-top:1px solid #ddd;z-index:1}
+.webix_ss_vscroll_header{position:absolute;top:0;right:0;border-left:1px solid #b0cee3;border-bottom:1px solid #ddd;z-index:1}
+.webix_dtable{position:relative;cursor:default;z-index:0}
+.webix_ss_footer,.webix_ss_header{clear:both;overflow:hidden}
+.webix_block_selection,.webix_cell,.webix_hcell,.webix_ss_footer td,.webix_ss_header td,.webix_table_cell,.webix_view.webix_table_cell{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_block_selection{position:absolute}
+.webix_ss_sort_asc,.webix_ss_sort_desc{position:absolute;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_hcell.webix_ss_filter{padding:3px 5px}
+.webix_ss_filter input,.webix_ss_filter select{width:100%;font-size:inherit;color:#666!important;height:39px;margin-top:-2px;padding:0 3px;vertical-align:top;border:1px solid #ddd;line-height:32px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:'PT Sans',Tahoma}
+.webix_richfilter{margin-top:1px}
+.webix_ss_filter select{padding:3px}
+.webix_dd_drag_column,.webix_ss_header,.webix_ss_header TD,.webix_ss_vscroll_header{font-size:15px;color:#4a4a4a;background:#d2e3ef}
+.webix_ss_footer TD,.webix_ss_vscroll_footer{background:#fafafa}
+.webix_hcell{padding:0 10px;text-align:left}
+.webix_ss_header td{border-right:1px solid #b0cee3;border-bottom:1px solid #b0cee3}
+.webix_ss_footer td{border-right:1px solid #ebebeb;border-top:1px solid #ebebeb}
+.webix_column.webix_last>div,.webix_hs_center td.webix_last,.webix_hs_right td.webix_last{border-right-width:0}
+.webix_hs_right td.webix_first,.webix_ss_right .webix_column.webix_first>div{border-left:1px solid #ddd}
+.webix_ss_left .webix_column.webix_last>div{border-right:1px solid #ddd}
+.webix_last_topcell.webix_cell{border-bottom:1px solid #ddd}
+.webix_column>div,.webix_table_cell{border-right:1px solid #ebebeb;padding:0 10px;border-bottom:1px solid #ebebeb}
+.webix_column{text-align:left}
+.webix_dd_over_column,.webix_sel_hcell{background-color:#c9eaf5}
+.webix_block_selection{background:rgba(0,0,0,.1);border:2px solid #ebebeb}
+.webix_dd_drag{white-space:nowrap;overflow:hidden;border-left:1px solid #ebebeb;height:34px}
+.webix_dd_drag>div{display:inline-block;vertical-align:top;background:#fff;border-top:1px solid #ebebeb;border-right:1px solid #ebebeb;border-bottom:1px solid #ebebeb;padding:5px 10px;height:34px;line-height:26px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_dd_drag_column{padding:5px 10px}
+.webix_column>.webix_drag_over.webix_cell{background-color:#e6e6e6;color:#666}
+.webix_ss_header table,.webix_ss_header td,.webix_ss_header th{padding:0;margin:0}
+.webix_cell.webix_invalid,.webix_column>.webix_cell.webix_invalid:nth-child(even){background-color:#fee}
+.webix_invalid_cell{position:relative}
+.webix_invalid_cell:after{content:"";position:absolute;top:0;right:0;width:0;height:1px;border-top:8px solid #f44;border-left:8px solid transparent}
+.webix_column>div.webix_cell_select,.webix_column>div.webix_column_select,.webix_column>div.webix_row_select{color:#fff;background:#27ae60}
+.webix_column>div.webix_cell_select{border-bottom:1px solid #ebebeb;border-left:1px solid #ebebeb;border-right:1px solid #ebebeb;padding-top:0;padding-left:9px}
+.webix_ss_right .webix_column.webix_first>div.webix_cell_select{padding-left:10px}
+.webix_column>div.webix_invalid.webix_row_select:nth-child(even),.webix_column>div.webix_row_select{border-bottom:1px solid #ebebeb;padding-top:0}
+.webix_column>div.webix_column_select{border-left:1px solid #ebebeb;border-right:1px solid #ebebeb;padding-left:9px}
+.webix_column>.webix_cell.webix_invalid.webix_cell_select:nth-child(even){color:#fff;background:#27ae60}
+.webix_dtable_colrow,.webix_dtable_subrow,.webix_dtable_subview{position:absolute;left:0;top:0;background-color:#fff;width:100%;padding-right:28px;padding-left:10px;padding-top:1px;border-bottom:1px solid #ebebeb}
+.webix_dtable_subrow{border-top:1px solid #ebebeb;text-align:right}
+.webix_dtable_subview{background:#ebebeb;border-top:1px solid #ebebeb;padding:0 0 0 10px;box-sizing:border-box}
+.number .webix_cell{text-align:right}
+.webix_rotate{transform:rotate(-90deg);-webkit-transform:rotate(-90deg);line-height:normal}
+.webix_measure_rotate{line-height:normal;white-space:normal;padding:10px}
+.webix_span_layer{background:0 0;position:absolute;left:0;top:0;height:0;width:0;overflow:visible}
+.webix_dtable_span{position:absolute;background:#fff}
+.webix_dtable_span.webix_selected{color:#fff;background:#27ae60}
+.webix_hcell span.webix_input_icon{background-color:#b0cee3}
+.webix_area_selection_layer{position:absolute;z-index:1}
+.webix_area_selection{position:absolute;background:#666}
+.webix_area_selection_bottom,.webix_area_selection_top{height:2px}
+.webix_area_selection_left,.webix_area_selection_right{width:2px}
+.webix_area_selection_handle{position:absolute;width:6px;height:6px;border:1px solid #fff;background:#666;cursor:crosshair;margin:-6px 0 0 -6px}
+.webix_topcell{position:relative;background:#fff;z-index:1}
+.webix_window{position:absolute;box-shadow:1px 3px 4px #c8c8c8}
+.webix_win_body{overflow:hidden}
+.webix_win_body,.webix_win_body>.webix_view,.webix_win_body>.webix_view .webix_cal_month,.webix_win_content,.webix_window{border-radius:0}
+.webix_win_head{border-bottom:1px solid silver}
+.webix_win_head>.webix_view>.webix_template{color:#fff;font-size:18px;background:#3498db;padding:0;text-align:center;line-height:45px}
+.webix_win_head>.webix_view>.webix_template .webix_el_button,.webix_win_head>.webix_view>.webix_template .webix_el_label,.webix_win_head>.webix_view>.webix_template .webix_inp_label{color:#fff}
+.webix_win_head>.webix_view>.webix_template .webix_el_label{font-size:18px}
+.webix_win_head>.webix_view>.webix_template .webix_inp_counter_next,.webix_win_head>.webix_view>.webix_template .webix_inp_counter_prev,.webix_win_head>.webix_view>.webix_template .webix_segment_0,.webix_win_head>.webix_view>.webix_template .webix_segment_1,.webix_win_head>.webix_view>.webix_template .webix_segment_N,.webix_win_head>.webix_view>.webix_template .webixtype_base,.webix_win_head>.webix_view>.webix_template .webixtype_next,.webix_win_head>.webix_view>.webix_template .webixtype_prev{border-color:#d9d9d9;background-color:transparent;color:#fff}
+.webix_win_head>.webix_view>.webix_template .webix_el_arrow.webixtype_next_arrow{border-left:none;border-bottom:none}
+.webix_win_head>.webix_view>.webix_template .webix_el_arrow.webixtype_prev_arrow{border-right:none;border-bottom:none}
+.webix_win_head>.webix_view>.webix_template .webix_inp_counter_next:hover,.webix_win_head>.webix_view>.webix_template .webix_inp_counter_prev:hover,.webix_win_head>.webix_view>.webix_template .webix_segment_0:hover,.webix_win_head>.webix_view>.webix_template .webix_segment_1:hover,.webix_win_head>.webix_view>.webix_template .webix_segment_N:hover,.webix_win_head>.webix_view>.webix_template .webixtype_base:hover{color:#fff;background-color:rgba(0,0,0,.05)}
+.webix_win_head>.webix_view>.webix_template .webix_inp_counter_next:active,.webix_win_head>.webix_view>.webix_template .webix_inp_counter_prev:active,.webix_win_head>.webix_view>.webix_template .webix_segment_0:active,.webix_win_head>.webix_view>.webix_template .webix_segment_1:active,.webix_win_head>.webix_view>.webix_template .webix_segment_N:active,.webix_win_head>.webix_view>.webix_template .webixtype_base:active{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_win_head>.webix_view>.webix_template .webix_inp_counter_next:focus,.webix_win_head>.webix_view>.webix_template .webix_inp_counter_prev:focus,.webix_win_head>.webix_view>.webix_template .webix_segment_0:focus,.webix_win_head>.webix_view>.webix_template .webix_segment_1:focus,.webix_win_head>.webix_view>.webix_template .webix_segment_N:focus,.webix_win_head>.webix_view>.webix_template .webixtype_base:focus{background-color:rgba(0,0,0,.07);color:#fff}
+.webix_win_head>.webix_view>.webix_template .webix_inp_static,.webix_win_head>.webix_view>.webix_template input[type=text]{border-color:#fff}
+.webix_win_head>.webix_view>.webix_template .webix_inp_static:focus,.webix_win_head>.webix_view>.webix_template input[type=text]:focus{border-color:#fff;box-shadow:none}
+.webix_win_head>.webix_view>.webix_template .webix_input_icon{border-color:#d9d9d9;background-color:transparent;color:#666}
+.webix_win_head>.webix_view>.webix_template .webix_input_icon:active,.webix_win_head>.webix_view>.webix_template .webix_input_icon:focus,.webix_win_head>.webix_view>.webix_template .webix_input_icon:hover{background-color:transparent;color:#666}
+.webix_win_head>.webix_view>.webix_template .webix_pressed .webix_el_arrow,.webix_win_head>.webix_view>.webix_template .webix_pressed .webix_inp_counter_next,.webix_win_head>.webix_view>.webix_template .webix_pressed .webix_inp_counter_prev,.webix_win_head>.webix_view>.webix_template .webix_pressed .webix_input_icon,.webix_win_head>.webix_view>.webix_template .webix_pressed .webix_segment_0,.webix_win_head>.webix_view>.webix_template .webix_pressed .webix_segment_1,.webix_win_head>.webix_view>.webix_template .webix_pressed .webix_segment_N,.webix_win_head>.webix_view>.webix_template .webix_pressed .webixtype_base,.webix_win_head>.webix_view>.webix_template .webix_pressed .webixtype_next,.webix_win_head>.webix_view>.webix_template .webix_pressed .webixtype_prev{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_0,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_1,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_N{border-color:#d9d9d9;background-color:#27ae60;color:#fff}
+.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_0:hover,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_1:hover,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_N:hover{background-color:#24a259}
+.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_0:active,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_0:focus,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_1:active,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_1:focus,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_N:active,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_N:focus{background-color:#295}
+.webix_win_head>.webix_view>.webix_template .webix_segment_1,.webix_win_head>.webix_view>.webix_template .webix_segment_N,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_1,.webix_win_head>.webix_view>.webix_template .webix_selected.webix_segment_N{margin-left:0;border-left:none}
+.webix_win_head>.webix_view>.webix_template .webix_img_btn:active,.webix_win_head>.webix_view>.webix_template .webix_img_btn_top:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_win_head>.webix_view>.webix_template .webix_img_btn:focus,.webix_win_head>.webix_view>.webix_template .webix_img_btn_top:focus{background-color:#2489cc}
+.webix_win_head>.webix_view>.webix_template .webix_img_btn:hover,.webix_win_head>.webix_view>.webix_template .webix_img_btn_top:hover{background-color:#268fd5}
+.webix_win_head>.webix_view>.webix_template .webix_icon_button{border-radius:6px}
+.webix_win_head>.webix_view>.webix_template .webix_el_icon,.webix_win_head>.webix_view>.webix_template .webix_icon_btn,.webix_win_head>.webix_view>.webix_template .webix_icon_button,.webix_win_head>.webix_view>.webix_template .webix_img_btn,.webix_win_head>.webix_view>.webix_template .webix_img_btn_abs,.webix_win_head>.webix_view>.webix_template .webix_img_btn_abs .webix_icon,.webix_win_head>.webix_view>.webix_template .webix_img_btn_abs .webix_img_btn_text,.webix_win_head>.webix_view>.webix_template .webix_img_btn_top .webix_icon,.webix_win_head>.webix_view>.webix_template .webix_img_btn_top .webix_img_btn_text{color:#fff}
+.webix_win_head>.webix_view>.webix_template .webix_el_box .webix_img_btn_abs:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_win_head>.webix_view>.webix_template .webix_el_icon .webix_icon_button:focus{background-color:rgba(0,0,0,.07)}
+.webix_win_head>.webix_view>.webix_template .webix_el_box .webix_img_btn_abs:hover,.webix_win_head>.webix_view>.webix_template .webix_el_icon .webix_icon_button:hover{background-color:rgba(0,0,0,.05)}
+.webix_win_head>.webix_view>.webix_template .webix_control{border-color:#3498db}
+.webix_win_head>.webix_view>.webix_template .webix_icon_button .webix_icon{font-size:23px;height:27px;width:27px;color:#fff}
+.webix_win_head>.webix_view>.webix_template .webix_img_btn,.webix_win_head>.webix_view>.webix_template .webix_img_btn_top{border-width:0}
+.webix_win_content{height:auto;width:auto;overflow:hidden}
+.webix_modal{width:100%;height:100%;position:fixed;top:0;left:0;background-color:#000;filter:alpha(opacity=20);opacity:.2}
+.webix_point_bottom,.webix_point_left,.webix_point_right,.webix_point_top{position:absolute}
+.webix_point_bottom,.webix_point_top{width:13px;height:7px}
+.webix_point_left,.webix_point_right{width:7px;height:13px}
+.webix_point_bottom,.webix_point_left,.webix_point_right,.webix_point_top{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAArCAIAAADHSy4DAAAABnRSTlMAAAAAAABupgeRAAAACXBIWXMAAABPAAAATwFjiv3XAAAAhElEQVR4nMXVQQoAIQhAUe9/FC/pLAYayUm/EeT6YWGmoqpWharKG7n+XK5nt9L/LurMeV27oZHrReN0M6Oupr5S1GU0vhN1J7L27hp1QYXX1WtE5UxnNXI0ep7+pEGRpr95ooWObbXUm1npXWkFaF3vTqj9c+h8pVOb7gK6Yeje4tvwARi4FgcAh2V/AAAAAElFTkSuQmCC)}
+.webix_point_top{background-position:0 -36px}
+.webix_point_bottom{background-position:0 0}
+.webix_point_right{background-position:0 -22px}
+.webix_point_left{background-position:0 -9px}
+.webix_resize_handle{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize}
+.webix_resize_frame{position:absolute;filter:alpha(opacity=10);opacity:.1;background:#3498db;display:block;border:1px solid #196090;box-shadow:1px 3px 6px #000}
+.webix_resize_cursor{cursor:nw-resize}
+.webix_tree .webix_scroll_cont>.webix_tree_leaves{padding:9px 10px 9px 9px}
+.webix_tree_item{clear:both;height:28px;line-height:28px;white-space:nowrap}
+.webix_tree_item.webix_selected{background:0 0}
+.webix_tree_item.webix_selected span{padding:4px 10px 4px 4px;margin-left:-4px;color:#fff;background:#27ae60}
+.webix_tree_checkbox{margin:1px 0 0;padding:0;float:left;vertical-align:middle;height:100%;width:13px}
+.webix_indeterminate{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcCCSwfRyGesAAAAAxpVFh0Q29tbWVudAAAAAAAvK6ymQAAAExJREFUKM9jLCgo+M9AAmBhYGBgaGtrY+Tk5MSrsLCwkIGBgeE/EwOJgGQNLMgcJSUlBgYGBnQ/Md67d498G+jsB6hbGQfWSYykJg0AUMsPVoNrFX0AAAAASUVORK5CYII=);background-repeat:no-repeat;background-position:left center;height:100%;width:13px;margin-top:0!important}
+.webix_measure_size input,.webix_measure_size select,.webix_measure_size textarea{width:5px}
+.webix_measure_size div{margin-left:-5px;float:none}
+.webix_measure_size a,.webix_measure_size div{display:inline-block!important}
+.webix_tree_close,.webix_tree_file,.webix_tree_folder,.webix_tree_folder_open,.webix_tree_none,.webix_tree_open{float:left;width:20px;height:100%;cursor:pointer;margin:0;background-repeat:no-repeat}
+.webix_tree_close,.webix_tree_none,.webix_tree_open{background-position:center center}
+.webix_cell .webix_tree_close,.webix_cell .webix_tree_none,.webix_cell .webix_tree_open{background-color:transparent}
+.webix_tree_file,.webix_tree_folder,.webix_tree_folder_open{background-position:0 center;margin:0 2px}
+.webix_tree_leaves .webix_tree_leaves{margin-left:18px}
+.webixLineTree .webix_tree_leaves{margin-left:0}
+.webix_tree_close{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7)}
+.webix_tree_open{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7)}
+.webix_tree_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAInjI+JwM26XAtPyTnTfU5veGyXJ2ZhaRpoSq0AicKlLNJftNojyCMFADs=)}
+.webix_tree_folder{background-image:url(data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIhjI+py90AI3Syvoqj27mfnn2gZYxkYEpiCqypa27yTC8FADs=)}
+.webix_tree_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIjjI+py90AI3SyvorjkQ7pDAJBSJaTaGpjKq7pxsJmR9c2UwAAOw==)}
+.webix_tree_img{background:0 0;float:left;width:25px;height:28px}
+.webix_tree_plus2{background-image:url(data:image/gif;base64,R0lGODlhEgAYAMIDAFVVVYiIiMHBwf///////////////////yH5BAEKAAQALAAAAAASABgAAAM8SLoq/LDFKWl0FuLMNq8faAVkWVLBoK5DgK7A6k6pGqtzlAI83wpAIKM2uLVeNhmSdaSZTKGodEqtWjkJADs=);background-repeat:no-repeat}
+.webix_tree_plus3{background-image:url(data:image/gif;base64,R0lGODlhEgAYAMIDAFVVVYiIiMHBwf///////////////////yH5BAEKAAQALAAAAAASABgAAANCSLoq/LDFKWl0FuLMNq8faAVkWVLBoK5DgK7A6k6pGqtzlAI83wpAIKM2uLVeNhmSdaSZTB9PNLSQcqwZrEVL4SYAADs=)}
+.webix_tree_plus4{background-image:url(data:image/gif;base64,R0lGODlhEgAYAMIDAFVVVYiIiMHBwf///////////////////yH5BAEKAAQALAAAAAASABgAAAM5SLrc/jDKSau9mIbNeQxDKA7BJwJiCYEhGqoPCMwzKdw3ww4uabap38i36nQqgkwSs7w0LU+kMpIAADs=)}
+.webix_tree_minus2{background-image:url(data:image/gif;base64,R0lGODlhEgAYAMIDAFVVVYiIiMHBwf///////////////////yH5BAEKAAQALAAAAAASABgAAAM5SLoq/LDFKWl0FuLMNq8faAVkWVLBoK5DgLKrO6Vw+wI43go8z9AwWQTIEkKIMZTJFGo6n9ColJMAADs=);background-repeat:no-repeat}
+.webix_tree_minus3{background-image:url(data:image/gif;base64,R0lGODlhEgAYAMIDAFVVVYiIiMHBwf///////////////////yH5BAEKAAQALAAAAAASABgAAAM+SLoq/LDFKWl0FuLMNq8faAVkWVLBoK5DgLKrO6Vw+wI43go8z9AwWQTIEkKIMZTJ9PE0QwsnR5qhWqwUbAIAOw==)}
+.webix_tree_minus4{background-image:url(data:image/gif;base64,R0lGODlhEgAYAMIDAFVVVYiIiMHBwf///////////////////yH5BAEKAAQALAAAAAASABgAAAM1SLrc/jDKSau9mIbNeQxDKA7BN4olBJ6kCbwvKcwzs57pc4+5s6OfTqciyBQxx0vSsiQaIwkAOw==)}
+.webix_tree_line1{background-image:url(data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIxjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKrKg68GbjNGVTeGZmeiRP+IphBbi0EgrAAA7)}
+.webix_tree_line2{background-image:url(data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIpjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC7/mTNf2jef6zvc+XgAAOw==);background-repeat:no-repeat}
+.webix_tree_line3{background-image:url(data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAI1jI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC78VC9KeveGYPpsJTwFmfCeixahABoQRXQEAOw==)}
+.webix_tree_line4{background-image:url(data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIjjI+py+0Po5y02ouz3rxDAIZi+HGAiW6nmmqr22avHGMzUwAAOw==)}
+.webix_tree_blank{background-image:url(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)}
+.webix_tree_img{background-color:#fff}
+.webix_cal_month{height:22px;position:relative;padding-top:17px;padding-bottom:5px;box-sizing:content-box}
+.webix_cal_next_button,.webix_cal_prev_button{cursor:pointer;position:absolute;top:17px;width:30px;height:28px;background-position:11.5px 4px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_cal_prev_button{left:17px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAASUlEQVR42p2QMQoAQQgD79EZ0Mqn5xCu2cPdYgUbJ0rMMxXgLeiuKq8gsJAz8weQ0QiwJEfECnr4wdlEnwJ68+yyhReC+c85oRecj0Um+pmo9wAAAABJRU5ErkJggg==);background-repeat:no-repeat}
+.webix_cal_next_button{right:17px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAARElEQVR42qXPsQoAIAhF0T76PdDJT7cUmtQhcmk4N8QVQ9JXN2bmgWOgqp+BiCRG2AYAMoi3/LxYdyagAnhA6G93TrABZaJFJjrFY8IAAAAASUVORK5CYII=);background-repeat:no-repeat}
+.webix_view>.webix_cal_header{margin:0 17px 10px;height:auto}
+.webix_view>.webix_cal_header div{float:left;text-align:center;height:19px;color:#666;border-bottom:#cecece 1px solid;margin-bottom:7px}
+.webix_cal_body{margin:0 17px}
+.webix_cal_body .webix_cal_row{clear:both}
+.webix_cal_body .webix_cal_row>div{float:left;text-align:center;height:100%}
+.webix_cal_body .webix_cal_select,.webix_cal_body .webix_cal_select.webix_cal_today,.webix_cal_body .webix_selected{color:#fff;background:#27ae60}
+.webix_cal_day,.webix_cal_week_num{cursor:pointer;font-size:12px;color:#666;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_cal_week_num{color:#bfbfbf;cursor:default;margin-right:0;border-right:1px solid #cecece}
+.webix_cal_event{font-weight:700}
+.webix_cal_inactive{background:#888}
+.webix_cal_day_disabled,.webix_cal_day_disabled.webix_cal_event{color:#ccc;background:#f0f0f0}
+.webix_hours .webix_cal_day_disabled,.webix_hours .webix_cal_day_disabled.webix_cal_event,.webix_minutes .webix_cal_day_disabled,.webix_minutes .webix_cal_day_disabled.webix_cal_event{background:#fff;font-weight:400;text-decoration:line-through}
+.webix_cal_month_name{cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_cal_block{float:left;text-align:center;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_selected{background:#27ae60;color:#fff}
+.webix_cal_footer{text-align:center;font-size:12px;color:#444;margin:4px 17px;padding-top:2px;cursor:pointer}
+.webix_cal_icons{float:right;padding:4px}
+.webix_cal_time{padding:2px 4px}
+.webix_cal_time_icons{float:left}
+.webix_cal_icons .webix_cal_icon{text-align:center;padding:2px 4px}
+.webix_cal_icon:hover,.webix_cal_month_name:hover,.webix_cal_time:hover{text-decoration:underline;color:#3498db}
+.webix_cal_month_name.webix_readonly:hover{text-decoration:none;color:#666;cursor:default}
+.webix_time_header{padding:17px 17px 1px}
+.webix_time_header .webix_cal_hours,.webix_time_header .webix_cal_minutes{display:inline-block;font-size:14px;text-align:center;height:26px;line-height:22px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #ddd}
+.webix_time_header .webix_cal_minutes{padding-left:1px;border-left:none}
+.webix_time_header .webix_cal_hours{border-right:none!important}
+.webix_cal_body .webix_hours{float:left;border-right:1px solid #cecece;padding-right:1px}
+.webix_cal_body .webix_minutes{float:left;padding-left:1px}
+.webix_cal_block_empty{float:left;text-align:center}
+.webix_time_footer{text-align:center;font-size:12px;padding:7px 17px 0;cursor:pointer}
+.webix_cal_done{margin-top:3px;border-radius:6px;font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;background:#27ae60;color:#fff;border-color:#27ae60;border-bottom:1px solid #209150;box-shadow:none;float:right}
+.webix_cal_blurred_hours{background-color:#f7f7f7}
+.webix_property_line{clear:both;width:100%;min-height:24px;height:auto}
+.webix_property_label,.webix_property_value{padding-left:10px;float:left;border-bottom:1px solid #ddd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;height:28px;line-height:27px}
+.webix_property_label{border-right:1px solid #ddd}
+.webix_property_label_line{padding-left:10px;color:#fff;font-size:18px;background:#3498db;border-bottom:1px solid #ebebeb;line-height:28px}
+.webix_property_label_line .webix_el_button,.webix_property_label_line .webix_el_label,.webix_property_label_line .webix_inp_label{color:#fff}
+.webix_property_label_line .webix_el_label{font-size:18px}
+.webix_property_label_line .webix_inp_counter_next,.webix_property_label_line .webix_inp_counter_prev,.webix_property_label_line .webix_segment_0,.webix_property_label_line .webix_segment_1,.webix_property_label_line .webix_segment_N,.webix_property_label_line .webixtype_base,.webix_property_label_line .webixtype_next,.webix_property_label_line .webixtype_prev{border-color:#d9d9d9;background-color:transparent;color:#fff}
+.webix_property_label_line .webix_el_arrow.webixtype_next_arrow{border-left:none;border-bottom:none}
+.webix_property_label_line .webix_el_arrow.webixtype_prev_arrow{border-right:none;border-bottom:none}
+.webix_property_label_line .webix_inp_counter_next:hover,.webix_property_label_line .webix_inp_counter_prev:hover,.webix_property_label_line .webix_segment_0:hover,.webix_property_label_line .webix_segment_1:hover,.webix_property_label_line .webix_segment_N:hover,.webix_property_label_line .webixtype_base:hover{color:#fff;background-color:rgba(0,0,0,.05)}
+.webix_property_label_line .webix_inp_counter_next:active,.webix_property_label_line .webix_inp_counter_prev:active,.webix_property_label_line .webix_segment_0:active,.webix_property_label_line .webix_segment_1:active,.webix_property_label_line .webix_segment_N:active,.webix_property_label_line .webixtype_base:active{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_property_label_line .webix_inp_counter_next:focus,.webix_property_label_line .webix_inp_counter_prev:focus,.webix_property_label_line .webix_segment_0:focus,.webix_property_label_line .webix_segment_1:focus,.webix_property_label_line .webix_segment_N:focus,.webix_property_label_line .webixtype_base:focus{background-color:rgba(0,0,0,.07);color:#fff}
+.webix_property_label_line .webix_inp_static,.webix_property_label_line input[type=text]{border-color:#fff}
+.webix_property_label_line .webix_inp_static:focus,.webix_property_label_line input[type=text]:focus{border-color:#fff;box-shadow:none}
+.webix_property_label_line .webix_input_icon{border-color:#d9d9d9;background-color:transparent;color:#666}
+.webix_property_label_line .webix_input_icon:active,.webix_property_label_line .webix_input_icon:focus,.webix_property_label_line .webix_input_icon:hover{background-color:transparent;color:#666}
+.webix_property_label_line .webix_pressed .webix_el_arrow,.webix_property_label_line .webix_pressed .webix_inp_counter_next,.webix_property_label_line .webix_pressed .webix_inp_counter_prev,.webix_property_label_line .webix_pressed .webix_input_icon,.webix_property_label_line .webix_pressed .webix_segment_0,.webix_property_label_line .webix_pressed .webix_segment_1,.webix_property_label_line .webix_pressed .webix_segment_N,.webix_property_label_line .webix_pressed .webixtype_base,.webix_property_label_line .webix_pressed .webixtype_next,.webix_property_label_line .webix_pressed .webixtype_prev{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_property_label_line .webix_selected.webix_segment_0,.webix_property_label_line .webix_selected.webix_segment_1,.webix_property_label_line .webix_selected.webix_segment_N{border-color:#d9d9d9;background-color:#27ae60;color:#fff}
+.webix_property_label_line .webix_selected.webix_segment_0:hover,.webix_property_label_line .webix_selected.webix_segment_1:hover,.webix_property_label_line .webix_selected.webix_segment_N:hover{background-color:#24a259}
+.webix_property_label_line .webix_selected.webix_segment_0:active,.webix_property_label_line .webix_selected.webix_segment_0:focus,.webix_property_label_line .webix_selected.webix_segment_1:active,.webix_property_label_line .webix_selected.webix_segment_1:focus,.webix_property_label_line .webix_selected.webix_segment_N:active,.webix_property_label_line .webix_selected.webix_segment_N:focus{background-color:#295}
+.webix_property_label_line .webix_segment_1,.webix_property_label_line .webix_segment_N,.webix_property_label_line .webix_selected.webix_segment_1,.webix_property_label_line .webix_selected.webix_segment_N{margin-left:0;border-left:none}
+.webix_property_label_line .webix_img_btn:active,.webix_property_label_line .webix_img_btn_top:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_property_label_line .webix_img_btn:focus,.webix_property_label_line .webix_img_btn_top:focus{background-color:#2489cc}
+.webix_property_label_line .webix_img_btn:hover,.webix_property_label_line .webix_img_btn_top:hover{background-color:#268fd5}
+.webix_property_label_line .webix_icon_button{border-radius:6px}
+.webix_property_label_line .webix_el_icon,.webix_property_label_line .webix_icon_btn,.webix_property_label_line .webix_icon_button,.webix_property_label_line .webix_img_btn,.webix_property_label_line .webix_img_btn_abs,.webix_property_label_line .webix_img_btn_abs .webix_icon,.webix_property_label_line .webix_img_btn_abs .webix_img_btn_text,.webix_property_label_line .webix_img_btn_top .webix_icon,.webix_property_label_line .webix_img_btn_top .webix_img_btn_text{color:#fff}
+.webix_property_label_line .webix_el_box .webix_img_btn_abs:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_property_label_line .webix_el_icon .webix_icon_button:focus{background-color:rgba(0,0,0,.07)}
+.webix_property_label_line .webix_el_box .webix_img_btn_abs:hover,.webix_property_label_line .webix_el_icon .webix_icon_button:hover{background-color:rgba(0,0,0,.05)}
+.webix_property_label_line .webix_control{border-color:#3498db}
+.webix_property_label_line .webix_icon_button .webix_icon{font-size:23px;height:27px;width:27px;color:#fff}
+.webix_property_label_line .webix_img_btn,.webix_property_label_line .webix_img_btn_top{border-width:0}
+.webix_property_col_val{width:100%;height:100%;-moz-user-select:text;-webkit-user-select:text;user-select:text}
+.webix_property_col_ind{float:right;border:1px solid #ddd;border-radius:2px;width:30px;cursor:pointer;height:13px;margin:3px 10px 3px 0}
+.webix_property_value{text-overflow:ellipsis;white-space:nowrap}
+.webix_property_check{margin-top:5px}
+.webix_tooltip{display:none;white-space:pre;position:absolute;z-index:10000;background-color:#fff;padding:5px 10px;border:1px solid #ddd;font-family:'PT Sans',Tahoma;font-size:15px;color:#666;border-radius:0;box-shadow:1px 1px 0 0 #CCC}
+.webix_color_row{clear:both;white-space:nowrap}
+.webix_color_palette{text-align:left;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_color_row,.webix_color_row div,.webix_color_selector{line-height:0;font-size:0}
+.webix_color_row div{display:inline-block;width:15px;height:15px;cursor:default}
+.webix_color_selector{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;border:2px solid #f3f3f3}
+.webix_daterange .webix_view{background-color:#fff}
+.webix_daterange .webix_range_0 .webix_cal_next_button,.webix_daterange .webix_range_1 .webix_cal_next_button,.webix_daterange .webix_range_1 .webix_cal_prev_button,.webix_daterange .webix_range_N .webix_cal_prev_button{visibility:hidden}
+.webix_daterange .webix_range_1 .webix_cal_next_button:hover,.webix_daterange .webix_range_1 .webix_cal_prev_button:hover{cursor:default}
+.webix_daterange .webix_range_1 .webix_cal_month_name:hover{text-decoration:none;color:inherit;cursor:default}
+.webix_daterange .webix_range_left .webix_cal_next_button:hover,.webix_daterange .webix_range_right .webix_cal_prev_button:hover{cursor:default}
+.webix_cal_range_start{border-radius:3px 0 0 3px}
+.webix_cal_range_end{border-radius:0 3px 3px 0}
+.webix_cal_body .webix_cal_today.webix_cal_range_end,.webix_cal_body .webix_cal_today.webix_cal_range_start,.webix_cal_event.webix_cal_range_end,.webix_cal_event.webix_cal_range_start,.webix_cal_range_end,.webix_cal_range_start{background-color:#27ae60;color:#fff}
+.webix_cal_body .webix_cal_outside.webix_cal_range_end,.webix_cal_body .webix_cal_outside.webix_cal_range_start,.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_end,.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_start,.webix_cal_outside.webix_cal_range{background-color:transparent;color:#ccc}
+.webix_daterange .webix_cal_icons{text-align:right;padding:0 4px}
+.webix_daterange .webix_cal_icons .webix_cal_icon{border-top:1px solid #ddd}
+.webix_daterange .webix_cal_time{display:none}
+.webix_daterange .webix_cal_timepicker .webix_range_time_start,.webix_daterange .webix_range_timepicker .webix_cal_time{display:block}
+.webix_daterange .webix_range_timepicker .webix_range_time_start{float:left}
+.webix_daterange .webix_range_timepicker .webix_range_time_end{float:right}
+.webix_daterange .webix_range_footer .webix_cal_footer{padding:0}
+.webix_view.webix_toolbar .webix_el_button{background:0 0}
+.webix_el_button button,.webix_el_button input,.webix_el_toggle button,.webix_el_toggle input,.webixbutton{border-radius:6px;height:100%;width:100%;cursor:pointer;color:#fff;font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;border-bottom:1px solid #268fd5;outline:0;-webkit-appearance:none}
+.webix_el_button .webix_img_btn,.webix_el_button .webix_img_btn .webix_img_btn_text,.webix_el_button .webix_img_btn_top,.webix_el_button .webix_img_btn_top .webix_img_btn_text,.webix_el_toggle .webix_img_btn,.webix_el_toggle .webix_img_btn .webix_img_btn_text,.webix_el_toggle .webix_img_btn_top,.webix_el_toggle .webix_img_btn_top .webix_img_btn_text{color:#666}
+.webix_el_button .webix_img_btn,.webix_el_button .webix_img_btn_top,.webix_el_toggle .webix_img_btn,.webix_el_toggle .webix_img_btn_top{border:0}
+.webixbutton,.webixtype_base,.webixtype_next,.webixtype_prev{background:#3498db;color:#fff;font-size:15px;font-family:'PT Sans',Tahoma;outline:0;padding:0;border:0}
+.webixtype_form{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;background:#27ae60;color:#fff;border-color:#27ae60;border-bottom:1px solid #209150;box-shadow:none}
+.webix_el_button .webixtype_danger{background:#ce5545;border:1px solid #ce5545;border-bottom:1px solid #b13e2f;color:#fff}
+.webix_el_button .webix_el_box,.webix_el_toggle .webix_el_box{position:relative}
+.webix_el_button .webix_el_arrow,.webix_el_toggle .webix_el_arrow{position:absolute;z-index:1}
+.webixtype_next,.webixtype_prev{position:absolute;z-index:2;top:0}
+input.webixtype_prev{border-left-width:0;border-radius:0 6px 6px 0;-webkit-border-radius:0 6px 6px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}
+input.webixtype_next{border-right-width:0;border-radius:6px 0 0 6px;-webkit-border-radius:6px 0 0 6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}
+.webix_el_arrow{width:18px;height:18px;font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;outline:0;color:#fff;background:#3498db;border:1px solid #ddd}
+.webixtype_prev_arrow{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg)}
+.webixtype_next_arrow{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg)}
+.webix_img_btn_abs_top .webix_icon,.webix_img_btn_top .webix_icon{font-size:22px;position:absolute;top:8px;left:50%}
+.webix_img_btn_abs .webix_icon{margin-left:8px}
+.webix_img_btn_abs.webix_img_btn_abs_top .webix_icon,.webix_img_btn_top .webix_icon{margin-left:-10px}
+.webix_img_btn,.webix_img_btn_top{vertical-align:top;background-color:transparent;border:none;width:100%;padding:0}
+.webix_img_btn,.webix_img_btn_abs{cursor:pointer;text-align:left;background-repeat:no-repeat;background-position:2px center;height:100%;font-size:15px}
+.webix_img_btn .webix_icon,.webix_img_btn_abs .webix_icon{color:#fff}
+.webix_img_btn,.webix_img_btn_abs{padding:0}
+.webix_img_btn .webix_image,.webix_img_btn_abs .webix_image{background-repeat:no-repeat;background-position:center center;float:left;vertical-align:top}
+.webix_img_btn_top .webix_image{background-repeat:no-repeat;background-position:center top}
+.webix_img_btn_abs.webix_img_btn_abs_top .webix_image{background-position:center 5px}
+.webix_img_btn_top{text-align:center;background-repeat:no-repeat}
+.webix_img_btn_text{position:absolute;left:0;bottom:4px;width:100%;text-align:center;cursor:pointer;color:#fff}
+.webix_img_btn_abs{background-position:center center}
+.webix_img_btn_top{background-position:center top;vertical-align:top}
+.webix_img_btn_abs .webix_img_btn_text{bottom:8px}
+.webix_pressed .webix_img_btn,.webix_pressed .webix_img_btn_top{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background-color:rgba(0,0,0,.05)}
+.webix_pressed .webix_img_btn_abs+input,.webix_pressed .webixtype_base{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_control .webix_disabled_box .webix_el_arrow,.webix_control .webix_disabled_box .webix_img_btn,.webix_control .webix_disabled_box .webixtype_base,.webix_control .webix_disabled_box .webixtype_danger,.webix_control .webix_disabled_box .webixtype_form,.webix_control .webix_disabled_box .webixtype_next,.webix_control .webix_disabled_box .webixtype_prev{color:#aaa;background:#e9e9e9;border:1px solid #e9e9e9;text-shadow:none}
+.webix_control .webix_disabled_box .webix_img_btn_text{color:#aaa}
+.webix_control .webix_disabled_box .webix_image{opacity:.4}
+.webix_disabled_view.webix_control .webix_icon,.webix_disabled_view.webix_control .webix_icon_btn,.webix_layout_toolbar.webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,.webix_layout_toolbar.webix_toolbar .webix_disabled_view.webix_control .webix_icon,.webix_layout_toolbar.webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn{color:#aaa}
+.webixbutton{width:auto;height:auto;padding:8px 15px}
+.webix_richtext_editor{height:100%}
+.webix_template .webix_richtext_editor:focus{outline:0}
+.webix_richtext_container .webix_template{padding:10px;overflow-x:auto;border:solid #ccc;border-width:0 1px 1px;border-radius:0 0 6px 6px}
+.webix_control{background:0 0}
+.webix_control button,.webix_control input,.webix_control textarea,.webix_el_label,.webix_inp_bottom_label,.webix_inp_label,.webix_inp_top_label{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:'PT Sans',Tahoma}
+.webix_el_box{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3px 2px;height:100%;width:100%;font-size:15px;overflow:hidden}
+.webix_el_colorpicker input,.webix_el_combo input,.webix_el_datepicker input,.webix_el_search input,.webix_el_text input{height:100%;padding:0 10px;border:1px solid #ddd;color:#666;font-size:15px;background:#fff;font-family:'PT Sans',Tahoma;border-color:#ccc;-webkit-appearance:none}
+.webix_inp_label,.webix_inp_top_label,.webix_label_right{color:#666;text-transform:none;font-size:15px}
+.webix_inp_label{float:left;padding-top:1px;padding-left:3px;padding-right:7.5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
+.webix_inp_top_label{float:none;padding:3px 2px 0}
+.webix_inp_bottom_label{font-size:13px;color:#737373}
+.webix_label_right{padding-left:7.5px}
+.webix_el_checkbox .webix_label_right{display:inline-block;padding-top:2px}
+.webix_el_label{color:#666;line-height:32px;padding:3px 2px}
+.webix_toolbar .webix_el_label{padding-left:10px;text-transform:none}
+.webix_el_select select{height:100%;font-size:15px;border:1px solid #ddd}
+body:not(:-moz-handler-blocked) .webix_el_select select{padding:.2em}
+.webix_all_segments,.webix_el_group{height:100%;white-space:nowrap}
+.webix_inp_counter_next,.webix_inp_counter_prev,.webix_inp_counter_value{border:1px solid #ddd;cursor:pointer;-webkit-appearance:none;width:20px;height:100%;vertical-align:top}
+.webix_inp_counter_value{font-size:15px;width:50px;color:#666;text-align:center;border-left-width:0;border-right-width:0;-webkit-appearance:none;border-radius:0}
+.webix_inp_counter_prev{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;color:#fff;background:#3498db;border-bottom:1px solid #2386c8;-webkit-border-radius:6px 0 0 6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:6px 0 0 6px}
+.webix_inp_counter_next{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;color:#fff;background:#3498db;border-bottom:1px solid #2386c8;-webkit-border-radius:0 6px 6px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px;border-radius:0 6px 6px 0}
+.webix_el_textarea textarea{border:1px solid #ddd;height:100%;margin:0;padding:5px 10px;color:#666;resize:none;font-size:15px}
+.webix_el_textarea .webix_inp_label{padding-top:9.5px}
+.webix_segment_0,.webix_segment_1{height:100%}
+.webix_segment_0{-webkit-border-radius:6px 0 0 6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:6px 0 0 6px}
+.webix_segment_N{height:100%;-webkit-border-radius:0 6px 6px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px;border-radius:0 6px 6px 0}
+.webix_segment_N:first-child{-webkit-border-radius:6px;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px;border-radius:6px}
+.webix_segment_0,.webix_segment_1,.webix_segment_N{-webkit-appearance:none;background:#3498db;color:#fff;font-size:15px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;border-bottom:1px solid #268fd5;outline:0;cursor:pointer;padding:0}
+.webix_segment_0.webix_selected,.webix_segment_1.webix_selected,.webix_segment_N.webix_selected{color:#fff;background:#27ae60;border-color:#27ae60}
+.webix_inp_static{border:1px solid #ddd;background:#fff;overflow:hidden;padding:0 10px;height:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;float:left}
+.webix_inp_static .webix_placeholder{color:#b3b3b3}
+.webix_el_colorpicker,.webix_el_combo,.webix_el_datepicker,.webix_el_richselect,.webix_el_search{font-size:15px}
+.webix_el_colorpicker .webix_el_box,.webix_el_combo .webix_el_box,.webix_el_datepicker .webix_el_box,.webix_el_richselect .webix_el_box,.webix_el_search .webix_el_box{color:#666;position:relative}
+.webix_el_colorpicker .webix_inp_static,.webix_el_colorpicker input,.webix_el_combo .webix_inp_static,.webix_el_combo input,.webix_el_datepicker .webix_inp_static,.webix_el_datepicker input,.webix_el_richselect .webix_inp_static,.webix_el_richselect input,.webix_el_search .webix_inp_static,.webix_el_search input{color:#666;padding-right:24px;background:#fff;font-family:'PT Sans',Tahoma;border-color:#ccc;-webkit-appearance:none}
+.webix_el_colorpicker .webix_input_icon,.webix_el_combo .webix_input_icon,.webix_el_datepicker .webix_input_icon,.webix_el_richselect .webix_input_icon,.webix_el_search .webix_input_icon{right:2px;background:0 0;z-index:1;position:absolute}
+.webix_el_combo .webix_input_icon,.webix_el_richselect .webix_input_icon{padding-left:7px;width:19px}
+.webix_el_colorpicker .webix_input_icon,.webix_el_datepicker .webix_input_icon,.webix_el_search .webix_input_icon{padding-left:5px;width:21px}
+.webix_view button::-moz-focus-inner{padding:0;border:0}
+.webix_el_radio .webix_inp_label{line-height:normal!important;padding-top:6.5px}
+.webix_el_checkbox input,.webix_inp_radio_border input{margin:0;padding:0;float:left}
+.webix_line_break{clear:both}
+.webix_custom_checkbox,.webix_custom_radio{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}
+.webix_radio_option{display:table;float:left;height:32px;margin-right:20px}
+.webix_el_radio .webix_label_right,.webix_inp_radio_border{display:table-cell;vertical-align:middle}
+.webix_invalid .webix_custom_radio,.webix_invalid .webix_el_box .webix_inp_static,.webix_invalid .webix_el_box input,.webix_invalid .webix_el_box select,.webix_invalid .webix_el_box textarea,input.webix_invalid,select.webix_invalid,textarea.webix_invalid{background-color:#fff6f6;border-color:#fea5a8}
+.webix_invalid .webix_inp_bottom_label{font-size:13px;color:#fd595f}
+.webix_el_colorpicker .webix_input_icon{padding-left:0;top:7px;right:8px;width:24px;height:24px;border-radius:6px}
+.webix_el_search .webix_el_box{position:relative}
+.webix_el_search span{position:absolute;right:19px;cursor:pointer;padding-left:7px}
+.webix_view.webix_control>.webix_disabled{filter:alpha(opacity=0);opacity:0}
+.webix_disabled_view.webix_control .webix_image{-webkit-filter:grayscale(100%);filter:grayscale(100%)}
+.webix_view.webix_control .webix_disabled_box .webix_input_icon,.webix_view.webix_control .webix_disabled_box button,.webix_view.webix_control .webix_disabled_box label{color:#aaa}
+.webix_view.webix_control .webix_disabled_box .webix_inp_static,.webix_view.webix_control .webix_disabled_box input,.webix_view.webix_control .webix_disabled_box select,.webix_view.webix_control .webix_disabled_box textarea{color:#aaa;background:#eee}
+.webix_view.webix_control .webix_disabled_box .webix_inp_counter_next,.webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,.webix_view.webix_control .webix_disabled_box .webix_segment_0,.webix_view.webix_control .webix_disabled_box .webix_segment_1,.webix_view.webix_control .webix_disabled_box .webix_segment_N{color:#aaa;background:#e9e9e9;border:1px solid #e9e9e9;text-shadow:none}
+.webix_disabled_top_label{color:#aaa}
+label.webix_required:after{padding-left:4px;content:"*";color:red}
+.webix_multicombo .webix_inp_static{padding:0 3px}
+.webix_el_text .webix_multicombo_input{background-color:transparent;border:0;float:left;vertical-align:middle;padding:0;color:#666;font-size:15px;font-family:'PT Sans',Tahoma;margin-left:7px}
+.webix_el_text .webix_multicombo_input:focus{border:0;box-shadow:none}
+.webix_multicombo_listbox{width:auto;line-height:1;margin:0;padding:0;list-style:none}
+.webix_multicombo_tag,.webix_multicombo_value{padding:0 5px 0 7px;background-color:#f2f2f2;display:inline-block;margin:3px;float:left;border-radius:6px}
+.webix_multicombo_tag{min-width:15px;text-align:center;padding:0 5px}
+.webix_multicombo_delete{margin-left:10px;padding:0 5px;color:#404040;cursor:pointer}
+.webix_multilist .webix_selected{background:#f2f2f2;color:#666}
+.webix_el_tabbar{background:0 0}
+.webix_all_tabs{height:100%;display:table}
+.webix_tab_filler{display:table-cell;background:0 0;font-size:1px;border-bottom:1px solid #ddd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_item_tab:first-child{border-left:1px solid #ddd}
+.webix_item_tab{display:table-cell;text-align:center;vertical-align:middle;overflow:hidden;cursor:pointer;border:1px solid #ddd;border-left-width:0;background:#a4b4bf;color:#fff;-webkit-border-radius:4px 4px 0 0;-moz-border-radius-topleft:4px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:0;border-radius:4px 4px 0 0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webixtype_bottom .webix_item_tab{border-radius:0}
+.webix_item_tab.webix_selected{border-bottom-width:0;background:#3498db;color:#fff;border-color:#3498db}
+.webixtype_bottom .webix_item_tab.webix_selected{border-bottom-width:1px}
+.webix_before_all_tabs{width:100%}
+.webix_after_all_tabs{width:100%;border-left:1px solid #ddd;border-right:1px solid #ddd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_view.webix_control .webix_disabled_box .webix_item_tab{color:#aaa;background:#e9e9e9;border:1px solid #e9e9e9;text-shadow:none}
+.webix_el_tabbar .webixtype_icon .webix_img_btn_top,.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top,.webix_el_tabbar .webixtype_image .webix_img_btn_top{background-position:center 0;position:relative;height:100%}
+.webix_tab_more_icon{cursor:pointer;display:table-cell;overflow:hidden;text-align:center;box-sizing:border-box;vertical-align:middle;padding:0 3px}
+.webix_tab_more_icon .webix_icon{width:100%}
+.webix_tab_list .webix_list_item:last-child{border-bottom:none}
+.webix_icon.webix_tab_close{font-size:12px;float:right;padding:4px;margin-top:-4px}
+.webix_menu .webix_list_item:active,.webix_menu .webix_list_item:focus,.webix_menu .webix_list_item:hover,.webix_menu-x .webix_list_item:active,.webix_menu-x .webix_list_item:focus,.webix_menu-x .webix_list_item:hover{background:rgba(100,100,100,.1)}
+.webix_menu .webix_list_item,.webix_menu-x .webix_list_item{border:none;text-decoration:none;background:#fff;height:34px}
+.webix_menu .webix_list_item .webix_submenu_icon,.webix_menu-x .webix_list_item .webix_submenu_icon{float:right;text-align:right;position:relative;margin-left:4px}
+.webix_menu-x .webix_list_item:first-child{margin-left:0}
+.webix_menu-x .webix_submenu_icon{top:13px}
+.webix_menu-x{border:none;background:0 0}
+.webix_menu-x .webix_list_item{display:inline-block;line-height:30px;border-right:1px solid #fff;border-left:0;background:#3498db;color:#fff;font-size:15px}
+.webix_menu-x .webix_list_item .webix_submenu_icon:before{content:'\f107'}
+.webix_menu-x .webix_list_item .webix_icon_btn{color:#fff;text-align:left}
+.webix_menu-x .webix_list_item:active,.webix_menu-x .webix_list_item:focus,.webix_menu-x .webix_list_item:hover{background-color:#268fd5}
+.webix_menu-x .webix_list_item:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius-topleft:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:4px 0 0 4px}
+.webix_menu-x .webix_list_item:last-child{border-right:none;-webkit-border-radius:0 4px 4px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px;border-radius:0 4px 4px 0}
+.webix_menu{background:#fff;border:1px solid #ddd;border-radius:0}
+.webix_menu .webix_list_item{display:block}
+.webix_menu .webix_context_separator{height:3px;padding:1px 3px 0}
+.webix_menu .webix_context_separator .sep_line{height:1px;border-top:1px solid #ddd}
+.webix_menu .webix_submenu_icon{top:11px}
+.webix_menu .webix_context_spacer{height:34px}
+.webix_menu_link{color:inherit;text-decoration:none;display:block;height:100%}
+.webix_layout_toolbar{color:#fff;font-size:18px;background:#3498db}
+.webix_layout_toolbar .webix_el_button,.webix_layout_toolbar .webix_el_label,.webix_layout_toolbar .webix_inp_label{color:#fff}
+.webix_layout_toolbar .webix_el_label{font-size:18px}
+.webix_layout_toolbar .webix_inp_counter_next,.webix_layout_toolbar .webix_inp_counter_prev,.webix_layout_toolbar .webix_segment_0,.webix_layout_toolbar .webix_segment_1,.webix_layout_toolbar .webix_segment_N,.webix_layout_toolbar .webixtype_base,.webix_layout_toolbar .webixtype_next,.webix_layout_toolbar .webixtype_prev{border-color:#d9d9d9;background-color:transparent;color:#fff}
+.webix_layout_toolbar .webix_el_arrow.webixtype_next_arrow{border-left:none;border-bottom:none}
+.webix_layout_toolbar .webix_el_arrow.webixtype_prev_arrow{border-right:none;border-bottom:none}
+.webix_layout_toolbar .webix_inp_counter_next:hover,.webix_layout_toolbar .webix_inp_counter_prev:hover,.webix_layout_toolbar .webix_segment_0:hover,.webix_layout_toolbar .webix_segment_1:hover,.webix_layout_toolbar .webix_segment_N:hover,.webix_layout_toolbar .webixtype_base:hover{color:#fff;background-color:rgba(0,0,0,.05)}
+.webix_layout_toolbar .webix_inp_counter_next:active,.webix_layout_toolbar .webix_inp_counter_prev:active,.webix_layout_toolbar .webix_segment_0:active,.webix_layout_toolbar .webix_segment_1:active,.webix_layout_toolbar .webix_segment_N:active,.webix_layout_toolbar .webixtype_base:active{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar .webix_inp_counter_next:focus,.webix_layout_toolbar .webix_inp_counter_prev:focus,.webix_layout_toolbar .webix_segment_0:focus,.webix_layout_toolbar .webix_segment_1:focus,.webix_layout_toolbar .webix_segment_N:focus,.webix_layout_toolbar .webixtype_base:focus{background-color:rgba(0,0,0,.07);color:#fff}
+.webix_layout_toolbar .webix_inp_static,.webix_layout_toolbar input[type=text]{border-color:#fff}
+.webix_layout_toolbar .webix_inp_static:focus,.webix_layout_toolbar input[type=text]:focus{border-color:#fff;box-shadow:none}
+.webix_layout_toolbar .webix_input_icon{border-color:#d9d9d9;background-color:transparent;color:#666}
+.webix_layout_toolbar .webix_input_icon:active,.webix_layout_toolbar .webix_input_icon:focus,.webix_layout_toolbar .webix_input_icon:hover{background-color:transparent;color:#666}
+.webix_layout_toolbar .webix_pressed .webix_el_arrow,.webix_layout_toolbar .webix_pressed .webix_inp_counter_next,.webix_layout_toolbar .webix_pressed .webix_inp_counter_prev,.webix_layout_toolbar .webix_pressed .webix_input_icon,.webix_layout_toolbar .webix_pressed .webix_segment_0,.webix_layout_toolbar .webix_pressed .webix_segment_1,.webix_layout_toolbar .webix_pressed .webix_segment_N,.webix_layout_toolbar .webix_pressed .webixtype_base,.webix_layout_toolbar .webix_pressed .webixtype_next,.webix_layout_toolbar .webix_pressed .webixtype_prev{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar .webix_selected.webix_segment_0,.webix_layout_toolbar .webix_selected.webix_segment_1,.webix_layout_toolbar .webix_selected.webix_segment_N{border-color:#d9d9d9;background-color:#27ae60;color:#fff}
+.webix_layout_toolbar .webix_selected.webix_segment_0:hover,.webix_layout_toolbar .webix_selected.webix_segment_1:hover,.webix_layout_toolbar .webix_selected.webix_segment_N:hover{background-color:#24a259}
+.webix_layout_toolbar .webix_selected.webix_segment_0:active,.webix_layout_toolbar .webix_selected.webix_segment_0:focus,.webix_layout_toolbar .webix_selected.webix_segment_1:active,.webix_layout_toolbar .webix_selected.webix_segment_1:focus,.webix_layout_toolbar .webix_selected.webix_segment_N:active,.webix_layout_toolbar .webix_selected.webix_segment_N:focus{background-color:#295}
+.webix_layout_toolbar .webix_segment_1,.webix_layout_toolbar .webix_segment_N,.webix_layout_toolbar .webix_selected.webix_segment_1,.webix_layout_toolbar .webix_selected.webix_segment_N{margin-left:0;border-left:none}
+.webix_layout_toolbar .webix_img_btn:active,.webix_layout_toolbar .webix_img_btn_top:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar .webix_img_btn:focus,.webix_layout_toolbar .webix_img_btn_top:focus{background-color:#2489cc}
+.webix_layout_toolbar .webix_img_btn:hover,.webix_layout_toolbar .webix_img_btn_top:hover{background-color:#268fd5}
+.webix_layout_toolbar .webix_icon_button{border-radius:6px}
+.webix_layout_toolbar .webix_el_icon,.webix_layout_toolbar .webix_icon_btn,.webix_layout_toolbar .webix_icon_button,.webix_layout_toolbar .webix_img_btn,.webix_layout_toolbar .webix_img_btn_abs,.webix_layout_toolbar .webix_img_btn_abs .webix_icon,.webix_layout_toolbar .webix_img_btn_abs .webix_img_btn_text,.webix_layout_toolbar .webix_img_btn_top .webix_icon,.webix_layout_toolbar .webix_img_btn_top .webix_img_btn_text{color:#fff}
+.webix_layout_toolbar .webix_el_box .webix_img_btn_abs:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar .webix_el_icon .webix_icon_button:focus{background-color:rgba(0,0,0,.07)}
+.webix_layout_toolbar .webix_el_box .webix_img_btn_abs:hover,.webix_layout_toolbar .webix_el_icon .webix_icon_button:hover{background-color:rgba(0,0,0,.05)}
+.webix_layout_toolbar .webix_control{border-color:#3498db}
+.webix_layout_toolbar .webix_icon_button .webix_icon{font-size:23px;height:27px;width:27px;color:#fff}
+.webix_layout_toolbar .webix_img_btn,.webix_layout_toolbar .webix_img_btn_top{border-width:0}
+.webix_toolbar.webix_layout_subbar{color:#fff;font-size:18px}
+.webix_toolbar.webix_layout_subbar .webix_el_button,.webix_toolbar.webix_layout_subbar .webix_el_label,.webix_toolbar.webix_layout_subbar .webix_inp_label{color:#fff}
+.webix_toolbar.webix_layout_subbar .webix_el_label{font-size:18px}
+.webix_toolbar.webix_layout_subbar .webix_inp_counter_next,.webix_toolbar.webix_layout_subbar .webix_inp_counter_prev,.webix_toolbar.webix_layout_subbar .webix_segment_0,.webix_toolbar.webix_layout_subbar .webix_segment_1,.webix_toolbar.webix_layout_subbar .webix_segment_N,.webix_toolbar.webix_layout_subbar .webixtype_base,.webix_toolbar.webix_layout_subbar .webixtype_next,.webix_toolbar.webix_layout_subbar .webixtype_prev{border-color:#d9d9d9;background-color:transparent;color:#fff}
+.webix_toolbar.webix_layout_subbar .webix_el_arrow.webixtype_next_arrow{border-left:none;border-bottom:none}
+.webix_toolbar.webix_layout_subbar .webix_el_arrow.webixtype_prev_arrow{border-right:none;border-bottom:none}
+.webix_toolbar.webix_layout_subbar .webix_inp_counter_next:hover,.webix_toolbar.webix_layout_subbar .webix_inp_counter_prev:hover,.webix_toolbar.webix_layout_subbar .webix_segment_0:hover,.webix_toolbar.webix_layout_subbar .webix_segment_1:hover,.webix_toolbar.webix_layout_subbar .webix_segment_N:hover,.webix_toolbar.webix_layout_subbar .webixtype_base:hover{color:#fff;background-color:rgba(0,0,0,.05)}
+.webix_toolbar.webix_layout_subbar .webix_inp_counter_next:active,.webix_toolbar.webix_layout_subbar .webix_inp_counter_prev:active,.webix_toolbar.webix_layout_subbar .webix_segment_0:active,.webix_toolbar.webix_layout_subbar .webix_segment_1:active,.webix_toolbar.webix_layout_subbar .webix_segment_N:active,.webix_toolbar.webix_layout_subbar .webixtype_base:active{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_toolbar.webix_layout_subbar .webix_inp_counter_next:focus,.webix_toolbar.webix_layout_subbar .webix_inp_counter_prev:focus,.webix_toolbar.webix_layout_subbar .webix_segment_0:focus,.webix_toolbar.webix_layout_subbar .webix_segment_1:focus,.webix_toolbar.webix_layout_subbar .webix_segment_N:focus,.webix_toolbar.webix_layout_subbar .webixtype_base:focus{background-color:rgba(0,0,0,.07);color:#fff}
+.webix_toolbar.webix_layout_subbar .webix_inp_static,.webix_toolbar.webix_layout_subbar input[type=text]{border-color:#fff}
+.webix_toolbar.webix_layout_subbar .webix_inp_static:focus,.webix_toolbar.webix_layout_subbar input[type=text]:focus{border-color:#fff;box-shadow:none}
+.webix_toolbar.webix_layout_subbar .webix_input_icon{border-color:#d9d9d9;background-color:transparent;color:#666}
+.webix_toolbar.webix_layout_subbar .webix_input_icon:active,.webix_toolbar.webix_layout_subbar .webix_input_icon:focus,.webix_toolbar.webix_layout_subbar .webix_input_icon:hover{background-color:transparent;color:#666}
+.webix_toolbar.webix_layout_subbar .webix_pressed .webix_el_arrow,.webix_toolbar.webix_layout_subbar .webix_pressed .webix_inp_counter_next,.webix_toolbar.webix_layout_subbar .webix_pressed .webix_inp_counter_prev,.webix_toolbar.webix_layout_subbar .webix_pressed .webix_input_icon,.webix_toolbar.webix_layout_subbar .webix_pressed .webix_segment_0,.webix_toolbar.webix_layout_subbar .webix_pressed .webix_segment_1,.webix_toolbar.webix_layout_subbar .webix_pressed .webix_segment_N,.webix_toolbar.webix_layout_subbar .webix_pressed .webixtype_base,.webix_toolbar.webix_layout_subbar .webix_pressed .webixtype_next,.webix_toolbar.webix_layout_subbar .webix_pressed .webixtype_prev{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_0,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_1,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_N{border-color:#d9d9d9;background-color:#27ae60;color:#fff}
+.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_0:hover,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_1:hover,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_N:hover{background-color:#24a259}
+.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_0:active,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_0:focus,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_1:active,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_1:focus,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_N:active,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_N:focus{background-color:#295}
+.webix_toolbar.webix_layout_subbar .webix_segment_1,.webix_toolbar.webix_layout_subbar .webix_segment_N,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_1,.webix_toolbar.webix_layout_subbar .webix_selected.webix_segment_N{margin-left:0;border-left:none}
+.webix_toolbar.webix_layout_subbar .webix_img_btn:active,.webix_toolbar.webix_layout_subbar .webix_img_btn_top:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_toolbar.webix_layout_subbar .webix_img_btn:focus,.webix_toolbar.webix_layout_subbar .webix_img_btn_top:focus{background-color:#2489cc}
+.webix_toolbar.webix_layout_subbar .webix_img_btn:hover,.webix_toolbar.webix_layout_subbar .webix_img_btn_top:hover{background-color:#268fd5}
+.webix_toolbar.webix_layout_subbar .webix_icon_button{border-radius:6px}
+.webix_toolbar.webix_layout_subbar .webix_el_icon,.webix_toolbar.webix_layout_subbar .webix_icon_btn,.webix_toolbar.webix_layout_subbar .webix_icon_button,.webix_toolbar.webix_layout_subbar .webix_img_btn,.webix_toolbar.webix_layout_subbar .webix_img_btn_abs,.webix_toolbar.webix_layout_subbar .webix_img_btn_abs .webix_icon,.webix_toolbar.webix_layout_subbar .webix_img_btn_abs .webix_img_btn_text,.webix_toolbar.webix_layout_subbar .webix_img_btn_top .webix_icon,.webix_toolbar.webix_layout_subbar .webix_img_btn_top .webix_img_btn_text{color:#fff}
+.webix_toolbar.webix_layout_subbar .webix_el_box .webix_img_btn_abs:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_toolbar.webix_layout_subbar .webix_el_icon .webix_icon_button:focus{background-color:rgba(0,0,0,.07)}
+.webix_toolbar.webix_layout_subbar .webix_el_box .webix_img_btn_abs:hover,.webix_toolbar.webix_layout_subbar .webix_el_icon .webix_icon_button:hover{background-color:rgba(0,0,0,.05)}
+.webix_toolbar.webix_layout_subbar .webix_control{border-color:#3498db}
+.webix_toolbar.webix_layout_subbar .webix_icon_button .webix_icon{font-size:23px;height:27px;width:27px;color:#fff}
+.webix_toolbar.webix_layout_subbar .webix_img_btn,.webix_toolbar.webix_layout_subbar .webix_img_btn_top{border-width:0}
+.webix_toolbar .webix_layout_clean,.webix_toolbar .webix_layout_line,.webix_toolbar .webix_layout_toolbar{background:0 0}
+.webix_el_button .webix_hidden_upload,.webix_hidden_upload{height:1px;width:1px;border:0!important;font-size:1px;position:absolute;top:0;left:0;z-index:-1}
+.webix_upload_client,.webix_upload_error,.webix_upload_server{width:60px;text-align:center;float:right}
+.cancel_icon,.error_icon{display:inline-block;background-repeat:no-repeat}
+.error_icon{width:18px;height:16px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFMDdENjlDNjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFMDdENjlENjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkUwN0Q2OUE2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkUwN0Q2OUI2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ZJnE7AAABdklEQVR42mK80aLPgAcwA/EcIOYB4mgg/oWuQL36AphmYcAPYvl5WBOYmBgY3n/6fQTIn4hLIRMeQ0CuaBHgY2EQ4GMF8euAWIgcg6qF+NmkOdiZGdhYmRiEBdhAhrSQapAKEBcJC7DCBUQE2UBUGhAbkGLQBDEhdjYmJkaGtHVMDD4LmBk+/2RgEBdhBwX+ZGINcuLiZPYW5Ie45tknRrAhIFqAl5WBh4vFBijsR8ggkI29IA0wwMsOo/+DaWjA9wIxGz6D0oAKDXi5EalCkvc/2DApPgifm5OZQZCPFRyGuAwCxwqya0AAZADMVTAgyA92TDUQS2MzqAUUxcAgRjPoP9hVyICVhREUi6B01g4TY4RmES0gvqSuyMPMQAK4ef/LXyBlAswmF2DWd4kJs2M1pGgLIvrRAXJyAIWqNzcXi7cgHysDqQAUnt9//LW52WoQBfLaDRlxDnWgYQzkAKBBDI+ef38E0n3nycsf6gyUgUcAAQYA9DZJKVXGocQAAAAASUVORK5CYII=)}
+.webix_upload_server{color:green}
+.webix_remove_upload{float:right}
+.cancel_icon{margin-top:8px;width:14px;height:14px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAsElEQVR4XoVQUQbDQBScAywIuUcpKCWglBJCDlBKf0vpbymhd5mDhIDcoAcoJQSEsn2G5KmWzMDsPG92ZyGAgVfWfBtrUwEOZnwwOu2UjaPCbScLAEzYmzxyxafMgaUlRXMTsJJ1B7jgy0Y7gHt5FdgyimeAS+a6ZpDTQkLkCQbmk9OBHaPv+p6x99jLFFuOsTMPSlXl8FVlrSopFBP/sIQAbn6+bwsHA29sNGhMBQgf1cri4JYEbDkAAAAASUVORK5CYII=)}
+.webix_upload_flash{width:100%;height:100%;position:absolute;bottom:0;left:0;background:#fff;filter:alpha(opacity=0)}
+.webix_drop_file{background:#f4f4f4;position:relative}
+.webix_drop_file::before{position:absolute;bottom:10px;left:0;width:100%;text-align:center;pointer-events:none}
+.webix_fieldset fieldset{border:1px solid #c4c4c4;margin:0;padding:5px 8px}
+.webix_fieldset legend{color:#666;font-size:12px}
+.webix_forminput fieldset{border:none;margin:0;padding:0}
+.webix_forminput legend{color:#666;line-height:32px;padding:3px 7.5px 3px 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:'PT Sans',Tahoma;float:left}
+.webix_slider_box{position:relative;padding:15px 10px 0;height:100%;float:left;border-radius:5px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_slider_box .webix_slider_left{float:left;width:100px;-webkit-border-radius:5px 0 0 5px;-moz-border-radius-topleft:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:5px 0 0 5px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_slider_box .webix_slider_right{float:left;width:100px;background:#fff;-webkit-border-radius:0 5px 5px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:5px;border-radius:0 5px 5px 0;border:1px solid #eaeaea;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_slider_box .webix_slider_handle{z-index:1;position:absolute;top:9px;border-radius:8px}
+.webix_slider_box .webix_slider_left{height:6px;border:1px solid #ccc;background:#3498db}
+.webix_slider_box .webix_slider_right{height:6px;border-color:#ccc}
+.webix_slider_box .webix_slider_handle{width:16px;height:16px;border:1px solid #ccc;background-color:#fff}
+.webix_rangeslider .webix_slider_box .webix_slider_left{position:absolute}
+.webix_rangeslider .webix_slider_box .webix_slider_active{z-index:1}
+.webix_rangeslider .webix_slider_box .webix_slider_right{border-radius:5px}
+.webix_slider_alt .webix_slider_box .webix_slider_left,.webix_slider_alt .webix_slider_box .webix_slider_right{border:1px solid #e1e1e1}
+.webix_slider_alt .webix_slider_box .webix_slider_handle{width:11px;margin:0 2px;height:20px;top:6.5px;border-radius:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==);background-repeat:no-repeat;background-position:3px center}
+.webix_slider_alt .webix_slider_box .webix_slider_left{border:1px solid #ccc;background:#3498db}
+.webix_slider_alt .webix_slider_box .webix_slider_right{border-color:#ccc}
+.webix_slider_alt .webix_slider_box .webix_slider_handle{background-color:#fff;border:1px solid #ccc}
+.webix_slider_title{margin-bottom:-11px;text-align:center}
+.webix_progress_bottom,.webix_progress_top{width:100%;position:absolute;top:0;left:0;height:6px;overflow:hidden;z-index:20;background:#f2f2f2}
+.webix_progress_bottom{bottom:0;top:auto;height:17px}
+.webix_progress_bottom .webix_progress_state,.webix_progress_top .webix_progress_state{width:0;height:6px;background:#27ae60;-moz-transition:width 3s;transition:width 3s}
+.webix_progress_bottom .webix_progress_state{height:17px}
+.webix_progress_icon{width:100%;height:100%;position:absolute;top:0;left:0;z-index:20}
+.webix_progress_icon .webix_progress_state{font-family:FontAwesome;font-size:50px;position:absolute;left:50%;top:50%;margin-left:-25px;margin-top:-25px;display:inline-block;color:#b3b3b3}
+.webix_gage{height:100%;width:100%;transform:rotate(180deg)}
+.webix_gage_label{font-size:.9em;text-align:center;margin-top:10px}
+.webix_gage_placeholder{margin-top:-20px}
+.webix_gage_info{text-align:center;font-size:.7em;position:relative;margin:0 auto 10px}
+.webix_gage_min_range{left:-74px}
+.webix_gage_max_range{right:-74px}
+.webix_gage_max_range,.webix_gage_min_range{display:inline-block;margin-top:20px;position:absolute;text-align:center;width:150px}
+.webix_gage_range_info{font-size:1.2em;line-height:1}
+.webix_gage-value{font-size:2.2em;color:#404040}
+.webix_gage_gradient_point_animated{transition:transform 1.3s linear}
+.webix_gage_animated{stroke:#0f0;animation:gage_dash 1.3s linear forwards;transition:stroke 1.3s linear,stroke-dasharray 1.3s linear}
+.webix_gage_animated_first_load{stroke:#0f0;animation:gage_dash 1.3s linear forwards;transition:stroke 1.3s linear}
+@keyframes gage_dash{to{stroke-dashoffset:0}}
+.webix_bullet_name{width:100}
+.webix_bullet_header{font-weight:700;font-size:15px}
+.webix_bullet_subheader{font-size:15px}
+.webix_bullet_scale{font-size:12px;font-weight:700}
+.webix_organogram canvas{position:absolute}
+.webix_organogram_item{position:absolute;z-index:1;text-align:center;border-radius:4px;background-color:#e3f2fd;border:1px solid #bbdefb;padding:7px 7px 10px;box-sizing:border-box}
+.webix_organogram_item.webix_selected{background-color:#27ae60;border-color:#27ae60}
+.webix_organogram_list{border-radius:4px;position:absolute;z-index:1;height:auto;border:1px solid #ddd;box-sizing:border-box}
+.webix_organogram_list .webix_organogram_list_item{border:none;text-align:left;position:static;padding:5px;border-radius:0;box-sizing:border-box}
+/*!
+ * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?v=4.7.0);src:url(fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fonts/fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(fonts/fontawesome-webfont.woff?v=4.7.0) format('woff'),url(fonts/fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}
+.fa,.webix_icon,.webix_icon_btn,.webix_input_icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}
+.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}
+.fa-2x{font-size:2em}
+.fa-3x{font-size:3em}
+.fa-4x{font-size:4em}
+.fa-5x{font-size:5em}
+.fa-fw{width:1.28571429em;text-align:center}
+.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}
+.fa-ul>li{position:relative}
+.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}
+.fa-li.fa-lg{left:-1.85714286em}
+.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}
+.fa-pull-left{float:left}
+.fa-pull-right{float:right}
+.fa.fa-pull-left{margin-right:.3em}
+.fa.fa-pull-right{margin-left:.3em}
+.pull-right{float:right}
+.pull-left{float:left}
+.fa.pull-left{margin-right:.3em}
+.fa.pull-right{margin-left:.3em}
+.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}
+.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}
+@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}
+100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}
+100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}
+.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}
+.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}
+.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}
+.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}
+:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}
+.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}
+.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}
+.fa-stack-1x{line-height:inherit}
+.fa-stack-2x{font-size:2em}
+.fa-inverse{color:#fff}
+.fa-glass:before{content:"\f000"}
+.fa-music:before{content:"\f001"}
+.fa-search:before{content:"\f002"}
+.fa-envelope-o:before{content:"\f003"}
+.fa-heart:before{content:"\f004"}
+.fa-star:before{content:"\f005"}
+.fa-star-o:before{content:"\f006"}
+.fa-user:before{content:"\f007"}
+.fa-film:before{content:"\f008"}
+.fa-th-large:before{content:"\f009"}
+.fa-th:before{content:"\f00a"}
+.fa-th-list:before{content:"\f00b"}
+.fa-check:before{content:"\f00c"}
+.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}
+.fa-search-plus:before{content:"\f00e"}
+.fa-search-minus:before{content:"\f010"}
+.fa-power-off:before{content:"\f011"}
+.fa-signal:before{content:"\f012"}
+.fa-cog:before,.fa-gear:before{content:"\f013"}
+.fa-trash-o:before{content:"\f014"}
+.fa-home:before{content:"\f015"}
+.fa-file-o:before{content:"\f016"}
+.fa-clock-o:before{content:"\f017"}
+.fa-road:before{content:"\f018"}
+.fa-download:before{content:"\f019"}
+.fa-arrow-circle-o-down:before{content:"\f01a"}
+.fa-arrow-circle-o-up:before{content:"\f01b"}
+.fa-inbox:before{content:"\f01c"}
+.fa-play-circle-o:before{content:"\f01d"}
+.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}
+.fa-refresh:before{content:"\f021"}
+.fa-list-alt:before{content:"\f022"}
+.fa-lock:before{content:"\f023"}
+.fa-flag:before{content:"\f024"}
+.fa-headphones:before{content:"\f025"}
+.fa-volume-off:before{content:"\f026"}
+.fa-volume-down:before{content:"\f027"}
+.fa-volume-up:before{content:"\f028"}
+.fa-qrcode:before{content:"\f029"}
+.fa-barcode:before{content:"\f02a"}
+.fa-tag:before{content:"\f02b"}
+.fa-tags:before{content:"\f02c"}
+.fa-book:before{content:"\f02d"}
+.fa-bookmark:before{content:"\f02e"}
+.fa-print:before{content:"\f02f"}
+.fa-camera:before{content:"\f030"}
+.fa-font:before{content:"\f031"}
+.fa-bold:before{content:"\f032"}
+.fa-italic:before{content:"\f033"}
+.fa-text-height:before{content:"\f034"}
+.fa-text-width:before{content:"\f035"}
+.fa-align-left:before{content:"\f036"}
+.fa-align-center:before{content:"\f037"}
+.fa-align-right:before{content:"\f038"}
+.fa-align-justify:before{content:"\f039"}
+.fa-list:before{content:"\f03a"}
+.fa-dedent:before,.fa-outdent:before{content:"\f03b"}
+.fa-indent:before{content:"\f03c"}
+.fa-video-camera:before{content:"\f03d"}
+.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}
+.fa-pencil:before{content:"\f040"}
+.fa-map-marker:before{content:"\f041"}
+.fa-adjust:before{content:"\f042"}
+.fa-tint:before{content:"\f043"}
+.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}
+.fa-share-square-o:before{content:"\f045"}
+.fa-check-square-o:before{content:"\f046"}
+.fa-arrows:before{content:"\f047"}
+.fa-step-backward:before{content:"\f048"}
+.fa-fast-backward:before{content:"\f049"}
+.fa-backward:before{content:"\f04a"}
+.fa-play:before{content:"\f04b"}
+.fa-pause:before{content:"\f04c"}
+.fa-stop:before{content:"\f04d"}
+.fa-forward:before{content:"\f04e"}
+.fa-fast-forward:before{content:"\f050"}
+.fa-step-forward:before{content:"\f051"}
+.fa-eject:before{content:"\f052"}
+.fa-chevron-left:before{content:"\f053"}
+.fa-chevron-right:before{content:"\f054"}
+.fa-plus-circle:before{content:"\f055"}
+.fa-minus-circle:before{content:"\f056"}
+.fa-times-circle:before{content:"\f057"}
+.fa-check-circle:before{content:"\f058"}
+.fa-question-circle:before{content:"\f059"}
+.fa-info-circle:before{content:"\f05a"}
+.fa-crosshairs:before{content:"\f05b"}
+.fa-times-circle-o:before{content:"\f05c"}
+.fa-check-circle-o:before{content:"\f05d"}
+.fa-ban:before{content:"\f05e"}
+.fa-arrow-left:before{content:"\f060"}
+.fa-arrow-right:before{content:"\f061"}
+.fa-arrow-up:before{content:"\f062"}
+.fa-arrow-down:before{content:"\f063"}
+.fa-mail-forward:before,.fa-share:before{content:"\f064"}
+.fa-expand:before{content:"\f065"}
+.fa-compress:before{content:"\f066"}
+.fa-plus:before{content:"\f067"}
+.fa-minus:before{content:"\f068"}
+.fa-asterisk:before{content:"\f069"}
+.fa-exclamation-circle:before{content:"\f06a"}
+.fa-gift:before{content:"\f06b"}
+.fa-leaf:before{content:"\f06c"}
+.fa-fire:before{content:"\f06d"}
+.fa-eye:before{content:"\f06e"}
+.fa-eye-slash:before{content:"\f070"}
+.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}
+.fa-plane:before{content:"\f072"}
+.fa-calendar:before{content:"\f073"}
+.fa-random:before{content:"\f074"}
+.fa-comment:before{content:"\f075"}
+.fa-magnet:before{content:"\f076"}
+.fa-chevron-up:before{content:"\f077"}
+.fa-chevron-down:before{content:"\f078"}
+.fa-retweet:before{content:"\f079"}
+.fa-shopping-cart:before{content:"\f07a"}
+.fa-folder:before{content:"\f07b"}
+.fa-folder-open:before{content:"\f07c"}
+.fa-arrows-v:before{content:"\f07d"}
+.fa-arrows-h:before{content:"\f07e"}
+.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}
+.fa-twitter-square:before{content:"\f081"}
+.fa-facebook-square:before{content:"\f082"}
+.fa-camera-retro:before{content:"\f083"}
+.fa-key:before{content:"\f084"}
+.fa-cogs:before,.fa-gears:before{content:"\f085"}
+.fa-comments:before{content:"\f086"}
+.fa-thumbs-o-up:before{content:"\f087"}
+.fa-thumbs-o-down:before{content:"\f088"}
+.fa-star-half:before{content:"\f089"}
+.fa-heart-o:before{content:"\f08a"}
+.fa-sign-out:before{content:"\f08b"}
+.fa-linkedin-square:before{content:"\f08c"}
+.fa-thumb-tack:before{content:"\f08d"}
+.fa-external-link:before{content:"\f08e"}
+.fa-sign-in:before{content:"\f090"}
+.fa-trophy:before{content:"\f091"}
+.fa-github-square:before{content:"\f092"}
+.fa-upload:before{content:"\f093"}
+.fa-lemon-o:before{content:"\f094"}
+.fa-phone:before{content:"\f095"}
+.fa-square-o:before{content:"\f096"}
+.fa-bookmark-o:before{content:"\f097"}
+.fa-phone-square:before{content:"\f098"}
+.fa-twitter:before{content:"\f099"}
+.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}
+.fa-github:before{content:"\f09b"}
+.fa-unlock:before{content:"\f09c"}
+.fa-credit-card:before{content:"\f09d"}
+.fa-feed:before,.fa-rss:before{content:"\f09e"}
+.fa-hdd-o:before{content:"\f0a0"}
+.fa-bullhorn:before{content:"\f0a1"}
+.fa-bell:before{content:"\f0f3"}
+.fa-certificate:before{content:"\f0a3"}
+.fa-hand-o-right:before{content:"\f0a4"}
+.fa-hand-o-left:before{content:"\f0a5"}
+.fa-hand-o-up:before{content:"\f0a6"}
+.fa-hand-o-down:before{content:"\f0a7"}
+.fa-arrow-circle-left:before{content:"\f0a8"}
+.fa-arrow-circle-right:before{content:"\f0a9"}
+.fa-arrow-circle-up:before{content:"\f0aa"}
+.fa-arrow-circle-down:before{content:"\f0ab"}
+.fa-globe:before{content:"\f0ac"}
+.fa-wrench:before{content:"\f0ad"}
+.fa-tasks:before{content:"\f0ae"}
+.fa-filter:before{content:"\f0b0"}
+.fa-briefcase:before{content:"\f0b1"}
+.fa-arrows-alt:before{content:"\f0b2"}
+.fa-group:before,.fa-users:before{content:"\f0c0"}
+.fa-chain:before,.fa-link:before{content:"\f0c1"}
+.fa-cloud:before{content:"\f0c2"}
+.fa-flask:before{content:"\f0c3"}
+.fa-cut:before,.fa-scissors:before{content:"\f0c4"}
+.fa-copy:before,.fa-files-o:before{content:"\f0c5"}
+.fa-paperclip:before{content:"\f0c6"}
+.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}
+.fa-square:before{content:"\f0c8"}
+.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}
+.fa-list-ul:before{content:"\f0ca"}
+.fa-list-ol:before{content:"\f0cb"}
+.fa-strikethrough:before{content:"\f0cc"}
+.fa-underline:before{content:"\f0cd"}
+.fa-table:before{content:"\f0ce"}
+.fa-magic:before{content:"\f0d0"}
+.fa-truck:before{content:"\f0d1"}
+.fa-pinterest:before{content:"\f0d2"}
+.fa-pinterest-square:before{content:"\f0d3"}
+.fa-google-plus-square:before{content:"\f0d4"}
+.fa-google-plus:before{content:"\f0d5"}
+.fa-money:before{content:"\f0d6"}
+.fa-caret-down:before{content:"\f0d7"}
+.fa-caret-up:before{content:"\f0d8"}
+.fa-caret-left:before{content:"\f0d9"}
+.fa-caret-right:before{content:"\f0da"}
+.fa-columns:before{content:"\f0db"}
+.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}
+.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}
+.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}
+.fa-envelope:before{content:"\f0e0"}
+.fa-linkedin:before{content:"\f0e1"}
+.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}
+.fa-gavel:before,.fa-legal:before{content:"\f0e3"}
+.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}
+.fa-comment-o:before{content:"\f0e5"}
+.fa-comments-o:before{content:"\f0e6"}
+.fa-bolt:before,.fa-flash:before{content:"\f0e7"}
+.fa-sitemap:before{content:"\f0e8"}
+.fa-umbrella:before{content:"\f0e9"}
+.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}
+.fa-lightbulb-o:before{content:"\f0eb"}
+.fa-exchange:before{content:"\f0ec"}
+.fa-cloud-download:before{content:"\f0ed"}
+.fa-cloud-upload:before{content:"\f0ee"}
+.fa-user-md:before{content:"\f0f0"}
+.fa-stethoscope:before{content:"\f0f1"}
+.fa-suitcase:before{content:"\f0f2"}
+.fa-bell-o:before{content:"\f0a2"}
+.fa-coffee:before{content:"\f0f4"}
+.fa-cutlery:before{content:"\f0f5"}
+.fa-file-text-o:before{content:"\f0f6"}
+.fa-building-o:before{content:"\f0f7"}
+.fa-hospital-o:before{content:"\f0f8"}
+.fa-ambulance:before{content:"\f0f9"}
+.fa-medkit:before{content:"\f0fa"}
+.fa-fighter-jet:before{content:"\f0fb"}
+.fa-beer:before{content:"\f0fc"}
+.fa-h-square:before{content:"\f0fd"}
+.fa-plus-square:before{content:"\f0fe"}
+.fa-angle-double-left:before{content:"\f100"}
+.fa-angle-double-right:before{content:"\f101"}
+.fa-angle-double-up:before{content:"\f102"}
+.fa-angle-double-down:before{content:"\f103"}
+.fa-angle-left:before{content:"\f104"}
+.fa-angle-right:before{content:"\f105"}
+.fa-angle-up:before{content:"\f106"}
+.fa-angle-down:before{content:"\f107"}
+.fa-desktop:before{content:"\f108"}
+.fa-laptop:before{content:"\f109"}
+.fa-tablet:before{content:"\f10a"}
+.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}
+.fa-circle-o:before{content:"\f10c"}
+.fa-quote-left:before{content:"\f10d"}
+.fa-quote-right:before{content:"\f10e"}
+.fa-spinner:before{content:"\f110"}
+.fa-circle:before{content:"\f111"}
+.fa-mail-reply:before,.fa-reply:before{content:"\f112"}
+.fa-github-alt:before{content:"\f113"}
+.fa-folder-o:before{content:"\f114"}
+.fa-folder-open-o:before{content:"\f115"}
+.fa-smile-o:before{content:"\f118"}
+.fa-frown-o:before{content:"\f119"}
+.fa-meh-o:before{content:"\f11a"}
+.fa-gamepad:before{content:"\f11b"}
+.fa-keyboard-o:before{content:"\f11c"}
+.fa-flag-o:before{content:"\f11d"}
+.fa-flag-checkered:before{content:"\f11e"}
+.fa-terminal:before{content:"\f120"}
+.fa-code:before{content:"\f121"}
+.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}
+.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}
+.fa-location-arrow:before{content:"\f124"}
+.fa-crop:before{content:"\f125"}
+.fa-code-fork:before{content:"\f126"}
+.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}
+.fa-question:before{content:"\f128"}
+.fa-info:before{content:"\f129"}
+.fa-exclamation:before{content:"\f12a"}
+.fa-superscript:before{content:"\f12b"}
+.fa-subscript:before{content:"\f12c"}
+.fa-eraser:before{content:"\f12d"}
+.fa-puzzle-piece:before{content:"\f12e"}
+.fa-microphone:before{content:"\f130"}
+.fa-microphone-slash:before{content:"\f131"}
+.fa-shield:before{content:"\f132"}
+.fa-calendar-o:before{content:"\f133"}
+.fa-fire-extinguisher:before{content:"\f134"}
+.fa-rocket:before{content:"\f135"}
+.fa-maxcdn:before{content:"\f136"}
+.fa-chevron-circle-left:before{content:"\f137"}
+.fa-chevron-circle-right:before{content:"\f138"}
+.fa-chevron-circle-up:before{content:"\f139"}
+.fa-chevron-circle-down:before{content:"\f13a"}
+.fa-html5:before{content:"\f13b"}
+.fa-css3:before{content:"\f13c"}
+.fa-anchor:before{content:"\f13d"}
+.fa-unlock-alt:before{content:"\f13e"}
+.fa-bullseye:before{content:"\f140"}
+.fa-ellipsis-h:before{content:"\f141"}
+.fa-ellipsis-v:before{content:"\f142"}
+.fa-rss-square:before{content:"\f143"}
+.fa-play-circle:before{content:"\f144"}
+.fa-ticket:before{content:"\f145"}
+.fa-minus-square:before{content:"\f146"}
+.fa-minus-square-o:before{content:"\f147"}
+.fa-level-up:before{content:"\f148"}
+.fa-level-down:before{content:"\f149"}
+.fa-check-square:before{content:"\f14a"}
+.fa-pencil-square:before{content:"\f14b"}
+.fa-external-link-square:before{content:"\f14c"}
+.fa-share-square:before{content:"\f14d"}
+.fa-compass:before{content:"\f14e"}
+.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}
+.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}
+.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}
+.fa-eur:before,.fa-euro:before{content:"\f153"}
+.fa-gbp:before{content:"\f154"}
+.fa-dollar:before,.fa-usd:before{content:"\f155"}
+.fa-inr:before,.fa-rupee:before{content:"\f156"}
+.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}
+.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}
+.fa-krw:before,.fa-won:before{content:"\f159"}
+.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}
+.fa-file:before{content:"\f15b"}
+.fa-file-text:before{content:"\f15c"}
+.fa-sort-alpha-asc:before{content:"\f15d"}
+.fa-sort-alpha-desc:before{content:"\f15e"}
+.fa-sort-amount-asc:before{content:"\f160"}
+.fa-sort-amount-desc:before{content:"\f161"}
+.fa-sort-numeric-asc:before{content:"\f162"}
+.fa-sort-numeric-desc:before{content:"\f163"}
+.fa-thumbs-up:before{content:"\f164"}
+.fa-thumbs-down:before{content:"\f165"}
+.fa-youtube-square:before{content:"\f166"}
+.fa-youtube:before{content:"\f167"}
+.fa-xing:before{content:"\f168"}
+.fa-xing-square:before{content:"\f169"}
+.fa-youtube-play:before{content:"\f16a"}
+.fa-dropbox:before{content:"\f16b"}
+.fa-stack-overflow:before{content:"\f16c"}
+.fa-instagram:before{content:"\f16d"}
+.fa-flickr:before{content:"\f16e"}
+.fa-adn:before{content:"\f170"}
+.fa-bitbucket:before{content:"\f171"}
+.fa-bitbucket-square:before{content:"\f172"}
+.fa-tumblr:before{content:"\f173"}
+.fa-tumblr-square:before{content:"\f174"}
+.fa-long-arrow-down:before{content:"\f175"}
+.fa-long-arrow-up:before{content:"\f176"}
+.fa-long-arrow-left:before{content:"\f177"}
+.fa-long-arrow-right:before{content:"\f178"}
+.fa-apple:before{content:"\f179"}
+.fa-windows:before{content:"\f17a"}
+.fa-android:before{content:"\f17b"}
+.fa-linux:before{content:"\f17c"}
+.fa-dribbble:before{content:"\f17d"}
+.fa-skype:before{content:"\f17e"}
+.fa-foursquare:before{content:"\f180"}
+.fa-trello:before{content:"\f181"}
+.fa-female:before{content:"\f182"}
+.fa-male:before{content:"\f183"}
+.fa-gittip:before,.fa-gratipay:before{content:"\f184"}
+.fa-sun-o:before{content:"\f185"}
+.fa-moon-o:before{content:"\f186"}
+.fa-archive:before{content:"\f187"}
+.fa-bug:before{content:"\f188"}
+.fa-vk:before{content:"\f189"}
+.fa-weibo:before{content:"\f18a"}
+.fa-renren:before{content:"\f18b"}
+.fa-pagelines:before{content:"\f18c"}
+.fa-stack-exchange:before{content:"\f18d"}
+.fa-arrow-circle-o-right:before{content:"\f18e"}
+.fa-arrow-circle-o-left:before{content:"\f190"}
+.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}
+.fa-dot-circle-o:before{content:"\f192"}
+.fa-wheelchair:before{content:"\f193"}
+.fa-vimeo-square:before{content:"\f194"}
+.fa-try:before,.fa-turkish-lira:before{content:"\f195"}
+.fa-plus-square-o:before{content:"\f196"}
+.fa-space-shuttle:before{content:"\f197"}
+.fa-slack:before{content:"\f198"}
+.fa-envelope-square:before{content:"\f199"}
+.fa-wordpress:before{content:"\f19a"}
+.fa-openid:before{content:"\f19b"}
+.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}
+.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}
+.fa-yahoo:before{content:"\f19e"}
+.fa-google:before{content:"\f1a0"}
+.fa-reddit:before{content:"\f1a1"}
+.fa-reddit-square:before{content:"\f1a2"}
+.fa-stumbleupon-circle:before{content:"\f1a3"}
+.fa-stumbleupon:before{content:"\f1a4"}
+.fa-delicious:before{content:"\f1a5"}
+.fa-digg:before{content:"\f1a6"}
+.fa-pied-piper-pp:before{content:"\f1a7"}
+.fa-pied-piper-alt:before{content:"\f1a8"}
+.fa-drupal:before{content:"\f1a9"}
+.fa-joomla:before{content:"\f1aa"}
+.fa-language:before{content:"\f1ab"}
+.fa-fax:before{content:"\f1ac"}
+.fa-building:before{content:"\f1ad"}
+.fa-child:before{content:"\f1ae"}
+.fa-paw:before{content:"\f1b0"}
+.fa-spoon:before{content:"\f1b1"}
+.fa-cube:before{content:"\f1b2"}
+.fa-cubes:before{content:"\f1b3"}
+.fa-behance:before{content:"\f1b4"}
+.fa-behance-square:before{content:"\f1b5"}
+.fa-steam:before{content:"\f1b6"}
+.fa-steam-square:before{content:"\f1b7"}
+.fa-recycle:before{content:"\f1b8"}
+.fa-automobile:before,.fa-car:before{content:"\f1b9"}
+.fa-cab:before,.fa-taxi:before{content:"\f1ba"}
+.fa-tree:before{content:"\f1bb"}
+.fa-spotify:before{content:"\f1bc"}
+.fa-deviantart:before{content:"\f1bd"}
+.fa-soundcloud:before{content:"\f1be"}
+.fa-database:before{content:"\f1c0"}
+.fa-file-pdf-o:before{content:"\f1c1"}
+.fa-file-word-o:before{content:"\f1c2"}
+.fa-file-excel-o:before{content:"\f1c3"}
+.fa-file-powerpoint-o:before{content:"\f1c4"}
+.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}
+.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}
+.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}
+.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}
+.fa-file-code-o:before{content:"\f1c9"}
+.fa-vine:before{content:"\f1ca"}
+.fa-codepen:before{content:"\f1cb"}
+.fa-jsfiddle:before{content:"\f1cc"}
+.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}
+.fa-circle-o-notch:before{content:"\f1ce"}
+.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}
+.fa-empire:before,.fa-ge:before{content:"\f1d1"}
+.fa-git-square:before{content:"\f1d2"}
+.fa-git:before{content:"\f1d3"}
+.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}
+.fa-tencent-weibo:before{content:"\f1d5"}
+.fa-qq:before{content:"\f1d6"}
+.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}
+.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}
+.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}
+.fa-history:before{content:"\f1da"}
+.fa-circle-thin:before{content:"\f1db"}
+.fa-header:before{content:"\f1dc"}
+.fa-paragraph:before{content:"\f1dd"}
+.fa-sliders:before{content:"\f1de"}
+.fa-share-alt:before{content:"\f1e0"}
+.fa-share-alt-square:before{content:"\f1e1"}
+.fa-bomb:before{content:"\f1e2"}
+.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}
+.fa-tty:before{content:"\f1e4"}
+.fa-binoculars:before{content:"\f1e5"}
+.fa-plug:before{content:"\f1e6"}
+.fa-slideshare:before{content:"\f1e7"}
+.fa-twitch:before{content:"\f1e8"}
+.fa-yelp:before{content:"\f1e9"}
+.fa-newspaper-o:before{content:"\f1ea"}
+.fa-wifi:before{content:"\f1eb"}
+.fa-calculator:before{content:"\f1ec"}
+.fa-paypal:before{content:"\f1ed"}
+.fa-google-wallet:before{content:"\f1ee"}
+.fa-cc-visa:before{content:"\f1f0"}
+.fa-cc-mastercard:before{content:"\f1f1"}
+.fa-cc-discover:before{content:"\f1f2"}
+.fa-cc-amex:before{content:"\f1f3"}
+.fa-cc-paypal:before{content:"\f1f4"}
+.fa-cc-stripe:before{content:"\f1f5"}
+.fa-bell-slash:before{content:"\f1f6"}
+.fa-bell-slash-o:before{content:"\f1f7"}
+.fa-trash:before{content:"\f1f8"}
+.fa-copyright:before{content:"\f1f9"}
+.fa-at:before{content:"\f1fa"}
+.fa-eyedropper:before{content:"\f1fb"}
+.fa-paint-brush:before{content:"\f1fc"}
+.fa-birthday-cake:before{content:"\f1fd"}
+.fa-area-chart:before{content:"\f1fe"}
+.fa-pie-chart:before{content:"\f200"}
+.fa-line-chart:before{content:"\f201"}
+.fa-lastfm:before{content:"\f202"}
+.fa-lastfm-square:before{content:"\f203"}
+.fa-toggle-off:before{content:"\f204"}
+.fa-toggle-on:before{content:"\f205"}
+.fa-bicycle:before{content:"\f206"}
+.fa-bus:before{content:"\f207"}
+.fa-ioxhost:before{content:"\f208"}
+.fa-angellist:before{content:"\f209"}
+.fa-cc:before{content:"\f20a"}
+.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}
+.fa-meanpath:before{content:"\f20c"}
+.fa-buysellads:before{content:"\f20d"}
+.fa-connectdevelop:before{content:"\f20e"}
+.fa-dashcube:before{content:"\f210"}
+.fa-forumbee:before{content:"\f211"}
+.fa-leanpub:before{content:"\f212"}
+.fa-sellsy:before{content:"\f213"}
+.fa-shirtsinbulk:before{content:"\f214"}
+.fa-simplybuilt:before{content:"\f215"}
+.fa-skyatlas:before{content:"\f216"}
+.fa-cart-plus:before{content:"\f217"}
+.fa-cart-arrow-down:before{content:"\f218"}
+.fa-diamond:before{content:"\f219"}
+.fa-ship:before{content:"\f21a"}
+.fa-user-secret:before{content:"\f21b"}
+.fa-motorcycle:before{content:"\f21c"}
+.fa-street-view:before{content:"\f21d"}
+.fa-heartbeat:before{content:"\f21e"}
+.fa-venus:before{content:"\f221"}
+.fa-mars:before{content:"\f222"}
+.fa-mercury:before{content:"\f223"}
+.fa-intersex:before,.fa-transgender:before{content:"\f224"}
+.fa-transgender-alt:before{content:"\f225"}
+.fa-venus-double:before{content:"\f226"}
+.fa-mars-double:before{content:"\f227"}
+.fa-venus-mars:before{content:"\f228"}
+.fa-mars-stroke:before{content:"\f229"}
+.fa-mars-stroke-v:before{content:"\f22a"}
+.fa-mars-stroke-h:before{content:"\f22b"}
+.fa-neuter:before{content:"\f22c"}
+.fa-genderless:before{content:"\f22d"}
+.fa-facebook-official:before{content:"\f230"}
+.fa-pinterest-p:before{content:"\f231"}
+.fa-whatsapp:before{content:"\f232"}
+.fa-server:before{content:"\f233"}
+.fa-user-plus:before{content:"\f234"}
+.fa-user-times:before{content:"\f235"}
+.fa-bed:before,.fa-hotel:before{content:"\f236"}
+.fa-viacoin:before{content:"\f237"}
+.fa-train:before{content:"\f238"}
+.fa-subway:before{content:"\f239"}
+.fa-medium:before{content:"\f23a"}
+.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}
+.fa-optin-monster:before{content:"\f23c"}
+.fa-opencart:before{content:"\f23d"}
+.fa-expeditedssl:before{content:"\f23e"}
+.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}
+.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}
+.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}
+.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}
+.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}
+.fa-mouse-pointer:before{content:"\f245"}
+.fa-i-cursor:before{content:"\f246"}
+.fa-object-group:before{content:"\f247"}
+.fa-object-ungroup:before{content:"\f248"}
+.fa-sticky-note:before{content:"\f249"}
+.fa-sticky-note-o:before{content:"\f24a"}
+.fa-cc-jcb:before{content:"\f24b"}
+.fa-cc-diners-club:before{content:"\f24c"}
+.fa-clone:before{content:"\f24d"}
+.fa-balance-scale:before{content:"\f24e"}
+.fa-hourglass-o:before{content:"\f250"}
+.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}
+.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}
+.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}
+.fa-hourglass:before{content:"\f254"}
+.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}
+.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}
+.fa-hand-scissors-o:before{content:"\f257"}
+.fa-hand-lizard-o:before{content:"\f258"}
+.fa-hand-spock-o:before{content:"\f259"}
+.fa-hand-pointer-o:before{content:"\f25a"}
+.fa-hand-peace-o:before{content:"\f25b"}
+.fa-trademark:before{content:"\f25c"}
+.fa-registered:before{content:"\f25d"}
+.fa-creative-commons:before{content:"\f25e"}
+.fa-gg:before{content:"\f260"}
+.fa-gg-circle:before{content:"\f261"}
+.fa-tripadvisor:before{content:"\f262"}
+.fa-odnoklassniki:before{content:"\f263"}
+.fa-odnoklassniki-square:before{content:"\f264"}
+.fa-get-pocket:before{content:"\f265"}
+.fa-wikipedia-w:before{content:"\f266"}
+.fa-safari:before{content:"\f267"}
+.fa-chrome:before{content:"\f268"}
+.fa-firefox:before{content:"\f269"}
+.fa-opera:before{content:"\f26a"}
+.fa-internet-explorer:before{content:"\f26b"}
+.fa-television:before,.fa-tv:before{content:"\f26c"}
+.fa-contao:before{content:"\f26d"}
+.fa-500px:before{content:"\f26e"}
+.fa-amazon:before{content:"\f270"}
+.fa-calendar-plus-o:before{content:"\f271"}
+.fa-calendar-minus-o:before{content:"\f272"}
+.fa-calendar-times-o:before{content:"\f273"}
+.fa-calendar-check-o:before{content:"\f274"}
+.fa-industry:before{content:"\f275"}
+.fa-map-pin:before{content:"\f276"}
+.fa-map-signs:before{content:"\f277"}
+.fa-map-o:before{content:"\f278"}
+.fa-map:before{content:"\f279"}
+.fa-commenting:before{content:"\f27a"}
+.fa-commenting-o:before{content:"\f27b"}
+.fa-houzz:before{content:"\f27c"}
+.fa-vimeo:before{content:"\f27d"}
+.fa-black-tie:before{content:"\f27e"}
+.fa-fonticons:before{content:"\f280"}
+.fa-reddit-alien:before{content:"\f281"}
+.fa-edge:before{content:"\f282"}
+.fa-credit-card-alt:before{content:"\f283"}
+.fa-codiepie:before{content:"\f284"}
+.fa-modx:before{content:"\f285"}
+.fa-fort-awesome:before{content:"\f286"}
+.fa-usb:before{content:"\f287"}
+.fa-product-hunt:before{content:"\f288"}
+.fa-mixcloud:before{content:"\f289"}
+.fa-scribd:before{content:"\f28a"}
+.fa-pause-circle:before{content:"\f28b"}
+.fa-pause-circle-o:before{content:"\f28c"}
+.fa-stop-circle:before{content:"\f28d"}
+.fa-stop-circle-o:before{content:"\f28e"}
+.fa-shopping-bag:before{content:"\f290"}
+.fa-shopping-basket:before{content:"\f291"}
+.fa-hashtag:before{content:"\f292"}
+.fa-bluetooth:before{content:"\f293"}
+.fa-bluetooth-b:before{content:"\f294"}
+.fa-percent:before{content:"\f295"}
+.fa-gitlab:before{content:"\f296"}
+.fa-wpbeginner:before{content:"\f297"}
+.fa-wpforms:before{content:"\f298"}
+.fa-envira:before{content:"\f299"}
+.fa-universal-access:before{content:"\f29a"}
+.fa-wheelchair-alt:before{content:"\f29b"}
+.fa-question-circle-o:before{content:"\f29c"}
+.fa-blind:before{content:"\f29d"}
+.fa-audio-description:before{content:"\f29e"}
+.fa-volume-control-phone:before{content:"\f2a0"}
+.fa-braille:before{content:"\f2a1"}
+.fa-assistive-listening-systems:before{content:"\f2a2"}
+.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}
+.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}
+.fa-glide:before{content:"\f2a5"}
+.fa-glide-g:before{content:"\f2a6"}
+.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}
+.fa-low-vision:before{content:"\f2a8"}
+.fa-viadeo:before{content:"\f2a9"}
+.fa-viadeo-square:before{content:"\f2aa"}
+.fa-snapchat:before{content:"\f2ab"}
+.fa-snapchat-ghost:before{content:"\f2ac"}
+.fa-snapchat-square:before{content:"\f2ad"}
+.fa-pied-piper:before{content:"\f2ae"}
+.fa-first-order:before{content:"\f2b0"}
+.fa-yoast:before{content:"\f2b1"}
+.fa-themeisle:before{content:"\f2b2"}
+.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}
+.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}
+.fa-handshake-o:before{content:"\f2b5"}
+.fa-envelope-open:before{content:"\f2b6"}
+.fa-envelope-open-o:before{content:"\f2b7"}
+.fa-linode:before{content:"\f2b8"}
+.fa-address-book:before{content:"\f2b9"}
+.fa-address-book-o:before{content:"\f2ba"}
+.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}
+.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}
+.fa-user-circle:before{content:"\f2bd"}
+.fa-user-circle-o:before{content:"\f2be"}
+.fa-user-o:before{content:"\f2c0"}
+.fa-id-badge:before{content:"\f2c1"}
+.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}
+.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}
+.fa-quora:before{content:"\f2c4"}
+.fa-free-code-camp:before{content:"\f2c5"}
+.fa-telegram:before{content:"\f2c6"}
+.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}
+.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}
+.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}
+.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}
+.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}
+.fa-shower:before{content:"\f2cc"}
+.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}
+.fa-podcast:before{content:"\f2ce"}
+.fa-window-maximize:before{content:"\f2d0"}
+.fa-window-minimize:before{content:"\f2d1"}
+.fa-window-restore:before{content:"\f2d2"}
+.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}
+.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}
+.fa-bandcamp:before{content:"\f2d5"}
+.fa-grav:before{content:"\f2d6"}
+.fa-etsy:before{content:"\f2d7"}
+.fa-imdb:before{content:"\f2d8"}
+.fa-ravelry:before{content:"\f2d9"}
+.fa-eercast:before{content:"\f2da"}
+.fa-microchip:before{content:"\f2db"}
+.fa-snowflake-o:before{content:"\f2dc"}
+.fa-superpowers:before{content:"\f2dd"}
+.fa-wpexplorer:before{content:"\f2de"}
+.fa-meetup:before{content:"\f2e0"}
+.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}
+.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
+.webix_icon,.webix_input_icon{font-size:17px;display:inline-block;width:20px}
+.webix_input_icon{float:right;font-size:19px;color:#888}
+.webix_icon_button{background-color:transparent;border:none;padding:0;cursor:pointer;position:relative}
+.webix_icon_button .webix_icon{font-size:20px;height:23px;width:21px;display:inline-block;text-align:center;color:#606060}
+.webix_icon_btn{font-size:17px;display:inline-block;text-align:center;width:24px;color:#606060}
+.webix_el_iconBbutton .webix_icon_btn{text-align:center;width:100%;padding:5px 0}
+.webix_el_icon{cursor:pointer}
+.webix_badge{background-color:#ff8839;color:#fff;border-radius:50%;font-size:12px;height:22px;min-width:22px;box-sizing:border-box;padding:0 4px;text-align:center;line-height:21px;position:absolute;right:0;top:0}
+.webix_list_item .webix_badge{position:static;float:right;margin:4px -5px 0 10px}
+.webixtype_base .webix_badge{top:50%;margin-top:-11px;margin-right:8px}
+.webix_treemap{background-color:#f5f5f5}
+.webix_treemap .webix_scroll_cont{position:relative;height:100%;width:100%}
+.webix_treemap_item{position:absolute;color:#444;overflow:hidden;text-align:left;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3px 5px;border-width:0 1px 1px 0;border-style:solid;border-color:rgba(0,0,0,.2);background:0 0}
+.webix_treemap_level_top{z-index:1;border-color:rgba(0,0,0,.4)}
+.webix_treemap_item_bottom{border-bottom-width:0}
+.webix_treemap_item_right{border-right-width:0}
+.webix_treemap_item:hover{box-shadow:inset 0 0 5px #666}
+.webix_treemap_item.webix_selected{border-color:#27ae60;box-shadow:inset 0 0 1px 2px #27ae60}
+.webix_treemap_header{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 10px;border-bottom:1px solid #ddd}
+.webix_treemap_header_item{cursor:pointer}
+.webix_treemap_header_item:last-child{cursor:default}
+.webix_treemap_reset{float:right;width:25px;text-align:center}
+.webix_treemap_reset:before{content:"\f00d";color:#666;font-family:FontAwesome;font-size:16px;display:block;cursor:pointer}
+.webix_treemap_path_icon{width:20px;text-align:center}
+.webix_barcode{position:relative}
+.webix_barcode .webix_canvas_text{font-size:15px;padding:0 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.portlet_drag{position:absolute;z-index:1;top:5px;right:5px;width:18px;opacity:.5;cursor:pointer}
+.portlet_in_drag{opacity:.4}
+.portlet_marker,.portlet_markerbottom,.portlet_markerleft,.portlet_markerright,.portlet_markertop{opacity:.5;background:#9169BE;position:absolute;transition:top .5s,left .5s,width .5s,height .5s;top:0;left:0;width:100%;height:100%}
+.portlet_markertop{height:50%}
+.portlet_markerbottom{height:50%;top:50%}
+.portlet_markerleft{width:50%}
+.portlet_markerright{width:50%;left:50%}
+.webix_popup.webix_sidemenu.webix_sidemenu_left{border-width:0 1px 0 0;box-shadow:2px 0 2px rgba(0,0,0,.05)}
+.webix_sidemenu_left.webix_animate{transition:left .6s}
+.webix_popup.webix_sidemenu.webix_sidemenu_right{left:auto;border-width:0 0 0 1px;box-shadow:-2px 0 2px rgba(0,0,0,.05)}
+.webix_sidemenu_right.webix_animate{transition:right .6s}
+.webix_popup.webix_sidemenu.webix_sidemenu_top{border-width:0 0 1px;box-shadow:0 2px 2px rgba(0,0,0,.05)}
+.webix_sidemenu_top .webix_win_body{position:relative}
+.webix_sidemenu_top .webix_win_body>.webix_view{position:absolute;top:auto;left:0;bottom:0}
+.webix_sidemenu_top.webix_animate,.webix_sidemenu_top.webix_animate .webix_win_body{transition:height .6s}
+.webix_popup.webix_sidemenu.webix_sidemenu_bottom{border-width:1px 0 0;top:auto;box-shadow:0 -2px 2px rgba(0,0,0,.05)}
+.webix_sidemenu_bottom.webix_animate,.webix_sidemenu_bottom.webix_animate .webix_win_body{transition:height .6s}
+.webix_view.webix_pdf{background-color:#404040;overflow:auto;-webkit-overflow-scrolling:touch}
+.webix_pdf .canvas_wrapper{margin:0 auto;box-shadow:5px 5px 15px #1c1c1c;width:100%;height:100%}
+.webix_toolbar.pdf_bar{background-color:#474747}
+.webix_toolbar.pdf_bar .webix_icon_btn{font-size:15px}
+.webix_toolbar.pdf_bar .webix_img_btn:focus,.webix_toolbar.pdf_bar .webix_img_btn:hover{background-color:#404040}
+.webix_toolbar.pdf_bar .webix_template{background-color:#3498db;color:#fff;line-height:2em}
+.webix_toolbar.pdf_bar .webix_el_box input,.webix_toolbar.pdf_bar .webix_inp_static{background-color:#5c5c5c;color:#fff;border-color:#404040}
+.webix_toolbar.pdf_bar .webix_el_box input:focus,.webix_toolbar.pdf_bar .webix_inp_static:focus{border-color:#333}
+.webix_toolbar.pdf_bar .webix_el_box .webix_input_icon{color:#fff}
+.webix_view.webix_popup.pdf_opt_list{box-shadow:5px 5px 15px #1c1c1c;border:none}
+.pdf_opt_list .webix_list{background-color:#404040;color:#fff}
+.pdf_opt_list .webix_list .webix_list_item{border-color:#474747;line-height:1.5em}
+.pdf_opt_list .webix_list .webix_list_item.webix_selected,.pdf_opt_list .webix_list .webix_list_item:hover{color:#404040;background-color:#fff}
+.webix_dbllist .webix_list{background:#ededed}
+.webix_dbllist .webix_list_item{background:#fff;margin:3px 4px 0;box-sizing:border-box}
+.webix_dbllist .webix_list_item.webix_selected{color:#FFF;background:#27ae60}
+.webix_dbllist button{width:45%;height:30px;margin-top:5px;background:#eef7fc;border-radius:6px;border:1px solid #ddd;cursor:pointer;font-size:15px;font-family:'PT Sans',Tahoma}
+.webix_dbllist button:active{box-shadow:inset 1px 1px 0 silver}
+.webix_dbllist button .webix_icon{color:#888;font-size:26px}
+.webix_dbllist button:first-child{margin-top:32px;margin-right:5%}
+.webix_dbllist button:last-child{margin-left:5%}
+.webix_dbllist .bottom_label{font-size:10px;text-transform:uppercase;background:#ededed;padding-left:13px}
+@font-face{font-family:'PT Sans';font-style:normal;font-weight:400;src:local('PT Sans'),local('PTSans-Regular'),url(fonts/PTS-webfont.woff) format('woff')}
+@font-face{font-family:'PT Sans';font-style:normal;font-weight:700;src:local('PT Sans Bold'),local('PTSans-Bold'),url(fonts/PTS-bold.woff) format('woff')}
+.mainFont{font-family:'PT Sans',Tahoma;font-size:15px;color:#666}
+.webix_layout_toolbar.webix_toolbar{color:#fff;font-size:18px;background:#3498db}
+.webix_layout_toolbar.webix_toolbar .webix_el_button,.webix_layout_toolbar.webix_toolbar .webix_el_label,.webix_layout_toolbar.webix_toolbar .webix_inp_label{color:#fff}
+.webix_layout_toolbar.webix_toolbar .webix_el_label{font-size:18px}
+.webix_layout_toolbar.webix_toolbar .webix_inp_counter_next,.webix_layout_toolbar.webix_toolbar .webix_inp_counter_prev,.webix_layout_toolbar.webix_toolbar .webix_segment_0,.webix_layout_toolbar.webix_toolbar .webix_segment_1,.webix_layout_toolbar.webix_toolbar .webix_segment_N,.webix_layout_toolbar.webix_toolbar .webixtype_base,.webix_layout_toolbar.webix_toolbar .webixtype_next,.webix_layout_toolbar.webix_toolbar .webixtype_prev{border-color:#d9d9d9;background-color:transparent;color:#fff}
+.webix_layout_toolbar.webix_toolbar .webix_el_arrow.webixtype_next_arrow{border-left:none;border-bottom:none}
+.webix_layout_toolbar.webix_toolbar .webix_el_arrow.webixtype_prev_arrow{border-right:none;border-bottom:none}
+.webix_layout_toolbar.webix_toolbar .webix_inp_counter_next:hover,.webix_layout_toolbar.webix_toolbar .webix_inp_counter_prev:hover,.webix_layout_toolbar.webix_toolbar .webix_segment_0:hover,.webix_layout_toolbar.webix_toolbar .webix_segment_1:hover,.webix_layout_toolbar.webix_toolbar .webix_segment_N:hover,.webix_layout_toolbar.webix_toolbar .webixtype_base:hover{color:#fff;background-color:rgba(0,0,0,.05)}
+.webix_layout_toolbar.webix_toolbar .webix_inp_counter_next:active,.webix_layout_toolbar.webix_toolbar .webix_inp_counter_prev:active,.webix_layout_toolbar.webix_toolbar .webix_segment_0:active,.webix_layout_toolbar.webix_toolbar .webix_segment_1:active,.webix_layout_toolbar.webix_toolbar .webix_segment_N:active,.webix_layout_toolbar.webix_toolbar .webixtype_base:active{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar.webix_toolbar .webix_inp_counter_next:focus,.webix_layout_toolbar.webix_toolbar .webix_inp_counter_prev:focus,.webix_layout_toolbar.webix_toolbar .webix_segment_0:focus,.webix_layout_toolbar.webix_toolbar .webix_segment_1:focus,.webix_layout_toolbar.webix_toolbar .webix_segment_N:focus,.webix_layout_toolbar.webix_toolbar .webixtype_base:focus{background-color:rgba(0,0,0,.07);color:#fff}
+.webix_layout_toolbar.webix_toolbar .webix_inp_static,.webix_layout_toolbar.webix_toolbar input[type=text]{border-color:#fff}
+.webix_layout_toolbar.webix_toolbar .webix_inp_static:focus,.webix_layout_toolbar.webix_toolbar input[type=text]:focus{border-color:#fff;box-shadow:none}
+.webix_layout_toolbar.webix_toolbar .webix_input_icon{border-color:#d9d9d9;background-color:transparent;color:#666}
+.webix_layout_toolbar.webix_toolbar .webix_input_icon:active,.webix_layout_toolbar.webix_toolbar .webix_input_icon:focus,.webix_layout_toolbar.webix_toolbar .webix_input_icon:hover{background-color:transparent;color:#666}
+.webix_layout_toolbar.webix_toolbar .webix_pressed .webix_el_arrow,.webix_layout_toolbar.webix_toolbar .webix_pressed .webix_inp_counter_next,.webix_layout_toolbar.webix_toolbar .webix_pressed .webix_inp_counter_prev,.webix_layout_toolbar.webix_toolbar .webix_pressed .webix_input_icon,.webix_layout_toolbar.webix_toolbar .webix_pressed .webix_segment_0,.webix_layout_toolbar.webix_toolbar .webix_pressed .webix_segment_1,.webix_layout_toolbar.webix_toolbar .webix_pressed .webix_segment_N,.webix_layout_toolbar.webix_toolbar .webix_pressed .webixtype_base,.webix_layout_toolbar.webix_toolbar .webix_pressed .webixtype_next,.webix_layout_toolbar.webix_toolbar .webix_pressed .webixtype_prev{background-color:rgba(0,0,0,.07);color:#fff;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_0,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_1,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_N{border-color:#d9d9d9;background-color:#27ae60;color:#fff}
+.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_0:hover,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_1:hover,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_N:hover{background-color:#24a259}
+.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_0:active,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_0:focus,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_1:active,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_1:focus,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_N:active,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_N:focus{background-color:#295}
+.webix_layout_toolbar.webix_toolbar .webix_segment_1,.webix_layout_toolbar.webix_toolbar .webix_segment_N,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_1,.webix_layout_toolbar.webix_toolbar .webix_selected.webix_segment_N{margin-left:0;border-left:none}
+.webix_layout_toolbar.webix_toolbar .webix_img_btn:active,.webix_layout_toolbar.webix_toolbar .webix_img_btn_top:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar.webix_toolbar .webix_img_btn:focus,.webix_layout_toolbar.webix_toolbar .webix_img_btn_top:focus{background-color:#2489cc}
+.webix_layout_toolbar.webix_toolbar .webix_img_btn:hover,.webix_layout_toolbar.webix_toolbar .webix_img_btn_top:hover{background-color:#268fd5}
+.webix_layout_toolbar.webix_toolbar .webix_icon_button{border-radius:6px}
+.webix_layout_toolbar.webix_toolbar .webix_el_icon,.webix_layout_toolbar.webix_toolbar .webix_icon_btn,.webix_layout_toolbar.webix_toolbar .webix_icon_button,.webix_layout_toolbar.webix_toolbar .webix_img_btn,.webix_layout_toolbar.webix_toolbar .webix_img_btn_abs,.webix_layout_toolbar.webix_toolbar .webix_img_btn_abs .webix_icon,.webix_layout_toolbar.webix_toolbar .webix_img_btn_abs .webix_img_btn_text,.webix_layout_toolbar.webix_toolbar .webix_img_btn_top .webix_icon,.webix_layout_toolbar.webix_toolbar .webix_img_btn_top .webix_img_btn_text{color:#fff}
+.webix_layout_toolbar.webix_toolbar .webix_el_box .webix_img_btn_abs:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_layout_toolbar.webix_toolbar .webix_el_icon .webix_icon_button:focus{background-color:rgba(0,0,0,.07)}
+.webix_layout_toolbar.webix_toolbar .webix_el_box .webix_img_btn_abs:hover,.webix_layout_toolbar.webix_toolbar .webix_el_icon .webix_icon_button:hover{background-color:rgba(0,0,0,.05)}
+.webix_layout_toolbar.webix_toolbar .webix_control{border-color:#3498db}
+.webix_layout_toolbar.webix_toolbar .webix_icon_button .webix_icon{font-size:23px;height:27px;width:27px;color:#fff}
+.webix_layout_toolbar.webix_toolbar .webix_img_btn,.webix_layout_toolbar.webix_toolbar .webix_img_btn_top{border-width:0}
+.webix_layout_space>.webix_toolbar{border-radius:4px}
+.webix_view.webix_layout_accordion{background-color:#ddd}
+.webix_accordionitem .webix_accordionitem_button{float:right;position:relative;height:19px;width:19px;margin:14px 13.5px}
+.webix_accordionitem.collapsed .webix_accordionitem_button{float:right;position:relative;height:19px;width:19px;margin-top:13px}
+.webix_accordionitem.collapsed,.webix_accordionitem.horizontal.collapsed{background-color:#a4b4bf}
+.webix_accordionitem.collapsed .webix_accordionitem_header,.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header{background-color:#a4b4bf;color:#fff}
+.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button,.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_button{color:#fff}
+.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button{color:#fff;background-image:none;font-family:FontAwesome;font-size:24px;text-align:center;width:24px;height:45px;margin:0 10.5px}
+.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before{content:'\f104'}
+.webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before{content:'\f106'}
+.webix_accordionitem.horizontal:last-child>.webix_accordionitem_header .webix_accordionitem_button:before{content:'\f105'}
+.webix_accordionitem.horizontal.collapsed:last-child>.webix_accordionitem_header .webix_accordionitem_button:before{content:'\f107'}
+.webix_accordionitem.vertical>.webix_accordionitem_header .webix_accordionitem_button{height:42px;margin:0 10.5px}
+.webix_accordionitem.vertical>.webix_accordionitem_header .webix_accordionitem_button:before{content:'\f106'}
+.webix_accordionitem.vertical>.webix_accordionitem_header.collapsed .webix_accordionitem_button:before{content:'\f107'}
+.webix_toolbar.webix_layout_subbar{background:0 0}
+.webix_toolbar.webix_layout_subbar .webix_view{color:#666}
+.webix_el_tabbar+.webix_multiview{background-color:#fff}
+.webix_view.rounded_top{-moz-border-top-left-radius:4px;-moz-border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-top-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px}
+.webix_view.rounded_right{-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px}
+.webix_view.rounded_bottom{border-bottom-left-radius:4px;border-bottom-right-radius:4px;-moz-border-bottom-left-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-webkit-border-bottom-right-radius:4px}
+.webix_view.rounded_left{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px}
+.webix_layout_space .webix_layout_accordion .webix_accordionitem,.webix_layout_space>.webix_view,.webix_layout_wide .webix_layout_accordion .webix_accordionitem,.webix_layout_wide>.webix_view{border-radius:4px}
+.webix_view .webix_win_head{border-bottom:1px solid #ddd}
+.webix_view .webix_win_head>.webix_view>.webix_template{color:#666;background:#fff;box-shadow:0 -2px #3498db inset}
+.webix_modal_box .webix_popup_title{color:#666;background:#fff;font-size:15px;text-shadow:none}
+.webix_popup_text{box-shadow:0 3px #3498db inset;font-size:15px}
+.webix_alert-warning .webix_popup_text,.webix_confirm-warning .webix_popup_text{box-shadow:0 3px #ffd21a inset}
+.webix_alert-error .webix_popup_text,.webix_confirm-error .webix_popup_text{box-shadow:0 3px #ff391b inset}
+.webix_modal_box,.webix_view.webix_popup{border:1px solid #ddd}
+.confirmButton{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;background:#27ae60;border-color:#27ae60;border-bottom:1px solid #209150;box-shadow:none;text-shadow:none;color:#fff}
+.confirmButtonActive{background:#2ecb70}
+.webix_popup_button{border:none}
+.webix_dtable .webix_ss_left .webix_column.webix_last>div{border-right:1px solid #d0d0d0}
+.webix_dtable .webix_last_topcell{border-bottom:1px solid #d0d0d0}
+.webix_dtable .webix_ss_right .webix_column.webix_first>div{border-left:1px solid #d0d0d0}
+.webix_dtable .webix_hs_right td.webix_first{border-left:1px solid #b0cee3}
+.webix_dtable .webix_hcell.webix_ss_filter{padding:0 5px}
+.webix_dtable .webix_hcell.webix_div_filter{padding:3px 5px}
+.webix_dtable .webix_ss_filter input,.webix_dtable .webix_ss_filter select{height:32px;vertical-align:middle;border-radius:6px}
+.webix_ss_sort_asc,.webix_ss_sort_desc{font-size:14px;font-family:FontAwesome;top:50%;line-height:1px;bottom:auto;right:3px;float:none;width:12px}
+.webix_ss_sort_asc:before{content:'\f106'}
+.webix_ss_sort_desc:before{content:'\f107'}
+.dtBodyCell{border-bottom:1px solid #ebebeb}
+.webix_dtable .webix_ss_vscroll_header{border-bottom:1px solid #b0cee3}
+.webix_view .webix_dt_editor input,.webix_view .webix_dt_editor select{border:1px solid #3498db}
+.dataItemStyle{border-color:#ebebeb}
+.webix_list_item.webix_group_back{color:#4a4a4a;background:#d2e3ef;border-bottom:1px solid #b0cee3}
+.webix_dataview_item{border-right-color:#ebebeb}
+.webix_view .webix_pager_item{padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;color:#fff;background:#3498db;border-bottom:1px solid #2386c8;font-size:15px}
+.webix_view .webix_pager_item:hover{background-color:#268fd5}
+.webix_view .webix_pager_item:focus{background-color:#2489cc}
+.webix_view .webix_pager_item_selected{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;background:#27ae60;color:#fff;border-color:#27ae60;border-bottom:1px solid #209150;box-shadow:none}
+.webix_view .webix_pager_item_selected:focus,.webix_view .webix_pager_item_selected:hover{background-color:#219552}
+.webix_view .webix_pager_item,.webix_view .webix_pager_item_selected{border-radius:6px}
+.webix_list .webix_unit_header{font-weight:400;text-shadow:none;background:#d2e3ef;font-size:15px;color:#4a4a4a}
+.webix_view .webix_tree_close,.webix_view .webix_tree_open{background-image:none;font-family:FontAwesome;font-size:14px;text-align:center;color:#666}
+.webix_view .webix_tree_open:before{content:"\f147"}
+.webix_view .webix_tree_close:before{content:"\f196"}
+.webix_menu-x .webix_submenu_icon,.webix_view.webix_menu .webix_submenu_icon{width:6px;height:auto;font-size:14px;font-family:FontAwesome;line-height:1px;margin-top:3px}
+.webix_menu.webix_view .webix_list_item:active,.webix_menu.webix_view .webix_list_item:hover{background-color:#f5f5f5}
+.webix_menu.webix_view .webix_list_item .webix_submenu_icon:before{content:'\f105'}
+.webix_menu.webix_view .webix_list_item.webix_selected{background:#27ae60}
+.webix_property .webix_property_label,.webix_property .webix_property_value{border-color:#ebebeb}
+.webix_view .webix_drag_over,.webix_view .webix_drop_zone{background-color:#f4f4f4}
+.propertyStyle{height:28px;line-height:27px}
+.propertyTitle{line-height:28px}
+.webix_view button,.webix_view input[type=button]{-webkit-appearance:none}
+.webix_el_colorpicker span.webix_input_icon,.webix_el_combo span.webix_input_icon,.webix_el_datepicker span.webix_input_icon,.webix_el_dbldatepicker span.webix_input_icon,.webix_el_richselect span.webix_input_icon{background-color:#3498db;color:#fff;-webkit-border-radius:0 6px 6px 0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px;border-radius:0 6px 6px 0}
+.focusStyle{border:1px solid #3498db;box-shadow:0 0 1px #3498db inset}
+.webix_el_colorpicker input,.webix_el_combo input,.webix_el_search input{padding-right:28px}
+.webix_el_colorpicker input,.webix_el_combo input,.webix_el_datepicker input,.webix_el_search input,.webix_el_text input{border-radius:6px}
+.webix_el_colorpicker input:focus,.webix_el_combo input:focus,.webix_el_datepicker input:focus,.webix_el_search input:focus,.webix_el_text input:focus{border:1px solid #3498db;box-shadow:0 0 1px #3498db inset}
+.webix_el_counter input[type=text]:focus{border-top:1px solid #3498db;border-bottom:1px solid #3498db;box-shadow:0 0 1px #3498db inset}
+.webix_el_colorpicker .webix_inp_static,.webix_el_datepicker .webix_inp_static,.webix_el_dbldatepicker .webix_inp_static,.webix_el_richselect .webix_inp_static{border-radius:6px;padding-right:28px;white-space:nowrap}
+.webix_el_colorpicker .webix_inp_static:focus,.webix_el_datepicker .webix_inp_static:focus,.webix_el_dbldatepicker .webix_inp_static:focus,.webix_el_richselect .webix_inp_static:focus,.webix_el_select select:focus,.webix_el_textarea textarea:focus{border:1px solid #3498db;box-shadow:0 0 1px #3498db inset}
+.webix_el_select select,.webix_el_textarea textarea{border-radius:6px}
+.webix_el_combo span.webix_input_icon,.webix_el_richselect span.webix_input_icon{width:21px;padding-left:8px}
+.webix_el_colorpicker span.webix_input_icon,.webix_el_datepicker span.webix_input_icon,.webix_el_dbldatepicker span.webix_input_icon,.webix_el_search span.webix_input_icon{width:24px}
+.webix_el_text .webix_inp_static{border-radius:6px;white-space:nowrap}
+.webix_focused .webix_inp_static{border:1px solid #3498db;box-shadow:0 0 1px #3498db inset}
+.webix_multilist .fa-check-square{color:#3498db}
+.buttonStyle{color:#fff;font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;border-bottom:1px solid #268fd5;outline:0}
+.webix_el_colorpicker div.webix_inp_static div{margin:2.5px -20px 0 -5px}
+.webix_el_textarea textarea,div.webix_inp_static{background:#fff;font-family:'PT Sans',Tahoma;border-color:#ccc}
+.webix_el_select select{font-family:'PT Sans',Tahoma;border-color:#ddd}
+.webix_el_checkbox input{border-color:#ddd}
+.webix_el_counter .webix_inp_counter_value{width:40px;background:#fff;font-family:'PT Sans',Tahoma;border-color:#ccc}
+.webix_el_counter .webix_inp_counter_next,.webix_el_counter .webix_inp_counter_prev{background:#3498db;width:29px;color:#fff;padding:auto 6px;border:1px solid #3498db;border-bottom:1px solid #268fd5;outline:0;font-weight:700;font-family:"Courier New",Courier,monospace;font-size:20px}
+.webix_view.webix_control.webix_el_tabbar{background:0 0}
+div.webix_item_tab{border-color:#a4b4bf;padding-top:3px;font-size:18px}
+div.webix_item_tab.webix_selected{padding-top:2px}
+.webixtype_bottom .webix_item_tab,.webixtype_bottom .webix_item_tab.webix_selected{border-color:#3498db;border-right:1px solid #5faee3;background:#3498db;color:#fff;padding-top:0}
+.webixtype_bottom .webix_item_tab.webix_selected:last-child,.webixtype_bottom .webix_item_tab:last-child{border-right:1px solid #5faee3}
+.webixtype_bottom .webix_item_tab.webix_selected{background:#2383c4;color:#fff}
+.webix_el_tabbar .webixtype_icon .webix_item_tab{white-space:nowrap}
+.webix_el_tabbar .webixtype_icon .webix_img_btn{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 auto;color:#fff;text-align:center}
+.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn{color:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:24px;height:100%;line-height:inherit;margin:0 3px;vertical-align:top;width:100%}
+.webix_el_tabbar .webixtype_icon .webix_item_tab.webix_selected{background:#2383c4}
+.webix_accordionitem_label .webix_icon{font-size:19px;width:25px}
+.webix_item_tab .webix_icon{width:30px;font-size:19px}
+.webix_el_tabbar .webixtype_iconTop,.webix_el_tabbar .webixtype_image{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+.webix_el_tabbar .webixtype_iconTop .webix_icon,.webix_el_tabbar .webixtype_image .webix_icon{color:#fff;font-size:18px;top:1px}
+.webix_el_tabbar .webixtype_iconTop .webix_item_tab,.webix_el_tabbar .webixtype_image .webix_item_tab{font-size:15px}
+.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_icon,.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_icon{margin-top:2px}
+.webix_el_tabbar .webixtype_iconTop .webix_img_btn_text,.webix_el_tabbar .webixtype_image .webix_img_btn_text{bottom:0;font-size:15px}
+.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected,.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected{background:#2383c4;box-shadow:0 0 0 1px #3498db inset}
+.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon,.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn_text,.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon,.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn_text{color:#fff}
+.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon_btn,.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon_btn{background-color:#2383c4}
+.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn,.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn{color:#fff}
+.webix_el_tabbar .webixtype_icon,.webix_el_tabbar .webixtype_iconTop,.webix_el_tabbar .webixtype_image{background:#3498db}
+.webix_el_tabbar .webixtype_icon .webix_tab_filler,.webix_el_tabbar .webixtype_iconTop .webix_tab_filler,.webix_el_tabbar .webixtype_image .webix_tab_filler{border-bottom-color:#3498db}
+.webix_el_tabbar .webixtype_icon .webix_item_tab,.webix_el_tabbar .webixtype_iconTop .webix_item_tab,.webix_el_tabbar .webixtype_image .webix_item_tab{padding:0;border-radius:0;color:#fff;background:#3498db;border-color:#3498db;border-bottom:1px solid #3498db}
+.webix_el_tabbar .webixtype_icon .webix_item_tab .webix_img_btn,.webix_el_tabbar .webixtype_iconTop .webix_item_tab .webix_img_btn,.webix_el_tabbar .webixtype_image .webix_item_tab .webix_img_btn{color:#fff}
+.webix_tab_more_icon:hover{color:#4d4d4d}
+.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon,.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,.webix_el_tabbar .webixtype_image .webix_tab_more_icon{background:#3498db}
+.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon .webix_icon,.webix_el_tabbar .webixtype_icon .webix_tab_more_icon .webix_icon,.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon .webix_icon,.webix_el_tabbar .webixtype_image .webix_tab_more_icon .webix_icon{color:#fff}
+.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:hover,.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:hover,.webix_el_tabbar .webixtype_image .webix_tab_more_icon:hover{background-color:#268fd5}
+.webix_tab_filler:first-child{border-right:0}
+.passiveBarBG{background:#a4b4bf;color:#fff}
+.webix_all_tabs{padding-left:1px;padding-right:1px}
+.webix_after_all_tabs{background:#3498db}
+.webix_el_box .webixtype_form:active{background-color:#219552;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_el_box .webixtype_form:focus{background-color:#219552}
+.webix_el_box .webixtype_form:hover{background-color:#239d57}
+.webixtype_danger:hover{background-color:#ca4635}
+.webixtype_danger:focus{background-color:#c14433}
+.webixtype_danger:active{background-color:#c14433;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webixtype_next:focus,.webixtype_next:focus+.webixtype_next_arrow,.webixtype_prev:focus,.webixtype_prev:focus+.webixtype_prev_arrow{background-color:#2489cc}
+.webixtype_next:hover,.webixtype_next:hover+.webixtype_next_arrow,.webixtype_prev:hover,.webixtype_prev:hover+.webixtype_prev_arrow{background-color:#268fd5}
+.webix_el_box .webixtype_form{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;background:#27ae60;color:#fff;border-color:#27ae60;border-bottom:1px solid #209150;box-shadow:none}
+.webix_inp_counter_next:hover,.webix_inp_counter_prev:hover,.webix_segment_0:hover,.webix_segment_1:hover,.webix_segment_N:hover,.webixbutton:hover,.webixtype_base:hover{background-color:#268fd5}
+.webix_inp_counter_next:active,.webix_inp_counter_prev:active,.webix_segment_0:active,.webix_segment_1:active,.webix_segment_N:active,.webixbutton:active,.webixtype_base:active{background-color:#2489cc;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_el_text .webix_input_icon:active,.webix_el_text .webix_input_icon:hover{color:#3498db;background:inherit;cursor:pointer}
+.webix_inp_counter_next:focus,.webix_inp_counter_prev:focus,.webix_segment_0:focus,.webix_segment_1:focus,.webix_segment_N:focus,.webixbutton:focus,.webixtype_base:focus{background-color:#2489cc}
+.webix_selected.webix_segment_0:hover,.webix_selected.webix_segment_1:hover,.webix_selected.webix_segment_N:hover{background-color:#239d57}
+.webix_selected.webix_segment_0:active,.webix_selected.webix_segment_0:focus,.webix_selected.webix_segment_1:active,.webix_selected.webix_segment_1:focus,.webix_selected.webix_segment_N:active,.webix_selected.webix_segment_N:focus{background-color:#219552}
+.webix_all_segments .webix_segment_1,.webix_all_segments .webix_segment_N{margin-left:1px;border-left:none}
+.webix_el_slider .webix_slider_title{margin-bottom:-13px}
+.activeShadow{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.toggleShadow{box-shadow:inset 0 3px 5px rgba(0,0,0,.18)}
+.webix_el_toggle .webix_pressed .webix_img_btn,.webix_el_toggle .webix_pressed .webix_img_btn_top{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_el_toggle .webix_el_box.webix_pressed .webix_img_btn_abs,.webix_el_toggle .webix_el_box.webix_pressed .webixtype_base{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background-color:#2489cc}
+.webix_img_btn_abs_top .webix_icon{font-size:22px}
+.webix_img_btn:hover,.webix_img_btn_top:hover{background-color:rgba(0,0,0,.05)}
+.webix_img_btn:active,.webix_img_btn_top:active{background-color:rgba(0,0,0,.07);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
+.webix_img_btn:focus,.webix_img_btn_top:focus{background-color:rgba(0,0,0,.07)}
+.webix_view .webix_fieldset fieldset{border:1px solid #dedede}
+.webix_view .webix_fieldset legend{color:#787878}
+.webix_custom_checkbox:before{content:"\f00c";color:#3498db;font-family:FontAwesome;font-size:16px;height:14px;display:block;line-height:13px;width:14px}
+.webix_checkbox_0 .webix_custom_checkbox:before{visibility:hidden}
+.webix_custom_checkbox{float:left;position:relative;top:50%;margin-top:-7px;padding:0;height:15px;width:15px;border:1px solid #ccc;border-radius:3px;background-color:#fff}
+.webix_custom_checkbox:focus{border-color:#3498db}
+a:active .webix_custom_checkbox,a:focus .webix_custom_checkbox{border:1px solid #3498db;box-shadow:0 0 1px #3498db inset}
+.webix_el_radio .webix_custom_radio:before{content:" ";border-radius:50%;display:block;width:7px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;height:7px;background-color:#3498db}
+.webix_el_radio .webix_radio_0 .webix_custom_radio:before{visibility:hidden}
+.webix_el_radio .webix_custom_radio{display:block;height:15px;width:15px;padding:3px;border:1px solid #ccc;border-radius:50%;background-color:#fff}
+.webix_el_radio .webix_custom_radio:focus{border-color:#3498db}
+.webix_el_radio .webix_label_right{color:#666;font-size:15px}
+a:active .webix_custom_radio,a:focus .webix_custom_radio{border:1px solid #3498db;box-shadow:0 0 1px #3498db inset}
+.webix_cal_body .webix_cal_today{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #27ae60;border-radius:6px}
+.webix_cal_body .webix_cal_day,.webix_cal_body .webix_cal_week_num{font-size:13px}
+.webix_cal_body .webix_cal_select,.webix_cal_body .webix_cal_select.webix_cal_today{border-radius:6px}
+.webix_cal_body .webix_cal_event.webix_cal_select,.webix_cal_body .webix_selected{color:#fff;border-radius:6px;background:#27ae60}
+.webix_cal_event{color:#3498db}
+.webix_cal_outside{font-weight:400;color:#bbb}
+.webix_cal_footer .webix_cal_done,.webix_time_footer .webix_cal_done{font-size:15px;padding:auto 6px;font-family:'PT Sans',Tahoma;border:1px solid #3498db;outline:0;color:#fff;background:#3498db;border-bottom:1px solid #2386c8}
+.webix_cal_footer .webix_cal_done:hover,.webix_time_footer .webix_cal_done:hover{background-color:#268fd5}
+.webix_cal_footer .webix_cal_done:focus,.webix_time_footer .webix_cal_done:focus{background-color:#2489cc}
+.webix_cal_month{line-height:20px;text-align:center;font-size:17px;font-weight:700}
+.webix_view>.webix_cal_header div{font-size:12px}
+.webix_cal_month_name{font-size:14px;font-weight:400}
+.webix_daterange .webix_range_timepicker .webix_cal_time{padding:5px 15px}
+.webix_cal_range{background-color:#d4f5e2}
+.webix_progress_bottom .webix_progress_state,.webix_progress_top .webix_progress_state{background-image:linear-gradient(135deg,rgba(255,255,255,.1) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.1) 50%,rgba(255,255,255,.1) 75%,transparent 75%,transparent)}
+.webix_progress_top .webix_progress_state{background-size:10px 10px}
+.webix_progress_bottom .webix_progress_state{background-size:14px 14px}
+.webix_skin_mark{height:200px}
+.webix_sparklines{padding:1px 0;box-sizing:border-box}
+.webix_sparklines svg{box-sizing:border-box}
+.webix_sparklines_line{stroke:#3498db;stroke-width:1;fill:transparent;stroke-linecap:round}
+.webix_sparklines_item{fill:#3498db;stroke-width:1}
+.webix_sparklines_bar{fill:#6dbcf0}
+.webix_sparklines_bar_negative{fill:#d86c79}
+.webix_sparklines_area{fill:#e5eef4}
+.webix_sparklines_origin{stroke:#888;stroke-width:1}
+.webix_sparklines_event_area{fill:transparent}
+.webix_sparklines_area_chart .webix_sparklines_event_area:hover,.webix_sparklines_line_chart .webix_sparklines_event_area:hover,.webix_sparklines_splinearea_chart .webix_sparklines_event_area:hover{fill:rgba(220,220,220,.4);stroke:rgba(255,255,255,.6)}
+.webix_sparklines_bar_chart .webix_sparklines_event_area:hover,.webix_sparklines_pie_chart .webix_sparklines_event_area:hover{fill:rgba(255,255,255,.3)}
+.webix_strong{font-weight:700;white-space:nowrap}
+.webix_light{color:#b3b3b3}
+.webix_debug div{border:1px solid orange;background-color:#FF9;color:#000}
+.webix_debug{background-color:#ff9;border:1px solid #ff9}
+.webix_input_icon,.webix_view{box-sizing:content-box}
+.webix_view.webix_el_label{box-sizing:border-box}
+.webix_inp_label,.webix_inp_top_label,.webix_label_right{margin-bottom:0}
+.webix_view table{border-collapse:initial}
\ No newline at end of file
diff --git a/source/static/fonts/FontAwesome.otf b/source/static/fonts/FontAwesome.otf
new file mode 100644
index 0000000..401ec0f
Binary files /dev/null and b/source/static/fonts/FontAwesome.otf differ
diff --git a/source/static/fonts/PTS-bold.woff b/source/static/fonts/PTS-bold.woff
new file mode 100644
index 0000000..830b063
Binary files /dev/null and b/source/static/fonts/PTS-bold.woff differ
diff --git a/source/static/fonts/PTS-webfont.woff b/source/static/fonts/PTS-webfont.woff
new file mode 100644
index 0000000..c183afc
Binary files /dev/null and b/source/static/fonts/PTS-webfont.woff differ
diff --git a/source/static/fonts/font-license.txt b/source/static/fonts/font-license.txt
new file mode 100644
index 0000000..3e33797
--- /dev/null
+++ b/source/static/fonts/font-license.txt
@@ -0,0 +1,14 @@
+## Font Awesome
+
+ Copyright (C) 2012 by Dave Gandy
+
+ Author: Dave Gandy
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://fortawesome.github.com/Font-Awesome/
+
+
+
+## PT Sans Free
+
+ Copyright © 2009 ParaType Ltd.
+ License: Free Font License v1.00
\ No newline at end of file
diff --git a/source/static/fonts/fontawesome-webfont.eot b/source/static/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..e9f60ca
Binary files /dev/null and b/source/static/fonts/fontawesome-webfont.eot differ
diff --git a/source/static/fonts/fontawesome-webfont.svg b/source/static/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..855c845
--- /dev/null
+++ b/source/static/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
diff --git a/source/static/fonts/fontawesome-webfont.ttf b/source/static/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
Binary files /dev/null and b/source/static/fonts/fontawesome-webfont.ttf differ
diff --git a/source/static/fonts/fontawesome-webfont.woff b/source/static/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..400014a
Binary files /dev/null and b/source/static/fonts/fontawesome-webfont.woff differ
diff --git a/source/static/fonts/fontawesome-webfont.woff2 b/source/static/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
Binary files /dev/null and b/source/static/fonts/fontawesome-webfont.woff2 differ
diff --git a/source/static/img/favicon.png b/source/static/img/favicon.png
new file mode 100644
index 0000000..eccb275
Binary files /dev/null and b/source/static/img/favicon.png differ
diff --git a/source/static/img/file-email.png b/source/static/img/file-email.png
new file mode 100644
index 0000000..d4cafd2
Binary files /dev/null and b/source/static/img/file-email.png differ
diff --git a/source/static/img/file-pdf.png b/source/static/img/file-pdf.png
new file mode 100644
index 0000000..6c6f519
Binary files /dev/null and b/source/static/img/file-pdf.png differ
diff --git a/source/static/img/file-xml.png b/source/static/img/file-xml.png
new file mode 100644
index 0000000..3f1d241
Binary files /dev/null and b/source/static/img/file-xml.png differ
diff --git a/source/static/img/file-zip.png b/source/static/img/file-zip.png
new file mode 100644
index 0000000..b96e8d7
Binary files /dev/null and b/source/static/img/file-zip.png differ
diff --git a/source/static/js/controller/admin.js b/source/static/js/controller/admin.js
new file mode 100644
index 0000000..4743426
--- /dev/null
+++ b/source/static/js/controller/admin.js
@@ -0,0 +1,448 @@
+var msg = ''
+
+
+var controllers = {
+ init: function(){
+ //~ Admin
+ $$('menu_user').attachEvent('onMenuItemClick', menu_user_click)
+ $$('multi_admin').attachEvent('onViewChange', multi_admin_change)
+ //~ Emisor
+ $$('cmd_save_emisor').attachEvent('onItemClick', cmd_save_emisor_click)
+ $$('emisor_cp').attachEvent('onKeyPress', emisor_postal_code_key_press)
+ $$('emisor_cp').attachEvent('onTimedKeyPress', emisor_postal_code_key_up)
+ $$('chk_escuela').attachEvent('onChange', chk_escuela_change)
+ $$('chk_ong').attachEvent('onChange', chk_ong_change)
+ $$('cmd_subir_certificado').attachEvent('onItemClick', cmd_subir_certificado_click)
+ $$('up_cert').attachEvent('onUploadComplete', up_cert_upload_complete)
+ $$('cmd_agregar_serie').attachEvent('onItemClick', cmd_agregar_serie_click)
+ $$('grid_folios').attachEvent('onItemClick', grid_folios_click)
+ }
+}
+
+
+function menu_user_click(id, e, node){
+ if (id == 1){
+ window.location = '/logout'
+ return
+ }
+}
+
+
+function cmd_home_click(){
+ window.location = '/main'
+}
+
+
+function cmd_save_emisor_click(){
+ var valid_cp = false
+ var form = $$('form_emisor')
+
+ if (!form.validate()){
+ msg = 'Valores inválidos'
+ msg_error(msg)
+ return
+ }
+
+ var values = form.getValues()
+
+ var ids = $$('lst_emisor_regimen').getSelectedId()
+ if(!ids){
+ msg = 'Selecciona al menos un Regimen Fiscal'
+ msg_error(msg)
+ return
+ }
+ if(values.emisor_cp && values.emisor_cp.length != 5){
+ msg = 'Longitud inválida del C.P.'
+ msg_error(msg)
+ return
+ }
+ if(values.emisor_cp2 && values.emisor_cp2.length != 5){
+ msg = 'Longitud inválida del C.P. de Expedición'
+ msg_error(msg)
+ return
+ }else if(values.emisor_cp2){
+ webix.ajax().sync().get('/values/cp', {cp: values.emisor_cp2}, {
+ error: function(text, data, xhr) {
+ msg = 'Error al consultar el C.P. de Expedición'
+ msg_error(msg)
+ },
+ success: function(text, data, xhr) {
+ var values = data.json();
+ if (values.estado == undefined){
+ msg = 'No se encontró el C.P., asegurate de que sea correcto'
+ msg_error(msg)
+ }else{
+ valid_cp = true
+ }
+ }
+ })
+ }
+ if(!valid_cp){
+ return
+ }
+
+ if(values.es_ong){
+ if(!values.ong_autorizacion){
+ msg = 'Si es ONG, el Número de Autorización del SAT es requerido'
+ msg_error(msg)
+ return
+ }
+ if(!values.ong_fecha){
+ msg = 'Si es ONG, la Fecha de Autorización del SAT es requerida'
+ msg_error(msg)
+ return
+ }
+ if(!values.ong_fecha_dof){
+ msg = 'Si es ONG, la Fecha de Publicación en DOF es requerida'
+ msg_error(msg)
+ return
+ }
+ }
+
+
+ values['regimenes'] = ids
+ webix.ajax().post('/emisor', values, {
+ error:function(text, data, XmlHttpRequest){
+ msg = 'Ocurrio un error, consulta a soporte técnico'
+ msg_error(msg)
+ },
+ success:function(text, data, XmlHttpRequest){
+ var values = data.json()
+ if(values.ok){
+ msg_sucess('Emisor guardado correctamente')
+ }else{
+ msg_error(values.msg)
+ }
+ }
+ })
+
+}
+
+
+function get_emisor(){
+ var form = $$('form_emisor')
+
+ webix.ajax().get("/emisor", {}, {
+ error: function(text, data, xhr) {
+ msg = 'Error al consultar'
+ msg_error(msg)
+ },
+ success: function(text, data, xhr) {
+ var values = data.json()
+ if (values.ok){
+ var emisor = values.row.emisor
+ $$('lst_emisor_regimen').parse(values.row.regimenes)
+ form.setValues(emisor, true)
+ $$('lst_emisor_regimen').select(emisor.regimenes)
+ }else{
+ msg_error(values.msg)
+ }
+ }
+ })
+
+}
+
+
+function get_certificado(){
+ var form = $$('form_cert')
+
+ webix.ajax().get("/values/cert", {}, {
+ error: function(text, data, xhr) {
+ msg = 'Error al consultar'
+ msg_error(msg)
+ },
+ success: function(text, data, xhr) {
+ var values = data.json()
+ form.setValues(values)
+ }
+ })
+
+}
+
+
+function get_table_folios(){
+ webix.ajax().get("/folios", {}, {
+ error: function(text, data, xhr) {
+ msg = 'Error al consultar'
+ msg_error(msg)
+ },
+ success: function(text, data, xhr) {
+ var values = data.json()
+ $$('grid_folios').parse(values)
+ }
+ })
+
+}
+
+
+function multi_admin_change(prevID, nextID){
+ //~ webix.message(nextID)
+ if(nextID == 'app_emisor'){
+ $$('tab_emisor').setValue('Datos Fiscales')
+ get_emisor()
+ get_certificado()
+ return
+ }
+
+ if(nextID == 'app_folios'){
+ get_table_folios()
+ return
+ }
+}
+
+
+function emisor_postal_code_key_up(){
+ var value = this.getValue()
+
+ if( value.length == 5 ){
+ webix.ajax().get('/values/cp', {cp: value}, {
+ error: function(text, data, xhr) {
+ msg = 'Error al consultar el C.P.'
+ msg_error(msg)
+ },
+ success: function(text, data, xhr) {
+ var values = data.json();
+ if (values.estado == undefined){
+ msg = 'No se encontró el C.P., asegurate de que sea correcto'
+ msg_error(msg)
+ } else {
+ $$('form_emisor').setValues({
+ emisor_cp2: value,
+ emisor_estado: values.estado,
+ emisor_municipio: values.municipio,
+ emisor_colonia: ''}, true)
+ $$('emisor_colonia').define('suggest', [])
+ if (webix.isArray(values.colonia)){
+ $$('emisor_colonia').define('suggest', values.colonia)
+ }else{
+ $$('form_emisor').setValues(
+ {emisor_colonia: values.colonia}, true)
+ }
+ $$('emisor_colonia').refresh()
+ }
+ }
+ })
+ }
+}
+
+
+function emisor_postal_code_key_press(code, e){
+ var data = [8, 9, 37, 39, 46]
+ if ( data.indexOf(code) >= 0 ){
+ return true;
+ }
+
+ if ( code < 48 || code > 57){
+ return false;
+ }
+}
+
+
+function chk_escuela_change(new_value, old_value){
+ var value = Boolean(new_value)
+ if (value){
+ $$('cmd_niveles').enable()
+ } else {
+ $$('cmd_niveles').disable()
+ }
+}
+
+
+function chk_ong_change(new_value, old_value){
+ var value = Boolean(new_value)
+ if (value){
+ $$('ong_autorizacion').enable()
+ $$('ong_fecha').enable()
+ $$('ong_fecha_dof').enable()
+ } else {
+ $$('ong_autorizacion').disable()
+ $$('ong_fecha').disable()
+ $$('ong_fecha_dof').disable()
+ }
+}
+
+
+function cmd_subir_certificado_click(){
+ var form = $$('form_upload')
+
+ if (!form.validate()){
+ msg = 'Valores inválidos'
+ msg_error(msg)
+ return
+ }
+
+ var values = form.getValues()
+
+ if(!values.contra.trim()){
+ msg = 'La contraseña no puede estar vacía'
+ msg_error(msg)
+ return
+ }
+
+ if($$('lst_cert').count() < 2){
+ msg = 'Selecciona al menos dos archivos: CER y KEY del certificado.'
+ msg_error(msg)
+ return
+ }
+
+ if($$('lst_cert').count() > 2){
+ msg = 'Selecciona solo dos archivos: CER y KEY del certificado.'
+ msg_error(msg)
+ return
+ }
+
+ var fo1 = $$('up_cert').files.getItem($$('up_cert').files.getFirstId())
+ var fo2 = $$('up_cert').files.getItem($$('up_cert').files.getLastId())
+
+ var ext = ['key', 'cer']
+ if(ext.indexOf(fo1.type.toLowerCase()) == -1 || ext.indexOf(fo2.type.toLowerCase()) == -1){
+ msg = 'Archivos inválidos, se requiere un archivo CER y un KEY.'
+ msg_error(msg)
+ return
+ }
+
+ if(fo1.type == fo2.type && fo1.size == fo2.size){
+ msg = 'Selecciona archivos diferentes: un archivo CER y un KEY.'
+ msg_error(msg)
+ return
+ }
+
+ var rfc = $$('form_cert').getValues()['cert_rfc']
+ if(rfc){
+ msg = 'Ya existe un certificado guardado
¿Deseas reemplazarlo?'
+ webix.confirm({
+ title: 'Certificado Existente',
+ ok: 'Si',
+ cancel: 'No',
+ type: 'confirm-error',
+ text: msg,
+ callback:function(result){
+ if(result){
+ $$('up_cert').send()
+ }
+ }
+ })
+ }
+}
+
+
+function up_cert_upload_complete(response){
+ if(response.status != 'server'){
+ msg = 'Ocurrio un error al subir los archivos'
+ msg_error(msg)
+ return
+ }
+
+ msg = 'Archivos subidos correctamente. Esperando validación'
+ msg_sucess(msg)
+
+ var values = $$('form_upload').getValues()
+ $$('form_upload').setValues({})
+ $$('up_cert').files.data.clearAll()
+
+ webix.ajax().post('/values/cert', values, {
+ error:function(text, data, XmlHttpRequest){
+ msg = 'Ocurrio un error, consulta a soporte técnico'
+ msg_error(msg)
+ },
+ success:function(text, data, XmlHttpRequest){
+ var values = data.json()
+ if(values.ok){
+ $$('form_cert').setValues(values.data)
+ msg_sucess(values.msg)
+ }else{
+ msg_error(values.msg)
+ }
+ }
+ })
+}
+
+
+function cmd_agregar_serie_click(){
+ var form = $$('form_folios')
+ var grid = $$('grid_folios')
+
+ if (!form.validate()){
+ msg = 'Valores inválidos'
+ msg_error(msg)
+ return
+ }
+
+ var values = form.getValues()
+
+ var reg = /^[a-z]+$/i
+ if(!reg.test(values.folio_serie)){
+ msg = 'Introduce una serie válida. Solo letras.'
+ msg_error(msg)
+ return
+ }
+
+ var pre = '1'
+ if(grid.count() > 0){
+ pre = ''
+ }
+
+ var usarcon = ''
+ if(values.folio_usarcon != 'S'){
+ usarcon = values.folio_usarcon
+ }
+
+ var values = {
+ serie: values.folio_serie.trim().toUpperCase(),
+ inicio: values.folio_inicio,
+ usarcon: usarcon,
+ default: pre,
+ }
+
+ webix.ajax().post('/folios', values, {
+ error:function(text, data, XmlHttpRequest){
+ msg = 'Ocurrio un error, consulta a soporte técnico'
+ msg_error(msg)
+ },
+ success:function(text, data, XmlHttpRequest){
+ var values = data.json()
+ if(values.ok){
+ form.setValues(
+ {folio_serie: '', folio_inicio: 1, folio_usarcon: 'S'})
+ grid.add(values.row)
+ msg = 'Serie agregada correctamente'
+ msg_sucess(msg)
+ }else{
+ msg_error(values.msg)
+ }
+ }
+ })
+}
+
+
+function grid_folios_click(id, e, node){
+ if(id.column != 'delete'){
+ return
+ }
+
+ msg = '¿Estás seguro de borrar esta serie?
ESTA ACCIÓN NO SE PUEDE DESHACER'
+ webix.confirm({
+ title: 'Borrar Serie',
+ ok: 'Si',
+ cancel: 'No',
+ type: 'confirm-error',
+ text: msg,
+ callback:function(result){
+ if(result){
+ webix.ajax().del('/folios', {id: id.row}, function(text, xml, xhr){
+ msg = 'Serie eliminada correctamente'
+ if(xhr.status == 200){
+ $$('grid_folios').remove(id.row)
+ msg_sucess(msg)
+ }else{
+ msg = 'No se pudo eliminar'
+ msg_error(msg)
+ }
+ })
+
+
+
+ }
+ }
+ })
+}
diff --git a/source/static/js/controller/invoices.js b/source/static/js/controller/invoices.js
new file mode 100644
index 0000000..eaf553d
--- /dev/null
+++ b/source/static/js/controller/invoices.js
@@ -0,0 +1,651 @@
+var query = []
+var grid = null
+var msg = ''
+
+
+function get_series(){
+ webix.ajax().get('/values/series', function(text, data){
+ var values = data.json()
+ table_series.clear()
+ table_series.insert(values)
+ pre = values[0]
+ $$('lst_serie').getList().parse(values)
+ $$('lst_serie').setValue(pre.id)
+ if(pre.usar_con){
+ $$('lst_tipo_comprobante').setValue(pre.usar_con)
+ $$('lst_tipo_comprobante').config.readonly = true
+ $$('lst_tipo_comprobante').refresh()
+ }
+ if(values.length == 1){
+ $$('lst_serie').config.readonly = true
+ $$('lst_serie').refresh()
+ }
+ })
+}
+
+
+function get_forma_pago(){
+ webix.ajax().get('/values/formapago', {key: true}, function(text, data){
+ var values = data.json()
+ //~ pre = values[0]
+ $$('lst_forma_pago').getList().parse(values)
+ //~ $$('lst_forma_pago').setValue(pre.id)
+ })
+}
+
+
+function get_monedas(){
+ webix.ajax().get('/values/monedas', function(text, data){
+ var values = data.json()
+ pre = values[0]
+ $$('lst_moneda').getList().parse(values)
+ $$('lst_moneda').setValue(pre.id)
+ if(values.length == 1){
+ $$('fs_moneda').hide()
+ $$('fs_moneda').refresh()
+ }
+ })
+}
+
+
+function get_uso_cfdi(){
+ get_uso_cfdi_to_table({key: true})
+ query = table_usocfdi.chain().data()
+ $$('lst_uso_cfdi').getList().parse(query)
+}
+
+
+function get_regimen_fiscal(){
+ webix.ajax().get('/values/regimenes', function(text, data){
+ var values = data.json()
+ pre = values[0]
+ $$('lst_regimen_fiscal').getList().parse(values)
+ $$('lst_regimen_fiscal').setValue(pre.id)
+ if(values.length == 1){
+ $$('fs_regimen_fiscal').hide()
+ $$('fs_regimen_fiscal').refresh()
+ }
+ })
+}
+
+
+function default_config(){
+ webix.ajax().sync().get('/values/taxes', function(text, data){
+ var values = data.json()
+ table_taxes.clear()
+ table_taxes.insert(values)
+ })
+ get_series()
+ get_forma_pago()
+ get_monedas()
+ get_uso_cfdi()
+ get_regimen_fiscal()
+ table_pt.clear()
+ table_totals.clear()
+}
+
+
+function cmd_new_invoice_click(id, e, node){
+ var form = $$('form_invoice')
+ var grid_totals = $$('grid_totals')
+ grid = $$('grid_details')
+
+ default_config()
+ form.adjust()
+ form.setValues({id: 0, id_partner: 0, lbl_client: 'Ninguno'})
+ grid.clearAll()
+ grid_totals.clearAll()
+ grid_totals.add({id: 1, concepto: 'SubTotal', importe: 0})
+ $$('multi_invoices').setValue('invoices_new')
+ form.focus('search_client_id')
+}
+
+
+function cmd_edit_invoice_click(id, e, node){
+
+ $$("multi_invoices").setValue("invoices_new")
+
+}
+
+
+function delete_invoice(id){
+ webix.ajax().del('/invoices', {id: id}, function(text, xml, xhr){
+ if(xhr.status == 200){
+ gi.remove(id)
+ msg_sucess('Factura eliminada correctamente')
+ }else{
+ msg_error('No se pudo eliminar')
+ }
+ })
+}
+
+
+function cmd_delete_invoice_click(id, e, node){
+
+ var row = gi.getSelectedItem()
+ if (row == undefined){
+ msg_error('Selecciona una factura')
+ return
+ }
+
+ if(row.uuid){
+ msg_error('Solo se pueden eliminar facturas sin timbrar')
+ return
+ }
+
+ var msg = '¿Estás seguro de eliminar la siguiente Factura?
'
+ msg += '(' + row['folio'] + ') ' + row['cliente']
+ msg += '
ESTA ACCIÓN NO SE PUEDE DESHACER'
+ webix.confirm({
+ title:'Eliminar Factura',
+ ok:'Si',
+ cancel:'No',
+ type:'confirm-error',
+ text:msg,
+ callback:function(result){
+ if (result){
+ delete_invoice(row['id'])
+ }
+ }
+ })
+}
+
+
+function validate_invoice(values){
+
+ if(values.id_partner == 0){
+ webix.UIManager.setFocus('search_client_name')
+ msg = 'Selecciona un cliente'
+ msg_error(msg)
+ return false
+ }
+
+ if(!grid.count()){
+ webix.UIManager.setFocus('search_product_id')
+ msg = 'Agrega al menos un producto o servicio'
+ msg_error(msg)
+ return false
+ }
+
+ var uso_cfdi = $$('lst_uso_cfdi').getValue()
+ if(uso_cfdi.trim() == ""){
+ webix.UIManager.setFocus('lst_uso_cfdi')
+ msg = 'El Uso del CFDI es requerido'
+ msg_error(msg)
+ return false
+ }
+
+ var forma_pago = $$('lst_forma_pago').getValue()
+ if(forma_pago.trim() == ""){
+ webix.UIManager.setFocus('lst_forma_pago')
+ msg = 'La Forma de pago es requerida'
+ msg_error(msg)
+ return false
+ }
+
+ var tipo_cambio = $$('txt_tipo_cambio').getValue()
+ if(tipo_cambio.trim() == ""){
+ webix.UIManager.setFocus('txt_tipo_cambio')
+ msg = 'El Tipo de Cambio es requerido'
+ msg_error(msg)
+ return false
+ }
+
+ if(isNaN(tipo_cambio * 1)){
+ webix.UIManager.setFocus('txt_tipo_cambio')
+ msg = 'El Tipo de Cambio debe ser un valor númerico'
+ msg_error(msg)
+ return false
+ }
+
+ var moneda = $$('lst_moneda').getValue()
+ if(moneda == 'MXN' && tipo_cambio != 1){
+ webix.UIManager.setFocus('txt_tipo_cambio')
+ msg = 'Si la moneda es MXN, el Tipo de Cambio debe ser 1.00'
+ msg_error(msg)
+ return false
+ }
+
+ if(moneda != 'MXN' && tipo_cambio == 1){
+ webix.UIManager.setFocus('txt_tipo_cambio')
+ msg = 'Si la moneda no es MXN, el Tipo de Cambio debe ser diferente de 1.00'
+ msg_error(msg)
+ return false
+ }
+
+
+ return true
+}
+
+
+function update_grid_invoices(values){
+ if(values.new){
+ gi.add(values.row)
+ }else{
+ gi.updateItem(values.row['id'], values.row)
+ }
+}
+
+function send_timbrar(id){
+ webix.ajax().get('/values/timbrar', {id: id}, function(text, data){
+ var values = data.json()
+ if(values.ok){
+ msg_sucess(values.msg)
+ gi.updateItem(id, values.row)
+ }else{
+ webix.alert({
+ title: 'Error al Timbrar',
+ text: values.msg,
+ type: 'alert-error'
+ })
+ }
+ })
+
+}
+
+
+function save_invoice(data){
+ var result = false
+ var values = NaN
+
+ webix.ajax().sync().post('invoices', data, {
+ error:function(text, data, XmlHttpRequest){
+ msg = 'Ocurrio un error, consulta a soporte técnico'
+ msg_error(msg)
+ },
+ success:function(text, data, XmlHttpRequest){
+ values = data.json();
+ if(values.ok){
+ msg_sucess('Factura guardada correctamente. Enviando a timbrar')
+ update_grid_invoices(values)
+ send_timbrar(values.row['id'])
+ result = true
+ }else{
+ msg_error(values.msg)
+ }
+ }
+ })
+
+ if(result){
+ table_pt.clear()
+ table_totals.clear()
+ grid.clearAll()
+ $$('grid_totals').clearAll()
+
+ }
+
+ return result
+}
+
+
+function cmd_timbrar_click(id, e, node){
+ var form = this.getFormView();
+
+ if(!form.validate()) {
+ webix.message({type:'error', text:'Valores inválidos'})
+ return
+ }
+
+ var values = form.getValues();
+ if(!validate_invoice(values)){
+ return
+ }
+
+ var rows = grid.data.getRange()
+ for (i = 0; i < rows.length; i++) {
+ delete rows[i]['delete']
+ delete rows[i]['clave']
+ delete rows[i]['descripcion']
+ delete rows[i]['unidad']
+ delete rows[i]['importe']
+ rows[i]['valor_unitario'] = parseFloat(rows[i]['valor_unitario'])
+ }
+
+ var data = new Object()
+ data['id'] = values.id
+ data['cliente'] = values.id_partner
+ data['productos'] = rows
+ data['serie'] = $$('lst_serie').getText()
+ data['forma_pago'] = $$('lst_forma_pago').getValue()
+ data['condiciones_pago'] = $$('txt_condicion_pago').getValue().trim()
+ data['moneda'] = $$('lst_moneda').getValue()
+ data['tipo_cambio'] = $$('txt_tipo_cambio').getValue()
+ data['tipo_comprobante'] = $$('lst_tipo_comprobante').getValue()
+ data['metodo_pago'] = $$('lst_metodo_pago').getValue()
+ data['uso_cfdi'] = $$('lst_uso_cfdi').getValue()
+ data['regimen_fiscal'] = $$('lst_regimen_fiscal').getValue()
+
+ if(!save_invoice(data)){
+ return
+ }
+
+ form.setValues({id_partner: 0, lbl_partner: 'Ninguno'})
+ $$('multi_invoices').setValue('invoices_home')
+}
+
+
+function cmd_close_invoice_click(id, e, node){
+ $$('multi_invoices').setValue('invoices_home')
+}
+
+
+function search_client_by_id(id){
+ var msg = ''
+ webix.ajax().get('/values/client', {'id': id}, {
+ error: function(text, data, xhr) {
+ webix.message({type: 'error', text: 'Error al consultar'})
+ },
+ success: function(text, data, xhr){
+ var values = data.json()
+ if (values.ok){
+ set_client(values.row)
+ }else{
+ msg = 'No se encontró un cliente con la clave: ' + id
+ webix.message({type:'error', text: msg})
+ }
+ }
+ })
+
+}
+
+
+function set_client(row){
+ var form = $$('form_invoice')
+ var html = ''
+ form.setValues({
+ id_partner:row.id, search_client_id:'', search_client_name:'',
+ forma_pago: row.forma_pago, uso_cfdi: row.uso_cfdi}, true)
+ html += row.nombre + ' (' + row.rfc + ')'
+ $$('lbl_client').setValue(html)
+ form.focus('search_product_id')
+}
+
+
+function grid_clients_found_click(obj){
+ set_client(obj)
+}
+
+
+function search_client_id_key_press(code, e){
+ var value = this.getValue()
+ if(code == 13 && value.length > 0){
+ var id = parseInt(value, 10)
+ if (isNaN(id)){
+ webix.message({type:'error', text:'Captura una clave válida'});
+ }else{
+ search_client_by_id(id)
+ }
+ }
+}
+
+
+function calculate_taxes(){
+ var tmp = null
+ table_totals.clear()
+ var subtotal = 0
+ var total_iva = 0
+ var id = 2
+ var grid_totals = $$('grid_totals')
+
+ grid_totals.clearAll()
+ grid_totals.add({id: 1, concepto: 'SubTotal', importe: 0})
+
+ grid.eachRow(function(row){
+ var product = grid.getItem(row)
+ subtotal += parseFloat(product.importe)
+ query = table_pt.chain().find({'product': product.id}).data()
+ for(var tax of query){
+ tmp = table_totals.findOne({'tax': tax.tax})
+ if(tmp === null){
+ table_totals.insert(
+ {'tax': tax.tax, 'importe': parseFloat(product.importe)})
+ tmp = table_totals.findOne({'tax': tax.tax})
+ }else{
+ tmp.importe += parseFloat(product.importe)
+ table_totals.update(tmp)
+ }
+ }
+ })
+
+ var tax = null
+ var tipo = 'Traslado '
+ var concepto = ''
+ var total_tax = 0
+ query = table_totals.chain().data()
+ for(var t of query){
+ tax = table_taxes.findOne({'id': t.tax})
+ if(tax.tipo == 'E' || tax.tipo == 'R'){
+ continue
+ }
+ concepto = tipo + tax.name + ' (' + tax.tasa + ')'
+ total_tax = (tax.tasa * t.importe).round(DECIMALES)
+ grid_totals.add({id: id, concepto: concepto, importe: total_tax})
+ id += 1
+ if(tax.name == 'IVA'){
+ total_iva += total_tax
+ }
+ }
+
+ tipo = 'Retención '
+ for(var t of query){
+ tax = table_taxes.findOne({'id': t.tax})
+ if(tax.tipo == 'E' || tax.tipo == 'T'){
+ continue
+ }
+ concepto = tipo + tax.name + ' (' + tax.tasa + ')'
+ if(tax.tasa == (2/3).round(6)){
+ total_tax = (tax.tasa * total_iva * -1).round(DECIMALES)
+ concepto = tipo + tax.name + ' (2/3)'
+ }else{
+ total_tax = (tax.tasa * t.importe * -1).round(DECIMALES)
+ }
+ grid_totals.add({id: id, concepto: concepto, importe: total_tax})
+ id += 1
+ }
+
+ var row = {importe: subtotal}
+ grid_totals.updateItem(1, row)
+}
+
+
+function set_product(values){
+ var taxes = values.taxes
+ var values = values.row
+ var form = $$('form_invoice')
+ var row = grid.getItem(values.id)
+
+ values['delete'] = '-'
+ if (row == undefined){
+ values['cantidad'] = 1
+ values['importe'] = values['valor_unitario']
+ grid.add(values)
+ } else {
+ values['cantidad'] = parseFloat(row.cantidad) + 1
+ values['importe'] = values['valor_unitario'] * values['cantidad']
+ grid.updateItem(row.id, values)
+ }
+ form.setValues({search_product_id:'', search_product_name:''}, true)
+
+ for(var v of taxes){
+ var pt = table_pt.findOne(v)
+ if(pt === null){
+ table_pt.insert(v)
+ }
+ }
+ calculate_taxes()
+}
+
+
+function grid_products_found_click(obj){
+ search_product_by_id(obj.id)
+}
+
+
+function search_product_by_id(id){
+ var msg = ''
+
+ webix.ajax().get('/values/product', {'id': id}, {
+ error: function(text, data, xhr) {
+ webix.message({type: 'error', text: 'Error al consultar'})
+ },
+ success: function(text, data, xhr){
+ var values = data.json()
+ if (values.ok){
+ set_product(values)
+ } else {
+ msg = 'No se encontró un producto con la clave: ' + id
+ webix.message({type: 'error', text: msg})
+ }
+ }
+ })
+
+}
+
+
+function search_product_id_key_press(code, e){
+ var value = this.getValue()
+ if(code == 13 && value.length > 0){
+ var id = parseInt(value, 10)
+ if (isNaN(id)){
+ webix.message({type: 'error', text: 'Captura una clave válida'});
+ }else{
+ search_product_by_id(id)
+ }
+ }
+}
+
+
+function grid_details_before_edit_start(id){
+ var columns = ['', 'descripcion', 'cantidad', 'valor_unitario']
+ if(!columns.indexOf(id.column)){
+ return !this.getItem(id.row)[id.column]
+ }
+}
+
+
+function grid_details_before_edit_stop(state, editor){
+ var row = grid.getItem(editor.row)
+
+ if(editor.column == 'descripcion'){
+ if(!state.value.trim()){
+ msg = 'La descripción no puede estar vacía'
+ webix.message({type:'error', text: msg})
+ grid.blockEvent()
+ state.value = state.old
+ grid.editCancel()
+ grid.unblockEvent()
+ return true
+ }
+ state.value = state.value.trim()
+ return true
+ }
+
+ if(editor.column == 'cantidad'){
+ var cantidad = parseFloat(state.value)
+ if(isNaN(cantidad)){
+ msg = 'La cantidad debe ser un número'
+ webix.message({type:'error', text: msg})
+ grid.blockEvent()
+ state.value = state.old
+ grid.editCancel()
+ grid.unblockEvent()
+ return true
+ }
+ var valor_unitario = row['valor_unitario']
+ }
+
+ if(editor.column == 'valor_unitario'){
+ var valor_unitario = parseFloat(state.value)
+ if(isNaN(valor_unitario)){
+ msg = 'El valor unitario debe ser un número'
+ webix.message({type:'error', text: msg})
+ grid.blockEvent()
+ state.value = state.old
+ grid.editCancel()
+ grid.unblockEvent()
+ return true
+ }
+ var cantidad = row['cantidad']
+ }
+
+ row['importe'] = (cantidad * valor_unitario).round(DECIMALES)
+ grid.refresh()
+ calculate_taxes()
+}
+
+
+function grid_details_click(id, e, node){
+ if(id.column != 'delete'){
+ return
+ }
+ grid.remove(id.row)
+ calculate_taxes()
+}
+
+
+function grid_details_header_click(id){
+ if(id.column != 'delete'){
+ return
+ }
+
+ var msg = '¿Estás seguro de quitar todos los productos?'
+ webix.confirm({
+ title: 'Quitar todos',
+ ok: 'Si',
+ cancel: 'No',
+ type: 'confirm-error',
+ text: msg,
+ callback:function(result){
+ if (result){
+ grid.clearAll()
+ calculate_taxes()
+ }
+ }
+ })
+}
+
+
+function cmd_refacturar_click(){
+ show('Refacturar')
+}
+
+
+function cmd_invoice_timbrar_click(){
+ if(gi.count() == 0){
+ return
+ }
+
+ var row = gi.getSelectedItem()
+ if (row == undefined){
+ msg_error('Selecciona una factura')
+ return
+ }
+
+ if(row.uuid){
+ msg_error('La factura ya esta timbrada')
+ return
+ }
+
+ msg = '¿Estás seguro de enviar a timbrar esta factura?'
+ webix.confirm({
+ title: 'Timbrar Factura',
+ ok: 'Si',
+ cancel: 'No',
+ type: 'confirm-error',
+ text: msg,
+ callback:function(result){
+ if(result){
+ send_timbrar(row.id)
+ }
+ }
+ })
+}
+
+
+function grid_invoices_click(id, e, node){
+ var row = this.getItem(id)
+ if(id.column == 'xml'){
+ location = '/doc/xml/' + row.id
+ }
+
+}
diff --git a/source/static/js/controller/main.js b/source/static/js/controller/main.js
new file mode 100644
index 0000000..8830ebd
--- /dev/null
+++ b/source/static/js/controller/main.js
@@ -0,0 +1,157 @@
+var gi = null
+
+
+var controllers = {
+ init: function(){
+ //~ Main
+ $$('menu_user').attachEvent('onMenuItemClick', menu_user_click);
+ //~ Partner
+ $$('cmd_new_partner').attachEvent('onItemClick', cmd_new_partner_click);
+ $$('cmd_new_contact').attachEvent('onItemClick', cmd_new_contact_click);
+ $$('cmd_edit_partner').attachEvent('onItemClick', cmd_edit_partner_click);
+ $$('cmd_delete_partner').attachEvent('onItemClick', cmd_delete_partner_click);
+ $$('cmd_save_partner').attachEvent('onItemClick', cmd_save_partner_click);
+ $$('cmd_cancel_partner').attachEvent('onItemClick', cmd_cancel_partner_click);
+ $$('cmd_cancel_contact').attachEvent('onItemClick', cmd_cancel_contact_click);
+ $$('codigo_postal').attachEvent('onKeyPress', postal_code_key_press);
+ $$('codigo_postal').attachEvent('onTimedKeyPress', postal_code_key_up);
+ $$('colonia').attachEvent('onFocus', colonia_on_focus)
+ $$("tipo_persona").attachEvent( "onChange", opt_tipo_change)
+ $$("es_cliente").attachEvent( "onChange", is_client_change)
+ $$("es_proveedor").attachEvent( "onChange", is_supplier_change)
+ $$("rfc").attachEvent( "onBlur", rfc_lost_focus)
+ $$('multi').attachEvent('onViewChange', multi_change)
+ //~ Products
+ $$("cmd_new_product").attachEvent("onItemClick", cmd_new_product_click)
+ $$("cmd_edit_product").attachEvent("onItemClick", cmd_edit_product_click)
+ $$("cmd_delete_product").attachEvent("onItemClick", cmd_delete_product_click)
+ $$("cmd_save_product").attachEvent("onItemClick", cmd_save_product_click)
+ $$("cmd_cancel_product").attachEvent("onItemClick", cmd_cancel_product_click)
+ $$("chk_automatica").attachEvent("onChange", chk_automatica_change)
+ $$("valor_unitario").attachEvent("onChange", valor_unitario_change)
+ //~ Invoices
+ $$('cmd_new_invoice').attachEvent("onItemClick", cmd_new_invoice_click)
+ $$('cmd_refacturar').attachEvent("onItemClick", cmd_refacturar_click)
+ $$('cmd_delete_invoice').attachEvent("onItemClick", cmd_delete_invoice_click)
+ $$('cmd_timbrar').attachEvent('onItemClick', cmd_timbrar_click)
+ $$('cmd_close_invoice').attachEvent('onItemClick', cmd_close_invoice_click)
+ $$('search_client_id').attachEvent('onKeyPress', search_client_id_key_press)
+ $$('grid_clients_found').attachEvent('onValueSuggest', grid_clients_found_click)
+ $$('search_product_id').attachEvent('onKeyPress', search_product_id_key_press)
+ $$('grid_products_found').attachEvent('onValueSuggest', grid_products_found_click)
+ $$('grid_details').attachEvent('onItemClick', grid_details_click)
+ $$('grid_details').attachEvent('onHeaderClick', grid_details_header_click)
+ $$('grid_details').attachEvent('onBeforeEditStart', grid_details_before_edit_start)
+ $$('grid_details').attachEvent('onBeforeEditStop', grid_details_before_edit_stop)
+ $$('cmd_invoice_timbrar').attachEvent('onItemClick', cmd_invoice_timbrar_click)
+ $$('grid_invoices').attachEvent('onItemClick', grid_invoices_click)
+ }
+}
+
+
+function get_uso_cfdi_to_table(args){
+ webix.ajax().sync().get('/values/usocfdi', args, function(text, data){
+ var values = data.json()
+ table_usocfdi.clear()
+ table_usocfdi.insert(values)
+ })
+}
+
+
+function get_partners(){
+ webix.ajax().get("/partners", {}, {
+ error: function(text, data, xhr) {
+ webix.message({ type:"error", text: "Error al consultar"});
+ },
+ success: function(text, data, xhr) {
+ var values = data.json();
+ $$("grid_partners").clearAll();
+ if (values.ok){
+ $$("grid_partners").parse(values.rows, 'json');
+ };
+ }
+ });
+}
+
+
+function get_products(){
+ var grid = $$('grid_products')
+ webix.ajax().get('/products', {}, {
+ error: function(text, data, xhr) {
+ webix.message({type: 'error', text: 'Error al consultar'})
+ },
+ success: function(text, data, xhr) {
+ var values = data.json();
+ grid.clearAll();
+ if (values.ok){
+ grid.parse(values.rows, 'json');
+ };
+ }
+ });
+}
+
+
+function get_invoices(){
+ var grid = $$('grid_invoices')
+ webix.ajax().get('/invoices', {}, {
+ error: function(text, data, xhr) {
+ webix.message({type: 'error', text: 'Error al consultar'})
+ },
+ success: function(text, data, xhr) {
+ var values = data.json();
+ grid.clearAll();
+ if (values.ok){
+ grid.parse(values.rows, 'json');
+ };
+ }
+ });
+}
+
+
+function menu_user_click(id, e, node){
+ if (id == 1){
+ window.location = '/logout';
+ return
+ }
+}
+
+
+function multi_change(prevID, nextID){
+ //~ webix.message(nextID)
+ if(nextID == 'app_partners'){
+ active = $$('multi_partners').getActiveId()
+ if(active == 'partners_home'){
+ get_partners()
+ }
+ return
+ }
+
+ if(nextID == 'app_products'){
+ active = $$('multi_products').getActiveId()
+ if(active == 'products_home'){
+ get_products()
+ }
+ return
+ }
+
+ if(nextID == 'app_invoices'){
+ active = $$('multi_invoices').getActiveId()
+ if(active == 'invoices_home'){
+ get_invoices()
+ }
+ gi = $$('grid_invoices')
+ return
+ }
+
+}
+
+
+function get_taxes(){
+ webix.ajax().sync().get('/values/taxes', function(text, data){
+ var values = data.json()
+ table_taxes.clear()
+ table_taxes.insert(values)
+ $$("grid_product_taxes").clearAll()
+ $$("grid_product_taxes").parse(values, 'json')
+ })
+}
diff --git a/source/static/js/controller/partners.js b/source/static/js/controller/partners.js
new file mode 100644
index 0000000..30d22c4
--- /dev/null
+++ b/source/static/js/controller/partners.js
@@ -0,0 +1,329 @@
+
+
+function cmd_new_partner_click(id, e, node){
+ $$('form_partner').setValues({
+ id: 0, pais: 'México', tipo_persona: 1, es_activo: true})
+ $$('forma_pago').getList().load('/values/formapago')
+ $$('grid_partners').clearSelection()
+ $$('multi_partners').setValue('partners_new')
+ $$('tab_partner').setValue('Datos Fiscales')
+
+ get_uso_cfdi_to_table({})
+ query = table_usocfdi.chain().find({fisica: true}).data()
+ $$('lst_uso_cfdi_socio').getList().parse(query)
+}
+
+
+function cmd_new_contact_click(id, e, node){
+ $$('grid_contacts').clearSelection()
+ $$('multi_contacts').setValue('contacts_new')
+}
+
+
+function cmd_edit_partner_click(id, e, node){
+ var msg = ''
+ var row = $$('grid_partners').getSelectedItem()
+
+ if (row == undefined){
+ msg = 'Selecciona un Socio de Negocio'
+ webix.message({type:'error', text: msg})
+ return
+ }
+
+ webix.ajax().get("/partners", {id: row['id']}, {
+ error: function(text, data, xhr) {
+ webix.message({type:"error", text: "Error al consultar"})
+ },
+ success: function(text, data, xhr){
+ var values = data.json()
+ $$('form_partner').setValues(values)
+ $$('forma_pago').getList().load('/values/formapago')
+
+ get_uso_cfdi_to_table({})
+ if(values.tipo_persona == 1){
+ query = table_usocfdi.chain().find({fisica: true}).data()
+ }else if(values.tipo_persona == 2){
+ query = table_usocfdi.chain().find({moral: true}).data()
+ }else{
+ query = [{id: 'P01', value: 'Por definir'}]
+ }
+ $$('lst_uso_cfdi_socio').getList().parse(query)
+ if(values.es_cliente){
+ $$('cuenta_cliente').enable()
+ }
+ if(values.es_proveedor){
+ $$('cuenta_proveedor').enable()
+ }
+ }
+ })
+
+ $$('multi_partners').setValue('partners_new')
+ $$('tab_partner').setValue('Datos Fiscales')
+};
+
+
+function cmd_delete_partner_click(id, e, node){
+ var msg = ''
+ var row = $$('grid_partners').getSelectedItem()
+
+ if (row == undefined){
+ msg = 'Selecciona un Cliente o Proveedor'
+ webix.message({type:'error', text: msg})
+ return
+ }
+
+ msg = '¿Estás seguro de eliminar al cliente?
'
+ msg += row['nombre'] + ' (' + row['rfc'] + ')'
+ msg += '
ESTA ACCIÓN NO SE PUEDE DESHACER
'
+ msg += 'Solo se pueden eliminar clientes o proveedores sin documentos '
+ msg += 'relacionados. Se recomienda solo desactivar en vez de eliminar'
+ webix.confirm({
+ title:'Eliminar Cliente',
+ ok:'Si',
+ cancel:'No',
+ type:'confirm-error',
+ text:msg,
+ callback:function(result){
+ if (result){
+ delete_partner(row['id'])
+ }
+ }
+ })
+};
+
+
+function delete_partner(id){
+ webix.ajax().del('/partners', {id: id}, function(text, xml, xhr){
+ var msg = 'Socio eliminado correctamente'
+ if (xhr.status == 200){
+ $$('grid_partners').remove(id);
+ webix.message({type: 'success', text: msg})
+ } else {
+ msg = 'No se pudo eliminar. Asegurate de que no tenga documentos relacionados'
+ webix.message({type: 'error', text: msg})
+ }
+ })
+}
+
+
+function cmd_save_partner_click(id, e, node){
+ var msg = 'Valores inválidos'
+ var form = this.getFormView();
+
+ if (!form.validate()) {
+ webix.message({type: 'error', text: msg})
+ return
+ }
+
+ var values = form.getValues();
+
+ if(values.codigo_postal && values.codigo_postal.length != 5){
+ msg = 'Longitud inválida del C.P.'
+ msg_error(msg)
+ return
+ }
+
+ if (!values.es_cliente && !values.es_proveedor){
+ msg = 'Selecciona si es cliente, proveedor o ambos'
+ msg_error(msg)
+ $$('tab_partner').setValue('Otros Datos')
+ return
+ }
+
+ webix.ajax().post('/partners', values, {
+ error:function(text, data, XmlHttpRequest){
+ msg = 'Ocurrio un error, consulta a soporte técnico';
+ webix.message({type:'error', text:msg});
+ },
+ success:function(text, data, XmlHttpRequest){
+ var values = data.json();
+ if (values.ok) {
+ update_grid_partner(values)
+ } else {
+ webix.message({type:'error', text:values.msg});
+ }
+ }
+ })
+
+}
+
+
+function update_grid_partner(values){
+ var msg = 'Socio de negocio agregado correctamente'
+ if (values.new){
+ $$('form_partner').clear()
+ $$('grid_partners').add(values.row)
+ }else{
+ msg = 'Socio de negocio actualizado correctamente'
+ $$("grid_partners").updateItem(values.row['id'], values.row)
+ }
+ $$('multi_partners').setValue('partners_home')
+ webix.message({type:'success', text: msg})
+}
+
+
+function cmd_cancel_partner_click(id, e, node){
+ $$('multi_partners').setValue('partners_home')
+}
+
+
+function cmd_cancel_contact_click(id, e, node){
+ $$('multi_contacts').setValue('contacts_home')
+}
+
+
+function postal_code_key_up(){
+ var value = this.getValue()
+ var msg = ''
+ if( value.length == 5 ){
+ webix.ajax().get('/values/cp', {cp: value}, {
+ error: function(text, data, xhr) {
+ webix.message({type:'error', text:'Error al consultar el C.P.'})
+ },
+ success: function(text, data, xhr) {
+ var values = data.json();
+ if (values.estado == undefined){
+ msg = 'No se encontró el C.P., asegurate de que sea correcto'
+ webix.message({type:'error', text:msg})
+ } else {
+ $$('form_partner').setValues({
+ estado: values.estado,
+ municipio: values.municipio,
+ colonia: ''}, true)
+ $$('colonia').define('suggest', [])
+ if (webix.isArray(values.colonia)){
+ $$('colonia').define('suggest', values.colonia)
+ }else{
+ $$('form_partner').setValues({colonia: values.colonia}, true)
+ }
+ $$('colonia').refresh()
+ $$('form_partner').focus('colonia')
+ }
+ }
+ })
+ }
+}
+
+
+function postal_code_key_press(code, e){
+ var data = [8, 9, 37, 39, 46]
+ if ( data.indexOf(code) >= 0 ){
+ return true;
+ }
+
+ if ( code < 48 || code > 57){
+ return false;
+ }
+}
+
+
+function colonia_on_focus(){
+ if ($$(this.config.suggest).getList().config.height > 2){
+ $$(this.config.suggest).show(this.getInputNode())
+ }
+}
+
+
+function opt_tipo_change(new_value, old_value){
+
+ $$("nombre").define("value", "")
+ $$("pais").define("readonly", true)
+ $$("pais").define("value", PAIS)
+
+
+ if (new_value == 1 || new_value == 2){
+ $$("rfc").define("value", "");
+ $$("rfc").define("readonly", false);
+ } else if (new_value == 3) {
+ $$("rfc").define("value", RFC_PUBLICO);
+ $$("nombre").define("value", PUBLICO);
+ $$("rfc").define("readonly", true);
+ } else if (new_value == 4) {
+ $$("rfc").define("value", RFC_EXTRANJERO);
+ $$("rfc").define("readonly", true);
+ $$("pais").define("readonly", false);
+ $$("pais").define("value", "");
+ }
+
+ $$("nombre").refresh();
+ $$("rfc").refresh();
+ $$("pais").refresh();
+ if (new_value == 3) {
+ $$("calle").focus();
+ } else {
+ $$("rfc").focus();
+ }
+
+ $$('lst_uso_cfdi_socio').define('suggest', [])
+ if (new_value == 1){
+ query = table_usocfdi.chain().find({fisica: true}).data()
+ }else if (new_value == 2){
+ query = table_usocfdi.chain().find({moral: true}).data()
+ }else{
+ query = [{id: 'P01', value: 'Por definir'}]
+ }
+ $$('lst_uso_cfdi_socio').getList().parse(query)
+ $$('lst_uso_cfdi_socio').refresh()
+}
+
+
+function is_client_change(new_value, old_value){
+ var value = Boolean(new_value)
+ if (value){
+ $$("cuenta_cliente").enable();
+ } else {
+ $$("cuenta_cliente").disable();
+ }
+}
+
+
+function is_supplier_change(new_value, old_value){
+ var value = Boolean(new_value)
+ if (value){
+ $$("cuenta_proveedor").enable();
+ } else {
+ $$("cuenta_proveedor").disable();
+ }
+}
+
+
+function rfc_lost_focus(prev_view){
+ //~ var form = this.getFormView()
+ //~ var values = form.getValues()
+
+ //~ if (values.rfc.trim() == ""){
+ //~ return
+ //~ }
+
+ //~ if (values.id == undefined){
+ //~ exclude = ''
+ //~ } else {
+ //~ exclude = {'id': values.id}
+ //~ }
+
+ //~ values = {
+ //~ 'table': 'partner',
+ //~ 'filter': {'rfc': values.rfc.trim().toUpperCase()},
+ //~ 'exclude': exclude,
+ //~ }
+ //~ webix.message(values)
+ //~ webix.ajax().get("/values/validate", values, {
+ //~ error:function(text, data, XmlHttpRequest){
+ //~ msg = "No se pudo validar el RFC"
+ //~ webix.message({ type:"error", text: msg });
+ //~ },
+ //~ success:function(text, data, XmlHttpRequest){
+ //~ var values = data.json();
+ //~ if (values.exists) {
+ //~ msg = "El RFC ya existe"
+ //~ webix.message({ type:"error", text: msg });
+ //~ }
+ //~ }
+ //~ })
+}
+
+
+function multi_partners_change(prevID, nextID){
+ webix.message(prevID)
+ webix.message(nextID)
+}
diff --git a/source/static/js/controller/products.js b/source/static/js/controller/products.js
new file mode 100644
index 0000000..b63daee
--- /dev/null
+++ b/source/static/js/controller/products.js
@@ -0,0 +1,203 @@
+
+
+function cmd_new_product_click(id, e, node){
+ $$('form_product').setValues({
+ id: 0, es_activo_producto: true})
+ add_config({'key': 'id_product', 'value': ''})
+ get_new_key()
+ get_taxes()
+ $$('grid_products').clearSelection()
+ $$('categoria').getList().load('/values/categorias')
+ $$('unidad').getList().load('/values/unidades')
+ $$("multi_products").setValue("product_new")
+}
+
+
+function cmd_edit_product_click(id, e, node){
+ var grid = $$('grid_products')
+ var row = grid.getSelectedItem()
+ if(row == undefined){
+ webix.message({type: 'error', text: 'Selecciona un Producto'})
+ return
+ }
+
+ get_taxes()
+ $$('categoria').getList().load('/values/categorias')
+ $$('unidad').getList().load('/values/unidades')
+
+ webix.ajax().get('/products', {id:row['id']}, {
+ error: function(text, data, xhr) {
+ webix.message({type: 'error', text: 'Error al consultar'})
+ },
+ success: function(text, data, xhr){
+ var values = data.json()
+ $$('form_product').setValues(values.row)
+ add_config({'key': 'id_product', 'value': values.row.id})
+ for(i = 0; i < values.taxes.length; i++){
+ $$('grid_product_taxes').select(values.taxes[i], true)
+ }
+ }
+ })
+ $$('multi_products').setValue('product_new')
+
+};
+
+
+function delete_product(id){
+ webix.ajax().del('/products', {id:id}, function(text, xml, xhr){
+ var msg = 'Producto eliminado correctamente'
+ if(xhr.status == 200){
+ $$('grid_products').remove(id)
+ webix.message({type:'success', text:msg})
+ }else{
+ msg = 'No se pudo eliminar'
+ webix.message({type:'error', text:msg})
+ }
+ })
+}
+
+
+function cmd_delete_product_click(id, e, node){
+ var row = $$('grid_products').getSelectedItem()
+ if (row == undefined){
+ webix.message({type:'error', text: 'Selecciona un Producto'})
+ return
+ }
+
+ var msg = '¿Estás seguro de eliminar el Producto?
'
+ msg += '(' + row['clave'] + ') ' + row['descripcion']
+ msg += '
ESTA ACCIÓN NO SE PUEDE DESHACER
Se recomienda '
+ msg += 'solo desactivar el producto en vez de eliminar'
+ webix.confirm({
+ title: 'Eliminar Producto',
+ ok: 'Si',
+ cancel: 'No',
+ type: 'confirm-error',
+ text: msg,
+ callback:function(result){
+ if (result){
+ delete_product(row['id'])
+ }
+ }
+ })
+}
+
+
+function validate_sat_key_product(key, text){
+ var result = false
+ webix.ajax().sync().get('/values/satkey', {key:key}, function(text, data){
+ result = data.json()
+ })
+ if(text){
+ if(result.ok){
+ return '' + result.text + ''
+ }else{
+ return '' + result.text + ''
+ }
+ }
+ return result.ok
+}
+
+
+function update_grid_products(values){
+ var msg = 'Producto agregado correctamente'
+ if(values.new){
+ $$('form_product').clear()
+ $$('grid_products').add(values.row)
+ }else{
+ msg = 'Producto actualizado correctamente'
+ $$("grid_products").updateItem(values.row['id'], values.row)
+ }
+ $$('multi_products').setValue('products_home')
+ webix.message({type: 'success', text: msg})
+}
+
+
+function cmd_save_product_click(id, e, node){
+ var msg = ''
+ var form = this.getFormView()
+
+ if(!form.validate()){
+ webix.message({type: 'error', text: 'Valores inválidos'})
+ return
+ }
+
+ var rows = $$('grid_product_taxes').getSelectedId(true, true)
+ if (rows.length == 0){
+ webix.message({type: 'error', text: 'Selecciona un impuesto'})
+ return
+ }
+
+ var values = form.getValues();
+
+ if (!validate_sat_key_product(values.clave_sat, false)){
+ webix.message({ type:'error', text:'La clave SAT no existe' })
+ return
+ }
+
+ values['taxes'] = JSON.stringify(rows)
+ webix.ajax().sync().post('products', values, {
+ error:function(text, data, XmlHttpRequest){
+ msg = 'Ocurrio un error, consulta a soporte técnico'
+ webix.message({type: 'error', text: msg})
+ },
+ success:function(text, data, XmlHttpRequest){
+ var values = data.json();
+ if (values.ok) {
+ update_grid_products(values)
+ }else{
+ webix.message({type:'error', text:values.msg})
+ }
+ }
+ })
+}
+
+
+function cmd_cancel_product_click(id, e, node){
+
+ $$("multi_products").setValue("products_home")
+
+};
+
+
+function chk_automatica_change(new_value, old_value){
+ var value = Boolean(new_value)
+ if (value){
+ var value = get_config('id_product')
+ if(value){
+ $$("clave").setValue(value)
+ $$("clave").refresh()
+ }else{
+ get_new_key()
+ }
+ $$("clave").config.readonly = true
+ $$('form_product').focus('clave_sat')
+ } else {
+ $$("clave").setValue('')
+ $$("clave").config.readonly = false
+ $$('form_product').focus('clave')
+ }
+ $$("clave").refresh()
+}
+
+
+function get_new_key(){
+ webix.ajax().get('/values/newkey', {
+ error: function(text, data, xhr) {
+ webix.message({type:'error', text: text})
+ },
+ success: function(text, data, xhr) {
+ var values = data.json();
+ $$("clave").setValue(values.value)
+ $$("clave").refresh()
+ }
+ })
+}
+
+
+function valor_unitario_change(new_value, old_value){
+ if(!isFinite(new_value)){
+ this.config.value = old_value
+ this.refresh()
+ }
+}
diff --git a/source/static/js/controller/util.js b/source/static/js/controller/util.js
new file mode 100644
index 0000000..568d557
--- /dev/null
+++ b/source/static/js/controller/util.js
@@ -0,0 +1,149 @@
+var PUBLICO = "Público en general";
+var RFC_PUBLICO = "XAXX010101000";
+var RFC_EXTRANJERO = "XEXX010101000";
+var PAIS = "México";
+var DECIMALES = 2;
+
+
+var db = new loki('data.db');
+var table_config = db.addCollection('config')
+var table_taxes = db.addCollection('taxes')
+var table_pt = db.addCollection('productstaxes')
+var table_totals = db.addCollection('totals', {unique: ['tax']})
+var table_series = db.addCollection('series')
+var table_usocfdi = db.addCollection('usocfdi')
+
+
+function show(values){
+ webix.message(JSON.stringify(values, null, 2))
+}
+
+
+function msg_error(msg){
+ webix.message({type: 'error', text: msg})
+}
+
+
+function msg_sucess(msg){
+ webix.message({type: 'sucess', text: msg})
+}
+
+
+Number.prototype.round = function(decimals){
+ return Number((Math.round(this + "e" + decimals) + "e-" + decimals))
+}
+
+
+webix.protoUI({
+ $cssName: "text",
+ name: "currency",
+ $init:function(){
+ this.attachEvent("onItemClick", function(){
+ this.$setValue(this.config.raw, true)
+ })
+ this.attachEvent("onBlur", function(){
+ this.$setValue(this.config.value)
+ })
+ },
+ $render:function(){
+ this.$setValue(this.config.value)
+ },
+ $setValue:function(value, raw){
+ this.config.raw = value
+ if(!raw){
+ value = webix.i18n.priceFormat(value)
+ }
+ this.getInputNode().value = value
+ }
+}, webix.ui.text)
+
+
+webix.ui.datafilter.rowCount = webix.extend({
+ refresh:function(master, node, value){
+ node.firstChild.innerHTML = master.count();
+ }
+}, webix.ui.datafilter.summColumn)
+
+
+function validate_rfc(value){
+ rfc = value.trim().toUpperCase();
+ if ( rfc == ""){
+ webix.message({ type:"error", text:"El RFC no puede estar vacío" });
+ return false
+ }
+
+ var tipo_persona = $$('tipo_persona').getValue()
+ var length = 13
+ var start = 4
+ if(tipo_persona==2){
+ length = 12
+ start = 2
+ }
+ if (rfc.length != length){
+ webix.message({ type:"error", text:"Longitud incorrecta del RFC" });
+ return false
+ }
+ if (tipo_persona < 3 && (rfc == RFC_PUBLICO || rfc == RFC_EXTRANJERO)){
+ webix.message({ type:"error", text:"RFC incorrecto" });
+ return false
+ }
+
+ var part = rfc.slice(0, start);
+ var re = new RegExp('[a-z&Ñ]{' + start + '}', 'i');
+ if (!part.match(re)){
+ webix.message({ type:"error", text: "El RFC tiene caractéres inválidos al inicio" });
+ return false
+ }
+ part = rfc.slice(-3);
+ re = new RegExp('[a-z0-9]{3}', 'i');
+ if (!part.match(re)){
+ webix.message({ type:"error", text: "El RFC tiene caractéres inválidos al final" });
+ return false
+ }
+
+ part = rfc.slice(-9, -3);
+ re = new RegExp('[0-9]{6}', 'i');
+ if (!part.match(re)){
+ webix.message({ type:"error", text: "Fecha inválida" });
+ return false
+ }
+ var month = parseInt(part.slice(-4, -2))
+ if (month == 0 || month > 12 ){
+ webix.message({ type:"error", text: "Fecha inválida" });
+ return false
+ }
+ var day = parseInt(part.slice(-2))
+ if (day == 0 || day > 31 ){
+ webix.message({ type:"error", text: "Fecha inválida" });
+ return false
+ }
+
+ return true
+}
+
+
+function validate_email(email){
+ var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+ return re.test(email)
+}
+
+
+function add_config(args){
+ var key = table_config.findOne({key: args.key})
+ if(key===null){
+ table_config.insert(args)
+ }else{
+ key.value = args.value
+ table_config.update(key)
+ }
+}
+
+
+function get_config(value){
+ var key = table_config.findOne({key: value})
+ if(key===null){
+ return ''
+ }else{
+ return key.value
+ }
+}
diff --git a/source/static/js/es-MX.js b/source/static/js/es-MX.js
new file mode 100644
index 0000000..c86f89e
--- /dev/null
+++ b/source/static/js/es-MX.js
@@ -0,0 +1,26 @@
+/*Spanish (Mexico) locale*/
+webix.i18n.locales["es-MX"] = {
+ groupDelimiter:",",
+ groupSize:3,
+ decimalDelimiter:".",
+ decimalSize:2,
+ dateFormat:"%d/%n/%Y",
+ timeFormat:"%h:%i %a",
+ longDateFormat:"%l, %d' %je '%F' %je '%Y",
+ fullDateFormat:"%l, %d' %je '%F' %je '%Y %h:%i %a",
+ am:["a.m.","A.M."],
+ pm:["p.m.","P.M."],
+ price:"${obj}",
+ priceSettings:{
+ groupDelimiter:",",
+ groupSize:3,
+ decimalDelimiter:".",
+ decimalSize:2
+ },
+ calendar:{
+ monthFull:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],
+ monthShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],
+ dayFull:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+ dayShort:["dom","lun","mar","mié","jue","vie","sáb"]
+ }
+};
diff --git a/source/static/js/es.js b/source/static/js/es.js
new file mode 100644
index 0000000..7a41a7e
--- /dev/null
+++ b/source/static/js/es.js
@@ -0,0 +1,26 @@
+/*Spanish locale*/
+webix.i18n.locales["es"] = {
+ groupDelimiter:".",
+ groupSize:3,
+ decimalDelimiter:",",
+ decimalSize:2,
+ dateFormat:"%d/%n/%Y",
+ timeFormat:"%G:%i",
+ longDateFormat:"%l, %d' %je '%F' %je '%Y",
+ fullDateFormat:"%l, %d' %je '%F' %je '%Y %G:%i",
+ am:null,
+ pm:null,
+ price:"{obj} €",
+ priceSettings:{
+ groupDelimiter:".",
+ groupSize:3,
+ decimalDelimiter:",",
+ decimalSize:2
+ },
+ calendar:{
+ monthFull:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],
+ monthShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],
+ dayFull:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+ dayShort:["dom","lun","mar","mié","jue","vie","sáb"]
+ }
+};
diff --git a/source/static/js/lokijs.min.js b/source/static/js/lokijs.min.js
new file mode 100644
index 0000000..cf245f0
--- /dev/null
+++ b/source/static/js/lokijs.min.js
@@ -0,0 +1,3 @@
+(function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else if(typeof exports==="object"){module.exports=factory()}else{root.loki=factory()}})(this,function(){return function(){"use strict";var hasOwnProperty=Object.prototype.hasOwnProperty;var Utils={copyProperties:function(src,dest){var prop;for(prop in src){dest[prop]=src[prop]}},resolveTransformObject:function(subObj,params,depth){var prop,pname;if(typeof depth!=="number"){depth=0}if(++depth>=10)return subObj;for(prop in subObj){if(typeof subObj[prop]==="string"&&subObj[prop].indexOf("[%lktxp]")===0){pname=subObj[prop].substring(8);if(params.hasOwnProperty(pname)){subObj[prop]=params[pname]}}else if(typeof subObj[prop]==="object"){subObj[prop]=Utils.resolveTransformObject(subObj[prop],params,depth)}}return subObj},resolveTransformParams:function(transform,params){var idx,clonedStep,resolvedTransform=[];if(typeof params==="undefined")return transform;for(idx=0;idxcv2)return false;return equal}if(cv1===cv1&&cv2!==cv2){return true}if(cv2===cv2&&cv1!==cv1){return false}if(prop1prop2)return false;if(prop1==prop2)return equal;cv1=prop1.toString();cv2=prop2.toString();if(cv1t2}}cv1=Number(prop1);cv2=Number(prop2);if(cv1===cv1&&cv2===cv2){if(cv1>cv2)return true;if(cv1prop2)return true;if(prop1cv2){return true}if(cv1==cv2){return equal}return false}function sortHelper(prop1,prop2,desc){if(aeqHelper(prop1,prop2))return 0;if(ltHelper(prop1,prop2,false)){return desc?1:-1}if(gtHelper(prop1,prop2,false)){return desc?-1:1}return 0}function compoundeval(properties,obj1,obj2){var res=0;var prop,field,val1,val2,arr;for(var i=0,len=properties.length;i=paths.length){valueFound=fun(element,value)}else if(Array.isArray(element)){for(var index=0,len=element.length;index=0){return this.serializeCollection({delimited:options.delimited,delimiter:options.delimiter,collectionIndex:options.partition})}dbcopy=new Loki(this.filename);dbcopy.loadJSONObject(this);for(idx=0;idxcollCount){done=true}}else{currObject=JSON.parse(workarray[lineIndex]);cdb.collections[collIndex].data.push(currObject)}workarray[lineIndex++]=null}return cdb};Loki.prototype.deserializeCollection=function(destructuredSource,options){var workarray=[];var idx,len;options=options||{};if(!options.hasOwnProperty("partitioned")){options.partitioned=false}if(!options.hasOwnProperty("delimited")){options.delimited=true}if(!options.hasOwnProperty("delimiter")){options.delimiter=this.options.destructureDelimiter}if(options.delimited){workarray=destructuredSource.split(options.delimiter);workarray.pop()}else{workarray=destructuredSource}len=workarray.length;for(idx=0;idx=cdlen)doneWithPartition=true}if(pageLen>=this.options.pageSize)doneWithPage=true;if(!doneWithPage||doneWithPartition){pageBuilder+=this.options.delimiter;pageLen+=delimlen}if(doneWithPartition||doneWithPage){this.adapter.saveDatabase(keyname,pageBuilder,pageSaveCallback);return}}};function LokiFsAdapter(){this.fs=require("fs")}LokiFsAdapter.prototype.loadDatabase=function loadDatabase(dbname,callback){var self=this;this.fs.stat(dbname,function(err,stats){if(!err&&stats.isFile()){self.fs.readFile(dbname,{encoding:"utf8"},function readFileCallback(err,data){if(err){callback(new Error(err))}else{callback(data)}})}else{callback(null)}})};LokiFsAdapter.prototype.saveDatabase=function saveDatabase(dbname,dbstring,callback){var self=this;var tmpdbname=dbname+"~";this.fs.writeFile(tmpdbname,dbstring,function writeFileCallback(err){if(err){callback(new Error(err))}else{self.fs.rename(tmpdbname,dbname,callback)}})};LokiFsAdapter.prototype.deleteDatabase=function deleteDatabase(dbname,callback){this.fs.unlink(dbname,function deleteDatabaseCallback(err){if(err){callback(new Error(err))}else{callback()}})};function LokiLocalStorageAdapter(){}LokiLocalStorageAdapter.prototype.loadDatabase=function loadDatabase(dbname,callback){if(localStorageAvailable()){callback(localStorage.getItem(dbname))}else{callback(new Error("localStorage is not available"))}};LokiLocalStorageAdapter.prototype.saveDatabase=function saveDatabase(dbname,dbstring,callback){if(localStorageAvailable()){localStorage.setItem(dbname,dbstring);callback(null)}else{callback(new Error("localStorage is not available"))}};LokiLocalStorageAdapter.prototype.deleteDatabase=function deleteDatabase(dbname,callback){if(localStorageAvailable()){localStorage.removeItem(dbname);callback(null)}else{callback(new Error("localStorage is not available"))}};Loki.prototype.throttledSaveDrain=function(callback,options){var self=this;var now=(new Date).getTime();if(!this.throttledSaves){callback(true)}options=options||{};if(!options.hasOwnProperty("recursiveWait")){options.recursiveWait=true}if(!options.hasOwnProperty("recursiveWaitLimit")){options.recursiveWaitLimit=false}if(!options.hasOwnProperty("recursiveWaitLimitDuration")){options.recursiveWaitLimitDuration=2e3}if(!options.hasOwnProperty("started")){options.started=(new Date).getTime()}if(this.throttledSaves&&this.throttledSavePending){if(options.recursiveWait){this.throttledCallbacks.push(function(){if(self.throttledSavePending){if(options.recursiveWaitLimit&&now-options.started>options.recursiveWaitLimitDuration){callback(false);return}self.throttledSaveDrain(callback,options);return}else{callback(true);return}})}else{this.throttledCallbacks.push(callback);return}}else{callback(true)}};Loki.prototype.loadDatabaseInternal=function(options,callback){var cFun=callback||function(err,data){if(err){throw err}},self=this;if(this.persistenceAdapter!==null){
+this.persistenceAdapter.loadDatabase(this.filename,function loadDatabaseCallback(dbString){if(typeof dbString==="string"){var parseSuccess=false;try{self.loadJSON(dbString,options||{});parseSuccess=true}catch(err){cFun(err)}if(parseSuccess){cFun(null);self.emit("loaded","database "+self.filename+" loaded")}}else{if(!dbString){cFun(null);self.emit("loaded","empty database "+self.filename+" loaded");return}if(dbString instanceof Error){cFun(dbString);return}if(typeof dbString==="object"){self.loadJSONObject(dbString,options||{});cFun(null);self.emit("loaded","database "+self.filename+" loaded");return}cFun("unexpected adapter response : "+dbString)}})}else{cFun(new Error("persistenceAdapter not configured"))}};Loki.prototype.loadDatabase=function(options,callback){var self=this;if(!this.throttledSaves){this.loadDatabaseInternal(options,callback);return}this.throttledSaveDrain(function(success){if(success){self.throttledSavePending=true;self.loadDatabaseInternal(options,function(err){if(self.throttledCallbacks.length===0){self.throttledSavePending=false}else{self.saveDatabase()}if(typeof callback==="function"){callback(err)}});return}else{if(typeof callback==="function"){callback(new Error("Unable to pause save throttling long enough to read database"))}}},options)};Loki.prototype.saveDatabaseInternal=function(callback){var cFun=callback||function(err){if(err){throw err}return},self=this;if(this.persistenceAdapter!==null){if(this.persistenceAdapter.mode==="reference"&&typeof this.persistenceAdapter.exportDatabase==="function"){this.persistenceAdapter.exportDatabase(this.filename,this.copy({removeNonSerializable:true}),function exportDatabaseCallback(err){self.autosaveClearFlags();cFun(err)})}else{this.persistenceAdapter.saveDatabase(this.filename,self.serialize(),function saveDatabasecallback(err){self.autosaveClearFlags();cFun(err)})}}else{cFun(new Error("persistenceAdapter not configured"))}};Loki.prototype.saveDatabase=function(callback){if(!this.throttledSaves){this.saveDatabaseInternal(callback);return}if(this.throttledSavePending){this.throttledCallbacks.push(callback);return}var localCallbacks=this.throttledCallbacks;this.throttledCallbacks=[];localCallbacks.unshift(callback);this.throttledSavePending=true;var self=this;this.saveDatabaseInternal(function(err){self.throttledSavePending=false;localCallbacks.forEach(function(pcb){if(typeof pcb==="function"){setTimeout(function(){pcb(err)},1)}});if(self.throttledCallbacks.length>0){self.saveDatabase()}})};Loki.prototype.save=Loki.prototype.saveDatabase;Loki.prototype.deleteDatabase=function(options,callback){var cFun=callback||function(err,data){if(err){throw err}};if(typeof options==="function"&&!callback){cFun=options}if(this.persistenceAdapter!==null){this.persistenceAdapter.deleteDatabase(this.filename,function deleteDatabaseCallback(err){cFun(err)})}else{cFun(new Error("persistenceAdapter not configured"))}};Loki.prototype.autosaveDirty=function(){for(var idx=0;idx0){this.filteredrows=[]}this.filterInitialized=false;return this};Resultset.prototype.toJSON=function(){var copy=this.copy();copy.collection=null;return copy};Resultset.prototype.limit=function(qty){if(!this.filterInitialized&&this.filteredrows.length===0){this.filteredrows=this.collection.prepareFullDocIndex()}var rscopy=new Resultset(this.collection);rscopy.filteredrows=this.filteredrows.slice(0,qty);rscopy.filterInitialized=true;return rscopy};Resultset.prototype.offset=function(pos){if(!this.filterInitialized&&this.filteredrows.length===0){this.filteredrows=this.collection.prepareFullDocIndex()}var rscopy=new Resultset(this.collection);rscopy.filteredrows=this.filteredrows.slice(pos);rscopy.filterInitialized=true;return rscopy};Resultset.prototype.copy=function(){var result=new Resultset(this.collection);if(this.filteredrows.length>0){result.filteredrows=this.filteredrows.slice()}result.filterInitialized=this.filterInitialized;return result};Resultset.prototype.branch=Resultset.prototype.copy;Resultset.prototype.transform=function(transform,parameters){var idx,step,rs=this;if(typeof transform==="string"){if(this.collection.transforms.hasOwnProperty(transform)){transform=this.collection.transforms[transform]}}if(typeof transform!=="object"||!Array.isArray(transform)){throw new Error("Invalid transform")}if(typeof parameters!=="undefined"){transform=Utils.resolveTransformParams(transform,parameters)}for(idx=0;idx1){return this.find({$and:filters},firstOnly)}}if(!property||queryObject==="getAll"){if(firstOnly){this.filteredrows=this.collection.data.length>0?[0]:[];this.filterInitialized=true}return this}if(property==="$and"||property==="$or"){this[property](queryObjectOp);if(firstOnly&&this.filteredrows.length>1){this.filteredrows=this.filteredrows.slice(0,1)}return this}if(queryObjectOp===null||(typeof queryObjectOp!=="object"||queryObjectOp instanceof Date)){operator="$eq";value=queryObjectOp}else if(typeof queryObjectOp==="object"){for(key in queryObjectOp){if(hasOwnProperty.call(queryObjectOp,key)){operator=key;value=queryObjectOp[key];break}}}else{throw new Error("Do not know what you want to do.")}if(operator==="$regex"){if(Array.isArray(value)){value=new RegExp(value[0],value[1])}else if(!(value instanceof RegExp)){value=new RegExp(value)}}var usingDotNotation=property.indexOf(".")!==-1;var doIndexCheck=!usingDotNotation&&!this.filterInitialized;if(doIndexCheck&&this.collection.binaryIndices[property]&&indexedOps[operator]){if(this.collection.adaptiveBinaryIndices!==true){this.collection.ensureIndex(property)}searchByIndex=true;index=this.collection.binaryIndices[property]}var fun=LokiOps[operator];var t=this.collection.data;var i=0,len=0;var filter,rowIdx=0;if(this.filterInitialized){filter=this.filteredrows;len=filter.length;if(usingDotNotation){property=property.split(".");for(i=0;i=0){this.filterPipeline[idx]=filter;return this.reapplyFilters()}this.cachedresultset=null;if(this.options.persistent){this.resultdata=[];this.resultsdirty=true}this._addFilter(filter);if(this.sortFunction||this.sortCriteria){this.queueSortPhase()}else{this.queueRebuildEvent()}return this};DynamicView.prototype.applyFind=function(query,uid){this.applyFilter({type:"find",val:query,uid:uid});return this};DynamicView.prototype.applyWhere=function(fun,uid){this.applyFilter({type:"where",val:fun,uid:uid});return this};DynamicView.prototype.removeFilter=function(uid){var idx=this._indexOfFilterWithId(uid);if(idx<0){throw new Error("Dynamic view does not contain a filter with ID: "+uid)}this.filterPipeline.splice(idx,1);this.reapplyFilters();return this};DynamicView.prototype.count=function(){if(this.resultsdirty){this.resultdata=this.resultset.data()}return this.resultset.count()};DynamicView.prototype.data=function(options){if(this.sortDirty||this.resultsdirty){this.performSortPhase({suppressRebuildEvent:true})}return this.options.persistent?this.resultdata:this.resultset.data(options)};DynamicView.prototype.queueRebuildEvent=function(){if(this.rebuildPending){return}this.rebuildPending=true;var self=this;setTimeout(function(){if(self.rebuildPending){self.rebuildPending=false;self.emit("rebuild",self)}},this.options.minRebuildInterval)};DynamicView.prototype.queueSortPhase=function(){if(this.sortDirty){return}this.sortDirty=true;var self=this;if(this.options.sortPriority==="active"){setTimeout(function(){self.performSortPhase()},this.options.minRebuildInterval)}else{this.queueRebuildEvent()}};DynamicView.prototype.performSortPhase=function(options){if(!this.sortDirty&&!this.resultsdirty){return}options=options||{};if(this.sortDirty){if(this.sortFunction){this.resultset.sort(this.sortFunction)}else if(this.sortCriteria){this.resultset.compoundsort(this.sortCriteria)}this.sortDirty=false}if(this.options.persistent){this.resultdata=this.resultset.data();this.resultsdirty=false}if(!options.suppressRebuildEvent){this.emit("rebuild",this)}};DynamicView.prototype.evaluateDocument=function(objIndex,isNew){if(!this.resultset.filterInitialized){if(this.options.persistent){this.resultdata=this.resultset.data()}if(this.sortFunction||this.sortCriteria){this.queueSortPhase()}else{this.queueRebuildEvent()}return}var ofr=this.resultset.filteredrows;var oldPos=isNew?-1:ofr.indexOf(+objIndex);var oldlen=ofr.length;var evalResultset=new Resultset(this.collection);evalResultset.filteredrows=[objIndex];evalResultset.filterInitialized=true;var filter;for(var idx=0,len=this.filterPipeline.length;idxobjIndex){ofr[idx]--}}};DynamicView.prototype.mapReduce=function(mapFunction,reduceFunction){try{return reduceFunction(this.data().map(mapFunction))}catch(err){throw err}};function Collection(name,options){this.name=name;this.data=[];this.idIndex=[];this.binaryIndices={};this.constraints={unique:{},exact:{}};this.uniqueNames=[];this.transforms={};this.objType=name;this.dirty=true;this.cachedIndex=null;this.cachedBinaryIndex=null;this.cachedData=null;var self=this;options=options||{};if(options.hasOwnProperty("unique")){if(!Array.isArray(options.unique)){options.unique=[options.unique]}options.unique.forEach(function(prop){self.uniqueNames.push(prop);self.constraints.unique[prop]=new UniqueIndex(prop)})}if(options.hasOwnProperty("exact")){options.exact.forEach(function(prop){self.constraints.exact[prop]=new ExactIndex(prop)})}this.adaptiveBinaryIndices=options.hasOwnProperty("adaptiveBinaryIndices")?options.adaptiveBinaryIndices:true;this.transactional=options.hasOwnProperty("transactional")?options.transactional:false;this.cloneObjects=options.hasOwnProperty("clone")?options.clone:false;this.cloneMethod=options.hasOwnProperty("cloneMethod")?options.cloneMethod:"parse-stringify";this.asyncListeners=options.hasOwnProperty("asyncListeners")?options.asyncListeners:false;this.disableChangesApi=options.hasOwnProperty("disableChangesApi")?options.disableChangesApi:true;this.disableDeltaChangesApi=options.hasOwnProperty("disableDeltaChangesApi")?options.disableDeltaChangesApi:true;if(this.disableChangesApi){this.disableDeltaChangesApi=true}this.autoupdate=options.hasOwnProperty("autoupdate")?options.autoupdate:false;this.serializableIndices=options.hasOwnProperty("serializableIndices")?options.serializableIndices:true;this.ttl={age:null,ttlInterval:null,daemon:null};this.setTTL(options.ttl||-1,options.ttlInterval);this.maxId=0;this.DynamicViews=[];this.events={insert:[],update:[],"pre-insert":[],"pre-update":[],close:[],flushbuffer:[],error:[],delete:[],warning:[]};this.changes=[];this.ensureId();var indices=[];if(options&&options.indices){if(Object.prototype.toString.call(options.indices)==="[object Array]"){indices=options.indices}else if(typeof options.indices==="string"){indices=[options.indices]}else{throw new TypeError("Indices needs to be a string or an array of strings")}}for(var idx=0;idx=0||propertyName=="$loki"||propertyName=="meta"){delta[propertyName]=newObject[propertyName]}else{var propertyDelta=getObjectDelta(oldObject[propertyName],newObject[propertyName]);if(typeof propertyDelta!=="undefined"&&propertyDelta!={}){delta[propertyName]=propertyDelta}}}}return Object.keys(delta).length===0?undefined:delta}else{return oldObject===newObject?undefined:newObject}}this.getObjectDelta=getObjectDelta;function flushChanges(){self.changes=[]}this.getChanges=function(){return self.changes};this.flushChanges=flushChanges;function insertMeta(obj){var len,idx;if(!obj){return}if(Array.isArray(obj)){len=obj.length;for(idx=0;idx>1;id=typeof id==="number"?id:parseInt(id,10);if(isNaN(id)){throw new TypeError("Passed id is not an integer")}while(data[min]>1;if(data[mid]dataPosition){index[idx]--}}};Collection.prototype.calculateRangeStart=function(prop,val,adaptive){var rcd=this.data;var index=this.binaryIndices[prop].values;var min=0;var max=index.length-1;var mid=0;if(index.length===0){return-1}var minVal=rcd[index[min]][prop];var maxVal=rcd[index[max]][prop];while(min>1;if(ltHelper(rcd[index[mid]][prop],val,false)){min=mid+1}else{max=mid}}var lbound=min;if(aeqHelper(val,rcd[index[lbound]][prop])){return lbound}if(ltHelper(val,rcd[index[lbound]][prop],false)){return adaptive?lbound:lbound-1}return adaptive?lbound+1:lbound};Collection.prototype.calculateRangeEnd=function(prop,val){var rcd=this.data;var index=this.binaryIndices[prop].values;var min=0;var max=index.length-1;var mid=0;if(index.length===0){return-1}var minVal=rcd[index[min]][prop];var maxVal=rcd[index[max]][prop];while(min>1;if(ltHelper(val,rcd[index[mid]][prop],false)){max=mid}else{min=mid+1}}var ubound=max;if(aeqHelper(val,rcd[index[ubound]][prop])){return ubound}if(gtHelper(val,rcd[index[ubound]][prop],false)){return ubound+1}if(aeqHelper(val,rcd[index[ubound-1]][prop])){return ubound-1}return ubound};Collection.prototype.calculateRange=function(op,prop,val){var rcd=this.data;var index=this.binaryIndices[prop].values;var min=0;var max=index.length-1;var mid=0;var lbound,lval;var ubound,uval;if(rcd.length===0){return[0,-1]}var minVal=rcd[index[min]][prop];var maxVal=rcd[index[max]][prop];switch(op){case"$eq":case"$aeq":if(ltHelper(val,minVal,false)||gtHelper(val,maxVal,false)){return[0,-1]}break;case"$dteq":if(ltHelper(val,minVal,false)||gtHelper(val,maxVal,false)){return[0,-1]}break;case"$gt":if(gtHelper(val,maxVal,true)){return[0,-1]}if(gtHelper(minVal,val,false)){return[min,max]}break;case"$gte":if(gtHelper(val,maxVal,false)){return[0,-1]}if(gtHelper(minVal,val,true)){return[min,max]}break;case"$lt":if(ltHelper(val,minVal,true)){return[0,-1]}if(ltHelper(maxVal,val,false)){return[min,max]}break;case"$lte":if(ltHelper(val,minVal,false)){return[0,-1]}if(ltHelper(maxVal,val,true)){return[min,max]}break;case"$between":if(gtHelper(val[0],maxVal,false)){return[0,-1]}if(ltHelper(val[1],minVal,false)){return[0,-1]}lbound=this.calculateRangeStart(prop,val[0]);ubound=this.calculateRangeEnd(prop,val[1]);if(lbound<0)lbound++;if(ubound>max)ubound--;if(!gtHelper(rcd[index[lbound]][prop],val[0],true))lbound++;if(!ltHelper(rcd[index[ubound]][prop],val[1],true))ubound--;if(ubounddeepProperty(this.data[i],field,deep)){min=deepProperty(this.data[i],field,deep);result.index=this.data[i].$loki}}else{min=deepProperty(this.data[i],field,deep);result.index=this.data[i].$loki}}result.value=min;return result};Collection.prototype.extractNumerical=function(field){return this.extract(field).map(parseBase10).filter(Number).filter(function(n){return!isNaN(n)})};Collection.prototype.avg=function(field){return average(this.extractNumerical(field))};Collection.prototype.stdDev=function(field){return standardDeviation(this.extractNumerical(field))};Collection.prototype.mode=function(field){var dict={},data=this.extract(field);data.forEach(function(obj){if(dict[obj]){dict[obj]+=1}else{dict[obj]=1}});var max,prop,mode;for(prop in dict){if(max){if(max0){root=root[pieces.shift()]}return root}function binarySearch(array,item,fun){var lo=0,hi=array.length,compared,mid;while(lo>1;compared=fun.apply(null,[item,array[mid]]);if(compared===0){return{found:true,index:mid}}else if(compared<0){hi=mid}else{lo=mid+1}}return{found:false,index:hi}}function BSonSort(fun){return function(array,item){return binarySearch(array,item,fun)}}function KeyValueStore(){}KeyValueStore.prototype={keys:[],values:[],sort:function(a,b){return ab?1:0},setSort:function(fun){this.bs=new BSonSort(fun)},bs:function(){return new BSonSort(this.sort)},set:function(key,value){var pos=this.bs(this.keys,key);if(pos.found){this.values[pos.index]=value}else{this.keys.splice(pos.index,0,key);this.values.splice(pos.index,0,value)}},get:function(key){return this.values[binarySearch(this.keys,key,this.sort).index]}};function UniqueIndex(uniqueField){this.field=uniqueField;this.keyMap={};this.lokiMap={}}UniqueIndex.prototype.keyMap={};UniqueIndex.prototype.lokiMap={};UniqueIndex.prototype.set=function(obj){var fieldValue=obj[this.field];if(fieldValue!==null&&typeof fieldValue!=="undefined"){if(this.keyMap[fieldValue]){throw new Error("Duplicate key for property "+this.field+": "+fieldValue)}else{this.keyMap[fieldValue]=obj;this.lokiMap[obj.$loki]=fieldValue}}};UniqueIndex.prototype.get=function(key){return this.keyMap[key]};UniqueIndex.prototype.byId=function(id){return this.keyMap[this.lokiMap[id]]};UniqueIndex.prototype.update=function(obj,doc){if(this.lokiMap[obj.$loki]!==doc[this.field]){var old=this.lokiMap[obj.$loki];this.set(doc);this.keyMap[old]=undefined}else{this.keyMap[obj[this.field]]=doc}};UniqueIndex.prototype.remove=function(key){var obj=this.keyMap[key];if(obj!==null&&typeof obj!=="undefined"){this.keyMap[key]=undefined;this.lokiMap[obj.$loki]=undefined}else{throw new Error("Key is not in unique index: "+this.field)}};UniqueIndex.prototype.clear=function(){this.keyMap={};this.lokiMap={}};function ExactIndex(exactField){this.index={};this.field=exactField}ExactIndex.prototype={set:function add(key,val){if(this.index[key]){this.index[key].push(val)}else{this.index[key]=[val]}},remove:function remove(key,val){var idxSet=this.index[key];for(var i in idxSet){if(idxSet[i]==val){idxSet.splice(i,1)}}if(idxSet.length<1){this.index[key]=undefined}},get:function get(key){return this.index[key]},clear:function clear(key){this.index={}}};function SortedIndex(sortedField){this.field=sortedField}SortedIndex.prototype={keys:[],values:[],sort:function(a,b){return ab?1:0},bs:function(){return new BSonSort(this.sort)},setSort:function(fun){this.bs=new BSonSort(fun)},set:function(key,value){var pos=binarySearch(this.keys,key,this.sort);if(pos.found){this.values[pos.index].push(value)}else{this.keys.splice(pos.index,0,key);this.values.splice(pos.index,0,[value])}},get:function(key){var bsr=binarySearch(this.keys,key,this.sort);if(bsr.found){return this.values[bsr.index]}else{return[]}},getLt:function(key){var bsr=binarySearch(this.keys,key,this.sort);var pos=bsr.index;if(bsr.found)pos--;return this.getAll(key,0,pos)},getGt:function(key){var bsr=binarySearch(this.keys,key,this.sort);var pos=bsr.index;if(bsr.found)pos++;return this.getAll(key,pos,this.keys.length)},getAll:function(key,start,end){var results=[];for(var i=start;i"+obj.value+"";
+ },
+ arrow: function(obj, common){
+ var html = "";
+ var open = "";
+ for (var i=1; i<=obj.$level; i++){
+ if (i==obj.$level && obj.$count){
+ var className = "webix_sidebar_dir_icon webix_icon fa-angle-"+(obj.open?"down":"left");
+ html+="";
+ }
+ }
+ return html;
+ },
+ icon:function(obj, common){
+ if(obj.icon)
+ return "";
+ return "";
+ }
+});
\ No newline at end of file
diff --git a/source/static/js/ui/admin.js b/source/static/js/ui/admin.js
new file mode 100644
index 0000000..9ca919d
--- /dev/null
+++ b/source/static/js/ui/admin.js
@@ -0,0 +1,319 @@
+
+var menu_data = [
+ {id: 'app_home', icon: 'dashboard', value: 'Inicio'},
+ {id: 'app_emisor', icon: 'user-circle', value: 'Emisor'},
+ {id: 'app_folios', icon: 'sort-numeric-asc', value: 'Folios'},
+]
+
+
+var sidebar = {
+ view: 'sidebar',
+ data: menu_data,
+ ready: function(){
+ this.select('app_home');
+ this.open(this.getParentId('app_home'));
+ },
+ on:{
+ onAfterSelect: function(id){
+ $$('multi_admin').setValue(id)
+ }
+ }
+}
+
+
+var emisor_datos_fiscales = [
+ {template: 'Datos SAT', type: 'section'},
+ {cols: [{view: 'text', id: 'emisor_rfc', name: 'emisor_rfc', label: 'RFC: ',
+ width: 300, required: true, invalidMessage: 'RFC inválido',
+ readonly: true, attributes: {maxlength: 13}}, {}]},
+ {view: 'text', id: 'emisor_nombre', name: 'emisor_nombre',
+ label: 'Razón Social: ', required: true,
+ invalidMessage: 'La Razón Social es requerida'},
+ {cols: [
+ {view: 'search', id: 'emisor_cp', name: 'emisor_cp', width: 300,
+ label: 'C.P.: ', required: true, attributes: {maxlength: 5},
+ invalidMessage: 'El C.P. es requerido'},
+ {view: 'text', id: 'emisor_cp2', name: 'emisor_cp2', width: 300,
+ label: 'C.P. de Expedición: ', attributes: {maxlength: 5}},
+ {}]},
+ {cols: [
+ {view: 'label', label: 'Regimenes Fiscales *', required: true}, {}]},
+ {cols: [{view: 'list', id: 'lst_emisor_regimen', select: 'multiselect',
+ name: 'lst_emisor_regimen', width: 600, height: 125, required: true,
+ data: []}, {}]},
+ {template: 'Dirección Fiscal', type: 'section'},
+ {view: 'text', id: 'emisor_calle', name: 'emisor_calle', label: 'Calle: '},
+ {cols: [{view: 'text', id: 'emisor_no_exterior', name: 'emisor_no_exterior',
+ width: 300, label: 'No Exterior: '},{}]},
+ {cols: [{view: 'text', id: 'emisor_no_interior', name: 'emisor_no_interior',
+ width: 300, label: 'No Interior: '},{}]},
+ {view: 'text', id: 'emisor_colonia', name: 'emisor_colonia',
+ label: 'Colonia: '},
+ {view: 'text', id: 'emisor_municipio', name: 'emisor_municipio',
+ label: 'Municipio: '},
+ {view: 'text', id: 'emisor_estado', name: 'emisor_estado',
+ label: 'Estado: '},
+ {view: 'text', id: 'emisor_pais', name: 'emisor_pais', label: 'País: ',
+ value: 'México', readonly: true},
+ {template: '', type: 'section', minHeight: 25},
+]
+
+
+var emisor_otros_datos= [
+ {template: 'Generales', type: 'section'},
+ {view: 'text', id: 'emisor_nombre_comercial',
+ name: 'emisor_nombre_comercial', label: 'Nombre comercial: '},
+ {view: 'text', id: 'emisor_telefono', name: 'emisor_telefono',
+ label: 'Teléfonos: '},
+ {view: 'text', id: 'emisor_correo', name: 'emisor_correo',
+ label: 'Correos: '},
+ {view: 'text', id: 'emisor_web', name: 'emisor_web',
+ label: 'Página Web: '},
+ {template: 'Escuela', type: 'section'},
+ {cols: [{view: 'checkbox', id: 'chk_escuela', name: 'es_escuela',
+ label: 'Es Escuela'},
+ {view: 'button', id: 'cmd_niveles', label: 'Niveles Escolares',
+ type: 'form', align: 'center', autowidth: true, disabled: true},
+ {}, {}]},
+ {template: 'ONG', type: 'section'},
+ {view: 'checkbox', id: 'chk_ong', name: 'es_ong', label: 'Es ONG'},
+ {cols: [{view: 'text', id: 'ong_autorizacion', name: 'ong_autorizacion',
+ label: 'Autorización: ', disabled: true,
+ placeholder: 'Número de autorización del SAT'}, {}]},
+ {cols: [{view: 'datepicker', id: 'ong_fecha', name: 'ong_fecha',
+ label: 'Fecha de Autorización: ', disabled: true, format: '%d-%M-%Y',
+ placeholder: 'Fecha de autorización en el SAT'}, {}]},
+ {cols: [{view: 'datepicker', id: 'ong_fecha_dof', name: 'ong_fecha_dof',
+ label: 'Fecha de DOF: ', disabled: true, format: '%d-%M-%Y',
+ placeholder: 'Fecha de publicación en el DOF'}, {}]},
+]
+
+
+var emisor_certificado = [
+ {template: 'Certificado actual', type: 'section'},
+ {view: 'form', id: 'form_cert', rows: [
+ {cols: [{view: 'text', id: 'cert_rfc', name: 'cert_rfc',
+ label: 'RFC: ', readonly: true, placeholder: 'Ninguno'}, {}]},
+ {cols: [{view: 'text', id: 'cert_serie', name: 'cert_serie',
+ label: 'Serie: ', readonly: true, placeholder: 'Ninguno'}, {}]},
+ {cols: [{view: 'text', id: 'cert_desde', name: 'cert_desde',
+ label: 'Vigente desde: ', readonly: true}, {}]},
+ {cols: [{view: 'text', id: 'cert_hasta', name: 'cert_hasta',
+ label: 'Vigente hasta: ', readonly: true}, {}]},
+ ]},
+ {template: 'Cargar Certificado', type: 'section'},
+ {view: 'form', id: 'form_upload', rows: [
+ {cols: [{},
+ {view: 'uploader', id: 'up_cert', autosend: false, link: 'lst_cert',
+ value: 'Seleccionar certificado', upload: '/values/files'}, {}]},
+ {cols: [{},
+ {view: 'list', id: 'lst_cert', name: 'certificado',
+ type: 'uploader', autoheight:true, borderless: true}, {}]},
+ {cols: [{},
+ {view: 'text', id: 'txt_contra', name: 'contra',
+ label: 'Contraseña KEY', labelPosition: 'top',
+ labelAlign: 'center', type: 'password', required: true}, {}]},
+ {cols: [{}, {view: 'button', id: 'cmd_subir_certificado',
+ label: 'Subir certificado'}, {}]},
+ ]},
+]
+
+
+var controls_emisor = [
+ {
+ view: 'tabview',
+ id: 'tab_emisor',
+ tabbar: {options: [
+ 'Datos Fiscales',
+ 'Otros Datos',
+ 'Certificado']},
+ animate: true,
+ cells: [
+ {id: 'Datos Fiscales', rows: emisor_datos_fiscales},
+ {id: 'Otros Datos', rows: emisor_otros_datos},
+ {id: 'Certificado', rows: emisor_certificado},
+ {},
+ ]
+ }
+]
+
+
+var form_emisor = {
+ type: 'space',
+ cols: [{
+ view: 'form',
+ id: 'form_emisor',
+ complexData: true,
+ elements: controls_emisor,
+ elementsConfig: {
+ labelWidth: 150,
+ labelAlign: 'right'
+ },
+ autoheight: true,
+ rules: {
+ emisor_nombre: function(value){return value.trim() != ''},
+ }
+ }]
+}
+
+
+var options_usarcon = [
+ {id: 'S', value: 'Todos'},
+ {id: 'I', value: 'Ingreso'},
+ {id: 'E', value: 'Egreso'},
+ {id: 'T', value: 'Traslado'},
+]
+
+
+var grid_folios_cols = [
+ {id: 'delete', header: '', width: 30, css: 'delete'},
+ {id: 'serie', header: 'Serie', fillspace: 1},
+ {id: 'inicio', header: 'Inicio', fillspace: 1},
+ {id: 'usarcon', header: 'Usar Con', fillspace: 1},
+ {id: 'pre', header: 'Predeterminado', fillspace: 1}
+]
+
+
+var grid_folios = {
+ view: 'datatable',
+ id: 'grid_folios',
+ select: 'row',
+ adjust: true,
+ headermenu: true,
+ columns: grid_folios_cols
+}
+
+
+var emisor_folios = [
+ {template: 'Nueva serie', type: 'section'},
+ {cols: [
+ {view: 'text', id: 'folio_serie', name: 'folio_serie', label: 'Serie: ',
+ required: true, attributes: {maxlength: 15}},
+ {view: 'counter', id: 'folio_inicio', name: 'folio_inicio', value: 1,
+ required: true, label: 'Inicio: ', step: 1, min: 1},
+ {view: 'richselect', id: 'folio_usarcon', name: 'folio_usarcon',
+ label: 'Usar Con: ', value: 'S', required: true,
+ options: options_usarcon},
+ ]},
+ {maxHeight: 20},
+ {cols: [{},
+ {view: 'button', id: 'cmd_agregar_serie', label: 'Agregar Serie',
+ autowidth: true, type: 'form'},
+ {}]},
+ {template: 'Series guardadas', type: 'section'},
+ grid_folios
+]
+
+
+var controls_folios = [
+ {
+ view: 'tabview',
+ id: 'tab_folios',
+ tabbar: {options: ['Folios']},
+ animate: true,
+ cells: [
+ {id: 'Folios', rows: emisor_folios},
+ {},
+ ]
+ }
+]
+
+
+var form_folios = {
+ type: 'space',
+ cols: [{
+ view: 'form',
+ id: 'form_folios',
+ complexData: true,
+ elements: controls_folios,
+ elementsConfig: {
+ labelWidth: 100,
+ labelAlign: 'right'
+ },
+ autoheight: true,
+ rules: {
+ folio_serie: function(value){return value.trim() != ''},
+ folio_inicio: function(value){return value > 0},
+ }
+ }]
+}
+
+
+var app_emisor = {
+ id: 'app_emisor',
+ rows:[
+ {view: 'template', id: 'th_emisor', type: 'header',
+ template: 'Emisor'},
+ form_emisor,
+ {maxHeight: 20},
+ {margin: 10, cols: [{},
+ {view: 'button', id: 'cmd_save_emisor', label: 'Guardar' ,
+ type: 'form', autowidth: true, align: 'center'},
+ {}]
+ },
+ {},
+ ]
+}
+
+
+var app_folios = {
+ id: 'app_folios',
+ rows:[
+ {view: 'template', id: 'th_folios', type: 'header',
+ template: 'Folios'},
+ form_folios,
+ {},
+ ]
+}
+
+
+var multi_admin = {
+ id: 'multi_admin',
+ animate: true,
+ cells:[
+ {
+ id: 'app_admin_home',
+ view: 'template',
+ template: 'HOME'
+ },
+ app_emisor,
+ app_folios,
+ ]
+}
+
+
+var menu_user = {
+ view: 'menu',
+ id: 'menu_user',
+ width: 150,
+ autowidth: true,
+ data: [
+ {id: '0', value: 'User...', submenu:[{id:1, value:'Cerrar Sesión'}]},
+ ],
+ type: {
+ subsign: true,
+ },
+};
+
+var ui_admin = {
+ rows: [
+ {view: 'toolbar', padding: 3, elements: [
+ {view: 'button', type: 'icon', icon: 'bars',
+ width: 37, align: 'left', css: 'app_button', click: function(){
+ $$('$sidebar1').toggle()
+ }
+ },
+ {view: 'label', label: 'Empresa Libre - Configuración'},
+ {},
+ {view: 'button', type: 'icon', width: 40, css: 'app_button',
+ icon: 'home', click: 'cmd_home_click'},
+ menu_user
+ ]},
+ {
+ cols:[
+ sidebar,
+ multi_admin,
+ ]
+ }
+ ]
+};
diff --git a/source/static/js/ui/invoices.js b/source/static/js/ui/invoices.js
new file mode 100644
index 0000000..950baf1
--- /dev/null
+++ b/source/static/js/ui/invoices.js
@@ -0,0 +1,331 @@
+
+
+var toolbar_invoices = [
+ {view: "button", id: "cmd_new_invoice", label: "Nueva", type: "iconButton",
+ autowidth: true, icon: "plus"},
+ {view: "button", id: "cmd_refacturar", label: "Refacturar", type: "iconButton",
+ autowidth: true, icon: "pencil"},
+ {},
+ {view: "button", id: "cmd_delete_invoice", label: "Eliminar", type: "iconButton",
+ autowidth: true, icon: "minus"},
+]
+
+
+var toolbar_invoices_util = [
+ {view: 'button', id: 'cmd_invoice_timbrar', label: 'Timbrar',
+ type: 'iconButton', autowidth: true, icon: 'ticket'},
+]
+
+
+function get_icon(tipo){
+ var node = "
"
+ return node
+}
+
+
+var grid_invoices_cols = [
+ {id: "id", header:"ID", hidden:true},
+ {id: "serie", header: ["Serie", {content: "selectFilter"}], adjust: "data",
+ sort:"string"},
+ {id: "folio", header: ["Folio", {content: "numberFilter"}], adjust: "data",
+ sort:"int", css: "cell_right"},
+ {id: "uuid", header: ["UUID", {content: "textFilter"}], adjust: "data",
+ sort:"string", hidden:true},
+ {id: "fecha", header: ["Fecha y Hora"], adjust: "data", sort:"string"},
+ {id: "tipo_comprobante", header: ["Tipo", {content: "selectFilter"}],
+ adjust: 'header', sort: 'string'},
+ {id: "estatus", header: ["Estatus", {content: "selectFilter"}],
+ adjust: "data", sort:"string"},
+ {id: 'total_mn', header: ['Total M.N.', {content: 'numberFilter'}], width: 150,
+ sort: 'int', format: webix.i18n.priceFormat, css: 'right'},
+ {id: "cliente", header: ["Razón Social", {content: "selectFilter"}],
+ fillspace:true, sort:"string"},
+ {id: 'xml', header: 'XML', adjust: 'data', template: get_icon('xml')},
+ {id: 'pdf', header: 'PDF', adjust: 'data', template: get_icon('pdf')},
+ {id: 'zip', header: 'ZIP', adjust: 'data', template: get_icon('zip')},
+ {id: 'email', header: '', adjust: 'data', template: get_icon('email')}
+]
+
+
+var grid_invoices = {
+ view: 'datatable',
+ id: 'grid_invoices',
+ select: 'row',
+ adjust: true,
+ footer: true,
+ resizeColumn: true,
+ headermenu: true,
+ columns: grid_invoices_cols,
+};
+
+
+var grid_details_cols = [
+ {id: "id", header:"ID", hidden: true},
+ {id: 'delete', header: '', width: 30, css: 'delete'},
+ {id: "clave", header:{text: 'Clave', css: 'center'}, width: 100},
+ {id: "descripcion", header:{text: 'Descripción', css: 'center'},
+ fillspace: true, editor: 'text'},
+ {id: "unidad", header:{text: 'Unidad', css: 'center'}, width: 100},
+ {id: 'cantidad', header: {text: 'Cantidad', css: 'center'}, width: 100,
+ format: webix.i18n.numberFormat, css:'right', editor: 'text'},
+ {id: "valor_unitario", header:{text: 'Valor Unitario', css: 'center'}, width: 100,
+ format: webix.i18n.priceFormat, css:'right', editor: 'text'},
+ {id: "importe", header:{text: 'Importe', css: 'center'}, width: 150, format: webix.i18n.priceFormat, css:'right'},
+]
+
+
+var grid_details = {
+ view: 'datatable',
+ id: 'grid_details',
+ select: 'row',
+ adjust: true,
+ autoheight: true,
+ editable: true,
+ columns: grid_details_cols,
+ data: []
+}
+
+
+var grid_totals_cols = [
+ {id: 'id', header: 'ID', hidden: true},
+ {id: 'concepto', header: 'Concepto', width: 200,
+ footer: {text: 'TOTAL', css:'right_footer'}, css:'right'},
+ {id: 'importe', header: 'Importe', width: 150,
+ footer: {content: 'summColumn', css:'right_footer'},
+ format: webix.i18n.priceFormat, css:'right'},
+]
+
+
+var grid_totals = {
+ view: 'datatable',
+ id: 'grid_totals',
+ select: false,
+ width: 350,
+ header: false,
+ footer: true,
+ autoheight: true,
+ columns: grid_totals_cols,
+ data: [{id: 1, concepto: 'SubTotal', importe: 0}]
+}
+
+
+var suggest_partners = {
+ view: 'gridsuggest',
+ id: 'grid_clients_found',
+ name: 'grid_clients_found',
+ body: {
+ autoConfig: false,
+ header: false,
+ columns: [
+ {id: 'id', hidden: true},
+ {id: 'nombre', adjust: 'data'},
+ {id: 'rfc', adjust: 'data'},
+ {id: 'forma_pago', hidden: true},
+ {id: 'uso_cfdi', hidden: true},
+ ],
+ dataFeed:function(text){
+ if (text.length > 2){
+ this.load('/values/client?name=' + text)
+ }else{
+ this.hide()
+ }
+ }
+ }
+}
+
+var suggest_products = {
+ view: 'gridsuggest',
+ id: 'grid_products_found',
+ name: 'grid_products_found',
+ body: {
+ autoConfig: false,
+ header: true,
+ columns: [
+ {id: 'id', hidden: true},
+ {id: 'clave', adjust: 'data'},
+ {id: 'descripcion', adjust: 'data'},
+ {id: 'unidad', adjust: 'data'},
+ {id: 'valor_unitario', adjust: 'data',
+ format: webix.i18n.priceFormat}
+ ],
+ dataFeed:function(text){
+ if (text.length > 2){
+ this.load('/values/product?name=' + text)
+ }else{
+ this.hide()
+ }
+ }
+ }
+}
+
+
+var body_comprobante = {rows: [{
+ cols: [
+ {
+ view: 'richselect',
+ id: 'lst_tipo_comprobante',
+ label: 'Tipo',
+ labelPosition: 'top',
+ required: true,
+ value: 'I',
+ options: [
+ {id: 'I', value: 'Ingreso'},
+ {id: 'E', value: 'Egreso'},
+ {id: 'T', value: 'Traslado'}
+ ]
+ },
+ {
+ view: 'richselect',
+ id: 'lst_serie',
+ label: 'Serie',
+ labelPosition: 'top',
+ options: [],
+ },
+ ]},
+ {view: 'richselect', id: 'lst_uso_cfdi', name: 'uso_cfdi', required: true,
+ labelPosition: 'top', label: 'Uso del CFDI', options: []},
+]}
+
+
+var opt_metodo_pago = [
+ {id: 'PUE', value: 'Pago en una sola exhibición'},
+ {id: 'PPD', value: 'Pago en parcialidades o diferido'}
+]
+
+
+var body_opciones = {rows: [
+ {view: 'richselect', id: 'lst_forma_pago', name: 'forma_pago',
+ label: 'Forma de Pago', labelPosition: 'top', required: true,
+ options: []},
+ {view: 'richselect', id: 'lst_metodo_pago', label: 'Método de Pago',
+ labelPosition: 'top', options: opt_metodo_pago, readonly: true,
+ value: 'PUE',
+ required: true},
+ {view: 'text', id: 'txt_condicion_pago', label: 'Condiciones de Pago',
+ labelPosition: 'top'},
+]}
+
+
+var body_moneda = {cols: [
+ {view: 'richselect', id: 'lst_moneda', label: 'Nombre',
+ labelPosition: 'top', required: true, options: []},
+ {view: 'text', type: 'text', id: 'txt_tipo_cambio', value: '1.00',
+ label: 'Tipo de Cambio', labelPosition: 'top', required: true,
+ invalidMessage: 'Captura un valor númerico', inputAlign: 'right',
+ readonly: true}
+]}
+
+
+var body_regimen_fiscal = {
+ view: 'richselect',
+ id: 'lst_regimen_fiscal',
+ required: true,
+ options: []
+}
+
+
+var controls_generate = [
+ {cols: [ {rows:[
+ {view: 'fieldset', label: 'Buscar Cliente', body: {rows: [
+ {cols: [
+ {view:"search", id:"search_client_id", name:"search_client_id",
+ label:"por Clave", labelPosition:'top', maxWidth:200,
+ placeholder:'Captura la clave'},
+ {view: 'search', id: 'search_client_name',
+ name: 'search_client_name', label: 'por Nombre o RFC',
+ labelPosition: 'top', suggest: suggest_partners,
+ placeholder: 'Captura al menos tres letras'},
+ ]},
+ {cols: [{
+ view: 'label', id: 'lbl_client_title',
+ name: "lbl_client_title", label: 'Seleccionado: ',
+ autowidth:true},
+ {view: 'label', id: 'lbl_client', name: 'lbl_client',
+ label: 'Ninguno'},
+ ]}
+ ]}},
+ {view: 'fieldset', label: 'Buscar Producto', body: {rows: [
+ {cols: [
+ {view: "search", id: "search_product_id",
+ name: "search_product_id", label: "por Clave",
+ labelPosition:'top', maxWidth:200,
+ placeholder:'Captura la clave'},
+ {view: "search", id: "search_product_name",
+ name: "search_product_name", label: "por Descripción",
+ labelPosition:'top', suggest: suggest_products,
+ placeholder:'Captura al menos tres letras'},
+ ]},
+ ]}}
+ ]},
+ {maxWidth: 10},
+ {maxWidth: 300, rows: [
+ {view: 'fieldset', label: 'Comprobante', body: body_comprobante},
+ {view: 'fieldset', label: 'Opciones de Pago', body: body_opciones},
+ {view: 'fieldset', id: 'fs_moneda', label: 'Moneda', body: body_moneda},
+ {view: 'fieldset', id: 'fs_regimen_fiscal', label: 'Regimen Fiscal',
+ body: body_regimen_fiscal},
+ ]}
+ ]},
+ {view: 'label', label: 'Detalle', height: 30, align: 'left'},
+ grid_details,
+ {minHeight: 15, maxHeight: 15},
+ {cols: [{}, grid_totals]}
+]
+
+
+var controls_invoices = [
+ {
+ view: "tabview",
+ tabbar: {options: ["Generar"]}, animate: true,
+ cells: [
+ {id: "Generar", rows: controls_generate},
+ ]
+ },
+ {rows: [
+ {template:"", type: "section" },
+ {margin: 10, cols: [{},
+ {view: "button", id: "cmd_timbrar", label: "Timbrar",
+ type: "form", autowidth: true, align:"center"},
+ {view: 'button', id: 'cmd_close_invoice', label: 'Cancelar',
+ type: 'danger', autowidth: true, align: 'center'},
+ {}]
+ },
+ ]}
+]
+
+
+var form_invoice = {
+ type: 'space',
+ cols: [{
+ view: 'form',
+ id: 'form_invoice',
+ complexData: true,
+ elements: controls_invoices,
+ }]
+}
+
+
+var multi_invoices = {
+ id: 'multi_invoices',
+ view: 'multiview',
+ animate: true,
+ cells:[
+ {id: 'invoices_home', rows:[
+ {view: 'toolbar', elements: toolbar_invoices},
+ {view: 'toolbar', elements: toolbar_invoices_util},
+ grid_invoices,
+ ]},
+ {id: 'invoices_new', rows:[form_invoice, {}]}
+ ]
+}
+
+
+var app_invoices = {
+ id: "app_invoices",
+ rows:[
+ {view: "template", id: "th_invoices", type: "header", template:"Administración de Facturas" },
+ multi_invoices
+ ]
+}
+
+
diff --git a/source/static/js/ui/login.js b/source/static/js/ui/login.js
new file mode 100644
index 0000000..e8e9743
--- /dev/null
+++ b/source/static/js/ui/login.js
@@ -0,0 +1,44 @@
+
+var msg_rfc = 'El RFC es requerido'
+var msg_user = 'El usuario es requerido'
+var msg_pass = 'La contraseña es requerida'
+
+var form_controls = [
+ {view: 'text', label: 'RFC', id: 'txt_rfc', name: 'rfc',
+ labelPosition: 'top', required: true, invalidMessage: msg_rfc},
+ {view: 'text', label: 'Usuario', id: 'txt_usuario', name: 'usuario',
+ labelPosition: 'top', required: true, invalidMessage: msg_user},
+ {view: 'text', label: 'Contraseña', id: 'txt_contra', name: 'contra',
+ type: 'password', required: true, labelPosition: 'top',
+ invalidMessage: msg_pass},
+ {margin: 10, cols:[{}, {view: 'button', value: 'Iniciar Sesión',
+ click: 'validate_login', hotkey: 'enter'}, {}]}
+]
+
+
+var msg_header = 'Bienvenido a Empresa Libre'
+
+var ui_login = {
+ rows: [
+ {maxHeight: 50},
+ {view: 'template', template: msg_header, maxHeight: 50, css: 'login_header'},
+ {maxHeight: 50},
+ {cols: [{}, {type: 'space', padding: 5,
+ rows: [
+ {view: 'template', template: 'Acceso al sistema', type: 'header'},
+ {
+ container: 'form_login',
+ view: 'form',
+ id: 'form_login',
+ width: 400,
+ elements: form_controls,
+ rules:{
+ rfc:function(value){ return value.trim() != '';},
+ usuario:function(value){ return value.trim() != '';},
+ contra:function(value){ return value.trim() != '';},
+ }
+ },
+ ]}, {}, ]
+ },
+ ]
+}
diff --git a/source/static/js/ui/main.js b/source/static/js/ui/main.js
new file mode 100644
index 0000000..f594323
--- /dev/null
+++ b/source/static/js/ui/main.js
@@ -0,0 +1,75 @@
+
+var menu_data = [
+ {id: 'app_home', icon: 'dashboard', value: 'Inicio'},
+ {id: 'app_partners', icon: 'users', value: 'Clientes y Proveedores'},
+ {id: 'app_products', icon: 'server', value: 'Productos y Servicios'},
+ {id: 'app_invoices', icon: 'cart-plus', value: 'Facturas'},
+];
+
+
+var sidebar = {
+ view: 'sidebar',
+ data: menu_data,
+ ready: function(){
+ this.select('app_home');
+ this.open(this.getParentId('app_home'));
+ },
+ on:{
+ onAfterSelect: function(id){
+ $$('multi').setValue(id)
+ }
+ }
+};
+
+
+var multi_main = {
+ id: 'multi',
+ animate: true,
+ cells:[
+ {
+ id: 'app_home',
+ view: 'template',
+ template: 'HOME'
+ },
+ app_partners,
+ app_products,
+ app_invoices,
+ ]
+};
+
+
+var menu_user = {
+ view: 'menu',
+ id: 'menu_user',
+ width: 150,
+ autowidth: true,
+ data: [
+ {id: '0', value: 'User...', submenu:[{id:1, value:'Cerrar Sesión'}]},
+ ],
+ type: {
+ subsign: true,
+ },
+};
+
+var ui_main = {
+ rows: [
+ {view: 'toolbar', padding: 3, elements: [
+ {view: 'button', type: 'icon', icon: 'bars',
+ width: 37, align: 'left', css: 'app_button', click: function(){
+ $$('$sidebar1').toggle()
+ }
+ },
+ {view: 'label', label: 'Empresa Libre'},
+ {},
+ menu_user,
+ {view: 'button', type: 'icon', width: 45, css: 'app_button', icon: 'bell-o', badge: 1}
+ ]
+ },
+ {
+ cols:[
+ sidebar,
+ multi_main,
+ ]
+ }
+ ]
+};
diff --git a/source/static/js/ui/partners.js b/source/static/js/ui/partners.js
new file mode 100644
index 0000000..9c031af
--- /dev/null
+++ b/source/static/js/ui/partners.js
@@ -0,0 +1,323 @@
+
+
+var toolbar_partners = [
+ {view: 'button', id: 'cmd_new_partner', label: 'Nuevo', type: 'iconButton',
+ autowidth: true, icon: 'user-plus'},
+ {view: 'button', id: 'cmd_edit_partner', label: 'Editar', type: 'iconButton',
+ autowidth: true, icon: 'user'},
+ {view: 'button', id: 'cmd_delete_partner', label: 'Eliminar', type: 'iconButton',
+ autowidth: true, icon: 'user-times'},
+]
+
+
+var grid_partners_cols = [
+ {id: 'index', header:'#', adjust:'data', css: 'right',
+ footer: {content: 'rowCount', colspan: 2, css: 'right'}},
+ {id: 'id', header: 'Clave', adjust:'data', sort: 'int', css: 'right'},
+ {id: 'rfc', header: ['RFC', {content: 'textFilter'}], adjust:'data',
+ sort: 'string', footer: {text: 'Clientes y Proveedores', colspan: 2}},
+ {id: 'nombre', header: ['Razón Social', {content: 'textFilter'}],
+ fillspace:true, sort: 'string'},
+]
+
+
+var grid_partners = {
+ view: 'datatable',
+ id: 'grid_partners',
+ select: 'row',
+ adjust: true,
+ footer: true,
+ resizeColumn: true,
+ headermenu: true,
+ columns: grid_partners_cols,
+ on:{
+ 'data->onStoreUpdated':function(){
+ this.data.each(function(obj, i){
+ obj.index = i+1;
+ })
+ }
+ },
+}
+
+
+var persons_type = [
+ {id: 1, value: 'Física'},
+ {id: 2, value: 'Moral'},
+ {id: 3, value: 'Público'},
+ {id: 4, value: 'Extranjero'},
+]
+
+
+var controls_fiscales = [
+ {template: 'Tipo de Persona', type: 'section'},
+ {view: 'radio', id: 'tipo_persona', name: 'tipo_persona', label: 'Tipos: ',
+ labelWidth: 150, value: 1, options: persons_type, required: true,
+ invalidMessage: 'El Tipo de Persona es requerido'},
+ {template: 'Dirección Fiscal', type: 'section'},
+ {cols: [{view: 'text', id: 'rfc', name: 'rfc', label: 'RFC: ', width: 300,
+ required: true, invalidMessage: 'RFC inválido', attributes: {maxlength: 13}},{}]},
+ {view: 'text', id: 'nombre', name: 'nombre', label: 'Razón Social: ', required: true,
+ invalidMessage: 'La Razón Social es requerida'},
+ {view: 'text', id: 'calle', name: 'calle', label: 'Calle: '},
+ {cols: [{view: 'text', id: 'no_exterior', name: 'no_exterior', width: 300,
+ label: 'No Exterior: '},{}]},
+ {cols: [{view: 'text', id: 'no_interior', name: 'no_interior', width: 300,
+ label: 'No Interior: '},{}]},
+ {cols: [{view: 'search', id: 'codigo_postal', name: 'codigo_postal',
+ width: 300, label: 'C.P.: ', attributes: {maxlength: 5}},{}]},
+ {view: 'text', id: 'colonia', name: 'colonia', label: 'Colonia: '},
+ {view: 'text', id: 'municipio', name: 'municipio', label: 'Municipio: '},
+ {view: 'text', id: 'estado', name: 'estado', label: 'Estado: '},
+ {view: 'text', id: 'pais', name: 'pais', label: 'País: ',
+ value: 'México', readonly: true},
+ {template: 'Condiciones Comerciales', type: 'section'},
+ {cols: [
+ {view: 'richselect', id: 'forma_pago', name: 'forma_pago',
+ label: 'Forma de Pago: ', required: true, options: [],
+ invalidMessage: 'La Forma de pago es requerida'},
+ {view: 'text', id: 'condicion_pago', name: 'condicion_pago',
+ label: 'Condiciones de Pago: '},
+ ]},
+ {cols: [
+ {view: 'counter', id: 'dias_pago', name: 'dias_pago',
+ label: 'Días de pago', step: 5, value: 0, min: 0, max: 365,
+ tooltip: 'Permite calcular las fechas de pago', width: 250},
+ {view: 'checkbox', id: 'dias_habiles', name: 'dias_habiles',
+ label: 'Hábiles: ', value: false, width: 180},
+ {},
+ ]},
+ {cols: [
+ {view: 'richselect', id: 'lst_uso_cfdi_socio', name: 'uso_cfdi_socio',
+ label: 'Uso del CFDI', options: []},
+ {},
+ ]}
+]
+
+
+var controls_others = [
+ {view: 'checkbox', id: 'es_activo', name: 'es_activo', label: 'Activo: ',
+ value: true, bottomLabel: ' Se recomienda solo desactivar y no eliminar'},
+ {view: 'text', id: 'commercial_name', name: 'nombre_comercial',
+ label: 'Nombre Comercial: '},
+ {view: 'text', id: 'telefonos', name: 'telefonos', label: 'Teléfonos: '},
+ {view: 'text', id: 'web', name: 'web', label: 'Página Web: '},
+ {view: 'text', id: 'correo_facturas', name: 'correo_facturas',
+ label: 'Correos para Facturas: ', tooltip: 'Separados por comas',
+ bottomLabel: 'Uno o más correos electrónicos separados por comas'},
+ {cols: [
+ {view: 'checkbox', id: 'es_cliente', name: 'es_cliente',
+ label: 'Es Cliente: ', value: true, width: 180},
+ {view: 'text', id: 'cuenta_cliente', name: 'cuenta_cliente',
+ label: 'Cuenta Cliente: ', disabled: true}, {}]
+ },
+ {cols: [
+ {view: 'checkbox', id: 'es_proveedor', name: 'es_proveedor',
+ label: 'Es Proveedor: ', value: false, width: 180},
+ {view: 'text', id: 'cuenta_proveedor', name: 'cuenta_proveedor',
+ label: 'Cuenta Proveedor: ', disabled: true}, {}]
+ },
+ {view: 'checkbox', name: 'es_ong', label: 'Es ONG: ', value: false},
+ {view: 'text', name: 'tags', label: 'Etiquetas',
+ tooltip: 'Utiles para filtrados rápidos. Separa por comas.'},
+ {view: 'textarea' , height: 200, name: 'notas', label: 'Notas'},
+]
+
+
+
+var toolbar_contacts = [
+ {view: 'button', id: 'cmd_new_contact', label: 'Nuevo', type: 'iconButton',
+ autowidth: true, icon: 'user-plus'},
+]
+
+
+var grid_contacts_cols = [
+ {id: 'index', header:'#', adjust:'data', css:'right',
+ footer: {content: 'rowCount'}},
+ {id: 'id', header: '', hidden: true},
+ {id: 'title', header: 'Título', adjust:'data', sort: 'string',
+ footer: 'Contactos'},
+ {id: 'first_name', header: ['Nombre', {content: 'textFilter'}], adjust:'data',
+ sort: 'string'},
+ {id: 'paterno', header: ['Apellido Paterno', {content: 'textFilter'}],
+ fillspace:true, sort: 'string'},
+ {id: 'materno', header: ['Apellido Materno', {content: 'textFilter'}],
+ fillspace:true, sort: 'string'},
+ {id: 'date_born', header: ['Fecha de Nacimiento'],
+ adjust: 'data'},
+]
+
+
+var grid_contacts = {
+ view: 'datatable',
+ id: 'grid_contacts',
+ select: 'row',
+ adjust: true,
+ height: 400,
+ footer: true,
+ resizeColumn: true,
+ headermenu: true,
+ columns: grid_contacts_cols,
+ on:{
+ 'data->onStoreUpdated':function(){
+ this.data.each(function(obj, i){
+ obj.index = i+1;
+ })
+ }
+ },
+}
+
+
+var grid_email = {
+ view: 'datatable',
+ id: 'grid_email',
+ select: 'row',
+ adjust: true,
+ height: 200,
+ resizeColumn: true,
+ columns: [
+ {id: 'id', header: '', hidden: true},
+ {id: 'type', header: 'Tipo', adjust:'data', sort: 'string'},
+ {id: 'email', header: ['Correo Electrónico'], fillspace:true, sort: 'string'},
+ ],
+}
+
+
+var grid_phone = {
+ view: 'datatable',
+ id: 'grid_phone',
+ select: 'row',
+ adjust: true,
+ height: 200,
+ resizeColumn: true,
+ columns: [
+ {id: 'id', header: '', hidden: true},
+ {id: 'type', header: 'Tipo', adjust:'data', sort: 'string'},
+ {id: 'phone', header: ['Teléfono'], fillspace:true, sort: 'string'},
+ ],
+}
+
+
+var controls_contact = [
+ {template: 'Datos Generales', type: 'section' },
+ {cols: [
+ {view: 'combo', id: 'cbo_title_contact', name: 'cbo_title_contact',
+ label: 'Título: ', width: 150},
+ {view: 'text', id: 'name_contact', name: 'name_contact',
+ label: 'Nombre: '},
+ {view: 'text', id: 'paterno_contact', name: 'paterno_contact',
+ label: 'A. Paterno: '},
+ {view: 'text', id: 'materno_contact', name: 'materno_contact',
+ label: 'A. Materno: '},
+ {view: 'datepicker', id: 'date_contact', name: 'date_contact',
+ label: 'Fecha de Nacimiento: ', format: '%d-%M-%Y'},
+ ]},
+ {template: 'Correos y Teléfonos', type: 'section' },
+ {cols: [
+ grid_email,
+ {maxWidth: 10},
+ grid_phone,
+ ]},
+ {},
+ { template:"", type: "section" },
+ { margin: 10, cols: [{},
+ {view: "button", id: "cmd_save_conctact", label: "Guardar Contacto" , type: "form", autowidth: true, align:"center"},
+ {view: "button", id: "cmd_cancel_contact", label: "Regresar" , type: "danger", autowidth: true, align:"center"},
+ {}]
+ },
+
+]
+
+
+var form_contact = {
+ type: 'space',
+ cols: [{
+ view: 'form',
+ id: 'form_contact',
+ complexData: true,
+ elements: controls_contact,
+ elementsConfig: {
+ labelPosition: 'top',
+ },
+ autoheight: true,
+ }]
+}
+
+
+var multi_contacts = {
+ id: 'multi_contacts',
+ animate: true,
+ cells:[
+ {id: 'contacts_home', rows:[
+ {view: 'toolbar', elements: toolbar_contacts},
+ grid_contacts,
+ ]},
+ {id: 'contacts_new', rows:[form_contact, {}]}
+ ]
+};
+
+
+var controls_partner = [
+ {
+ view: 'tabview',
+ id: 'tab_partner',
+ tabbar: {options: ['Datos Fiscales', 'Otros Datos', 'Contactos']}, animate: true,
+ cells: [
+ {id: 'Datos Fiscales', rows: controls_fiscales},
+ {id: 'Otros Datos', rows: controls_others},
+ {id: 'Contactos', rows: [multi_contacts]},
+ ]
+ },
+ {rows: [
+ { template:"", type: "section" },
+ { margin: 10, cols: [{},
+ {view: "button", id: "cmd_save_partner", label: "Guardar" , type: "form", autowidth: true, align:"center"},
+ {view: "button", id: "cmd_cancel_partner", label: "Cancelar" , type: "danger", autowidth: true, align:"center"},
+ {}]
+ },
+ ]}
+]
+
+
+var form_partner = {
+ type: 'space',
+ cols: [{
+ view: 'form',
+ id: 'form_partner',
+ complexData: true,
+ elements: controls_partner,
+ elementsConfig: {
+ labelWidth: 150,
+ labelAlign: 'right'
+ },
+ autoheight: true,
+ rules: {
+ nombre: function(value){ return value.trim() != '';},
+ rfc: validate_rfc,
+ }
+ }]
+}
+
+
+var multi_partners = {
+ id: 'multi_partners',
+ animate: true,
+ cells:[
+ {id: 'partners_home', rows:[
+ {view: 'toolbar', elements: toolbar_partners},
+ grid_partners,
+ ]},
+ {id: 'partners_new', rows:[form_partner, {}]}
+ ]
+}
+
+
+var title_partners = 'Administración de Clientes y Proveedores'
+var app_partners = {
+ id: 'app_partners',
+ rows:[
+ {view: 'template', id: 'th_partner', type: 'header', template: title_partners},
+ multi_partners
+ ]
+}
+
+
diff --git a/source/static/js/ui/products.js b/source/static/js/ui/products.js
new file mode 100644
index 0000000..d0596ab
--- /dev/null
+++ b/source/static/js/ui/products.js
@@ -0,0 +1,171 @@
+
+
+var toolbar_products = [
+ {view: "button", id: "cmd_new_product", label: "Nuevo", type: "iconButton",
+ autowidth: true, icon: "plus"},
+ {view: "button", id: "cmd_edit_product", label: "Editar", type: "iconButton",
+ autowidth: true, icon: "pencil"},
+ {view: "button", id: "cmd_delete_product", label: "Eliminar",
+ type: "iconButton", autowidth: true, icon: "minus"},
+]
+
+
+var grid_products_cols = [
+ { id: "id", header: "ID", width: 75},
+ { id: "clave", header: ["Clave", {content: "textFilter"}], width: 100,
+ sort:"string" },
+ { id: "descripcion", header: ["Descripción", {content: "textFilter"}],
+ fillspace:true, sort:"string" },
+ { id: "unidad", header: ["Unidad", {content: "selectFilter"}], width: 150,
+ sort:"string" },
+ { id: "valor_unitario", header: ["Precio", {content: "numberFilter"}], width: 150,
+ sort:"int", format: webix.i18n.priceFormat, css: "right" },
+]
+
+
+var grid_products = {
+ view: "datatable",
+ id: "grid_products",
+ select: "row",
+ adjust: true,
+ footer: true,
+ resizeColumn: true,
+ headermenu: true,
+ columns: grid_products_cols,
+}
+
+var suggest_categories = {
+ view: "datasuggest",
+ type: "tree",
+ width: 400,
+ body: { data: [] },
+}
+
+
+var grid_product_taxes_cols = [
+ {id:"id", header:"ID", hidden: true},
+ {id:"name", header:'Nombre'},
+ {id:"tipo", header:'Tipo'},
+ {id:"tasa", header:'Tasa'},
+]
+
+
+var grid_product_taxes = {
+ view: 'datatable',
+ id: 'grid_product_taxes',
+ select: 'row',
+ multiselect: true,
+ adjust: true,
+ autoheight: true,
+ autowidth: true,
+ headermenu: true,
+ columns: grid_product_taxes_cols,
+}
+
+
+var controls_generals = [
+ {view: 'checkbox', id: 'es_activo_producto', name: 'es_activo_producto',
+ label: 'Activo: ', value: true,
+ bottomLabel: 'Se recomienda solo desactivar y no eliminar'},
+ {cols: [
+ {view: 'combo', id: 'categoria', name: 'categoria', label: 'Categoría',
+ labelPosition: 'top', options: suggest_categories},
+ {view: 'text', id: 'clave', name: 'clave', label: 'Clave',
+ labelPosition: 'top', readonly: true, required: true},
+ {view: 'checkbox', id: 'chk_automatica', label: 'Automática',
+ labelPosition: 'top', value: true, maxWidth: 80},
+ {view: 'search', id: 'clave_sat', name: 'clave_sat', label: 'Clave SAT',
+ labelPosition: 'top', required: true, placeholder: 'Buscar clave...'},
+ ]},
+ {cols: [
+ {view: 'text', id: 'codigo_barras', name: 'codigo_barras',
+ label: 'Código de Barras', labelPosition: 'top', hidden: true},
+ {view: 'text', id: 'cuenta_predial', name: 'cuenta_predial',
+ label: 'Cuenta Predial', labelPosition: 'top', hidden: true},
+ {id: 'txt_col1'}]},
+ {view: "textarea", id: "descripcion", name: "descripcion", height: 200,
+ label: "Descripción", required: true, labelPosition: "top",
+ invalidMessage: "La Descripción es requerida" },
+ {minHeight: 5},
+ {cols: [
+ {view: "richselect", id: "unidad", name: "unidad", label: "Unidad",
+ width: 300, labelWidth: 130, labelAlign: "right", required: true,
+ invalidMessage: "La Unidad es requerida", options: []},
+ {view: 'text', id: 'tags_producto', name: 'tags_producto',
+ labelAlign: 'right', label: 'Etiquetas',
+ placeholder: 'Separadas por comas'}
+ ]},
+ {cols: [{view: "currency", type: "text", id: "valor_unitario",
+ name: "valor_unitario", label: "Valor Unitario", width: 300,
+ labelWidth: 130, labelAlign: "right", required: true,
+ invalidMessage: "Captura un valor númerico", inputAlign: "right" },{}]},
+ {cols: [
+ {view: 'checkbox', id: 'inventario', name: 'inventario', hidden: true,
+ label: 'Inventario', labelAlign: 'right', labelWidth: 130},
+ {view: 'counter', id: 'existencia', name: 'existencia', hidden: true,
+ label: 'Existencia', step: 5, value: 0, min: 0, disabled: true},
+ {view: 'counter', id: 'minimo', name: 'minimo', hidden: true,
+ label: 'Mínimo', step: 5, value: 0, min: 0, disabled: true},
+ {id: 'txt_col2'}]},
+ {cols:[{view:'label', label:'Impuestos', width: 300, align:'center'}, {}]},
+ {cols:[grid_product_taxes, {}]}
+]
+
+
+var controls_products = [
+ {
+ view: "tabview",
+ tabbar: { options: ["Datos"]}, animate: true,
+ cells: [
+ {id: "Datos", rows: controls_generals},
+ ],
+ },
+ {rows: [
+ { template:"", type: "section" },
+ { margin: 10, cols: [{},
+ {view: "button", id: "cmd_save_product", label: "Guardar" , type: "form", autowidth: true, align:"center"},
+ {view: "button", id: "cmd_cancel_product", label: "Cancelar" , type: "danger", autowidth: true, align:"center"},
+ {}]
+ },
+ ]}
+]
+
+
+var form_product = {
+ type: "space",
+ cols: [{
+ view: "form",
+ id: "form_product",
+ //~ width: 600,
+ complexData: true,
+ elements: controls_products,
+ rules: {
+ descripcion: function(value){ return value.trim() != ""; },
+ valor_unitario: function(value){ return value.trim() != "$"; },
+ }
+ }],
+}
+
+
+var multi_products = {
+ id: "multi_products",
+ animate: true,
+ cells:[
+ {id: "products_home", rows:[
+ {view:"toolbar", elements: toolbar_products},
+ grid_products,
+ ]},
+ {id: "product_new", rows:[form_product, {}]}
+ ],
+}
+
+
+var app_products = {
+ id: "app_products",
+ rows:[
+ {view: "template", id: "th_products", type: "header", template:"Administración de Productos" },
+ multi_products
+ ],
+}
+
+
diff --git a/source/static/js/webix.js b/source/static/js/webix.js
new file mode 100644
index 0000000..6376784
--- /dev/null
+++ b/source/static/js/webix.js
@@ -0,0 +1,1985 @@
+/*
+@license
+webix UI v.4.3.0
+This software is covered by Webix Commercial License.
+Usage without proper license is prohibited.
+(c) XB Software Ltd.
+*/
+window.webix||(webix={}),webix.version="4.3.0",webix.codebase="./",webix.name="core",webix.cdn="//cdn.webix.com",webix.clone=function(t){var e=webix.clone.a;return e.prototype=t,new e},webix.clone.a=function(){},webix.extend=function(t,e,i){if(t.$protoWait)return webix.PowerArray.insertAt.call(t.$protoWait,e,1),
+t;for(var s in e)(!t[s]||i)&&(t[s]=e[s]);return e.defaults&&webix.extend(t.defaults,e.defaults),e.$init&&e.$init.call(t),t},webix.copy=function(t){var e;arguments.length>1?(e=arguments[0],t=arguments[1]):e=webix.isArray(t)?[]:{};for(var i in t){var s=t[i];!s||"object"!=typeof s||s instanceof RegExp?e[i]=s:webix.isDate(s)?e[i]=new Date(s):(e[i]=webix.isArray(s)?[]:{},
+webix.copy(e[i],s))}return e},webix.single=function(t){var e=null,i=function(i){return e||(e=new t({})),e.c&&e.c.apply(e,arguments),e};return i},webix.protoUI=function(){var t=arguments,e=t[0].name,i=function(t){if(!i)return webix.ui[e].prototype;var s=i.$protoWait;if(s){for(var n=[s[0]],a=1;a0;n--){if("function"==typeof t[n]&&(t[n]=t[n].prototype),t[n].$init&&s.push(t[n].$init),t[n].defaults){var a=t[n].defaults;e.defaults||(e.defaults={});for(var r in a)webix.isUndefined(e.defaults[r])&&(e.defaults[r]=a[r]);
+}if(t[n].type&&e.type)for(var r in t[n].type)e.type[r]||(e.type[r]=t[n].type[r]);for(var h in t[n])e[h]||e[h]===!1||(e[h]=t[n][h])}i&&s.push(e.$init),e.$init=function(){for(var t=0;t");
+-1!==s?this[e.substr(0,s)].attachEvent(e.substr(s+2),webix.bind(i,this)):this.attachEvent(e,i)}},callEvent:function(t,e){if(this.i.l)return!0;t=t.toLowerCase();var i=this.i[t.toLowerCase()],s=!0;if(i)for(var n=0;n=0&&this.splice(t,e||1)},remove:function(t){this.removeAt(this.find(t))},insertAt:function(t,e){if(e||0===e){var i=this.splice(e,this.length-e);this[e]=t,this.push.apply(this,i)}else this.push(t)},find:function(t){for(var e=0;e-1){
+webix.env.cssPrefix=n[i];var o=webix.env.jsPrefix=s[i];webix.env.transform=o?o+"Transform":"transform",webix.env.transition=o?o+"Transition":"transition",webix.env.transitionDuration=o?o+"TransitionDuration":"transitionDuration",a.style[webix.env.transform]="translate3d(0,0,0)",webix.env.translate=a.style[webix.env.transform]?"translate3d":"translate",
+webix.env.transitionEnd="-Moz-"==webix.env.cssPrefix?"transitionend":o?o+"TransitionEnd":"transitionend"}webix.env.pointerevents=!webix.env.isIE||null!==new RegExp("Trident/.*rv:11").exec(t)}(),webix.env.svg=function(){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1");
+}(),webix.env.svganimation=function(){return document.implementation.hasFeature("https://www.w3.org/TR/SVG11/feature#SVG-animation","1.1")}(),webix.html={m:0,ky:{},denySelect:function(){webix.m||(webix.m=document.onselectstart),document.onselectstart=webix.html.stopEvent},allowSelect:function(){0!==webix.m&&(document.onselectstart=webix.m||null),
+webix.m=0},index:function(t){for(var e=0;t=t.previousSibling;)e++;return e},n:{},createCss:function(t,e){var i="";e=e||"";for(var s in t)i+=s+":"+t[s]+";";var n=this.n[i+e];return n||(n="s"+webix.uid(),this.addStyle("."+n+(e||"")+"{"+i+"}"),this.n[i+e]=n),n},addStyle:function(t,e){var i=e?this.ky[e]:this.ky["default"];
+i||(i=document.createElement("style"),i.setAttribute("type","text/css"),i.setAttribute("media","screen,print"),document.getElementsByTagName("head")[0].appendChild(i),e?this.ky[e]=i:this.ky["default"]=i),i.styleSheet?i.styleSheet.cssText+=t:i.appendChild(document.createTextNode(t))},removeStyle:function(t){
+var e=this.ky[t||"default"];e&&(e.innerHTML="")},create:function(t,e,i){e=e||{};var s=document.createElement(t);for(var n in e)s.setAttribute(n,e[n]);return e.style&&(s.style.cssText=e.style),e["class"]&&(s.className=e["class"]),i&&(s.innerHTML=i),s},getValue:function(t){return t=webix.toNode(t),t?webix.isUndefined(t.value)?t.innerHTML:t.value:"";
+},remove:function(t){if(t instanceof Array)for(var e=0;eh;h++){var l,c=i[h];try{l=c&&c.then}catch(u){n.reject(u);break}!function(e){t.thennable(l,function(t){i[e]=t,s()},function(t){n.reject(t);
+},function(){s()},c)}(h)}return n})};var s={all:function(t){var i=new e(null,null);return i.resolve(t),i.all()},defer:function(){return new e(null,null)},fcall:function(){var t=new e,i=Array.apply([],arguments),s=i.shift();try{var n=s.apply(null,i);t.resolve(n)}catch(a){t.reject(a)}return t},nfcall:function(){
+var t=new e,i=Array.apply([],arguments),s=i.shift();try{i.push(function(e,i){return e?t.reject(e):t.resolve(i)}),s.apply(null,i)}catch(n){t.reject(n)}return t}};t.promise=s}(webix),function(){function t(t,e){this.kD={},this.lD=[],this.mD=t,this.U="",e?this.nD(e):this.o=webix.ajax(t).then(function(t){
+return t.text()}).then(webix.bind(function(t){return t=t.split("/*api*/")[1],this.nD(JSON.parse(t)),this.kD},this))}function e(e,i){var s=new t(e,i);return s.oD()}var i="__webix_remote_error";t.prototype={nD:function(t){if(t.$key&&(this.U=t.$key),t.$vars)for(var e in t.$vars)this.kD[e]=t.$vars[e];this.df(t,this.kD,"");
+},df:function(t,e,i){for(var s in t)if("$key"!==s&&"$vars"!==s){var n=t[s];if("object"==typeof n){var a=e[s]={};this.df(n,a,i+s+".")}else e[s]=this.pD(this,i+s)}},qD:function(t,e){var i=this.rD(this,t,e);return this.lD.push(i),this.sD(),i},sD:function(){this.tD||(this.tD=setTimeout(webix.bind(this.uD,this),1));
+},uD:function(){for(var t=[],e=this.lD,s=0;s":">",'"':""","'":"'","`":"`"},r=/[&<>"'`]/g,h=function(t){return a[t]||"&"};webix.template=function(a){if("function"==typeof a)return a;if(t[a])return t[a];if(a=(a||"").toString(),-1!=a.indexOf("->")){var r=a.split("->");switch(r[0]){case"html":a=webix.html.getValue(r[1]);
+break;case"http":a=(new webix.ajax).sync().get(r[1],{uid:webix.uid()}).responseText}}if(a=(a||"").toString(),webix.env.strict){if(!e[a]){e[a]=[];var h=[];if(a.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,function(t,e,i,s,n){h.push({pos:n,str:t,fn:function(t,n){return t[e]?i:s}})}),a.replace(/\{common\.([^}\(]*)\}/g,function(t,e,i){
+h.push({pos:i,str:t,fn:function(t,i){return i[e]||""}})}),a.replace(/\{common\.([^\}\(]*)\(\)\}/g,function(t,e,i){h.push({pos:i,str:t,fn:function(t,i){return i[e]?i[e].apply(this,arguments):""}})}),a.replace(/\{obj\.([^:}]*)\}/g,function(t,e,i){h.push({pos:i,str:t,fn:function(t,i){return t[e]}})}),a.replace("{obj}",function(t,e,i){
+h.push({pos:i,str:t,fn:function(t,e){return t}})}),a.replace(/#([^#'";, ]+)#/gi,function(t,e,i){"!"==e.charAt(0)?h.push({pos:i,str:t,fn:function(t,i){return e=e.substr(1),-1!=e.indexOf(".")&&(t=webix.CodeParser.collapseNames(t)),webix.template.escape(t[e.substr(1)])}}):h.push({pos:i,str:t,fn:function(t,i){
+return-1!=e.indexOf(".")&&(t=webix.CodeParser.collapseNames(t)),t[e]}})}),h.sort(function(t,e){return t.pos>e.pos?1:-1}),h.length){for(var o=0,l=function(t,i,s){e[t].push(function(){return t.slice(i,s)})},c=0;c")){var e=t.split("->");return webix.proxy(e[0],e[1])}return t},webix.proxy.post={$proxy:!0,load:function(t,e,i){i=webix.extend(i||{},this.params||{},!0),webix.ajax().bind(t).post(this.source,i,e)}},webix.proxy.sync={$proxy:!0,
+load:function(t,e){webix.ajax().sync().bind(t).get(this.source,null,e)}},webix.proxy.connector={$proxy:!0,connectorName:"!nativeeditor_status",load:function(t,e){webix.ajax(this.source,e,t)},saveAll:function(t,e,i,s){for(var n=this.source,a={},r=[],h=0;h=400||0===r.status;"blob"==r.responseType||"arraybuffer"==r.responseType?(t="",e=r.response):(t=r.responseText||"",e=p.J(r)),webix.ajax.$callback(s,i,t,e,r,a)}p&&(p.master=null),i=p=n=null}},this.qh&&(r.timeout=this.qh),this.H?r.send(e||null):setTimeout(function(){r.aborted||(-1!=webix.ly.find(r)?webix.ly.remove(r):r.send(e||null));
+},1),this.master&&this.master.Ve&&this.master.Ve.push(r),this.H?r:a}},J:function(t){return{xml:function(){try{return webix.DataDriver.xml.tagToObject(webix.DataDriver.xml.toObject(t.responseText,this))}catch(e){}},rawxml:function(){return window.XPathResult?t.responseXML:webix.DataDriver.xml.fromString(t.responseText);
+},text:function(){return t.responseText},json:function(){return webix.DataDriver.json.toObject(t.responseText,!1)}}},get:function(t,e,i){return this.G(t,e,i,"GET")},post:function(t,e,i){return this.G(t,e,i,"POST")},put:function(t,e,i){return this.G(t,e,i,"PUT")},del:function(t,e,i){return this.G(t,e,i,"DELETE");
+},patch:function(t,e,i){return this.G(t,e,i,"PATCH")},sync:function(){return this.H=!0,this},timeout:function(t){return this.qh=t,this},response:function(t){return this.Tw=t,this},header:function(t){return this.I=t,this},headers:function(t){return this.I=webix.extend(this.I||{},t),this},bind:function(t){
+return this.master=t,this}},webix.ajax.$callback=function(t,e,i,s,n,a){if(!t.$destructed){if(-1===n&&s&&"function"==typeof s.json&&(s=s.json()),a&&webix.callEvent("onAjaxError",[n]),webix.isArray(e)||(e=[e]),!a)for(var r=0;rs&&(e.value=e.value||this.nodeValue(t))}return e},nodeValue:function(t){return t.firstChild?t.firstChild.wholeText||t.firstChild.data:""},fromString:function(t){try{if(window.DOMParser)return(new DOMParser).parseFromString(t,"text/xml");
+if(window.ActiveXObject){var e=new ActiveXObject("Microsoft.xmlDOM");return e.loadXML(t),e}}catch(i){return null}}},webix.BaseBind={bind:function(t,e,i){this.attachEvent||webix.extend(this,webix.EventSystem),"string"==typeof t&&(t=webix.$$(t)),t.W&&t.W(),this.W&&this.W(),t.getBindData||webix.extend(t,webix.BindSource),
+this.X(),t.addBind(this.s.id,e,i),this.Os=t.s.id;var s=this.s.id;this.Ps=this.attachEvent(this.touchable?"onAfterRender":"onBindRequest",function(){return t.getBindData(s)}),this.refresh&&this.isVisible(this.s.id)&&this.refresh()},unbind:function(){if(this.Os){var t=webix.$$(this.Os);t&&t.removeBind(this.s.id),
+this.detachEvent(this.Ps),this.Os=null}},X:function(){var t=this.s;if(this.filter){var e=t.id;this.data.Y=webix.bind(function(){webix.$$(this.Os).Z[e]=!1},this)}var i=this.render;this.render=function(){if(!this.$){this.$=!0;var t=this.callEvent("onBindRequest");return this.$=!1,i.apply(this,t===!1?arguments:[]);
+}},(this.getValue||this.getValues)&&(this.save=function(t){var e=webix.$$(this.Os);if(t)e.setBindData(t);else{if(this.validate&&!this.validate())return!1;var i=this.getValue?this.getValue:this.getValues();e.setBindData(i,this.s.id),this.setDirty&&this.setDirty(!1)}}),this.X=function(){}}},webix.BindSource={
+$init:function(){this.bb={},this.Z={},this.cb={},this.db(this)},saveBatch:function(t){this.eb=!0,t.call(this),this.eb=!1,this.fb()},setBindData:function(t,e){if(e&&(this.cb[e]=!0),this.setValue)this.setValue(t);else if(this.setValues)this.setValues(t);else{var i=this.getCursor();i?this.updateItem(i,t):this.add(t);
+}this.callEvent("onBindUpdate",[t,e]),this.save&&this.save(),e&&(this.cb[e]=!1)},getBindData:function(t,e){if(this.Z[t])return!1;var i=webix.$$(t);i.isVisible(i.s.id)&&(this.Z[t]=!0,this.gb(i,this.bb[t][0],this.bb[t][1]),e&&i.filter&&i.refresh())},addBind:function(t,e,i){this.bb[t]=[e,i]},removeBind:function(t){
+delete this.bb[t],delete this.Z[t],delete this.cb[t]},db:function(t){t.filter?webix.extend(this,webix.CollectionBind):t.setValue?webix.extend(this,webix.ValueBind):webix.extend(this,webix.RecordBind)},fb:function(){if(!this.eb)for(var t in this.bb)this.cb[t]||(this.Z[t]=!1,this.getBindData(t,!0))},hb:function(t,e,i){
+t.setValue?t.setValue(i&&e?i[e]:i):t.filter?t.data.silent(function(){this.filter(e,i)}):!i&&t.clear?t.clear():t.O(i)&&t.setValues(webix.clone(i)),t.callEvent("onBindApply",[i,e,this])}},webix.DataValue=webix.proto({name:"DataValue",isVisible:function(){return!0},$init:function(t){(!t||webix.isUndefined(t.value))&&(this.data=t||"");
+var e=t&&t.id?t.id:webix.uid();this.s={id:e},webix.ui.views[e]=this},setValue:function(t){this.data=t,this.callEvent("onChange",[t])},getValue:function(){return this.data},refresh:function(){this.callEvent("onBindRequest")}},webix.EventSystem,webix.BaseBind),webix.DataRecord=webix.proto({name:"DataRecord",
+isVisible:function(){return!0},$init:function(t){this.data=t||{};var e=t&&t.id?t.id:webix.uid();this.s={id:e},webix.ui.views[e]=this},getValues:function(){return this.data},setValues:function(t,e){this.data=e?webix.extend(this.data,t,!0):t,this.callEvent("onChange",[t])},refresh:function(){this.callEvent("onBindRequest");
+}},webix.EventSystem,webix.BaseBind,webix.AtomDataLoader,webix.Settings),webix.ValueBind={$init:function(){this.attachEvent("onChange",this.fb)},gb:function(t,e,i){e=e||"value";var s=this.getValue()||"";if(i&&(s=i(s)),t.setValue)t.setValue(s);else if(t.filter)t.data.silent(function(){this.filter(e,s);
+});else{var n={};n[e]=s,t.O(s)&&t.setValues(n)}t.callEvent("onBindApply",[s,e,this])}},webix.RecordBind={$init:function(){this.attachEvent("onChange",this.fb)},gb:function(t,e,i){var s=this.getValues()||null;i&&(s=i(s)),this.hb(t,e,s)}},webix.CollectionBind={$init:function(){this.ib=null,this.attachEvent("onSelectChange",function(t){
+var e=this.getSelectedId();this.setCursor(e?e.id||e:null)}),this.attachEvent("onAfterCursorChange",this.fb),this.attachEvent("onAfterDelete",function(t){t==this.getCursor()&&this.setCursor(null)}),this.data.attachEvent("onStoreUpdated",webix.bind(function(t,e,i){t&&t==this.getCursor()&&"paint"!=i&&"delete"!=i&&this.fb();
+},this)),this.data.attachEvent("onClearAll",webix.bind(function(){this.ib=null},this)),this.data.attachEvent("onIdChange",webix.bind(function(t,e){this.ib==t&&(this.ib=e,this.fb())},this))},refreshCursor:function(){this.ib&&this.callEvent("onAfterCursorChange",[this.ib])},setCursor:function(t){t==this.ib||null!==t&&!this.getItem(t)||(this.callEvent("onBeforeCursorChange",[this.ib]),
+this.ib=t,this.callEvent("onAfterCursorChange",[t]))},getCursor:function(){return this.ib},gb:function(t,e,i){if("$level"==e&&this.data.getBranch)return(t.data||t).importData(this.data.getBranch(this.getCursor()));var s=this.getItem(this.getCursor())||this.s.defaultData||null;"$data"==e?("function"==typeof i?i.call(t,s,this):t.data.importData(s?s[i]:[]),
+t.callEvent("onBindApply",[s,e,this])):(i&&(s=i(s)),this.hb(t,e,s))}},webix.AtomRender={jb:function(t){return t.$empty?"":this.s.template(t,this)},render:function(){var t=this.s;return this.isVisible(t.id)?((!this.callEvent||this.callEvent("onBeforeRender",[this.data]))&&(this.data&&!t.content&&(this.y.innerHTML="",
+this.y.innerHTML=this.jb(this.data)),this.callEvent&&this.callEvent("onAfterRender",[])),!0):!1},sync:function(t){this.kb=!1,"DataStore"!=t.name&&(t.data&&"DataStore"==t.name?t=t.data:this.kb=!0),this.kb?t.bind("change",webix.bind(function(t){t.id==this.data.id&&(this.data=t.attributes,this.refresh());
+},this)):t.attachEvent("onStoreUpdated",webix.bind(function(e){e&&e!=this.data.id||(this.data=t.pull[e],this.refresh())},this))},template_setter:webix.template},webix.SingleRender=webix.proto({template_setter:function(t){this.type.template=webix.template(t)},jb:function(t){var e=this.type;return(e.templateStart?e.templateStart(t,e):"")+e.template(t,e)+(e.templateEnd?e.templateEnd(t,e):"");
+},customize:function(t){webix.type(this,t)}},webix.AtomRender),webix.UIManager={A:null,lb:{},mb:0,nb:{enter:13,tab:9,esc:27,escape:27,up:38,down:40,left:37,right:39,pgdown:34,pagedown:34,pgup:33,pageup:33,end:35,home:36,insert:45,"delete":46,backspace:8,space:32,meta:91,win:91,mac:91,multiply:106,add:107,
+subtract:109,decimal:110,divide:111,scrollock:145,pausebreak:19,numlock:144,"5numlocked":12,shift:16,capslock:20},wD:{input:1,button:1,textarea:1,select:1},ob:function(){webix.event(document.body,"click",webix.bind(this.pb,this)),webix.event(document,"keydown",webix.bind(this.qb,this)),document.body.addEventListener&&webix.event(document.body,"focus",this.rb,{
+capture:!0,bind:this}),webix.destructors.push({obj:this})},destructor:function(){webix.UIManager.A=null},getFocus:function(){return this.A},sb:function(t){this.tb=this.tb||t.s.id},setFocus:function(t,e){return t=webix.$$(t),t&&!t.$view&&(t=null),this.mb=webix.mb=new Date,this.A===t?!0:(this.A&&this.A.callEvent&&this.A.callEvent("onBlur",[this.A]),
+t&&t.callEvent&&t.callEvent("onFocus",[t,this.A]),webix.callEvent("onFocusChange",[t,this.A]),this.A&&this.A.blur&&!e&&this.A.blur(),this.A=t,t&&t.focus&&!e&&t.focus(),!0)},applyChanges:function(t){var e=this.getFocus();e&&e!=t&&e.Xy&&e.Xy(t)},hasFocus:function(t){return t===this.A?!0:!1},ub:function(t,e){
+var i=webix.html.locate(t,"view_id")||this.tb;return i=webix.$$(i),this.tb=null,webix.mb=new Date,i!=this.A?(e||(this.tb=null),i?(i=webix.$$(i),this.canFocus(i)&&(i.getNode&&i.getNode(t),this.setFocus(i))):e||this.setFocus(null),!0):void 0},pb:function(t){return new Date-this.mb<100?(this.tb=null,!1):this.ub(t);
+},rb:function(t){return this.wD[t.target.nodeName.toLowerCase()]?this.ub(t,!0):!1},canFocus:function(t){return t.isVisible()&&t.isEnabled()},vb:function(t){var e=this.getFocus();return t&&!this.wb(t,e)?!1:void(this.xb("getPrev",t)||(this.A=null))},Xz:{},wb:function(t,e){if(!t)return!1;if(!e)return!1;for(;e;){
+if(e===t)return!0;e=e.getParentView()}return!1},yb:function(){this&&this.callEvent&&this.callEvent("onTimedKeyPress",[])},BA:function(t){return 112>t&&t>105},qb:function(t){var e=t.which||t.keyCode;e>95&&106>e&&(e-=48),e=this.Xz[e]||e;var i=t.ctrlKey,s=t.shiftKey,n=t.altKey,a=t.metaKey,r=this.zb(e,i,s,n,a),h=this.getFocus();
+h&&h.callEvent&&(h.callEvent("onKeyPress",[e,t])===!1&&webix.html.preventEvent(t),h.hasEvent("onTimedKeyPress")&&(clearTimeout(h.Ab),h.Ab=webix.delay(this.yb,h,[],h.s.keyPressTimeout||250))),this.BA(e)||(r=this.zb(String.fromCharCode(e),i,s,n,a));var o=!i&&!n&&!a&&9!=e&&27!=e&&13!=e;return this.Bb(r,o,t)===!1?(webix.html.preventEvent(t),
+!1):void 0},xb:function(t){if(!this.getFocus())return null;t=t||"getNext";for(var e=this.getFocus(),i=e,s=webix.uid();;){if(e=this[t](e),e&&this.canFocus(e))return this.setFocus(e);if(e===i||e.$fmarker==s)return null;e.$fmarker=s}},WE:function(t,e){var i=!e.shiftKey;if(webix.UIManager.XE=new Date,t&&t.Gb&&!t.Gb(i,e))return!1;
+if(t&&t.Eb){if(t.editNext)return t.editNext(i);if(t.editStop)return t.editStop(),!0}else webix.delay(function(){webix.UIManager.setFocus(webix.$$(document.activeElement),!0)},1)},getTop:function(t){for(var e,i=webix.$$(t);i&&(e=i.getParentView());)i=e;return i},getNext:function(t,e){var i=t.getChildViews();
+if(i.length&&!e)return i[0];var s=t.getParentView();if(!s)return t;var n=s.getChildViews();if(n.length)for(var a=webix.PowerArray.find.call(n,t)+1;a=0;){if(this.canFocus(n[a]))return this.getPrev(n[a],!0);a--}return s},addHotKey:function(t,e,i){var s=this.Cb(t);i||(i=null),s.handler=e,s.view=i;var n=this.zb(s.letter,s.ctrl,s.shift,s.alt,s.meta);
+return this.lb[n]||(this.lb[n]=[]),this.lb[n].push(s),t},removeHotKey:function(t,e,i){var s=this.Cb(t),n=this.zb(s.letter,s.ctrl,s.shift,s.alt,s.meta);if(e||i){var a=this.lb[n];if(a){for(var r=a.length-1;r>=0;r--)i&&a[r].view!==i||e&&a[r].handler!==e||a.splice(r,1);a.length||delete this.lb[n]}}else delete this.lb[n];
+},zb:function(t,e,i,s,n){return t+"_"+["",e?"1":"0",i?"1":"0",s?"1":"0",n?"1":"0"].join("")},Bb:function(t,e,i){var s=this.getFocus();return this.lb[t]?this.Db(this.lb[t],s,i):e&&this.lb.ANY_0000?this.Db(this.lb.ANY_0000,s,i):!0},Db:function(t,e,i){for(var s=0;s=0;e--)delete webix.ui.views[t[e].config.id],t[e].config.id="x"+webix.uid(),webix.ui.views[t[e].config.id]=t[e],
+n(t[e].getChildViews())}}webix.ui.animate=function(t,e,i){var s=webix.$$(e);if(s){var n=i||{type:"slide",direction:"left"},a=s.x.cloneNode(!0),r=webix.ui(t,e);r.x.parentNode.appendChild(a);var h=webix.animate.formLine(r.x,a,n);return n.callback=function(){webix.animate.breakLine(h)},webix.animate(h,n),
+r}},webix.ui.animateView=function(t,e,i){if(t=webix.$$(t)){i=i||{type:"slide",direction:"left"};for(var s=function(t){var e=t.x,i=e.className,s=e.innerHTML;return""+s+"
"},n=[],a=0;a=0;i--)t[i].obj&&t[i].obj.adjust()},webix.ui.each=function(t,e,i,s){if(t)for(var n=s?[t]:t.getChildViews(),a=0;at&&(t=i[0]),i[2]>e&&(e=i[2]),(!s||this.s.width)&&t>i[1]&&(t=i[1]),(!s||this.s.height)&&e>i[3]&&(e=i[3]),
+this.$setSize(t,e),webix.ED&&(webix.ED=!1,this.adjust())},resize:function(t){if(!(webix.gc||webix.ui.$freeze||webix.ot)){var e=this.getParentView();e?e.resizeChildren?e.resizeChildren():e.resize():(this.adjust(),webix.callEvent("onResize",[]))}}},webix.Settings,webix.Destruction,webix.BaseBind,webix.UIExtension),
+webix.protoUI({name:"view",$init:function(t){this.hc(t)},hc:function(t){var e=webix.isUndefined(t.borderless);e&&!this.setPosition&&t.$topView&&(t.borderless=!0,e=!1),e&&this.defaults.borderless||t.borderless?t.Ob={top:!0,left:!0,bottom:!0,right:!0}:(t.Ob||(t.Ob={}),this.w.style.borderWidth="1px")},$getSize:function(t,e){
+var i=this.s.Ob;i&&(t+=(i.left?0:1)+(i.right?0:1),e+=(i.top?0:1)+(i.bottom?0:1));var s=webix.ui.baseview.prototype.$getSize.call(this,t,e);return s},$setSize:function(t,e){var i=this.s.Ob;return i&&(t-=(i.left?0:1)+(i.right?0:1),e-=(i.top?0:1)+(i.bottom?0:1)),webix.ui.baseview.prototype.$setSize.call(this,t,e);
+}},webix.ui.baseview)}(),webix.ui.view.call(webix),webix.protoUI({name:"spacer",defaults:{borderless:!0},$init:function(){this.x.className+=" webix_spacer"}},webix.ui.view),webix.protoUI({name:"baselayout",$init:function(t){this.$ready.push(this.kc),this.y=this.w,this.lc=[],this.ht=[],t.$topView&&(t.borderless=!0,
+t.Ob={top:!0,left:!0,bottom:!0,right:!0}),t.isolate&&webix.extend(this,webix.IdSpace)},rows_setter:function(t){this.mc=1,this.nc=t},cols_setter:function(t){this.mc=0,this.$view.style.whiteSpace="nowrap",this.nc=t},Rb:function(t){webix.PowerArray.removeAt.call(this.q,webix.PowerArray.find.call(this.q,t)),
+this.resizeChildren(!0)},Qb:function(t,e){if(webix.isUndefined(e)){for(var i=0;ie||e>this.q.length)&&(e=this.q.length);var n=(this.q[e]||{}).x;webix.PowerArray.insertAt.call(this.q,t,e),t.s.hidden||webix.html.insertBefore(t.x,n,this.y);
+}else{s=webix.$$(e),e=webix.PowerArray.find.call(this.q,s);var a=s.x.parentNode;a&&!t.s.hidden&&a.insertBefore(t.x,s.x),s.destructor(),this.q[e]=t}this.mc||this.oc(t),this.q[e].Xb=this}this.resizeChildren(!0);var r=this.elements?this:this.getFormView();r&&r.Qs(),webix.callEvent("onReconstruct",[this]);
+},oc:function(t){t.x.style.display="inline-block",t.x.style.verticalAlign="top"},addView:function(t,e){webix.isUndefined(e)&&(e=this.q.length);var i=this.$$?this:this.getTopParentView();return i=i&&i.ui?i:webix,i.ui(t,this,e).s.id},removeView:function(t){var e;e="object"!=typeof t?webix.$$(t)||(this.$$?this.$$(t):null):t;
+var i=webix.PowerArray.find.call(this.q,e);if(i>=0){this.Vx&&this.Vx(i,e);var s=this.elements?this:this.getFormView();this.q.splice(i,1),s&&webix.ui.each(e,function(t){t.name&&delete s.getCleanValues()[t.config.name]},s,!0),e.destructor(),this.resizeChildren(!0),s&&s.Qs()}webix.callEvent("onReconstruct",[this]);
+},reconstruct:function(){this.qc=0,this.Qb(this.nc)},Fb:function(t,e,i){t.s.hidden||(t.s.hidden=!0,webix.html.remove(t.x),this.qc++,i||webix.Nb||this.resizeChildren(!0))},Lw:function(t){t.callEvent&&t.callEvent("onViewShow",[])},resizeChildren:function(){if(!webix.ui.$freeze&&this.lc){var t=this.getParentView();
+if(t)return t.resizeChildren?t.resizeChildren():t.resize();var e,i,s,n,a=this.$getSize(0,0);s=e=this.lc[0]||0,n=i=this.lc[1]||0,(a[1]>=1e5||a[3]>=1e5)&&this.x.parentNode&&(s=e=Math.max(a[0],this.s.width||this.x.parentNode.offsetWidth||e||0),n=i=Math.max(a[2],this.s.height||this.x.parentNode.offsetHeight||i||0)),
+t?this.rc(e,i):(a[0]>e&&(s=a[0]),a[2]>i&&(n=a[2]),e>a[1]&&(s=a[1]),i>a[3]&&(n=a[3]),this.$setSize(s,n)),webix.ED&&(webix.ED=!1,this.resizeChildren()),webix.callEvent("onResize",[])}},getChildViews:function(){return this.q},index:function(t){t.s&&(t=t.s.id);for(var e=0;ei&&(i=c[0]),c[1]a&&(a=c[2]),c[3]n&&(n=a),i>s&&(s=i),this.vc=[r,this.q.length-h,o],this.ng=[i+t,a+e];var u=webix.ui.baseview.prototype.$getSize.call(this,0,0);return u[1]>=1e5&&(u[1]=0),u[3]>=1e5&&(u[3]=0),u[0]=(u[0]||i)+t,u[1]=Math.max(u[0],(u[1]||s)+t),u[2]=(u[2]||a)+e,u[3]=Math.max(u[2],(u[3]||n)+e),
+!this.mc&&this.s.responsive&&(u[0]=0),u},$setSize:function(t,e){this.lc=[t,e],webix.ui.baseview.prototype.$setSize.call(this,t,e),this.rc(t,e)},wc:function(t,e,i){e=t[e],i=t[i];var s=e;if(e!=i){var n=this.xc*t[4]/this.yc;if(e>n)s=e,this.yc-=t[4],this.xc-=s;else{if(!(n>i))return-1;s=i,this.yc-=t[4],this.xc-=s;
+}}return s},it:function(t,e){var i=webix.$$(e);"hide"!==i&&i?(i||(i=webix.ui({view:"popup",body:[{}]})),t.jt=t.s.width,t.kt=t.s.height,t.lt=i.s.id,t.s.width=0,t.s.height||(t.s.autoheight=!0),webix.ui(t,i,this.ht.length)):(t.hide(),t.lt="hide"),this.ht.push(t)},mt:function(t){var e=t.lt;if(t.lt=0,"hide"!==e&&e){
+t.s.width=t.jt,t.s.height=t.kt,delete t.s.autoheight;for(var i=0;this.q[i]&&this.q[i].s.responsiveCell===!1;)i++;webix.ui(t,this,i)}else t.show();this.ht.pop()},nt:function(t,e){if(webix.ot=!0,t+2*this.Dc+this.Cc*(this.q.length-1)s;s++){var n=this.q[s];if(!n.lt){
+if(n.s.responsiveCell!==!1){this.it(n,this.s.responsive),webix.callEvent("onResponsiveHide",[n.s.id]),webix.ED=!0;break}i=this.q.length}}else if(this.ht.length){var n=this.ht[this.ht.length-1],a="hide"==n.lt?0:n.jt,r=n.$getSize(a,0);r[0]+this.ng[0]+this.Cc+20<=t&&(this.mt(n),webix.callEvent("onResponsiveShow",[n.s.id]),
+webix.ED=!0)}webix.ot=!1},rc:function(t,e){webix.gc=(webix.gc||0)+1,!this.mc&&this.s.responsive&&this.nt(t,e),this.xc=(this.mc?e:t)-this.vc[0],this.yc=this.vc[2];for(var i=t,s=e,n=[],a=0;as){
+n.push(a);continue}}else{var i=this.wc(r,0,1);if(0>i){n.push(a);continue}}this.q[a].$setSize(i,s)}for(var a=0;a0&&!this.Xx},Hc:function(t){if(!this.Wx()||this.s.borderless&&"space"!=this.s.type){for(var e=0;ee;e++)t[e].Ob.top=t[e].Ob.bottom=i;if(s>1){for("head"!=this.s.type&&(t[0].Ob.bottom=i);t[s-1].hidden&&s>1;)s--;s>0&&(t[s-1].Ob.top=i)}}else{for(var e=1;s-1>e;e++)t[e].Ob.left=t[e].Ob.right=i;if(s>1){for("head"!=this.s.type&&(t[0].Ob.right=i),t[s-1].Ob.left=i;s>1&&t[s-1].hidden;)s--;
+s>0&&(t[s-1].Ob.left=i)}}}else for(var e=0;e