diff --git a/hosting/static/hosting/js/html2pdf.js b/hosting/static/hosting/js/html2pdf.js
deleted file mode 100644
index 92b970ac..00000000
--- a/hosting/static/hosting/js/html2pdf.js
+++ /dev/null
@@ -1,395 +0,0 @@
-/**
- * @license
- *
- * MIT License
- *
- * Copyright (c) 2017 Erik Koopmans
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/**
- * Generate a PDF from an HTML element or string using html2canvas and jsPDF.
- *
- * @param {Element|string} source The source element or HTML string.
- * @param {Object=} opt An object of optional settings: 'margin', 'filename',
- * 'image' ('type' and 'quality'), and 'html2canvas' / 'jspdf', which are
- * sent as settings to their corresponding functions.
- */
-
-var html2pdf = (function(html2canvas, jsPDF) {
-
- /* ---------- MAIN FUNCTION ---------- */
-
- var html2pdf = function(source, opt) {
- // Handle input.
- opt = objType(opt) === 'object' ? opt : {};
- var source = html2pdf.parseInput(source, opt);
-
- // Determine the PDF page size.
- var pageSize = jsPDF.getPageSize(opt.jsPDF);
- pageSize.inner = {
- width: pageSize.width - opt.margin[1] - opt.margin[3],
- height: pageSize.height - opt.margin[0] - opt.margin[2]
- };
- pageSize.inner.ratio = pageSize.inner.height / pageSize.inner.width;
-
- // Copy the source element into a PDF-styled container div.
- var container = html2pdf.makeContainer(source, pageSize);
- var overlay = container.parentElement;
-
- // Get the locations of all hyperlinks.
- if (opt.enableLinks) {
- // Find all anchor tags and get the container's bounds for reference.
- opt.links = [];
- var links = container.querySelectorAll('a');
- var containerRect = unitConvert(container.getBoundingClientRect(), pageSize.k);
-
- // Treat each client rect as a separate link (for text-wrapping).
- Array.prototype.forEach.call(links, function(link) {
- var clientRects = link.getClientRects();
- for (var i=0; i {
- // onRendered(canvas);
- document.body.removeChild(overlay);
- html2pdf.makePDF(canvas, pageSize, opt);
- });
- };
-
- html2pdf.parseInput = function(source, opt) {
- // Parse the opt object.
- opt.jsPDF = opt.jsPDF || {};
- opt.html2canvas = opt.html2canvas || {};
- opt.filename = opt.filename && objType(opt.filename) === 'string' ? opt.filename : 'file.pdf';
- opt.enableLinks = opt.hasOwnProperty('enableLinks') ? opt.enableLinks : true;
- opt.image = opt.image || {};
- opt.image.type = opt.image.type || 'jpeg';
- opt.image.quality = opt.image.quality || 0.95;
-
- // Parse the margin property of the opt object.
- switch (objType(opt.margin)) {
- case 'undefined':
- opt.margin = 0;
- case 'number':
- opt.margin = [opt.margin, opt.margin, opt.margin, opt.margin];
- break;
- case 'array':
- if (opt.margin.length === 2) {
- opt.margin = [opt.margin[0], opt.margin[1], opt.margin[0], opt.margin[1]];
- }
- if (opt.margin.length === 4) {
- break;
- }
- default:
- throw 'Invalid margin array.';
- }
-
- // Parse the source element/string.
- if (!source) {
- throw 'Missing source element or string.';
- } else if (objType(source) === 'string') {
- source = createElement('div', { innerHTML: source });
- } else if (objType(source) === 'element') {
- source = cloneNode(source, opt.html2canvas.javascriptEnabled);
- } else {
- throw 'Invalid source - please specify an HTML Element or string.';
- }
-
- // Return the parsed input (opt is modified in-place, no need to return).
- return source;
- };
-
- html2pdf.makeContainer = function(source, pageSize) {
- // Define the CSS styles for the container and its overlay parent.
- var overlayCSS = {
- position: 'fixed', overflow: 'hidden', zIndex: 1000,
- left: 0, right: 0, bottom: 0, top: 0,
- backgroundColor: 'rgba(0,0,0,0.8)'
- };
- var containerCSS = {
- position: 'absolute', width: pageSize.inner.width + pageSize.unit,
- left: 0, right: 0, top: 0, height: 'auto', margin: 'auto',
- backgroundColor: 'white'
- };
-
- // Set the overlay to hidden (could be changed in the future to provide a print preview).
- overlayCSS.opacity = 0;
-
- // Create and attach the elements.
- var overlay = createElement('div', { className: 'html2pdf__overlay', style: overlayCSS });
- var container = createElement('div', { className: 'html2pdf__container', style: containerCSS });
- container.appendChild(source);
- overlay.appendChild(container);
- document.body.appendChild(overlay);
-
- // Enable page-breaks.
- var pageBreaks = source.querySelectorAll('.html2pdf__page-break');
- var pxPageHeight = pageSize.inner.height * pageSize.k / 72 * 96;
- Array.prototype.forEach.call(pageBreaks, function(el) {
- el.style.display = 'block';
- var clientRect = el.getBoundingClientRect();
- el.style.height = pxPageHeight - (clientRect.top % pxPageHeight) + 'px';
- }, this);
-
- // Return the container.
- return container;
- };
-
- html2pdf.makePDF = function(canvas, pageSize, opt) {
- // Calculate the number of pages.
- var ctx = canvas.getContext('2d');
- var pxFullHeight = canvas.height;
- var pxPageHeight = Math.floor(canvas.width * pageSize.inner.ratio);
- var nPages = Math.ceil(pxFullHeight / pxPageHeight);
-
- // Create a one-page canvas to split up the full image.
- var pageCanvas = document.createElement('canvas');
- var pageCtx = pageCanvas.getContext('2d');
- var pageHeight = pageSize.inner.height;
- pageCanvas.width = canvas.width;
- pageCanvas.height = pxPageHeight;
-
- // Initialize the PDF.
- var pdf = new jsPDF(opt.jsPDF);
-
- for (var page=0; page pageTop && link.clientRect.top < pageTop + pageSize.inner.height) {
- var left = opt.margin[1] + link.clientRect.left;
- var top = opt.margin[0] + link.clientRect.top - pageTop;
- pdf.link(left, top, link.clientRect.width, link.clientRect.height, { url: link.el.href });
- }
- });
- }
- }
-
- // Finish the PDF.
- pdf.save( opt.filename );
- }
-
-
- /* ---------- UTILS ---------- */
-
- // Determine the type of a variable/object.
- var objType = function(obj) {
- if (typeof obj === 'undefined') return 'undefined';
- else if (typeof obj === 'string' || obj instanceof String) return 'string';
- else if (typeof obj === 'number' || obj instanceof Number) return 'number';
- else if (!!obj && obj.constructor === Array) return 'array';
- else if (obj && obj.nodeType === 1) return 'element';
- else if (typeof obj === 'object') return 'object';
- else return 'unknown';
- };
-
- // Create an HTML element with optional className, innerHTML, and style.
- var createElement = function(tagName, opt) {
- var el = document.createElement(tagName);
- if (opt.className) el.className = opt.className;
- if (opt.innerHTML) {
- el.innerHTML = opt.innerHTML;
- var scripts = el.getElementsByTagName('script');
- for (var i = scripts.length; i-- > 0; null) {
- scripts[i].parentNode.removeChild(scripts[i]);
- }
- }
- for (var key in opt.style) {
- el.style[key] = opt.style[key];
- }
- return el;
- };
-
- // Deep-clone a node and preserve contents/properties.
- var cloneNode = function(node, javascriptEnabled) {
- // Recursively clone the node.
- var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false);
- for (var child = node.firstChild; child; child = child.nextSibling) {
- if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') {
- clone.appendChild(cloneNode(child, javascriptEnabled));
- }
- }
-
- if (node.nodeType === 1) {
- // Preserve contents/properties of special nodes.
- if (node.nodeName === 'CANVAS') {
- clone.width = node.width;
- clone.height = node.height;
- clone.getContext('2d').drawImage(node, 0, 0);
- } else if (node.nodeName === 'TEXTAREA' || node.nodeName === 'SELECT') {
- clone.value = node.value;
- }
-
- // Preserve the node's scroll position when it loads.
- clone.addEventListener('load', function() {
- clone.scrollTop = node.scrollTop;
- clone.scrollLeft = node.scrollLeft;
- }, true);
- }
-
- // Return the cloned node.
- return clone;
- }
-
- // Convert units using the conversion value 'k' from jsPDF.
- var unitConvert = function(obj, k) {
- var newObj = {};
- for (var key in obj) {
- newObj[key] = obj[key] * 72 / 96 / k;
- }
- return newObj;
- };
-
- // Get dimensions of a PDF page, as determined by jsPDF.
- jsPDF.getPageSize = function(orientation, unit, format) {
- // Decode options object
- if (typeof orientation === 'object') {
- var options = orientation;
- orientation = options.orientation;
- unit = options.unit || unit;
- format = options.format || format;
- }
-
- // Default options
- unit = unit || 'mm';
- format = format || 'a4';
- orientation = ('' + (orientation || 'P')).toLowerCase();
- var format_as_string = ('' + format).toLowerCase();
-
- // Size in pt of various paper formats
- var pageFormats = {
- 'a0' : [2383.94, 3370.39], 'a1' : [1683.78, 2383.94],
- 'a2' : [1190.55, 1683.78], 'a3' : [ 841.89, 1190.55],
- 'a4' : [ 595.28, 841.89], 'a5' : [ 419.53, 595.28],
- 'a6' : [ 297.64, 419.53], 'a7' : [ 209.76, 297.64],
- 'a8' : [ 147.40, 209.76], 'a9' : [ 104.88, 147.40],
- 'a10' : [ 73.70, 104.88], 'b0' : [2834.65, 4008.19],
- 'b1' : [2004.09, 2834.65], 'b2' : [1417.32, 2004.09],
- 'b3' : [1000.63, 1417.32], 'b4' : [ 708.66, 1000.63],
- 'b5' : [ 498.90, 708.66], 'b6' : [ 354.33, 498.90],
- 'b7' : [ 249.45, 354.33], 'b8' : [ 175.75, 249.45],
- 'b9' : [ 124.72, 175.75], 'b10' : [ 87.87, 124.72],
- 'c0' : [2599.37, 3676.54], 'c1' : [1836.85, 2599.37],
- 'c2' : [1298.27, 1836.85], 'c3' : [ 918.43, 1298.27],
- 'c4' : [ 649.13, 918.43], 'c5' : [ 459.21, 649.13],
- 'c6' : [ 323.15, 459.21], 'c7' : [ 229.61, 323.15],
- 'c8' : [ 161.57, 229.61], 'c9' : [ 113.39, 161.57],
- 'c10' : [ 79.37, 113.39], 'dl' : [ 311.81, 623.62],
- 'letter' : [612, 792],
- 'government-letter' : [576, 756],
- 'legal' : [612, 1008],
- 'junior-legal' : [576, 360],
- 'ledger' : [1224, 792],
- 'tabloid' : [792, 1224],
- 'credit-card' : [153, 243]
- };
-
- // Unit conversion
- var k;
- switch (unit) {
- case 'pt': k = 1; break;
- case 'mm': k = 72 / 25.4; break;
- case 'cm': k = 72 / 2.54; break;
- case 'in': k = 72; break;
- case 'px': k = 72 / 96; break;
- case 'pc': k = 12; break;
- case 'em': k = 12; break;
- case 'ex': k = 6; break;
- default:
- throw ('Invalid unit: ' + unit);
- }
-
- // Dimensions are stored as user units and converted to points on output
- var pageHeight, pageWidth;
- if (pageFormats.hasOwnProperty(format_as_string)) {
- pageHeight = pageFormats[format_as_string][1] / k;
- pageWidth = pageFormats[format_as_string][0] / k;
- } else {
- try {
- pageHeight = format[1];
- pageWidth = format[0];
- } catch (err) {
- throw new Error('Invalid format: ' + format);
- }
- }
-
- // Handle page orientation
- if (orientation === 'p' || orientation === 'portrait') {
- orientation = 'p';
- if (pageWidth > pageHeight) {
- tmp = pageWidth;
- pageWidth = pageHeight;
- pageHeight = tmp;
- }
- } else if (orientation === 'l' || orientation === 'landscape') {
- orientation = 'l';
- if (pageHeight > pageWidth) {
- tmp = pageWidth;
- pageWidth = pageHeight;
- pageHeight = tmp;
- }
- } else {
- throw('Invalid orientation: ' + orientation);
- }
-
- // Return information (k is the unit conversion ratio from pts)
- var info = { 'width': pageWidth, 'height': pageHeight, 'unit': unit, 'k': k };
- return info;
- };
-
-
- // Expose the html2pdf function.
- return html2pdf;
-}(html2canvas, jsPDF));
diff --git a/hosting/static/hosting/js/html2pdf.min.js b/hosting/static/hosting/js/html2pdf.min.js
new file mode 100644
index 00000000..deac0f69
--- /dev/null
+++ b/hosting/static/hosting/js/html2pdf.min.js
@@ -0,0 +1,6 @@
+/**
+ * html2pdf.js v0.8.2
+ * Copyright (c) 2017 Erik Koopmans
+ * Released under the MIT License.
+ */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("es6-promise/auto"),require("jspdf"),require("html2canvas")):"function"==typeof define&&define.amd?define(["es6-promise/auto","jspdf","html2canvas"],t):e.html2pdf=t(null,e.jsPDF,e.html2canvas)}(this,function(e,t,n){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t,n=n&&n.hasOwnProperty("default")?n.default:n;var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getPageSize=function(e,t,n){if("object"===(void 0===e?"undefined":a(e))){var i=e;e=i.orientation,t=i.unit||t,n=i.format||n}t=t||"mm",n=n||"a4",e=(""+(e||"P")).toLowerCase();var r=(""+n).toLowerCase(),o={a0:[2383.94,3370.39],a1:[1683.78,2383.94],a2:[1190.55,1683.78],a3:[841.89,1190.55],a4:[595.28,841.89],a5:[419.53,595.28],a6:[297.64,419.53],a7:[209.76,297.64],a8:[147.4,209.76],a9:[104.88,147.4],a10:[73.7,104.88],b0:[2834.65,4008.19],b1:[2004.09,2834.65],b2:[1417.32,2004.09],b3:[1000.63,1417.32],b4:[708.66,1000.63],b5:[498.9,708.66],b6:[354.33,498.9],b7:[249.45,354.33],b8:[175.75,249.45],b9:[124.72,175.75],b10:[87.87,124.72],c0:[2599.37,3676.54],c1:[1836.85,2599.37],c2:[1298.27,1836.85],c3:[918.43,1298.27],c4:[649.13,918.43],c5:[459.21,649.13],c6:[323.15,459.21],c7:[229.61,323.15],c8:[161.57,229.61],c9:[113.39,161.57],c10:[79.37,113.39],dl:[311.81,623.62],letter:[612,792],"government-letter":[576,756],legal:[612,1008],"junior-legal":[576,360],ledger:[1224,792],tabloid:[792,1224],"credit-card":[153,243]};switch(t){case"pt":l=1;break;case"mm":l=72/25.4;break;case"cm":l=72/2.54;break;case"in":l=72;break;case"px":l=.75;break;case"pc":case"em":l=12;break;case"ex":var l=6;break;default:throw"Invalid unit: "+t}if(o.hasOwnProperty(r))var c=o[r][1]/l,d=o[r][0]/l;else try{var c=n[1],d=n[0]}catch(e){throw new Error("Invalid format: "+n)}if("p"===e||"portrait"===e){if(e="p",d>c){s=d;d=c,c=s}}else{if("l"!==e&&"landscape"!==e)throw"Invalid orientation: "+e;if(e="l",c>d){var s=d;d=c,c=s}}return{width:d,height:c,unit:t,k:l}};var i=function(e){var t=void 0===e?"undefined":a(e);return"undefined"===t?"undefined":"string"===t||e instanceof String?"string":"number"===t||e instanceof Number?"number":"function"===t||e instanceof Function?"function":e&&e.constructor===Array?"array":e&&1===e.nodeType?"element":"object"===t?"object":"unknown"},r=function(e,t){var n=document.createElement(e);if(t.className&&(n.className=t.className),t.innerHTML){n.innerHTML=t.innerHTML;for(var a=n.getElementsByTagName("script"),i=a.length;i-- >0;null)a[i].parentNode.removeChild(a[i])}for(var r in t.style)n.style[r]=t.style[r];return n},o=function(e,t){var n={};for(var a in e)n[a]=72*e[a]/96/t;return n},l=function e(a,r){r="object"===i(r)?r:{};var a=e.parseInput(a,r),l=t.getPageSize(r.jsPDF);l.inner={width:l.width-r.margin[1]-r.margin[3],height:l.height-r.margin[0]-r.margin[2]},l.inner.ratio=l.inner.height/l.inner.width;var c=e.makeContainer(a,l),d=c.parentElement;if(r.enableLinks){r.links=[];var s=c.querySelectorAll("a"),m=o(c.getBoundingClientRect(),l.k);Array.prototype.forEach.call(s,function(e){for(var t=e.getClientRects(),n=0;ng&&e.clientRect.top