From patchwork Mon Oct 16 16:04:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marlon Rodriguez Garcia X-Patchwork-Id: 32391 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66DB8CDB465 for ; Mon, 16 Oct 2023 16:05:01 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.130791.1697472291702103890 for ; Mon, 16 Oct 2023 09:04:52 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=Q55F8koq; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: marlon.rodriguez-garcia@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 28B789C3233 for ; Mon, 16 Oct 2023 12:04:50 -0400 (EDT) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id o-fwEIS4Df00; Mon, 16 Oct 2023 12:04:42 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 0D6669C2B2D; Mon, 16 Oct 2023 12:04:42 -0400 (EDT) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 0D6669C2B2D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1697472282; bh=gT3QGbR6JSL3f5Ivr8nMNUiDh8rJYLePCdAMqD0yKVs=; h=From:To:Date:Message-Id:MIME-Version; b=Q55F8koq0thsKG5XRcL02LM16x93QXTCmmQos0ZTMFXpeK4GzUozLKV1yg/zI2MPt rP/QINt0Rcjs+LS+CaNwodsWfUjq4VU4WcvJz3CdJSAfN/bpzgecgEpZW6vbNw3V7R UnprApWV2sv+aIlScqhmSoGZuLEprrgloLyPF3ABfFlFpI924qsyqKYzMniMG3LCXp y+u2uHzeisTzWMM2HZiwyv9Vcdsvn9nD1AW7tYI4cy49mjD5xN1DTmOjujjx5dvwc7 /TJ+LfQXxpCHcB5HJRXqyLfuhAhxSiGp9cDaxf4iSdb7/rCgZ5kqOzf+Kcmb2f5jrt t4A/+uOB2JvRA== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id 6LH_7Ry5bhe0; Mon, 16 Oct 2023 12:04:41 -0400 (EDT) Received: from savoirfairelinux.hitronhub.home (modemcable141.201-58-74.mc.videotron.ca [74.58.201.141]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id B83349C2809; Mon, 16 Oct 2023 12:04:41 -0400 (EDT) From: Marlon Rodriguez Garcia To: bitbake-devel@lists.openembedded.org Cc: Marlon Rodriguez Garcia Subject: [PATCH v2 4/4] toaster: Update bootstrap version to 3.4.1 Date: Mon, 16 Oct 2023 12:04:39 -0400 Message-Id: <20231016160439.65034-1-marlon.rodriguez-garcia@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Mon, 16 Oct 2023 16:05:01 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15244 Update bootstrap version to 3.4.1 to fix incompatibility issues and security vulnerabilities Files base, base_specific and js-unit-test were updated to match new versions of files Changes in v2: Update bootstrap version from 3.3.7 to 3.4.1 and explicit name version in files Signed-off-by: Marlon Rodriguez Garcia Signed-off-by: in the email patch) as it is part of the review and we do Reviewed-by: Tim Orling --- .../js/{bootstrap.js => bootstrap-3.4.1.js} | 431 +++++++++++++----- .../static/js/bootstrap-3.4.1.min.js | Bin 0 -> 39680 bytes .../toastergui/static/js/bootstrap.min.js | Bin 37049 -> 0 bytes lib/toaster/toastergui/templates/base.html | 2 +- .../toastergui/templates/base_specific.html | 4 +- .../toastergui/templates/js-unit-tests.html | 2 +- 6 files changed, 328 insertions(+), 111 deletions(-) rename lib/toaster/toastergui/static/js/{bootstrap.js => bootstrap-3.4.1.js} (84%) create mode 100644 lib/toaster/toastergui/static/js/bootstrap-3.4.1.min.js delete mode 100644 lib/toaster/toastergui/static/js/bootstrap.min.js diff --git a/lib/toaster/toastergui/static/js/bootstrap.js b/lib/toaster/toastergui/static/js/bootstrap-3.4.1.js similarity index 84% rename from lib/toaster/toastergui/static/js/bootstrap.js rename to lib/toaster/toastergui/static/js/bootstrap-3.4.1.js index d47d640f..170bd608 100644 --- a/lib/toaster/toastergui/static/js/bootstrap.js +++ b/lib/toaster/toastergui/static/js/bootstrap-3.4.1.js @@ -1,6 +1,6 @@ /*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. * Licensed under the MIT license */ @@ -11,16 +11,16 @@ if (typeof jQuery === 'undefined') { +function ($) { 'use strict'; var version = $.fn.jquery.split(' ')[0].split('.') - if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) { - throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') } }(jQuery); /* ======================================================================== - * Bootstrap: transition.js v3.3.6 - * http://getbootstrap.com/javascript/#transitions + * Bootstrap: transition.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#transitions * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -28,7 +28,7 @@ if (typeof jQuery === 'undefined') { +function ($) { 'use strict'; - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/) // ============================================================ function transitionEnd() { @@ -50,7 +50,7 @@ if (typeof jQuery === 'undefined') { return false // explicit for ie8 ( ._.) } - // http://blog.alexmaccaw.com/css-transitions + // https://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this @@ -77,10 +77,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: alert.js v3.3.6 - * http://getbootstrap.com/javascript/#alerts + * Bootstrap: alert.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#alerts * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -96,7 +96,7 @@ if (typeof jQuery === 'undefined') { $(el).on('click', dismiss, this.close) } - Alert.VERSION = '3.3.6' + Alert.VERSION = '3.4.1' Alert.TRANSITION_DURATION = 150 @@ -109,7 +109,8 @@ if (typeof jQuery === 'undefined') { selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } - var $parent = $(selector) + selector = selector === '#' ? [] : selector + var $parent = $(document).find(selector) if (e) e.preventDefault() @@ -172,10 +173,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: button.js v3.3.6 - * http://getbootstrap.com/javascript/#buttons + * Bootstrap: button.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#buttons * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -192,7 +193,7 @@ if (typeof jQuery === 'undefined') { this.isLoading = false } - Button.VERSION = '3.3.6' + Button.VERSION = '3.4.1' Button.DEFAULTS = { loadingText: 'loading...' @@ -214,10 +215,10 @@ if (typeof jQuery === 'undefined') { if (state == 'loadingText') { this.isLoading = true - $el.addClass(d).attr(d, d) + $el.addClass(d).attr(d, d).prop(d, true) } else if (this.isLoading) { this.isLoading = false - $el.removeClass(d).removeAttr(d) + $el.removeClass(d).removeAttr(d).prop(d, false) } }, this), 0) } @@ -281,10 +282,15 @@ if (typeof jQuery === 'undefined') { $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + var $btn = $(e.target).closest('.btn') Plugin.call($btn, 'toggle') - if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) @@ -293,10 +299,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: carousel.js v3.3.6 - * http://getbootstrap.com/javascript/#carousel + * Bootstrap: carousel.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#carousel * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -324,7 +330,7 @@ if (typeof jQuery === 'undefined') { .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } - Carousel.VERSION = '3.3.6' + Carousel.VERSION = '3.4.1' Carousel.TRANSITION_DURATION = 600 @@ -438,7 +444,9 @@ if (typeof jQuery === 'undefined') { var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) - $next[0].offsetWidth // force reflow + if (typeof $next === 'object' && $next.length) { + $next[0].offsetWidth // force reflow + } $active.addClass(direction) $next.addClass(direction) $active @@ -500,10 +508,17 @@ if (typeof jQuery === 'undefined') { // ================= var clickHandler = function (e) { - var href var $this = $(this) - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + var href = $this.attr('href') + if (href) { + href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + } + + var target = $this.attr('data-target') || href + var $target = $(document).find(target) + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false @@ -531,13 +546,14 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: collapse.js v3.3.6 - * http://getbootstrap.com/javascript/#collapse + * Bootstrap: collapse.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#collapse * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +/* jshint latedef: false */ +function ($) { 'use strict'; @@ -561,7 +577,7 @@ if (typeof jQuery === 'undefined') { if (this.options.toggle) this.toggle() } - Collapse.VERSION = '3.3.6' + Collapse.VERSION = '3.4.1' Collapse.TRANSITION_DURATION = 350 @@ -668,7 +684,7 @@ if (typeof jQuery === 'undefined') { } Collapse.prototype.getParent = function () { - return $(this.options.parent) + return $(document).find(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) @@ -691,7 +707,7 @@ if (typeof jQuery === 'undefined') { var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - return $(target) + return $(document).find(target) } @@ -743,10 +759,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: dropdown.js v3.3.6 - * http://getbootstrap.com/javascript/#dropdowns + * Bootstrap: dropdown.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#dropdowns * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -763,7 +779,7 @@ if (typeof jQuery === 'undefined') { $(element).on('click.bs.dropdown', this.toggle) } - Dropdown.VERSION = '3.3.6' + Dropdown.VERSION = '3.4.1' function getParent($this) { var selector = $this.attr('data-target') @@ -773,7 +789,7 @@ if (typeof jQuery === 'undefined') { selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } - var $parent = selector && $(selector) + var $parent = selector !== '#' ? $(document).find(selector) : null return $parent && $parent.length ? $parent : $this.parent() } @@ -909,10 +925,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: modal.js v3.3.6 - * http://getbootstrap.com/javascript/#modals + * Bootstrap: modal.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#modals * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -924,15 +940,16 @@ if (typeof jQuery === 'undefined') { // ====================== var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$dialog = this.$element.find('.modal-dialog') - this.$backdrop = null - this.isShown = null - this.originalBodyPad = null - this.scrollbarWidth = 0 + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 this.ignoreBackdropClick = false + this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom' if (this.options.remote) { this.$element @@ -943,7 +960,7 @@ if (typeof jQuery === 'undefined') { } } - Modal.VERSION = '3.3.6' + Modal.VERSION = '3.4.1' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 @@ -960,7 +977,7 @@ if (typeof jQuery === 'undefined') { Modal.prototype.show = function (_relatedTarget) { var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) @@ -1050,7 +1067,9 @@ if (typeof jQuery === 'undefined') { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) @@ -1152,7 +1171,7 @@ if (typeof jQuery === 'undefined') { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ - paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } @@ -1177,11 +1196,26 @@ if (typeof jQuery === 'undefined') { Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' - if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + var scrollbarWidth = this.scrollbarWidth + if (this.bodyIsOverflowing) { + this.$body.css('padding-right', bodyPad + scrollbarWidth) + $(this.fixedContent).each(function (index, element) { + var actualPadding = element.style.paddingRight + var calculatedPadding = $(element).css('padding-right') + $(element) + .data('padding-right', actualPadding) + .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px') + }) + } } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) + $(this.fixedContent).each(function (index, element) { + var padding = $(element).data('padding-right') + $(element).removeData('padding-right') + element.style.paddingRight = padding ? padding : '' + }) } Modal.prototype.measureScrollbar = function () { // thx walsh @@ -1199,8 +1233,8 @@ if (typeof jQuery === 'undefined') { function Plugin(option, _relatedTarget) { return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') + var $this = $(this) + var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) @@ -1211,7 +1245,7 @@ if (typeof jQuery === 'undefined') { var old = $.fn.modal - $.fn.modal = Plugin + $.fn.modal = Plugin $.fn.modal.Constructor = Modal @@ -1228,10 +1262,13 @@ if (typeof jQuery === 'undefined') { // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + var $this = $(this) + var href = $this.attr('href') + var target = $this.attr('data-target') || + (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + + var $target = $(document).find(target) + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() @@ -1247,18 +1284,148 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: tooltip.js v3.3.6 - * http://getbootstrap.com/javascript/#tooltip + * Bootstrap: tooltip.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ - +function ($) { 'use strict'; + var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'] + + var uriAttrs = [ + 'background', + 'cite', + 'href', + 'itemtype', + 'longdesc', + 'poster', + 'src', + 'xlink:href' + ] + + var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i + + var DefaultWhitelist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + } + + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi + + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i + + function allowedAttribute(attr, allowedAttributeList) { + var attrName = attr.nodeName.toLowerCase() + + if ($.inArray(attrName, allowedAttributeList) !== -1) { + if ($.inArray(attrName, uriAttrs) !== -1) { + return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)) + } + + return true + } + + var regExp = $(allowedAttributeList).filter(function (index, value) { + return value instanceof RegExp + }) + + // Check if a regular expression validates the attribute. + for (var i = 0, l = regExp.length; i < l; i++) { + if (attrName.match(regExp[i])) { + return true + } + } + + return false + } + + function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { + if (unsafeHtml.length === 0) { + return unsafeHtml + } + + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeHtml) + } + + // IE 8 and below don't support createHTMLDocument + if (!document.implementation || !document.implementation.createHTMLDocument) { + return unsafeHtml + } + + var createdDocument = document.implementation.createHTMLDocument('sanitization') + createdDocument.body.innerHTML = unsafeHtml + + var whitelistKeys = $.map(whiteList, function (el, i) { return i }) + var elements = $(createdDocument.body).find('*') + + for (var i = 0, len = elements.length; i < len; i++) { + var el = elements[i] + var elName = el.nodeName.toLowerCase() + + if ($.inArray(elName, whitelistKeys) === -1) { + el.parentNode.removeChild(el) + + continue + } + + var attributeList = $.map(el.attributes, function (el) { return el }) + var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []) + + for (var j = 0, len2 = attributeList.length; j < len2; j++) { + if (!allowedAttribute(attributeList[j], whitelistedAttributes)) { + el.removeAttribute(attributeList[j].nodeName) + } + } + } + + return createdDocument.body.innerHTML + } + // TOOLTIP PUBLIC CLASS DEFINITION // =============================== @@ -1274,7 +1441,7 @@ if (typeof jQuery === 'undefined') { this.init('tooltip', element, options) } - Tooltip.VERSION = '3.3.6' + Tooltip.VERSION = '3.4.1' Tooltip.TRANSITION_DURATION = 150 @@ -1291,7 +1458,10 @@ if (typeof jQuery === 'undefined') { viewport: { selector: 'body', padding: 0 - } + }, + sanitize : true, + sanitizeFn : null, + whiteList : DefaultWhitelist } Tooltip.prototype.init = function (type, element, options) { @@ -1299,7 +1469,7 @@ if (typeof jQuery === 'undefined') { this.type = type this.$element = $(element) this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { @@ -1332,7 +1502,15 @@ if (typeof jQuery === 'undefined') { } Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) + var dataAttributes = this.$element.data() + + for (var dataAttr in dataAttributes) { + if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) { + delete dataAttributes[dataAttr] + } + } + + options = $.extend({}, this.getDefaults(), dataAttributes, options) if (options.delay && typeof options.delay == 'number') { options.delay = { @@ -1341,6 +1519,10 @@ if (typeof jQuery === 'undefined') { } } + if (options.sanitize) { + options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn) + } + return options } @@ -1452,7 +1634,7 @@ if (typeof jQuery === 'undefined') { .addClass(placement) .data('bs.' + this.type, this) - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() @@ -1554,7 +1736,16 @@ if (typeof jQuery === 'undefined') { var $tip = this.tip() var title = this.getTitle() - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + if (this.options.html) { + if (this.options.sanitize) { + title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn) + } + + $tip.find('.tooltip-inner').html(title) + } else { + $tip.find('.tooltip-inner').text(title) + } + $tip.removeClass('fade in top bottom left right') } @@ -1565,9 +1756,11 @@ if (typeof jQuery === 'undefined') { function complete() { if (that.hoverState != 'in') $tip.detach() - that.$element - .removeAttr('aria-describedby') - .trigger('hidden.bs.' + that.type) + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } callback && callback() } @@ -1610,7 +1803,10 @@ if (typeof jQuery === 'undefined') { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } - var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null @@ -1726,9 +1922,13 @@ if (typeof jQuery === 'undefined') { that.$tip = null that.$arrow = null that.$viewport = null + that.$element = null }) } + Tooltip.prototype.sanitizeHtml = function (unsafeHtml) { + return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn) + } // TOOLTIP PLUGIN DEFINITION // ========================= @@ -1762,10 +1962,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: popover.js v3.3.6 - * http://getbootstrap.com/javascript/#popovers + * Bootstrap: popover.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#popovers * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -1782,7 +1982,7 @@ if (typeof jQuery === 'undefined') { if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - Popover.VERSION = '3.3.6' + Popover.VERSION = '3.4.1' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', @@ -1808,10 +2008,25 @@ if (typeof jQuery === 'undefined') { var title = this.getTitle() var content = this.getContent() - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) + if (this.options.html) { + var typeContent = typeof content + + if (this.options.sanitize) { + title = this.sanitizeHtml(title) + + if (typeContent === 'string') { + content = this.sanitizeHtml(content) + } + } + + $tip.find('.popover-title').html(title) + $tip.find('.popover-content').children().detach().end()[ + typeContent === 'string' ? 'html' : 'append' + ](content) + } else { + $tip.find('.popover-title').text(title) + $tip.find('.popover-content').children().detach().end().text(content) + } $tip.removeClass('fade top bottom left right in') @@ -1830,8 +2045,8 @@ if (typeof jQuery === 'undefined') { return $e.attr('data-content') || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) + o.content.call($e[0]) : + o.content) } Popover.prototype.arrow = function () { @@ -1871,10 +2086,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: scrollspy.js v3.3.6 - * http://getbootstrap.com/javascript/#scrollspy + * Bootstrap: scrollspy.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#scrollspy * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -1900,7 +2115,7 @@ if (typeof jQuery === 'undefined') { this.process() } - ScrollSpy.VERSION = '3.3.6' + ScrollSpy.VERSION = '3.4.1' ScrollSpy.DEFAULTS = { offset: 10 @@ -2044,10 +2259,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: tab.js v3.3.6 - * http://getbootstrap.com/javascript/#tabs + * Bootstrap: tab.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#tabs * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -2064,7 +2279,7 @@ if (typeof jQuery === 'undefined') { // jscs:enable requireDollarBeforejQueryAssignment } - Tab.VERSION = '3.3.6' + Tab.VERSION = '3.4.1' Tab.TRANSITION_DURATION = 150 @@ -2093,7 +2308,7 @@ if (typeof jQuery === 'undefined') { if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return - var $target = $(selector) + var $target = $(document).find(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { @@ -2118,15 +2333,15 @@ if (typeof jQuery === 'undefined') { $active .removeClass('active') .find('> .dropdown-menu > .active') - .removeClass('active') + .removeClass('active') .end() .find('[data-toggle="tab"]') - .attr('aria-expanded', false) + .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') - .attr('aria-expanded', true) + .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition @@ -2138,10 +2353,10 @@ if (typeof jQuery === 'undefined') { if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') - .addClass('active') + .addClass('active') .end() .find('[data-toggle="tab"]') - .attr('aria-expanded', true) + .attr('aria-expanded', true) } callback && callback() @@ -2200,10 +2415,10 @@ if (typeof jQuery === 'undefined') { }(jQuery); /* ======================================================================== - * Bootstrap: affix.js v3.3.6 - * http://getbootstrap.com/javascript/#affix + * Bootstrap: affix.js v3.4.1 + * https://getbootstrap.com/docs/3.4/javascript/#affix * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -2217,7 +2432,9 @@ if (typeof jQuery === 'undefined') { var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) - this.$target = $(this.options.target) + var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target) + + this.$target = target .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) @@ -2229,7 +2446,7 @@ if (typeof jQuery === 'undefined') { this.checkPosition() } - Affix.VERSION = '3.3.6' + Affix.VERSION = '3.4.1' Affix.RESET = 'affix affix-top affix-bottom' diff --git a/lib/toaster/toastergui/static/js/bootstrap-3.4.1.min.js b/lib/toaster/toastergui/static/js/bootstrap-3.4.1.min.js new file mode 100644 index 0000000000000000000000000000000000000000..eb0a8b410f59eb8abcd21e588f1a7b718db3eebd GIT binary patch literal 39680 zcmdsg?R(qCwdeQyS5SzrLPjJd*=c)23en@l&aHRTI-9udv#Tn%5DAG$D1ap(JFcky z?fW}#^8$df)7|~DPx8nFFf*7rbKcLHgX7N*{%!Et;H#=?>Smj525+BDKcAishO4I8 z)U)H`o4mQQhtoxMdpx4{Uss#=+u~-`44$5xo=))Ri@}?BMbqTl@!(atm{Ox}i$z}6 z`EqbqF7xf6S>=O2ym~WO%Wbqc{3`hi+xMepwXNO_ z%KY8n<#t!)A1!+|~I2 zt1A{wGJl(G2YD(lm|mCDpZ-p-n%0|j(F~J8GP*dqw5usb!VGiVI(vF}m|vV;o_(>~ zou(<>Iz0S>ew^Y*e)073>~yz#c192W)p-xz=Gz)`9-L0Uz!p^7!3rQIh+f?_gLU(q>iEbHEJ$ zjHXqY50k4p>X`VKjqdaG;N)R6-{#HTwj9)X^QO4XtGj0CMn{|7t{fJlDWHFIlW&LR zw7%PHs%?WiHlb-=E=LdJW;CW3Ka9(8fW8iH`h#jH^Ka5+wYa;@%VxUR=2-5_bxv1U zfFW-(8t3W#U-GM;i^i{Mmb`1-0eF(}AF6+ZZTws@)nxoSd{+4jbRAT!w*GRK_}?_l z!~7aJP0%j}MLEbvK(%ICH}BW^MR9qMrj9U10^)o0n$fcdh55lLZGRtx4i5q8{4K$w z-sFoSTTfd%nciO&aZPqsc?a6qVuk#ziokv@(vU0i3XKvGhQdkMFXxe03u#eHS zs0F2T9fM{neO_Pvq`$V)Y_nOv=VoK{;;pPl4-X^!H&k}uaj$M6x}fl<7t5^4Cd;C} zE$TW=vUR>~lFLuWnL`+22bc^Y_b^$26aAcwb4I)AVqMkw=wY5s|NQd%A6~uwW1284 zOvc&t&G*m$_`|C=xcOf%{`CEG`jMXg<^)eR+p4LEYf1m;MKUX0JE$w4W=#Vw#?~TpaDiqJ^{~6 zi}Q=iS;3sGO6#Ff!e|Pvx&-mfZEFT4$fcSt^CnxYhMp(^39Nky6qyRlMtJjW^)?@l z9-70$2CHOTdXZmeck2c?S54P>dDE;g_X-o|{xzu0`cn%d`6jKWF9{V1;&@N+8c;lt zLx=rNUXm||BN|qx@bx;Y>tRxqpx?TOc^n>Az@b{3U1!TY8J$;qm{&RKWrxGw9Ujd9 zE+7PLBdr0vl%X^CKizhN5f!6*<%Gn=ra6Jw0PnbzAw!-vQ$hn`um-a^cxC4xD?GXe0W@w6n540C zH$d7bPY%(_(T>|mUdtrg6huuOqWD+}F8x%RaXz|dI6eUnB2Es(Rsk`sHYCPsY)Sr0 z13opphs>D1c=^rqKYjb=2lNzzF6wWqYzbhc;FF#Piecpz`fGOza=57o6G3{_)lWGT z3a7JFz{J)TYIEH~k*nhZl$$iw&CNPT=juG4%EfRr!w~rta`cA=Oc&F{W|kdpohGvxTFi<7O^nFa(4^wxu`BdSK~lmsA;mlybsBR zTj_uo&E+}olx{q(XC?jsjsXB@C(fBnFm1Qs_S@d3spo2nV#@ ziAR!0wq8V!{7wtu=W-Qs`Z9X*VOFmLevsGet5|I*wClUhAs$eQ^n=WG1O-8CcWu!4AcSrp+{-SJwF@EQa}J; zziOH!*DxXKWHd9x=h0_xi@E@Z)E;&TYPc@8Pet74l7ncFUB6fIP3)1&eckrzqiYfLsb1 zJrTMO?-WgbTL(AvJ=34__g7W6T|&c+sFCy=JX==pO4=ryaWdYhoZ{x%f~Q6zeFc4a zOG1dovRCjL4i688NmVx0-C|Wk?{C1B2d1S@?T1>d;J@A3+!Dy31m%o3dnUy1(&;b) za<6rsy=9eqPp`%M1(2IwNxH6)?Eseg$7o5|cP`H*%r-SWJg6;ncjyrpNk7pkVU;8}^LRo>lR$-V&L;aVzL;lk=>P`y|c!Jvjm zq<=9OLDmcy7(kg+f9voQ|~^@*`${0^?R83ezfAbvlf zuh-cWy8^0XtNP%WnbNL-c9p@=aSSP?^vt$4IPA?Ivs+O1eGPXUOps>!ZdEK+qx(e$ z+4byqqU(@BHyq8cFvQPudGdukDKWBp0>>N~d^52N9=bgBA)YnEESj^KM8uJaFc=I= z)-U+lV03s0G|aZIl%Q1s)2o<21iK}IR>pK%n|4Z}V7lQV%B3X=#`9lCtTq==GtDht z8XOs~z(-!eS@}!v3Tbsugw+5}*c=$Vz@k;LUg9@QV|r$+P8wn*7;V_V?&IFVx}Y|O zn4mBIrrN%MkCUC6!TZThVi%I|op6>=OUZjVOlY%-F&!SBkhfsBO9%pTr!ZxUXRZq6 zjMos%>XhSU#TX4o5XB6ZZ&;|z zw&SI-o>>i#KRK#tXt!cRjP+=Iu z>s_UyqkuR2aUEA4UGUHmYpF(;qxtIaaOE8b&X#?k{a(hf`&FRRo#~^Xw&Lf_M&2PZ z)+;|HIKw)s6S<%qMbkDcNt zL(mM46?3vUShZXx7xp0T2zQ~9GkIA8r%>?ftcz(BFoJ_+k3Y9pKZBnK&W6y7V>61N z;cv$1daCHD{zzvwF2UvukyU5pmJepXZ^)Z!D(XDCO1H2nf~S!czi2&s)Q*paF|REX zKpt=`6RW1Sw}TFIc#{!{ASiVM4@VYwQ1Nf^3U&urIAgafz{fW2AVkGXqYOOt1`y!R zJrPwMSqi0k7vY3r2O?mcxc~{jkZEGlRPY{Tm~`#5Le?#};!uDi1RY^e^cg24sxycv z7KPB(Tyz6F7cL-jciXgiK=F7d5_aMVUBUq#1eZeAu%`!>z@5gM;X81s>Ya2a$7U34 z-3-+`u!a4TCN>Z91@4J8=qAq<7EpN&mau91?Eb9B?%xL3L%ODLV)Mx(ETJ;qZ1-#m zp{+jotvC0~C;vnxMVi@i%(uCy*6VCj=gH*-1;7y6`t%6Fq2mre+|x9`y{N~h zIxQb@r8t0h9GF@wdb+B4a^V!|?^K5ug$?}eIh=gY%jMTPQ*|mw5K$hXtBhfz&KYI% zvKZKx-sa|H1)_zVRNlT|A#^;lw8iJ>;)MC5QE9h=!qB=DzJ5 znfrV8-%zh#W+7iAXNN0CMGg;->s9q`w*sQ8yQ(6uG)!H7&IBIE${g~j17OSgi8uh- z0W%7+u-y+D*mf-YZLekj46$C1&FQ^NgpKxXV6-oh|9~WmDhOo7P86pwdD;GsWHW_V z1>e4zoVcU1vmCW4b8T$xPGX)P7|X8uI~# zsJh`}*kRFx)*=nyUM8F(8+^Cxn<7WBMkAGPOxSKq;S-4{Jys<8No+^ zjL}19Ur&{lP0K6V7s%2$*wI?piD!Z?!xT4el8PDBO(v${-Bw1q&w1vaA6UAuCgX zh7`BpDqX__53VB{blZCNs0|toV>akG+~nAl(&+?-(cWF|3n;5HI^Sc5cI`TbMUj@+ zX3lP5%QDtc&Mh+sL0~aF=c+suW6sCv<|6i6O|6wIk!(WoL<)_^er__MI9kWqh{WGr zTVaAilA)bId0uQYds`r|gMdU(j$tSCnF`0BTs)uruWa&Q!Sg#vXQ%TxZBcfhI;rI!+E-2lA5gNjdMd%-&vQ+X?;w%1B@byW>pWc2@YZKs#_v=d?7qgqVk2 zMFR2jYlPi_orFW^;#gP$-x8BX*^g~l6f9QFEg=rvGI8vU$eRNO>`~T4Py%ypAWKr| zXZXl4zaz9TQ~3jE;dJw8E)VijBuzd5F+UiRJ{~^%kKN}dyQja~J$pJ*wqj9d?9v`$ zvSgqjV$H4(c!n6#Z1;6sbAVIbRGaU>8Zu<2!_+3c`9H?K18{+-zdL|yg@fh09bY4Y zr@?d8SDyaP-6AH(+z&jdy*DJPEvHCw%nebrPr&HlFu22sm|0mhLq|R%%Q6~dVquqx z(&j2HEplw^X8!Cyf~lRH)rW`mWHSC70bgAMZk*XLlT%zB9gY84gT>S-%ugH^`1=rN zKHR)Dmx(MJMsigl3{gaduq&t94DydlgZBJ7NE@-yM1b`@Q11>RtW1mJPKpR*Pdgc! zl@c2|(rqfyZQQdD>o(T(!@7;N40IblQKN?rLNOmS@pv)7(U9A~{|lzugZY|h*3le- zA-53;t1iJzEXZ)`nQh!p+Y0x4yrW;kgm4=sdY6TKtn;~ch=l;DIiJnbtXX1DuBzpG zFbzwin$oq|k6l0YlO@i=R5$7YGmAzewzt(XTjTr)wJE_92E3xtL>*u?(jS1sRn9 z{2q6)WQieP47q36byAnj<=}Xh zB1bDtY)mg_&ogJu>*1pwB`t)rBCNzY$d81>2D|~h5}X>rG0$T;`|Cy z^k_}Wg_sX>mL}(#c852U34WN$$H3VQ#NF;TJ#%uMAT&TqrXm24$RDs(vFS7IWkVEJ zf6$2<5{5@JNKGR&=(=wy{lH!j*jjQZYaTokcMa0x>=aq>3Re4j!*j?n`P~J5B{i=_KiaY!C z9zl4VJo9_|f#b8mOdKCowae*YIFPu#U`{*& zoqUXhLP#4PQ;5Tu=CyY#n9X%|$g#+fU)fmj3>o9Ht)dpu9Qbn1Xaz-^d+doe3GD(FX|5xba1S9{gH*~c7$Babm32`{QwbNwjd*D zXxe$_eXaczVYhF6@bZP(DAL%IyPLaAkq?0XX#*#uiMd(OpXjqaKx;A%al`qDoS`?g z6bWi=GP_SeH6l1-*BCQxC;agYsb#7_go zmerSoMx*ERN?&aA0Hpd<5yTyOW8aV4DKH$sj`$!XIerDGVh^|HZ`opQ9vva9{!_P0 zlt3SokEnC>O1PZ*G)@7^UPN!ftRE8PzX%C9AN5EmmQGAMw4$WMg>XerrwWr;V~sn8 z&%%zLA3Cl?7$Ul`#N)p-`Pn{I22Xhb%#~IxcDg`)h5HSZVdQ>%i!Ae*Y%1yAujvlk$}j0ThZv0nDLc?G z!(i{6#?29q3yRAqa-Fqfg+bIE9vrH&6U`1`S&IKp`<6ZDCmauMK?FXdz8)Y50Q4Jp z#TvvqkIJKD^9y`pZJnBxklt-kw#5k0-3M_ZwBY}1fv|T?NT?=22p@jIMM_#|fB;7q zfPAp5LvC%n?Bbq7n^xf_4$&bWVnGF9=uD$}S0)Z`;9zE?SKp_)dsuNm6j;sohSXwU zKU2_zh9lzSD~nirU=u%8Aw}o*D3+W@@efv2B>2HUk-*OZ2EK@*3w8M5!=VKk%}(HZ z(9E{qrlYS4Q_H3*4zIp*EB=l+v$k7af=$^W3*k9(49Eh!ko84rQo1PT=Dn&kH zR-!iBKk{UpAOhLs-xf6rs<_+VAaMi-ATAP8rEYM5o~n=~3pB((oCiKm=(rgd^`NRK z<;@bV6Fl5hHNw|4)Rr!PSr_HcGwyK-Z_a)4Su(po{sTx1PjSi%e+wFWjfxle2VPdZ z;`m2SN4ogyy9vrq9T%7jdMT#32{c7RjbZDpX|_08JiE9YU-6$U{YCzf{IksIUl2I` zli$+c6}MQO^6#ho_Zk2Fod5oY|NfT#7X0V-1~ZT~WorVJz5N~MQ)5z+Mvaqh+(BNw zp}z2H(LXi+xka8S|3ES>|9i(1hNj6^%@&}fUw8b6nj*a|J^pccKEwZ9B=LNAn-%M( z+Fdsr9L!$tu8TEtVs;ll9?p)>Ked^4s}x{I2!WL+4?S@-ez7$|KI7 zd3lD4hDS$KT(8iVR~O}_&HLa)r2x_$>?J6ZhSxx}-=h;9nQkonZZQ?o3Beu{>p>Qv zlou#0g}ERRM5?2cZ^i9KN?CEY*b+_ z{8EJ0D-Mu~eoL=N8wc_d8+e;hQ6yWJ;Dv!3z^$<>GJ@u1f`LHs0LZr}$E6_8&bIRm zAZL|%oz@o_=sR71JYKCRCB_h8sk2(Mlqyh6C9i`C`hX&)w@EKh39TwofCTwinA_!U z2ja~yR{Uc$USOuz>C$GpIJ=%NFw?u?@?rtb0IXcA0zieG_+|Xa%^k9cY5=YEg#RCb z*OA7s#-S1kaJB)>M@MhH{^KLsggRj?S<9RG(@J^CHM)W}ja1qU?r>oVE*uuzv|vnd zt0>!z3W%N|F6~tQ?giY^(Y@l%D-mL`nMVIfL z0X#z$4-@4C0Q>z-$tjX!C);Pu1Hk4(uCxacYAE+%)zr4%BA|>fY74p@CT^*Af#MJM zg<1Mqt|@a_G+kSUSdQkyw!4RiH-Sr^l{#?z`WshJmpqH@P9yOQv~T-k9QtbY(`fX$ z)7-$Sp6&K?U4WtRJx6b7ml*l!2X7~Sh`&7alLVr|ab#?+RY$a=Q}#-mNw=2o-|W%f z2GV$Ni{Rtn3MGcA(&}}Ag2(Sxc?sbJl`dNs|A0#XPECeAZQW5aK#gCjhOE8@o6kT> z;T(WV8}pN>y92i(uhl2U!E1;+FX|?fxiDSGKgc)|KQ6bm#!4viY@RZ2Rs>Uv5D1kB zgXs?QM@w*p3RI`byMX9=0nX~X4; ztPN@jCoN|crkx!n(_cAfuppFCCIGkyd;o{-uOE=7sRKTUBd3iyLJ|L^w;{y*!C2l2 zeK5Xv97#dw*(7KE$KRF(kjzd$RoCsptD+a;w_~r7=v633Cq~=TMZz%7rLb1z(6zN>U0>4s93K+vs z4iSMdJdhx6H$xqn-w`mq^JaDfFhpSu0N(1-21LfHtQ;$#aB5TYetzT| z$+Q?Z;p}fD5d%btJheGa~hG0ozvjHJNKZ3WTkGwN$C2mJDfshTD>Nek(ySgHVXa!f{P@x9zjMNZRB+IU>iUbACF!%{Kw!IaY2t?5^DS~e#zuR zgeC-&-dzOaceD_USh3%F;X=glTZbRotc9_Gs8fH~t(B z_j{r(IfVKSp&YZM+kr9RR6%p*bp1(6M8*nJw!xq%!KA&JhOXe>bfQQSr6Urcjaoa@`L2>L zbwC$dak;KAhB01-w=|*)@w63U+oUzT96TK$p&Lo&XExqw4y@3`@ifI@5qutk)5wpO zUoP|~x$HO4#ObfL!OzL^YyrRE=G?klNiuE1fx@E|Mqx*+t6Rq9%d`#so~$qq{W#Z> zX0sZ5uCW&``M-&FmAxm|Ze3qz>ji(-Wciw-JHvXs9ysJH?qDXwaz6%$hXOmH)bC3|UYHn4zcb_Xfiv*6;FcgAoPjQGjH7rI zro2UFOi|J)1&}ZT#oz#YnlL_an|Xog-XFmcm>-~zTxWC*$0BHn@a+g_O>Wq0l$+0B zkV;SwCTgPyK-0s0GqUb#Sl#hANqCAV-Ljc+B%Y%vWCT>3kua9%Hob~cyWmL}q0$)k z-0>Jv!z8@84WYs@ML736fSM}}L4jW%q^K1pZ>0=JEUcWYWw4dQ?mw%aN%GV3<%@ic zPes5i8gIvFyb{7OaL6TPDiN4g^bd=tWqORCJ0WZhvB5{QNtfqOKa)S#No3pAXR zM{977<#`eWOhNy0C0mYkF@-#ZMwzE5`$j+jXCgMJ?vIifaHUdxwovg5n?>kHjxHXE z-FZ|o6^K+gzJZA)%p8!0N z!d`QuUKCx8#Fi-*{9zd)3s|WEZzOJLVjSj)@mA6)?YFLjyzL0^QWgDB-3bmP;{BR- znH<4RBAtp7{VDAV!cXShRu2)3KIlJMZK`pr9v~4mm`Goq8F;>{)S%oNw9uPaw=bP+ z54WZxtUUj=P@$Xg)|nf~Z(oGc2GltijOdmU6(zMw%V6P*D?o>MnYAEoX=14)6KzlG zw~o;F9Gtj4Jg_&s)ul(T+=r95fEuBkr@?s9fg0nxI<$p5$<W40k&U47r;+$oaDZ39d)IG=Cz!QWM16wkx1n?vvtS#v2t+soT&d*3!rThF&q>0}Im6P-Flr zcP5aO&=RialzJtmlBK_Xe!=9DHB!5}ecMvuD8Wx^3lll+wI0B6kC_g31T;JI4?hM? zbqg7QxlZZ{GIklipcDy|{H>#EzCD962uq@*zhoGq&vv%{l7Ag#y2l{Jpn!V`6!W-y5UP1rh9o%X)TjC`=e;z$}hVdDTCeU9DoE`LKO~LO| zFAKIJdkSdh`+bC~f=lBdlZM&6sSe1I=bt`XK>w;S4i-lrD&bpQ0)y|t&kwAUynFPa zrhoo(c$)wAGf{MLYNNU(kE~-4*mC7lU%h`t*>7|Ab;p()9NK|@K~Rp6)CSUTO@%OZ z!tl*J?$G=piL4d2g+3-X>IB=kg~rVOW_{zh8%**V$x;J|wEPzoz+S%}oDK+;);PPi z9;is5m|7@nXrA%DvicdWDQYfHWy1VhBa|2hDyyEWHg%30wDnQ(WQ8x_(R^$-o(^0b z6!YKT9wE+9-Ib`^OHC9oEYkX2IM^r&1d`dUSA7Hc_c;Me)0{)o8ls-iNBZtZgv#>a zI$k90k$#2l|52m>8q~QD3s90L9jJG40=WSdH1dBB>FYlnIDtydVuTEL(!YtYy72OX80Ns=uPj4F{S9l?F#FWh?uANl=0v11UOftl?*f|le0bAHbU{HPG^v2J2qftFC3 zlGZwd;T04UyJfBia~6f!RoR9zA<8z6_DIcHJ}eflE6N$Zh3(;&jGUvd_kW`?Y?+D? z`p}bb+WsUk3FshH?30ir3useqpJ3LO)1UAqEqt!5 z{Vmm?!U1Z|xKh#KOG1#i%%btVb1R$2(Wmk-xhI^f1FEDn9+MSuc9E^_vFsvY-j-Fg zdS;nP+E*-xri}|R@xB)wnNk?cL_g8k^YFqyXFXo2Rsxh7Jeks(;i6y z@bK=O2LW<%iIG595O%<%#%@^E+>N%7lLby~FmW+Y&yHEWywU5oO1{4lfuKPX@FB}X|Ez4QD z5_9jbhl5lVP-IJ#>B!jl{|lnb22)Y?Xg!=rl!faG`8K@u(W6I2S=iD_YxRh-_D8>M zvm{;HLd4|a2tI<%+0N=;dm`4TnmGJHVLII5%pdAHIzBp_NbEz0W z#t!A61RZ~a|C*~eq2k-%OB8ogHHqUaHFB5bTH5<-`K-?yK6M;q^2%y{&z=ygD-|!1 z&kjj5a^1?WdV?@BlR7FpF-k+sEb!%0emQYeV*mIA15T&mBjIwXO~54_)ISn=1(#aL z>u0hbePd?U(c5G+gX86Jzft1guwHtZk+t5%)i-rQT3a6)=;}}WAOyT9!m<_T8(i4@tA3!l# zh_04r+X4X)fl4v`g+EcE>uIl^tUkOPM~;yAiqB+QGDHh0rP~`6?=fVPlY1;G`Q1iG zBR-B00AEB#7p3$l5(_zTL(9i8z#ET${AB8aUnqMB-NHNpg+yz~^+3Pc=e#a1h`og0dF2$5Z@h0iJ>j07|5Rs4cvR?S2Vku@P+~_-CIFLm;IZkm>2mA_AN|SCN&>HK z43S_sfq;{;Sq?px++-xU#T_+oD4!ayME&zi4EJS9A03A-ihqtyFL5pi$MAAsZN9|k zB=9o2+nEk^ZjrA|)$b&1XI^zQKQ*Fla)kS)E5kaca}-B*{8K~&RX^v?eXy9l%{ntIQinO8xx%&e$h!#l4r(rU`ABMTWNJ_Oy zK|o=t@{g1r&_c0J^6NfF5WLEk(06NkuK_O9Z2btmA>m_MT(nqA^-f zu|JQIiBy+LY}X_H-C9fdD)w{n(-CXu<}xxNMVzmIs4P;lYBeAr@(SFe|J!S>82cCn z)Ql#XYJF7N(Ag|+`;56_{|s4G4HXmyuijcdrbYD`uF!45uRb;`#lXs4Ydc}x*P1c| z<IwUE$HHp0iy^O z;1TBFC5BVJv$1zZa2PRec6&OqKSjEmw34rQ;r#d&f0siPw$=wP4(J;&JtFB}7zxQ+ zC31LxpHUiRI665{DC;I#yMPI^FnV*MO)49E85r<^4+%i|V#vR?3T%D>rsj9LMCNLL z3JN@gy|tZsncoPOE@j+Ct0$0{VBE4-I=jNB1j#*}T|pSy&qxd+-mfhl7l78vL?26) z;Nv_bRp8=mRi9LuWx_%}ID<)s?7<&vgTafL212tJ{a`?{mCP<=61R``*%WKkHuw~s zdL$)Wo*hZKil|$)Jo6^310V3pd%9tu5DQR`XY53P(&<~O*>K*g^^9igHrHg98IPxY z^ohtOeE5^#Ct3^vBfCb%Q2;_5d**`BJkny7FMhTZ0d*e4u>AP$e<_+39})PrLWOG@ z-r0txS@4%VgzM9+^03JEUAZa3a@@FrR{ole-cZjEXADa6tnVX(N&@MYp2Dkq#19v1 zFw$Ce7%>7r?8I1gw3yZO`g5@-rg(mw2X#Qv3XFS}u8)S>^K3>R*s(WsVEtW)r-80+ z0hJJsZIL{)@PVj84)7rtS1gGvF#;L%YT8Z>_1M-3-OF~WrRhc$HKN84{@0BDeS|&ZwLo97`i3I{+-_VgZF3X`i)!4@?ke4GXM;V z)H5M5=w!~z7cyK!^Rd4vu4wm)(cHe@?Q$~dgeP+E;qMstBm#jBU@-6m)B&fg5v;PO zIYrIe063hB&BNmexNy6p zA&!7glA{`-*%8tV*J^&yNp6!eCE+!22kml*IO$vt*{T!&~?Bg@;a%zgU(LlKl5|U|2HA| B&G`TT literal 0 HcmV?d00001 diff --git a/lib/toaster/toastergui/static/js/bootstrap.min.js b/lib/toaster/toastergui/static/js/bootstrap.min.js deleted file mode 100644 index 2446398cfe6177172771488ec9bbef5429050afd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37049 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 diff --git a/lib/toaster/toastergui/templates/base.html b/lib/toaster/toastergui/templates/base.html index 709573dd..e8600f3e 100644 --- a/lib/toaster/toastergui/templates/base.html +++ b/lib/toaster/toastergui/templates/base.html @@ -18,7 +18,7 @@ - diff --git a/lib/toaster/toastergui/templates/base_specific.html b/lib/toaster/toastergui/templates/base_specific.html index e377cadd..425f7ed7 100644 --- a/lib/toaster/toastergui/templates/base_specific.html +++ b/lib/toaster/toastergui/templates/base_specific.html @@ -14,11 +14,11 @@ - - diff --git a/lib/toaster/toastergui/templates/js-unit-tests.html b/lib/toaster/toastergui/templates/js-unit-tests.html index ca248962..41553c4f 100644 --- a/lib/toaster/toastergui/templates/js-unit-tests.html +++ b/lib/toaster/toastergui/templates/js-unit-tests.html @@ -11,7 +11,7 @@ - +