Commits

Miguel Eduardo Roman Martinez  committed 7306779

Se agrego una interfaz gráfica

  • Participants
  • Parent commits debf341

Comments (0)

Files changed (20)

File Compiladores.sln

 		.nuget\NuGet.targets = .nuget\NuGet.targets
 	EndProjectSection
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UI", "UI\UI.csproj", "{B52B48F8-0FF9-429B-9353-DFEE13E9DEB8}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
 		{FB2ED8D5-2E18-46B1-966F-02A9798A556E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{FB2ED8D5-2E18-46B1-966F-02A9798A556E}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{FB2ED8D5-2E18-46B1-966F-02A9798A556E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B52B48F8-0FF9-429B-9353-DFEE13E9DEB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B52B48F8-0FF9-429B-9353-DFEE13E9DEB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B52B48F8-0FF9-429B-9353-DFEE13E9DEB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B52B48F8-0FF9-429B-9353-DFEE13E9DEB8}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

File Core/Core.csproj

     <Compile Include="Entidades\TablaSintactica.cs" />
     <Compile Include="Entidades\Terminal.cs" />
     <Compile Include="Entidades\Variable.cs" />
+    <Compile Include="Servicios\AnalizadorSintactico.cs" />
     <Compile Include="Servicios\GramaticaAnalyzer.cs" />
     <Compile Include="Servicios\GramaticaNormalizer.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />

File Core/Entidades/Terminal.cs

         {
             return this.Nombre;
         }
+
+        public bool EsEpsilon
+        {
+            get
+            {
+                return Nombre == Epsilon;
+            }
+        }
     }
 }

File Core/Entidades/Variable.cs

 using Seterlund.CodeGuard;
+using System.Collections.Generic;
+using System.Linq;
+
 namespace Compiladores.Entidades
 {
     public class Variable
         {
             return this.Nombre;
         }
+
+        public IEnumerable<KeyValuePair<Terminal, ReglaGramatical>> Primero { get; set; }
+
+        public IEnumerable<KeyValuePair<Terminal, ReglaGramatical>> Siguiente { get; set; }
+
+        public IEnumerable<Terminal> PrimeroHelper
+        {
+            get
+            {
+                return Primero.Select(x => x.Key).Distinct().ToArray();
+            }
+        }
+
+        public IEnumerable<Terminal> SiguienteHelper
+        {
+            get
+            {
+                return Siguiente.Select(x => x.Key).Distinct().ToArray();
+            }
+        }
     }
 }

File Core/Servicios/AnalizadorSintactico.cs

+using Compiladores.Entidades;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Compiladores.Servicios
+{
+    public class AnalizadorSintactico
+    {
+        private readonly GramaticaParser parser = new GramaticaParser();
+        private readonly GramaticaNormalizer normalizer = new GramaticaNormalizer();
+        private readonly GramaticaAnalyzer analyser = new GramaticaAnalyzer();
+        
+
+        private Gramatica gramaticaOriginal = null;
+        private Gramatica gramatica = null;
+        private TablaSintactica tabla = null;
+
+
+
+        public void Cargar(string ruta)
+        {
+            gramaticaOriginal = parser.ObtenerDesdeArchivo(ruta);
+            gramatica = parser.ObtenerDesdeArchivo(ruta);
+        }
+
+
+        public void Procesar()
+        {
+            try
+            {
+                normalizer.EliminarRecursividadIzquierda(gramatica);
+            }
+            catch (Exception ex)
+            {
+                throw new Exception("Ocurrió un error al eliminar la recursividad: " + ex.Message, ex);
+            }
+
+            try
+            {
+                analyser.CalcularPrimero(gramatica);
+            }
+            catch (Exception ex)
+            {
+                throw new Exception("Ocurrió un error al calcular la función primera: " + ex.Message, ex);
+            }
+
+            try
+            {
+                analyser.CalcularSiguiente(gramatica);
+            }
+            catch (Exception ex)
+            {
+                throw new Exception("Ocurrió un error al calcular la función siguiente: " + ex.Message, ex);
+            }
+
+            try
+            {
+                tabla = analyser.GenerarTablaSintactica(gramatica);
+            }
+            catch (Exception ex)
+            {
+                throw new Exception("Ocurrió un error al generar la tabla sintáctica: " + ex.Message, ex);
+            }
+
+        }
+
+
+        public Gramatica ObtenerGramaticaOriginal()
+        {
+            return gramaticaOriginal;
+        }
+
+        public Gramatica ObtenerGramaticaNormalizada()
+        {
+            return gramatica;
+        }
+
+        public TablaSintactica ObtenerTablaSintactica()
+        {
+            return tabla;
+        }
+    }
+}

File Core/Servicios/GramaticaAnalyzer.cs

 
             return tabla;
         }
+
+        public void CalcularPrimero(Gramatica gramatica)
+        {
+            foreach (var variable in gramatica.Variables)
+            {
+                variable.Primero = Primero(gramatica.Reglas, variable);
+            }
+        }
+
+        public void CalcularSiguiente(Gramatica gramatica)
+        {
+            foreach (var variable in gramatica.Variables)
+            {
+                variable.Siguiente = Siguiente(gramatica.Reglas, variable);
+            }
+        }
     }
 }

File Core/Servicios/GramaticaParser.cs

         /// <summary>
         /// Sobrecarga del constructor de la clase para sustituir las dependencias.
         /// </summary>
-        /// <param name="fileSystem">Systema de archivos</param>
+        /// <param name="fileSystem">Sistema de archivos</param>
         public GramaticaParser(IFileSystem fileSystem)
         {
             Guard.That(fileSystem, "fileSystem").IsNotNull();
         /// Lee la especificación de una gramática desde el archivo ubicado en <paramref name="ruta"/>.
         /// </summary>
         /// <param name="ruta">Ruta en la que se encuentra ubicado el archivo.</param>
-        /// <returns>Retorna la gramatica construida según la especificación del archivo.</returns>
+        /// <returns>Retorna la gramática construida según la especificación del archivo.</returns>
         public Gramatica ObtenerDesdeArchivo(string ruta)
         {
             if (!fileSystem.File.Exists(ruta))

File UI/App.config

+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>

File UI/MainForm.Designer.cs

+namespace UI
+{
+    partial class MainForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer();
+            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
+            this.archivoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.abrirToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.ofdArchivo = new System.Windows.Forms.OpenFileDialog();
+            this.webBrowser1 = new System.Windows.Forms.WebBrowser();
+            this.toolStripContainer1.ContentPanel.SuspendLayout();
+            this.toolStripContainer1.TopToolStripPanel.SuspendLayout();
+            this.toolStripContainer1.SuspendLayout();
+            this.menuStrip1.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // toolStripContainer1
+            // 
+            // 
+            // toolStripContainer1.ContentPanel
+            // 
+            this.toolStripContainer1.ContentPanel.Controls.Add(this.webBrowser1);
+            this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(736, 494);
+            this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.toolStripContainer1.Location = new System.Drawing.Point(0, 0);
+            this.toolStripContainer1.Name = "toolStripContainer1";
+            this.toolStripContainer1.Size = new System.Drawing.Size(736, 543);
+            this.toolStripContainer1.TabIndex = 0;
+            this.toolStripContainer1.Text = "toolStripContainer1";
+            // 
+            // toolStripContainer1.TopToolStripPanel
+            // 
+            this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.menuStrip1);
+            this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip1);
+            // 
+            // menuStrip1
+            // 
+            this.menuStrip1.Dock = System.Windows.Forms.DockStyle.None;
+            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.archivoToolStripMenuItem});
+            this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+            this.menuStrip1.Name = "menuStrip1";
+            this.menuStrip1.Size = new System.Drawing.Size(736, 24);
+            this.menuStrip1.TabIndex = 0;
+            this.menuStrip1.Text = "menuStrip1";
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None;
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripButton1});
+            this.toolStrip1.Location = new System.Drawing.Point(3, 24);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(35, 25);
+            this.toolStrip1.TabIndex = 1;
+            // 
+            // toolStripButton1
+            // 
+            this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
+            this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButton1.Name = "toolStripButton1";
+            this.toolStripButton1.Size = new System.Drawing.Size(23, 22);
+            this.toolStripButton1.Text = "toolStripButton1";
+            this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);
+            // 
+            // archivoToolStripMenuItem
+            // 
+            this.archivoToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.abrirToolStripMenuItem});
+            this.archivoToolStripMenuItem.Name = "archivoToolStripMenuItem";
+            this.archivoToolStripMenuItem.Size = new System.Drawing.Size(60, 20);
+            this.archivoToolStripMenuItem.Text = "Archivo";
+            // 
+            // abrirToolStripMenuItem
+            // 
+            this.abrirToolStripMenuItem.Name = "abrirToolStripMenuItem";
+            this.abrirToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+            this.abrirToolStripMenuItem.Text = "Abrir";
+            this.abrirToolStripMenuItem.Click += new System.EventHandler(this.abrirToolStripMenuItem_Click);
+            // 
+            // ofdArchivo
+            // 
+            this.ofdArchivo.DefaultExt = "*.txt";
+            this.ofdArchivo.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
+            this.ofdArchivo.Title = "Seleccione el archivo";
+            // 
+            // webBrowser1
+            // 
+            this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.webBrowser1.Location = new System.Drawing.Point(0, 0);
+            this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
+            this.webBrowser1.Name = "webBrowser1";
+            this.webBrowser1.Size = new System.Drawing.Size(736, 494);
+            this.webBrowser1.TabIndex = 0;
+            // 
+            // MainForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(736, 543);
+            this.Controls.Add(this.toolStripContainer1);
+            this.MainMenuStrip = this.menuStrip1;
+            this.Name = "MainForm";
+            this.Text = "Analizador Sintáctico";
+            this.toolStripContainer1.ContentPanel.ResumeLayout(false);
+            this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false);
+            this.toolStripContainer1.TopToolStripPanel.PerformLayout();
+            this.toolStripContainer1.ResumeLayout(false);
+            this.toolStripContainer1.PerformLayout();
+            this.menuStrip1.ResumeLayout(false);
+            this.menuStrip1.PerformLayout();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ToolStripContainer toolStripContainer1;
+        private System.Windows.Forms.MenuStrip menuStrip1;
+        private System.Windows.Forms.ToolStripMenuItem archivoToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem abrirToolStripMenuItem;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ToolStripButton toolStripButton1;
+        private System.Windows.Forms.OpenFileDialog ofdArchivo;
+        private System.Windows.Forms.WebBrowser webBrowser1;
+    }
+}
+

File UI/MainForm.cs

+using Compiladores.Entidades;
+using Compiladores.Servicios;
+using Nustache.Core;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace UI
+{
+    public partial class MainForm : Form
+    {
+        private readonly AnalizadorSintactico analizador = new AnalizadorSintactico();
+
+        const string plantilla = "UI.Plantilla.html";
+
+        public MainForm()
+        {
+            InitializeComponent();
+        }
+
+        private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            BuscarArchivo();
+        }
+
+        private void toolStripButton1_Click(object sender, EventArgs e)
+        {
+            BuscarArchivo();
+        }
+
+        private void BuscarArchivo()
+        {
+            var resultado = ofdArchivo.ShowDialog();
+            if (resultado == DialogResult.OK)
+            {
+                var ruta = ofdArchivo.FileName;
+
+                try
+                {
+                    analizador.Cargar(ruta);
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show("Ocurrió un error al leer el archivo: \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                    Renderizar(analizador.ObtenerGramaticaOriginal(), null, null);
+                    return;
+                }
+
+                try
+                {
+                    analizador.Procesar();
+                    Renderizar(analizador.ObtenerGramaticaOriginal(), analizador.ObtenerGramaticaNormalizada(), analizador.ObtenerTablaSintactica());
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show("Ocurrió un error al procesar la gramática: \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                    Renderizar(analizador.ObtenerGramaticaOriginal(), null, null);
+                    return;
+                }
+
+
+                
+            }
+
+        }
+
+        private void Renderizar(Gramatica gramaticaOriginal, Gramatica gramaticaNormalizada, TablaSintactica tablaSintactica)
+        {
+            var template = "";
+            using (var sr = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(plantilla)))
+            {
+                template = sr.ReadToEnd();
+            }
+
+            ICollection<ColumnaSintactica> columnas = null;
+            if (tablaSintactica != null)
+            {
+                columnas = tablaSintactica.Filas.First().Columnas;
+            }
+
+            var html = Render.StringToString(template, new { 
+                GramaticaOriginal = gramaticaOriginal, 
+                GramaticaNormalizada = gramaticaNormalizada,
+                TablaSintactica = tablaSintactica,
+                Columnas = columnas
+            });
+
+            webBrowser1.Navigate("about:blank");
+            Application.DoEvents();
+            var doc = webBrowser1.Document.OpenNew(false);
+
+            doc.Write(html);
+        }
+
+     
+    }
+}

File UI/MainForm.resx

+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>132, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
+        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
+        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
+        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
+        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
+        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
+        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
+        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
+        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
+        TgDQASA1MVpwzwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <metadata name="ofdArchivo.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>237, 17</value>
+  </metadata>
+</root>

File UI/Plantilla.html

+<!DOCTYPE>
+<html>
+    <head>
+        <title></title>
+        <style type="text/css">
+            /*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+            /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ html {
+                font-family: sans-serif;
+                -ms-text-size-adjust: 100%;
+                -webkit-text-size-adjust: 100%;
+            }
+
+            body {
+                margin: 0;
+            }
+
+            article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {
+                display: block;
+            }
+
+            audio, canvas, progress, video {
+                display: inline-block;
+                vertical-align: baseline;
+            }
+
+                audio:not([controls]) {
+                    display: none;
+                    height: 0;
+                }
+
+            [hidden], template {
+                display: none;
+            }
+
+            a {
+                background: 0 0;
+            }
+
+                a:active, a:hover {
+                    outline: 0;
+                }
+
+            abbr[title] {
+                border-bottom: 1px dotted;
+            }
+
+            b, strong {
+                font-weight: 700;
+            }
+
+            dfn {
+                font-style: italic;
+            }
+
+            h1 {
+                font-size: 2em;
+                margin: .67em 0;
+            }
+
+            mark {
+                background: #ff0;
+                color: #000;
+            }
+
+            small {
+                font-size: 80%;
+            }
+
+            sub, sup {
+                font-size: 75%;
+                line-height: 0;
+                position: relative;
+                vertical-align: baseline;
+            }
+
+            sup {
+                top: -.5em;
+            }
+
+            sub {
+                bottom: -.25em;
+            }
+
+            img {
+                border: 0;
+            }
+
+            svg:not(:root) {
+                overflow: hidden;
+            }
+
+            figure {
+                margin: 1em 40px;
+            }
+
+            hr {
+                -moz-box-sizing: content-box;
+                box-sizing: content-box;
+                height: 0;
+            }
+
+            pre {
+                overflow: auto;
+            }
+
+            code, kbd, pre, samp {
+                font-family: monospace,monospace;
+                font-size: 1em;
+            }
+
+            button, input, optgroup, select, textarea {
+                color: inherit;
+                font: inherit;
+                margin: 0;
+            }
+
+            button {
+                overflow: visible;
+            }
+
+            button, select {
+                text-transform: none;
+            }
+
+            button, html input[type=button], input[type=reset], input[type=submit] {
+                -webkit-appearance: button;
+                cursor: pointer;
+            }
+
+                button[disabled], html input[disabled] {
+                    cursor: default;
+                }
+
+                button::-moz-focus-inner, input::-moz-focus-inner {
+                    border: 0;
+                    padding: 0;
+                }
+
+            input {
+                line-height: normal;
+            }
+
+                input[type=checkbox], input[type=radio] {
+                    box-sizing: border-box;
+                    padding: 0;
+                }
+
+                input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button {
+                    height: auto;
+                }
+
+                input[type=search] {
+                    -webkit-appearance: textfield;
+                    -moz-box-sizing: content-box;
+                    -webkit-box-sizing: content-box;
+                    box-sizing: content-box;
+                }
+
+                    input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration {
+                        -webkit-appearance: none;
+                    }
+
+            fieldset {
+                border: 1px solid silver;
+                margin: 0 2px;
+                padding: .35em .625em .75em;
+            }
+
+            legend {
+                border: 0;
+                padding: 0;
+            }
+
+            textarea {
+                overflow: auto;
+            }
+
+            optgroup {
+                font-weight: 700;
+            }
+
+            table {
+                border-collapse: collapse;
+                border-spacing: 0;
+            }
+
+            td, th {
+                padding: 0;
+            }
+
+            @media print {
+                * {
+                    text-shadow: none !important;
+                    color: #000 !important;
+                    background: transparent !important;
+                    box-shadow: none !important;
+                }
+
+                a, a:visited {
+                    text-decoration: underline;
+                }
+
+                    a[href]:after {
+                        content: " (" attr(href) ")";
+                    }
+
+                abbr[title]:after {
+                    content: " (" attr(title) ")";
+                }
+
+                a[href^="javascript:"]:after, a[href^="#"]:after {
+                    content: "";
+                }
+
+                pre, blockquote {
+                    border: 1px solid #999;
+                    page-break-inside: avoid;
+                }
+
+                thead {
+                    display: table-header-group;
+                }
+
+                tr, img {
+                    page-break-inside: avoid;
+                }
+
+                img {
+                    max-width: 100% !important;
+                }
+
+                p, h2, h3 {
+                    orphans: 3;
+                    widows: 3;
+                }
+
+                h2, h3 {
+                    page-break-after: avoid;
+                }
+
+                select {
+                    background: #fff !important;
+                }
+
+                .navbar {
+                    display: none;
+                }
+
+                .table td, .table th {
+                    background-color: #fff !important;
+                }
+
+                .btn > .caret, .dropup > .btn > .caret {
+                    border-top-color: #000 !important;
+                }
+
+                .label {
+                    border: 1px solid #000;
+                }
+
+                .table {
+                    border-collapse: collapse !important;
+                }
+
+                .table-bordered th, .table-bordered td {
+                    border: 1px solid #ddd !important;
+                }
+            }
+
+            * {
+                -webkit-box-sizing: border-box;
+                -moz-box-sizing: border-box;
+                box-sizing: border-box;
+            }
+
+            :before, :after {
+                -webkit-box-sizing: border-box;
+                -moz-box-sizing: border-box;
+                box-sizing: border-box;
+            }
+
+            html {
+                font-size: 62.5%;
+                -webkit-tap-highlight-color: rgba(0,0,0,0);
+            }
+
+            body {
+                font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+                font-size: 14px;
+                line-height: 1.42857143;
+                color: #333;
+                background-color: #fff;
+            }
+
+            input, button, select, textarea {
+                font-family: inherit;
+                font-size: inherit;
+                line-height: inherit;
+            }
+
+            a {
+                color: #428bca;
+                text-decoration: none;
+            }
+
+                a:hover, a:focus {
+                    color: #2a6496;
+                    text-decoration: underline;
+                }
+
+                a:focus {
+                    outline: thin dotted;
+                    outline: 5px auto -webkit-focus-ring-color;
+                    outline-offset: -2px;
+                }
+
+            figure {
+                margin: 0;
+            }
+
+            img {
+                vertical-align: middle;
+            }
+
+            .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img {
+                display: block;
+                max-width: 100%;
+                height: auto;
+            }
+
+            .img-rounded {
+                border-radius: 6px;
+            }
+
+            .img-thumbnail {
+                padding: 4px;
+                line-height: 1.42857143;
+                background-color: #fff;
+                border: 1px solid #ddd;
+                border-radius: 4px;
+                -webkit-transition: all .2s ease-in-out;
+                transition: all .2s ease-in-out;
+                display: inline-block;
+                max-width: 100%;
+                height: auto;
+            }
+
+            .img-circle {
+                border-radius: 50%;
+            }
+
+            hr {
+                margin-top: 20px;
+                margin-bottom: 20px;
+                border: 0;
+                border-top: 1px solid #eee;
+            }
+
+            .sr-only {
+                position: absolute;
+                width: 1px;
+                height: 1px;
+                margin: -1px;
+                padding: 0;
+                overflow: hidden;
+                clip: rect(0,0,0,0);
+                border: 0;
+            }
+
+            h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
+                font-family: inherit;
+                font-weight: 500;
+                line-height: 1.1;
+                color: inherit;
+            }
+
+                h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small {
+                    font-weight: 400;
+                    line-height: 1;
+                    color: #999;
+                }
+
+            h1, .h1, h2, .h2, h3, .h3 {
+                margin-top: 20px;
+                margin-bottom: 10px;
+            }
+
+                h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small {
+                    font-size: 65%;
+                }
+
+            h4, .h4, h5, .h5, h6, .h6 {
+                margin-top: 10px;
+                margin-bottom: 10px;
+            }
+
+                h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small {
+                    font-size: 75%;
+                }
+
+            h1, .h1 {
+                font-size: 36px;
+            }
+
+            h2, .h2 {
+                font-size: 30px;
+            }
+
+            h3, .h3 {
+                font-size: 24px;
+            }
+
+            h4, .h4 {
+                font-size: 18px;
+            }
+
+            h5, .h5 {
+                font-size: 14px;
+            }
+
+            h6, .h6 {
+                font-size: 12px;
+            }
+
+            p {
+                margin: 0 0 10px;
+            }
+
+            .lead {
+                margin-bottom: 20px;
+                font-size: 16px;
+                font-weight: 200;
+                line-height: 1.4;
+            }
+
+            @media (min-width:768px) {
+                .lead {
+                    font-size: 21px;
+                }
+            }
+
+            small, .small {
+                font-size: 85%;
+            }
+
+            cite {
+                font-style: normal;
+            }
+
+            .text-left {
+                text-align: left;
+            }
+
+            .text-right {
+                text-align: right;
+            }
+
+            .text-center {
+                text-align: center;
+            }
+
+            .text-justify {
+                text-align: justify;
+            }
+
+            .text-muted {
+                color: #999;
+            }
+
+            .text-primary {
+                color: #428bca;
+            }
+
+            a.text-primary:hover {
+                color: #3071a9;
+            }
+
+            .text-success {
+                color: #3c763d;
+            }
+
+            a.text-success:hover {
+                color: #2b542c;
+            }
+
+            .text-info {
+                color: #31708f;
+            }
+
+            a.text-info:hover {
+                color: #245269;
+            }
+
+            .text-warning {
+                color: #8a6d3b;
+            }
+
+            a.text-warning:hover {
+                color: #66512c;
+            }
+
+            .text-danger {
+                color: #a94442;
+            }
+
+            a.text-danger:hover {
+                color: #843534;
+            }
+
+            .bg-primary {
+                color: #fff;
+                background-color: #428bca;
+            }
+
+            a.bg-primary:hover {
+                background-color: #3071a9;
+            }
+
+            .bg-success {
+                background-color: #dff0d8;
+            }
+
+            a.bg-success:hover {
+                background-color: #c1e2b3;
+            }
+
+            .bg-info {
+                background-color: #d9edf7;
+            }
+
+            a.bg-info:hover {
+                background-color: #afd9ee;
+            }
+
+            .bg-warning {
+                background-color: #fcf8e3;
+            }
+
+            a.bg-warning:hover {
+                background-color: #f7ecb5;
+            }
+
+            .bg-danger {
+                background-color: #f2dede;
+            }
+
+            a.bg-danger:hover {
+                background-color: #e4b9b9;
+            }
+
+            .page-header {
+                padding-bottom: 9px;
+                margin: 40px 0 20px;
+                border-bottom: 1px solid #eee;
+            }
+
+            ul, ol {
+                margin-top: 0;
+                margin-bottom: 10px;
+            }
+
+                ul ul, ol ul, ul ol, ol ol {
+                    margin-bottom: 0;
+                }
+
+            .list-unstyled {
+                padding-left: 0;
+                list-style: none;
+            }
+
+            .list-inline {
+                padding-left: 0;
+                list-style: none;
+                margin-left: -5px;
+            }
+
+                .list-inline > li {
+                    display: inline-block;
+                    padding-left: 5px;
+                    padding-right: 5px;
+                }
+
+            dl {
+                margin-top: 0;
+                margin-bottom: 20px;
+            }
+
+            dt, dd {
+                line-height: 1.42857143;
+            }
+
+            dt {
+                font-weight: 700;
+            }
+
+            dd {
+                margin-left: 0;
+            }
+
+            @media (min-width:768px) {
+                .dl-horizontal dt {
+                    float: left;
+                    width: 160px;
+                    clear: left;
+                    text-align: right;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    white-space: nowrap;
+                }
+
+                .dl-horizontal dd {
+                    margin-left: 180px;
+                }
+            }
+
+            abbr[title], abbr[data-original-title] {
+                cursor: help;
+                border-bottom: 1px dotted #999;
+            }
+
+            .initialism {
+                font-size: 90%;
+                text-transform: uppercase;
+            }
+
+            blockquote {
+                padding: 10px 20px;
+                margin: 0 0 20px;
+                font-size: 17.5px;
+                border-left: 5px solid #eee;
+            }
+
+                blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child {
+                    margin-bottom: 0;
+                }
+
+                blockquote footer, blockquote small, blockquote .small {
+                    display: block;
+                    font-size: 80%;
+                    line-height: 1.42857143;
+                    color: #999;
+                }
+
+                    blockquote footer:before, blockquote small:before, blockquote .small:before {
+                        content: '\2014 \00A0';
+                    }
+
+                .blockquote-reverse, blockquote.pull-right {
+                    padding-right: 15px;
+                    padding-left: 0;
+                    border-right: 5px solid #eee;
+                    border-left: 0;
+                    text-align: right;
+                }
+
+                    .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before {
+                        content: '';
+                    }
+
+                    .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after {
+                        content: '\00A0 \2014';
+                    }
+
+                blockquote:before, blockquote:after {
+                    content: "";
+                }
+
+            address {
+                margin-bottom: 20px;
+                font-style: normal;
+                line-height: 1.42857143;
+            }
+
+            code, kbd, pre, samp {
+                font-family: Menlo,Monaco,Consolas,"Courier New",monospace;
+            }
+
+            code {
+                padding: 2px 4px;
+                font-size: 90%;
+                color: #c7254e;
+                background-color: #f9f2f4;
+                white-space: nowrap;
+                border-radius: 4px;
+            }
+
+            kbd {
+                padding: 2px 4px;
+                font-size: 90%;
+                color: #fff;
+                background-color: #333;
+                border-radius: 3px;
+                box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
+            }
+
+            pre {
+                display: block;
+                padding: 9.5px;
+                margin: 0 0 10px;
+                font-size: 13px;
+                line-height: 1.42857143;
+                word-break: break-all;
+                word-wrap: break-word;
+                color: #333;
+                background-color: #f5f5f5;
+                border: 1px solid #ccc;
+                border-radius: 4px;
+            }
+
+                pre code {
+                    padding: 0;
+                    font-size: inherit;
+                    color: inherit;
+                    white-space: pre-wrap;
+                    background-color: transparent;
+                    border-radius: 0;
+                }
+
+            .pre-scrollable {
+                max-height: 340px;
+                overflow-y: scroll;
+            }
+
+            .container {
+                margin-right: auto;
+                margin-left: auto;
+                padding-left: 15px;
+                padding-right: 15px;
+            }
+
+            @media (min-width:768px) {
+                .container {
+                    width: 750px;
+                }
+            }
+
+            @media (min-width:992px) {
+                .container {
+                    width: 970px;
+                }
+            }
+
+            @media (min-width:1200px) {
+                .container {
+                    width: 1170px;
+                }
+            }
+
+            .container-fluid {
+                margin-right: auto;
+                margin-left: auto;
+                padding-left: 15px;
+                padding-right: 15px;
+            }
+
+            .row {
+                margin-left: -15px;
+                margin-right: -15px;
+            }
+
+            .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+                position: relative;
+                min-height: 1px;
+                padding-left: 15px;
+                padding-right: 15px;
+            }
+
+            .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+                float: left;
+            }
+
+            .col-xs-12 {
+                width: 100%;
+            }
+
+            .col-xs-11 {
+                width: 91.66666667%;
+            }
+
+            .col-xs-10 {
+                width: 83.33333333%;
+            }
+
+            .col-xs-9 {
+                width: 75%;
+            }
+
+            .col-xs-8 {
+                width: 66.66666667%;
+            }
+
+            .col-xs-7 {
+                width: 58.33333333%;
+            }
+
+            .col-xs-6 {
+                width: 50%;
+            }
+
+            .col-xs-5 {
+                width: 41.66666667%;
+            }
+
+            .col-xs-4 {
+                width: 33.33333333%;
+            }
+
+            .col-xs-3 {
+                width: 25%;
+            }
+
+            .col-xs-2 {
+                width: 16.66666667%;
+            }
+
+            .col-xs-1 {
+                width: 8.33333333%;
+            }
+
+            .col-xs-pull-12 {
+                right: 100%;
+            }
+
+            .col-xs-pull-11 {
+                right: 91.66666667%;
+            }
+
+            .col-xs-pull-10 {
+                right: 83.33333333%;
+            }
+
+            .col-xs-pull-9 {
+                right: 75%;
+            }
+
+            .col-xs-pull-8 {
+                right: 66.66666667%;
+            }
+
+            .col-xs-pull-7 {
+                right: 58.33333333%;
+            }
+
+            .col-xs-pull-6 {
+                right: 50%;
+            }
+
+            .col-xs-pull-5 {
+                right: 41.66666667%;
+            }
+
+            .col-xs-pull-4 {
+                right: 33.33333333%;
+            }
+
+            .col-xs-pull-3 {
+                right: 25%;
+            }
+
+            .col-xs-pull-2 {
+                right: 16.66666667%;
+            }
+
+            .col-xs-pull-1 {
+                right: 8.33333333%;
+            }
+
+            .col-xs-pull-0 {
+                right: 0;
+            }
+
+            .col-xs-push-12 {
+                left: 100%;
+            }
+
+            .col-xs-push-11 {
+                left: 91.66666667%;
+            }
+
+            .col-xs-push-10 {
+                left: 83.33333333%;
+            }
+
+            .col-xs-push-9 {
+                left: 75%;
+            }
+
+            .col-xs-push-8 {
+                left: 66.66666667%;
+            }
+
+            .col-xs-push-7 {
+                left: 58.33333333%;
+            }
+
+            .col-xs-push-6 {
+                left: 50%;
+            }
+
+            .col-xs-push-5 {
+                left: 41.66666667%;
+            }
+
+            .col-xs-push-4 {
+                left: 33.33333333%;
+            }
+
+            .col-xs-push-3 {
+                left: 25%;
+            }
+
+            .col-xs-push-2 {
+                left: 16.66666667%;
+            }
+
+            .col-xs-push-1 {
+                left: 8.33333333%;
+            }
+
+            .col-xs-push-0 {
+                left: 0;
+            }
+
+            .col-xs-offset-12 {
+                margin-left: 100%;
+            }
+
+            .col-xs-offset-11 {
+                margin-left: 91.66666667%;
+            }
+
+            .col-xs-offset-10 {
+                margin-left: 83.33333333%;
+            }
+
+            .col-xs-offset-9 {
+                margin-left: 75%;
+            }
+
+            .col-xs-offset-8 {
+                margin-left: 66.66666667%;
+            }
+
+            .col-xs-offset-7 {
+                margin-left: 58.33333333%;
+            }
+
+            .col-xs-offset-6 {
+                margin-left: 50%;
+            }
+
+            .col-xs-offset-5 {
+                margin-left: 41.66666667%;
+            }
+
+            .col-xs-offset-4 {
+                margin-left: 33.33333333%;
+            }
+
+            .col-xs-offset-3 {
+                margin-left: 25%;
+            }
+
+            .col-xs-offset-2 {
+                margin-left: 16.66666667%;
+            }
+
+            .col-xs-offset-1 {
+                margin-left: 8.33333333%;
+            }
+
+            .col-xs-offset-0 {
+                margin-left: 0;
+            }
+
+            @media (min-width:768px) {
+                .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+                    float: left;
+                }
+
+                .col-sm-12 {
+                    width: 100%;
+                }
+
+                .col-sm-11 {
+                    width: 91.66666667%;
+                }
+
+                .col-sm-10 {
+                    width: 83.33333333%;
+                }
+
+                .col-sm-9 {
+                    width: 75%;
+                }
+
+                .col-sm-8 {
+                    width: 66.66666667%;
+                }
+
+                .col-sm-7 {
+                    width: 58.33333333%;
+                }
+
+                .col-sm-6 {
+                    width: 50%;
+                }
+
+                .col-sm-5 {
+                    width: 41.66666667%;
+                }
+
+                .col-sm-4 {
+                    width: 33.33333333%;
+                }
+
+                .col-sm-3 {
+                    width: 25%;
+                }
+
+                .col-sm-2 {
+                    width: 16.66666667%;
+                }
+
+                .col-sm-1 {
+                    width: 8.33333333%;
+                }
+
+                .col-sm-pull-12 {
+                    right: 100%;
+                }
+
+                .col-sm-pull-11 {
+                    right: 91.66666667%;
+                }
+
+                .col-sm-pull-10 {
+                    right: 83.33333333%;
+                }
+
+                .col-sm-pull-9 {
+                    right: 75%;
+                }
+
+                .col-sm-pull-8 {
+                    right: 66.66666667%;
+                }
+
+                .col-sm-pull-7 {
+                    right: 58.33333333%;
+                }
+
+                .col-sm-pull-6 {
+                    right: 50%;
+                }
+
+                .col-sm-pull-5 {
+                    right: 41.66666667%;
+                }
+
+                .col-sm-pull-4 {
+                    right: 33.33333333%;
+                }
+
+                .col-sm-pull-3 {
+                    right: 25%;
+                }
+
+                .col-sm-pull-2 {
+                    right: 16.66666667%;
+                }
+
+                .col-sm-pull-1 {
+                    right: 8.33333333%;
+                }
+
+                .col-sm-pull-0 {
+                    right: 0;
+                }
+
+                .col-sm-push-12 {
+                    left: 100%;
+                }
+
+                .col-sm-push-11 {
+                    left: 91.66666667%;
+                }
+
+                .col-sm-push-10 {
+                    left: 83.33333333%;
+                }
+
+                .col-sm-push-9 {
+                    left: 75%;
+                }
+
+                .col-sm-push-8 {
+                    left: 66.66666667%;
+                }
+
+                .col-sm-push-7 {
+                    left: 58.33333333%;
+                }
+
+                .col-sm-push-6 {
+                    left: 50%;
+                }
+
+                .col-sm-push-5 {
+                    left: 41.66666667%;
+                }
+
+                .col-sm-push-4 {
+                    left: 33.33333333%;
+                }
+
+                .col-sm-push-3 {
+                    left: 25%;
+                }
+
+                .col-sm-push-2 {
+                    left: 16.66666667%;
+                }
+
+                .col-sm-push-1 {
+                    left: 8.33333333%;
+                }
+
+                .col-sm-push-0 {
+                    left: 0;
+                }
+
+                .col-sm-offset-12 {
+                    margin-left: 100%;
+                }
+
+                .col-sm-offset-11 {
+                    margin-left: 91.66666667%;
+                }
+
+                .col-sm-offset-10 {
+                    margin-left: 83.33333333%;
+                }
+
+                .col-sm-offset-9 {
+                    margin-left: 75%;
+                }
+
+                .col-sm-offset-8 {
+                    margin-left: 66.66666667%;
+                }
+
+                .col-sm-offset-7 {
+                    margin-left: 58.33333333%;
+                }
+
+                .col-sm-offset-6 {
+                    margin-left: 50%;
+                }
+
+                .col-sm-offset-5 {
+                    margin-left: 41.66666667%;
+                }
+
+                .col-sm-offset-4 {
+                    margin-left: 33.33333333%;
+                }
+
+                .col-sm-offset-3 {
+                    margin-left: 25%;
+                }
+
+                .col-sm-offset-2 {
+                    margin-left: 16.66666667%;
+                }
+
+                .col-sm-offset-1 {
+                    margin-left: 8.33333333%;
+                }
+
+                .col-sm-offset-0 {
+                    margin-left: 0;
+                }
+            }
+
+            @media (min-width:992px) {
+                .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+                    float: left;
+                }
+
+                .col-md-12 {
+                    width: 100%;
+                }
+
+                .col-md-11 {
+                    width: 91.66666667%;
+                }
+
+                .col-md-10 {
+                    width: 83.33333333%;
+                }
+
+                .col-md-9 {
+                    width: 75%;
+                }
+
+                .col-md-8 {
+                    width: 66.66666667%;
+                }
+
+                .col-md-7 {
+                    width: 58.33333333%;
+                }
+
+                .col-md-6 {
+                    width: 50%;
+                }
+
+                .col-md-5 {
+                    width: 41.66666667%;
+                }
+
+                .col-md-4 {
+                    width: 33.33333333%;
+                }
+
+                .col-md-3 {
+                    width: 25%;
+                }
+
+                .col-md-2 {
+                    width: 16.66666667%;
+                }
+
+                .col-md-1 {
+                    width: 8.33333333%;
+                }
+
+                .col-md-pull-12 {
+                    right: 100%;
+                }
+
+                .col-md-pull-11 {
+                    right: 91.66666667%;
+                }
+
+                .col-md-pull-10 {
+                    right: 83.33333333%;
+                }
+
+                .col-md-pull-9 {
+                    right: 75%;
+                }
+
+                .col-md-pull-8 {
+                    right: 66.66666667%;
+                }
+
+                .col-md-pull-7 {
+                    right: 58.33333333%;
+                }
+
+                .col-md-pull-6 {
+                    right: 50%;
+                }
+
+                .col-md-pull-5 {
+                    right: 41.66666667%;
+                }
+
+                .col-md-pull-4 {
+                    right: 33.33333333%;
+                }
+
+                .col-md-pull-3 {
+                    right: 25%;
+                }
+
+                .col-md-pull-2 {
+                    right: 16.66666667%;
+                }
+
+                .col-md-pull-1 {
+                    right: 8.33333333%;
+                }
+
+                .col-md-pull-0 {
+                    right: 0;
+                }
+
+                .col-md-push-12 {
+                    left: 100%;
+                }
+
+                .col-md-push-11 {
+                    left: 91.66666667%;
+                }
+
+                .col-md-push-10 {
+                    left: 83.33333333%;
+                }
+
+                .col-md-push-9 {
+                    left: 75%;
+                }
+
+                .col-md-push-8 {
+                    left: 66.66666667%;
+                }
+
+                .col-md-push-7 {
+                    left: 58.33333333%;
+                }
+
+                .col-md-push-6 {
+                    left: 50%;
+                }
+
+                .col-md-push-5 {
+                    left: 41.66666667%;
+                }
+
+                .col-md-push-4 {
+                    left: 33.33333333%;
+                }
+
+                .col-md-push-3 {
+                    left: 25%;
+                }
+
+                .col-md-push-2 {
+                    left: 16.66666667%;
+                }
+
+                .col-md-push-1 {
+                    left: 8.33333333%;
+                }
+
+                .col-md-push-0 {
+                    left: 0;
+                }
+
+                .col-md-offset-12 {
+                    margin-left: 100%;
+                }
+
+                .col-md-offset-11 {
+                    margin-left: 91.66666667%;
+                }
+
+                .col-md-offset-10 {
+                    margin-left: 83.33333333%;
+                }
+
+                .col-md-offset-9 {
+                    margin-left: 75%;
+                }
+
+                .col-md-offset-8 {
+                    margin-left: 66.66666667%;
+                }
+
+                .col-md-offset-7 {
+                    margin-left: 58.33333333%;
+                }
+
+                .col-md-offset-6 {
+                    margin-left: 50%;
+                }
+
+                .col-md-offset-5 {
+                    margin-left: 41.66666667%;
+                }
+
+                .col-md-offset-4 {
+                    margin-left: 33.33333333%;
+                }
+
+                .col-md-offset-3 {
+                    margin-left: 25%;
+                }
+
+                .col-md-offset-2 {
+                    margin-left: 16.66666667%;
+                }
+
+                .col-md-offset-1 {
+                    margin-left: 8.33333333%;
+                }
+
+                .col-md-offset-0 {
+                    margin-left: 0;
+                }
+            }
+
+            @media (min-width:1200px) {
+                .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+                    float: left;
+                }
+
+                .col-lg-12 {
+                    width: 100%;
+                }
+
+                .col-lg-11 {
+                    width: 91.66666667%;
+                }
+
+                .col-lg-10 {
+                    width: 83.33333333%;
+                }
+
+                .col-lg-9 {
+                    width: 75%;
+                }
+
+                .col-lg-8 {
+                    width: 66.66666667%;
+                }
+
+                .col-lg-7 {
+                    width: 58.33333333%;
+                }
+
+                .col-lg-6 {
+                    width: 50%;
+                }
+
+                .col-lg-5 {
+                    width: 41.66666667%;
+                }
+
+                .col-lg-4 {
+                    width: 33.33333333%;
+                }
+
+                .col-lg-3 {
+                    width: 25%;
+                }
+
+                .col-lg-2 {
+                    width: 16.66666667%;
+                }
+
+                .col-lg-1 {
+                    width: 8.33333333%;
+                }
+
+                .col-lg-pull-12 {
+                    right: 100%;
+                }
+
+                .col-lg-pull-11 {
+                    right: 91.66666667%;
+                }
+
+                .col-lg-pull-10 {
+                    right: 83.33333333%;
+                }
+
+                .col-lg-pull-9 {
+                    right: 75%;
+                }
+
+                .col-lg-pull-8 {
+                    right: 66.66666667%;
+                }
+
+                .col-lg-pull-7 {
+                    right: 58.33333333%;
+                }
+
+                .col-lg-pull-6 {
+                    right: 50%;
+                }
+
+                .col-lg-pull-5 {
+                    right: 41.66666667%;
+                }
+
+                .col-lg-pull-4 {
+                    right: 33.33333333%;
+                }
+
+                .col-lg-pull-3 {
+                    right: 25%;
+                }
+
+                .col-lg-pull-2 {
+                    right: 16.66666667%;
+                }
+
+                .col-lg-pull-1 {
+                    right: 8.33333333%;
+                }
+
+                .col-lg-pull-0 {
+                    right: 0;
+                }
+
+                .col-lg-push-12 {
+                    left: 100%;
+                }
+
+                .col-lg-push-11 {
+                    left: 91.66666667%;
+                }