diff --git a/assets/scripts/App.js b/assets/scripts/App.js index 59e8bf6..eaecc7e 100644 --- a/assets/scripts/App.js +++ b/assets/scripts/App.js @@ -1,5 +1,5 @@ /* jshint esnext: true */ -import { APP_NAME, $document, $barba } from './utils/environment'; +import { APP_NAME, $document, $pjaxWrapper } from './utils/environment'; import globals from './globals'; @@ -106,8 +106,8 @@ class App { $moduleEls = $document.find('[data-module]'); } else if (event.$scope instanceof jQuery && event.$scope.length > 0) { $moduleEls = event.$scope.find('[data-module]'); - } else if (event.isBarba) { - $moduleEls = $barba.find('[data-module]'); + } else if (event.isPjax) { + $moduleEls = $pjaxWrapper.find('[data-module]'); } // Loop through elements diff --git a/assets/scripts/modules/Example.js b/assets/scripts/modules/Example.js index 7c404af..dc24a96 100644 --- a/assets/scripts/modules/Example.js +++ b/assets/scripts/modules/Example.js @@ -14,13 +14,17 @@ export default class extends AbstractModule { super(options); // Declaration of properties + console.log('πŸ”¨ [module]:constructor - Example'); + } init() { // Set events and such + } destroy() { + console.log('❌ [module]:destroy - Example'); super.destroy(); this.$el.off(`.${EVENT_NAMESPACE}`); } diff --git a/assets/scripts/transitions/BaseTransition.js b/assets/scripts/transitions/BaseTransition.js new file mode 100644 index 0000000..f2a1057 --- /dev/null +++ b/assets/scripts/transitions/BaseTransition.js @@ -0,0 +1,82 @@ +import { APP_NAME, $document, $html, $body, isDebug, $pjaxWrapper } from '../utils/environment'; + +const MODULE_NAME = 'Transition'; +const EVENT_NAMESPACE = `${APP_NAME}.${MODULE_NAME}`; + +const EVENT = { + CLICK: `click.${EVENT_NAMESPACE}`, + READYTOREMOVE: `readyToRemove.${EVENT_NAMESPACE}`, + READYTODESTROY: `readyToDestroy.${EVENT_NAMESPACE}` +}; + +export default class { + constructor(options) { + + this.options = options; + this.wrapper = options.wrapper; + this.overrideClass = options.overrideClass ? options.overrideClass : ''; + this.clickedLink = options.clickedLink; + + } + + launch() { + if(isDebug) { + console.log("---- Launch transition πŸ‘Š -----"); + } + + $html + .removeClass('dom-is-loaded dom-is-animated ') + .addClass(`dom-is-loading ${this.overrideClass}`); + + } + + hideView(oldView, newView) { + if(isDebug) { + console.log('----- ❌ [VIEW]:hide - ', oldView.getAttribute('data-template')); + } + + // launch it at the end (animations...) + $document.triggerHandler({ + type:EVENT.READYTOREMOVE, + oldView: oldView, + newView: newView + }); + + } + + + displayView(view) { + + if(isDebug) { + console.log('----- βœ… [VIEW]:display :', view.getAttribute('data-template')); + } + + $html.attr('data-template', view.getAttribute('data-template')); + + setTimeout(() => { + + $html + .addClass('dom-is-loaded') + .removeClass('dom-is-loading'); + + setTimeout(() => { + $html + .removeClass(this.overrideClass) + .addClass('dom-is-animated'); + }, 1000); + + // launch it at the end (animations...) + $document.triggerHandler({ + type:EVENT.READYTODESTROY + }); + + },1000); + } + + + destroy() { + if(isDebug) { + console.log("---- ❌ [transition]:destroy -----"); + } + } +} diff --git a/assets/scripts/transitions/CustomTransition.js b/assets/scripts/transitions/CustomTransition.js new file mode 100644 index 0000000..2fecbdb --- /dev/null +++ b/assets/scripts/transitions/CustomTransition.js @@ -0,0 +1,22 @@ +import { APP_NAME, $document, $html, isDebug, $pjaxWrapper } from '../utils/environment'; +import BaseTransition from './BaseTransition'; + +const MODULE_NAME = 'Transition'; +const EVENT_NAMESPACE = `${APP_NAME}.${MODULE_NAME}`; + +const EVENT = { + CLICK: `click.${EVENT_NAMESPACE}`, + READYTOREMOVE: `readyToRemove.${EVENT_NAMESPACE}`, + READYTODISPLAY: `readyToDisplay.${EVENT_NAMESPACE}`, + READYTODESTROY: `readyToDestroy.${EVENT_NAMESPACE}` +}; + + +export default class extends BaseTransition{ + constructor(options) { + super(options); + + this.overrideClass = '-custom-transition'; + } + +} diff --git a/assets/scripts/transitions/DefaultTransition.js b/assets/scripts/transitions/DefaultTransition.js deleted file mode 100644 index baa10a7..0000000 --- a/assets/scripts/transitions/DefaultTransition.js +++ /dev/null @@ -1,57 +0,0 @@ -/* jshint esnext: true */ -import { APP_NAME, $document, $html, $barba } from '../utils/environment'; -import { EVENT as APP_EVENT } from '../App'; - -function DefaultTransition(options) { - options = options || {}; - const startCallback = (typeof options.startCallback === 'function') ? options.startCallback : function(){}; - const overrideClass = (typeof options.overrideClass === 'string') ? options.overrideClass : ''; - - return Barba.BaseTransition.extend({ - start: function() { - $html - .removeClass('dom-is-loaded dom-is-animated') - .addClass(`dom-is-loading ${overrideClass}`); - - startCallback(); - - /* Close any overlays */ - - setTimeout(() => { - Promise - .all([this.newContainerLoading]) - .then(this.finish.bind(this)); - }, 1000); - }, - finish: function() { - $document.triggerHandler({ - type: APP_EVENT.DELETE_SCOPED_MODULES, - $scope: $barba - }); - - this.done(); - - const $el = $(this.newContainer); - - // Get the template name of the new container and set it to the DOM - $html.attr('data-template', $el.data('template')); - - $document.triggerHandler({ - type: APP_EVENT.INIT_SCOPED_MODULES, - isBarba: true - }); - - $html - .addClass('dom-is-loaded') - .removeClass('dom-is-loading'); - - setTimeout(() => { - $html - .removeClass(overrideClass) - .addClass('dom-is-animated'); - }, 1000); - } - }); -} - -export default DefaultTransition; diff --git a/assets/scripts/transitions/TransitionManager.js b/assets/scripts/transitions/TransitionManager.js index 1fc77d9..4ac9eeb 100644 --- a/assets/scripts/transitions/TransitionManager.js +++ b/assets/scripts/transitions/TransitionManager.js @@ -1,81 +1,199 @@ /* jshint esnext: true */ -import { APP_NAME, $document, $html, isDebug } from '../utils/environment'; +import { APP_NAME, $document, $html, isDebug, $pjaxWrapper } from '../utils/environment'; +import { EVENT as APP_EVENT } from '../App'; -import DefaultTransition from './DefaultTransition'; +//List here all of your transitions +import * as transitions from './transitions'; -const MODULE_NAME = 'TransitionManager'; +const MODULE_NAME = 'Transition'; const EVENT_NAMESPACE = `${APP_NAME}.${MODULE_NAME}`; const EVENT = { - GOTO: `goto.${EVENT_NAMESPACE}` + CLICK: `click.${EVENT_NAMESPACE}`, + READYTOREMOVE: `readyToRemove.${EVENT_NAMESPACE}`, + READYTODESTROY: `readyToDestroy.${EVENT_NAMESPACE}` }; +/* + +@todo : + +- βœ… get data-transition on clicked link -> launch() and add switch(){} +- ❌ add goto listener +- ❌ add newPageReady functon with google analytics send (maybe pjax do that?) +- βœ… add overrideClass system for all transitions +- βœ… add base class manager like old DefaultTransition (dom-is-loaded, dom-is-loading etc..) + + + +======= SCHEMA ======= + +[] : listener +* : trigger event + +[pjax:send] -> (transition) launch() + +[pjax:switch] (= new view is loaded) -> (transition) hideView()-> hide animations & *readyToRemove + +[readyToRemove] -> remove() -> delete modules + -> remove oldView from the DOM, and innerHTMl newView + -> display() + +display() -> (transition) displayView() -> display animations & *readyToRemove + -> init new modules + +[readyToRemove] -> reinit() + +*/ + export default class { constructor() { - let clickedLink = undefined; - let transition = ''; + // jQuery ondomready $(() => { - this.load() + this.load(); }); - $document.on(EVENT.GOTO, (event) => { - if (!window.history.pushState) { - window.location = event.options.location; - } else { - transition = event.options.transition; - Barba.Pjax.goTo(event.options.location); - } + this.transition = new transitions['BaseTransition']({ + wrapper: this.wrapper }); - // Define different page transitions - Barba.Pjax.getTransition = function() { - transition = (clickedLink instanceof Node) ? clickedLink.getAttribute('data-transition') : (typeof transition === 'string' ? transition : ''); + /* + ===== PJAX CONFIGURATION ===== + */ - let TransitionObject; + this.containerClass = '.js-pjax-container'; + this.wrapperId = 'js-pjax-wrapper'; + this.noPjaxRequestClass = 'no-transition'; + this.wrapper = document.getElementById(this.wrapperId); - switch (transition) { - default: - TransitionObject = DefaultTransition(); - } + this.options = { + debug: false, + cacheBust: false, + elements: [`a:not(.${this.noPjaxRequestClass})`,'form[action]'], + selectors: ['title',`${this.containerClass}`], + switches: {} + }; + this.options.switches[this.containerClass] = (oldEl, newEl, options) => this.switch(oldEl, newEl, options) + this.pjax = new Pjax(this.options); - clickedLink = undefined; - transition = ''; + /* + ===== LISTENERS ===== + */ - return TransitionObject; + document.addEventListener('pjax:send',(e) => this.send(e)); + + + $document.on(EVENT.READYTOREMOVE,(event) => { + this.remove(event.oldView, event.newView); + }); + $document.on(EVENT.READYTODESTROY,(event) => { + this.reinit(); + }); + } + + + /** + * (PJAX) Launch when pjax receive a request + * get & manage data-transition,init and launch it + * @param {event} + * @return void + */ + send(e) { + if(isDebug) { + console.log("---- Launch request πŸ™Œ -----"); } - Barba.Dispatcher.on('linkClicked', (HTMLElement, MouseEvent) => { - clickedLink = HTMLElement; + let el = e.triggerElement; + + let transition = el.getAttribute('data-transition') ? el.getAttribute('data-transition') : 'BaseTransition'; + $html.attr('data-transition',transition); + + // options available : wrapper, overrideClass + this.transition = new transitions[transition]({ + wrapper: this.wrapper, + clickedLink: el }); - Barba.Dispatcher.on('newPageReady', (currentStatus, prevStatus, container, currentHTML) => { - // Fetch any inline script elements. - const scripts = container.querySelectorAll('script.js-inline'); + this.transition.launch(); - if (scripts instanceof window.NodeList) { - let i = 0; - let len = scripts.length; - for (; i < len; i++) { - eval(scripts[i].innerHTML); - } - } + } - /** - * Execute any third party features. - */ + /** + * (PJAX) Launch when new page is loaded + * @param {js dom element}, + * @param {js dom element} + * @param {options : pjax options} + * @return void + */ + switch(oldView, newView, options) { + if(isDebug) { + console.log('---- Next view loaded πŸ‘Œ -----'); + } + this.transition.hideView(oldView, newView); - // Google Analytics - if (window.ga && !isDebug) { - ga('send', 'pageview'); - } + this.pjax.onSwitch(); + + } + + /** + * Launch when you trigger EVENT.READYTOREMOVE in your transition -> hideView(), at the end + * after oldView hidden, delete modules and launch this.display() + * @param {js dom element}, + * @param {js dom element} + * @return void + */ + remove(oldView, newView) { + + $document.triggerHandler({ + type: APP_EVENT.DELETE_SCOPED_MODULES, + $scope: $pjaxWrapper }); - Barba.Pjax.Dom.containerClass = 'js-barba-container'; - Barba.Pjax.Dom.wrapperId = 'js-barba-wrapper'; + oldView.remove(); - Barba.Pjax.start(); + this.display(newView); + } + + /** + * launch after this.remove() + * @param {js dom element}, + * @return void + */ + display(view) { + this.wrapper.innerHTML = view.outerHTML; + + // Fetch any inline script elements. + const scripts = view.querySelectorAll('script.js-inline'); + + if (scripts instanceof window.NodeList) { + let i = 0; + let len = scripts.length; + for (; i < len; i++) { + eval(scripts[i].innerHTML); + } + } + + $document.triggerHandler({ + type: APP_EVENT.INIT_SCOPED_MODULES, + isPjax: true + }); + + this.transition.displayView(view); + + } + + /** + * Launch when you trigger EVENT.READYTODESTROY in your transition -> displayView(), at the end + * @return void + */ + reinit() { + this.transition.destroy(); + $html.attr('data-transition',''); + this.transition = new transitions['BaseTransition']({ + wrapper: this.wrapper + }); } /** diff --git a/assets/scripts/transitions/transitions.js b/assets/scripts/transitions/transitions.js new file mode 100644 index 0000000..fd440be --- /dev/null +++ b/assets/scripts/transitions/transitions.js @@ -0,0 +1,2 @@ +export {default as BaseTransition} from './BaseTransition'; +export {default as CustomTransition} from './CustomTransition'; diff --git a/assets/scripts/utils/environment.js b/assets/scripts/utils/environment.js index 610b668..b809e10 100644 --- a/assets/scripts/utils/environment.js +++ b/assets/scripts/utils/environment.js @@ -5,8 +5,8 @@ const $document = $(document); const $window = $(window); const $html = $(document.documentElement).removeClass('has-no-js').addClass('has-js'); const $body = $(document.body); -const $barba = $('#js-barba-wrapper'); +const $pjaxWrapper = $('#js-pjax-wrapper'); const isDebug = !!$html.data('debug'); -export { APP_NAME, DATA_API_KEY, $document, $window, $html, $body, isDebug, $barba }; +export { APP_NAME, DATA_API_KEY, $document, $window, $html, $body, isDebug, $pjaxWrapper }; diff --git a/build/grunt/config/browserSync.js b/build/grunt/config/browserSync.js index f0fba7e..8f45b30 100644 --- a/build/grunt/config/browserSync.js +++ b/build/grunt/config/browserSync.js @@ -1,7 +1,7 @@ module.exports = { options: { open : false, - proxy : 'localhost', + proxy : 'locomotive-boilerplate.test', port : 3000, watchTask : true, notify : false @@ -12,7 +12,8 @@ module.exports = { '<%= paths.css.dist %>/**/*.css', '<%= paths.js.dist %>/**/*.js', '<%= paths.img.dist %>/**/*.svg', - '**/*.php' + '**/*.php', + '**/*.html', ] } } diff --git a/build/grunt/config/concat.js b/build/grunt/config/concat.js index cde1e6e..9c507ce 100644 --- a/build/grunt/config/concat.js +++ b/build/grunt/config/concat.js @@ -5,7 +5,7 @@ module.exports = { }, src : [ '<%= paths.js.src %>/vendors/**/*.js', - '<%= paths.npm %>/barba.js/dist/barba.js', + '<%= paths.npm %>/pjax/pjax.js', '<%= paths.npm %>/svg4everybody/dist/svg4everybody.js' ], dest : '<%= paths.js.dist %>/vendors.js' diff --git a/package.json b/package.json index f3efa69..80c062a 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "version": "1.0.0", "author": "Locomotive ", "dependencies": { - "barba.js": "0.0.0", + "pjax": "0.0.0", "svg4everybody": "0.0.0" }, "devDependencies": { diff --git a/www/assets/scripts/app.js b/www/assets/scripts/app.js index 54721a1..5ef86ac 100644 --- a/www/assets/scripts/app.js +++ b/www/assets/scripts/app.js @@ -6,6 +6,12 @@ Object.defineProperty(exports, "__esModule", { }); exports.EVENT = undefined; +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* jshint esnext: true */ + + +// Basic modules + + var _environment = require('./utils/environment'); var _globals = require('./globals'); @@ -26,11 +32,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /* jshint esnext: true */ - - -// Basic modules - +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var MODULE_NAME = 'App'; var EVENT_NAMESPACE = _environment.APP_NAME + '.' + MODULE_NAME; @@ -70,115 +72,120 @@ var App = function () { */ - App.prototype.deleteModules = function deleteModules(event) { - var destroyAll = true; - var moduleIds = []; + _createClass(App, [{ + key: 'deleteModules', + value: function deleteModules(event) { + var destroyAll = true; + var moduleIds = []; - // Check for scope first - if (event.$scope instanceof jQuery && event.$scope.length > 0) { - // Modules within scope - var $modules = event.$scope.find('[data-module]'); + // Check for scope first + if (event.$scope instanceof jQuery && event.$scope.length > 0) { + // Modules within scope + var $modules = event.$scope.find('[data-module]'); - // Determine their uids - moduleIds = $.makeArray($modules.map(function (index) { - return $modules.eq(index).data('uid'); - })); + // Determine their uids + moduleIds = $.makeArray($modules.map(function (index) { + return $modules.eq(index).data('uid'); + })); - if (moduleIds.length > 0) { - destroyAll = false; - } else { - return this; - } - } - - // Loop modules and destroying all of them, or specific ones - var i = this.currentModules.length; - - while (i--) { - if (destroyAll || (0, _array.arrayContains)(moduleIds, this.currentModules[i].uid)) { - (0, _array.removeFromArray)(moduleIds, this.currentModules[i].uid); - this.currentModules[i].destroy(); - this.currentModules.splice(i); - } - } - - return this; - }; - - /** - * Execute global functions and settings - * Allows you to initialize global modules only once if you need - * (ex.: when using Barba.js or SmoothState.js) - * @return {Object} Self (allows chaining) - */ - - - App.prototype.initGlobals = function initGlobals(firstBlood) { - (0, _globals2.default)(firstBlood); - return this; - }; - - /** - * Find modules and initialize them - * @param {Object} event The event being triggered. - * @return {Object} Self (allows chaining) - */ - - - App.prototype.initModules = function initModules(event) { - // Elements with module - var $moduleEls = []; - - // If first blood, load all modules in the DOM - // If scoped, render elements with modules - // If Barba, load modules contained in Barba container - if (event.firstBlood) { - $moduleEls = _environment.$document.find('[data-module]'); - } else if (event.$scope instanceof jQuery && event.$scope.length > 0) { - $moduleEls = event.$scope.find('[data-module]'); - } else if (event.isBarba) { - $moduleEls = _environment.$barba.find('[data-module]'); - } - - // Loop through elements - var i = 0; - var elsLen = $moduleEls.length; - - for (; i < elsLen; i++) { - - // Current element - var el = $moduleEls[i]; - - // All data- attributes considered as options - var options = (0, _html.getNodeData)(el); - - // Add current DOM element and jQuery element - options.el = el; - options.$el = $moduleEls.eq(i); - - // Module does exist at this point - var attr = options.module; - - // Splitting modules found in the data-attribute - var moduleIdents = attr.split(/[,\s]+/g); - - // Loop modules - var j = 0; - var modulesLen = moduleIdents.length; - - for (; j < modulesLen; j++) { - var moduleAttr = moduleIdents[j]; - - if (typeof this.modules[moduleAttr] === 'function') { - var module = new this.modules[moduleAttr](options); - this.currentModules.push(module); - module.init(); + if (moduleIds.length > 0) { + destroyAll = false; + } else { + return this; } } + + // Loop modules and destroying all of them, or specific ones + var i = this.currentModules.length; + + while (i--) { + if (destroyAll || (0, _array.arrayContains)(moduleIds, this.currentModules[i].uid)) { + (0, _array.removeFromArray)(moduleIds, this.currentModules[i].uid); + this.currentModules[i].destroy(); + this.currentModules.splice(i); + } + } + + return this; } - return this; - }; + /** + * Execute global functions and settings + * Allows you to initialize global modules only once if you need + * (ex.: when using Barba.js or SmoothState.js) + * @return {Object} Self (allows chaining) + */ + + }, { + key: 'initGlobals', + value: function initGlobals(firstBlood) { + (0, _globals2.default)(firstBlood); + return this; + } + + /** + * Find modules and initialize them + * @param {Object} event The event being triggered. + * @return {Object} Self (allows chaining) + */ + + }, { + key: 'initModules', + value: function initModules(event) { + // Elements with module + var $moduleEls = []; + + // If first blood, load all modules in the DOM + // If scoped, render elements with modules + // If Barba, load modules contained in Barba container + if (event.firstBlood) { + $moduleEls = _environment.$document.find('[data-module]'); + } else if (event.$scope instanceof jQuery && event.$scope.length > 0) { + $moduleEls = event.$scope.find('[data-module]'); + } else if (event.isPjax) { + $moduleEls = _environment.$pjaxWrapper.find('[data-module]'); + } + + // Loop through elements + var i = 0; + var elsLen = $moduleEls.length; + + for (; i < elsLen; i++) { + + // Current element + var el = $moduleEls[i]; + + // All data- attributes considered as options + var options = (0, _html.getNodeData)(el); + + // Add current DOM element and jQuery element + options.el = el; + options.$el = $moduleEls.eq(i); + + // Module does exist at this point + var attr = options.module; + + // Splitting modules found in the data-attribute + var moduleIdents = attr.split(/[,\s]+/g); + + // Loop modules + var j = 0; + var modulesLen = moduleIdents.length; + + for (; j < modulesLen; j++) { + var moduleAttr = moduleIdents[j]; + + if (typeof this.modules[moduleAttr] === 'function') { + var module = new this.modules[moduleAttr](options); + this.currentModules.push(module); + module.init(); + } + } + } + + return this; + } + }]); return App; }(); @@ -195,7 +202,7 @@ var App = function () { }); })(); -},{"./globals":2,"./modules":3,"./utils/array":8,"./utils/environment":10,"./utils/html":11,"./utils/is":12}],2:[function(require,module,exports){ +},{"./globals":2,"./modules":3,"./utils/array":10,"./utils/environment":12,"./utils/html":13,"./utils/is":14}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -216,7 +223,7 @@ var _TransitionManager2 = _interopRequireDefault(_TransitionManager); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -},{"./transitions/TransitionManager":7}],3:[function(require,module,exports){ +},{"./transitions/TransitionManager":8}],3:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -241,6 +248,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /* jshint esnext: true */ @@ -263,13 +272,17 @@ var _class = function () { this.$el.data('uid', this.uid); } - _class.prototype.init = function init() {}; - - _class.prototype.destroy = function destroy() { - if (this.$el) { - this.$el.removeData('uid'); + _createClass(_class, [{ + key: 'init', + value: function init() {} + }, { + key: 'destroy', + value: function destroy() { + if (this.$el) { + this.$el.removeData('uid'); + } } - }; + }]); return _class; }(); @@ -283,6 +296,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + var _environment = require('../utils/environment'); var _AbstractModule2 = require('./AbstractModule'); @@ -311,157 +328,377 @@ var _class = function (_AbstractModule) { function _class(options) { _classCallCheck(this, _class); - return _possibleConstructorReturn(this, _AbstractModule.call(this, options)); - // Declaration of properties + var _this = _possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).call(this, options)); + + console.log('πŸ”¨ [module]:constructor - Example'); + + return _this; } - _class.prototype.init = function init() { - // Set events and such - }; + _createClass(_class, [{ + key: 'init', + value: function init() { + // Set events and such - _class.prototype.destroy = function destroy() { - _AbstractModule.prototype.destroy.call(this); - this.$el.off('.' + EVENT_NAMESPACE); - }; + } + }, { + key: 'destroy', + value: function destroy() { + console.log('❌ [module]:destroy - Example'); + _get(_class.prototype.__proto__ || Object.getPrototypeOf(_class.prototype), 'destroy', this).call(this); + this.$el.off('.' + EVENT_NAMESPACE); + } + }]); return _class; }(_AbstractModule3.default); exports.default = _class; -},{"../utils/environment":10,"./AbstractModule":4}],6:[function(require,module,exports){ +},{"../utils/environment":12,"./AbstractModule":4}],6:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _environment = require('../utils/environment'); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var MODULE_NAME = 'Transition'; +var EVENT_NAMESPACE = _environment.APP_NAME + '.' + MODULE_NAME; + +var EVENT = { + CLICK: 'click.' + EVENT_NAMESPACE, + READYTOREMOVE: 'readyToRemove.' + EVENT_NAMESPACE, + READYTODESTROY: 'readyToDestroy.' + EVENT_NAMESPACE +}; + +var _class = function () { + function _class(options) { + _classCallCheck(this, _class); + + this.options = options; + this.wrapper = options.wrapper; + this.overrideClass = options.overrideClass ? options.overrideClass : ''; + this.clickedLink = options.clickedLink; + } + + _createClass(_class, [{ + key: 'launch', + value: function launch() { + if (_environment.isDebug) { + console.log("---- Launch transition πŸ‘Š -----"); + } + + _environment.$html.removeClass('dom-is-loaded dom-is-animated ').addClass('dom-is-loading ' + this.overrideClass); + } + }, { + key: 'hideView', + value: function hideView(oldView, newView) { + if (_environment.isDebug) { + console.log('----- ❌ [VIEW]:hide - ', oldView.getAttribute('data-template')); + } + + // launch it at the end (animations...) + _environment.$document.triggerHandler({ + type: EVENT.READYTOREMOVE, + oldView: oldView, + newView: newView + }); + } + }, { + key: 'displayView', + value: function displayView(view) { + var _this = this; + + if (_environment.isDebug) { + console.log('----- βœ… [VIEW]:display :', view.getAttribute('data-template')); + } + + _environment.$html.attr('data-template', view.getAttribute('data-template')); + + setTimeout(function () { + + _environment.$html.addClass('dom-is-loaded').removeClass('dom-is-loading'); + + setTimeout(function () { + _environment.$html.removeClass(_this.overrideClass).addClass('dom-is-animated'); + }, 1000); + + // launch it at the end (animations...) + _environment.$document.triggerHandler({ + type: EVENT.READYTODESTROY + }); + }, 1000); + } + }, { + key: 'destroy', + value: function destroy() { + if (_environment.isDebug) { + console.log("---- ❌ [transition]:destroy -----"); + } + } + }]); + + return _class; +}(); + +exports.default = _class; + +},{"../utils/environment":12}],7:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _environment = require('../utils/environment'); + +var _BaseTransition2 = require('./BaseTransition'); + +var _BaseTransition3 = _interopRequireDefault(_BaseTransition2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MODULE_NAME = 'Transition'; +var EVENT_NAMESPACE = _environment.APP_NAME + '.' + MODULE_NAME; + +var EVENT = { + CLICK: 'click.' + EVENT_NAMESPACE, + READYTOREMOVE: 'readyToRemove.' + EVENT_NAMESPACE, + READYTODISPLAY: 'readyToDisplay.' + EVENT_NAMESPACE, + READYTODESTROY: 'readyToDestroy.' + EVENT_NAMESPACE +}; + +var _class = function (_BaseTransition) { + _inherits(_class, _BaseTransition); + + function _class(options) { + _classCallCheck(this, _class); + + var _this = _possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).call(this, options)); + + _this.overrideClass = '-custom-transition'; + return _this; + } + + return _class; +}(_BaseTransition3.default); + +exports.default = _class; + +},{"../utils/environment":12,"./BaseTransition":6}],8:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* jshint esnext: true */ + + +//List here all of your transitions + + var _environment = require('../utils/environment'); var _App = require('../App'); -/* jshint esnext: true */ -function DefaultTransition(options) { - options = options || {}; - var startCallback = typeof options.startCallback === 'function' ? options.startCallback : function () {}; - var overrideClass = typeof options.overrideClass === 'string' ? options.overrideClass : ''; +var _transitions = require('./transitions'); - return Barba.BaseTransition.extend({ - start: function start() { - var _this = this; +var transitions = _interopRequireWildcard(_transitions); - _environment.$html.removeClass('dom-is-loaded dom-is-animated').addClass('dom-is-loading ' + overrideClass); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - startCallback(); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - /* Close any overlays */ - - setTimeout(function () { - Promise.all([_this.newContainerLoading]).then(_this.finish.bind(_this)); - }, 1000); - }, - finish: function finish() { - _environment.$document.triggerHandler({ - type: _App.EVENT.DELETE_SCOPED_MODULES, - $scope: _environment.$barba - }); - - this.done(); - - var $el = $(this.newContainer); - - // Get the template name of the new container and set it to the DOM - _environment.$html.attr('data-template', $el.data('template')); - - _environment.$document.triggerHandler({ - type: _App.EVENT.INIT_SCOPED_MODULES, - isBarba: true - }); - - _environment.$html.addClass('dom-is-loaded').removeClass('dom-is-loading'); - - setTimeout(function () { - _environment.$html.removeClass(overrideClass).addClass('dom-is-animated'); - }, 1000); - } - }); -} - -exports.default = DefaultTransition; - -},{"../App":1,"../utils/environment":10}],7:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _environment = require('../utils/environment'); - -var _DefaultTransition = require('./DefaultTransition'); - -var _DefaultTransition2 = _interopRequireDefault(_DefaultTransition); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /* jshint esnext: true */ - - -var MODULE_NAME = 'TransitionManager'; +var MODULE_NAME = 'Transition'; var EVENT_NAMESPACE = _environment.APP_NAME + '.' + MODULE_NAME; var EVENT = { - GOTO: 'goto.' + EVENT_NAMESPACE + CLICK: 'click.' + EVENT_NAMESPACE, + READYTOREMOVE: 'readyToRemove.' + EVENT_NAMESPACE, + READYTODESTROY: 'readyToDestroy.' + EVENT_NAMESPACE }; +/* + +@todo : + +- βœ… get data-transition on clicked link -> launch() and add switch(){} +- ❌ add goto listener +- ❌ add newPageReady functon with google analytics send (maybe pjax do that?) +- βœ… add overrideClass system for all transitions +- βœ… add base class manager like old DefaultTransition (dom-is-loaded, dom-is-loading etc..) + + + +======= SCHEMA ======= + +[] : listener +* : trigger event + +[pjax:send] -> (transition) launch() + +[pjax:switch] (= new view is loaded) -> (transition) hideView()-> hide animations & *readyToRemove + +[readyToRemove] -> remove() -> delete modules + -> remove oldView from the DOM, and innerHTMl newView + -> display() + +display() -> (transition) displayView() -> display animations & *readyToRemove + -> init new modules + +[readyToRemove] -> reinit() + +*/ + var _class = function () { function _class() { var _this = this; _classCallCheck(this, _class); - var clickedLink = undefined; - var transition = ''; - // jQuery ondomready $(function () { _this.load(); }); - _environment.$document.on(EVENT.GOTO, function (event) { - if (!window.history.pushState) { - window.location = event.options.location; - } else { - transition = event.options.transition; - Barba.Pjax.goTo(event.options.location); - } + this.transition = new transitions['BaseTransition']({ + wrapper: this.wrapper }); - // Define different page transitions - Barba.Pjax.getTransition = function () { - transition = clickedLink instanceof Node ? clickedLink.getAttribute('data-transition') : typeof transition === 'string' ? transition : ''; + /* + ===== PJAX CONFIGURATION ===== + */ - var TransitionObject = void 0; + this.containerClass = '.js-pjax-container'; + this.wrapperId = 'js-pjax-wrapper'; + this.noPjaxRequestClass = 'no-transition'; + this.wrapper = document.getElementById(this.wrapperId); - switch (transition) { - default: - TransitionObject = (0, _DefaultTransition2.default)(); - } - - clickedLink = undefined; - transition = ''; - - return TransitionObject; + this.options = { + debug: false, + cacheBust: false, + elements: ['a:not(.' + this.noPjaxRequestClass + ')', 'form[action]'], + selectors: ['title', '' + this.containerClass], + switches: {} }; + this.options.switches[this.containerClass] = function (oldEl, newEl, options) { + return _this.switch(oldEl, newEl, options); + }; + this.pjax = new Pjax(this.options); - Barba.Dispatcher.on('linkClicked', function (HTMLElement, MouseEvent) { - clickedLink = HTMLElement; + /* + ===== LISTENERS ===== + */ + + document.addEventListener('pjax:send', function (e) { + return _this.send(e); }); - Barba.Dispatcher.on('newPageReady', function (currentStatus, prevStatus, container, currentHTML) { + _environment.$document.on(EVENT.READYTOREMOVE, function (event) { + _this.remove(event.oldView, event.newView); + }); + _environment.$document.on(EVENT.READYTODESTROY, function (event) { + _this.reinit(); + }); + } + + /** + * (PJAX) Launch when pjax receive a request + * get & manage data-transition,init and launch it + * @param {event} + * @return void + */ + + + _createClass(_class, [{ + key: 'send', + value: function send(e) { + if (_environment.isDebug) { + console.log("---- Launch request πŸ™Œ -----"); + } + + var el = e.triggerElement; + + var transition = el.getAttribute('data-transition') ? el.getAttribute('data-transition') : 'BaseTransition'; + _environment.$html.attr('data-transition', transition); + + // options available : wrapper, overrideClass + this.transition = new transitions[transition]({ + wrapper: this.wrapper, + clickedLink: el + }); + + this.transition.launch(); + } + + /** + * (PJAX) Launch when new page is loaded + * @param {js dom element}, + * @param {js dom element} + * @param {options : pjax options} + * @return void + */ + + }, { + key: 'switch', + value: function _switch(oldView, newView, options) { + if (_environment.isDebug) { + console.log('---- Next view loaded πŸ‘Œ -----'); + } + this.transition.hideView(oldView, newView); + + this.pjax.onSwitch(); + } + + /** + * Launch when you trigger EVENT.READYTOREMOVE in your transition -> hideView(), at the end + * after oldView hidden, delete modules and launch this.display() + * @param {js dom element}, + * @param {js dom element} + * @return void + */ + + }, { + key: 'remove', + value: function remove(oldView, newView) { + + _environment.$document.triggerHandler({ + type: _App.EVENT.DELETE_SCOPED_MODULES, + $scope: _environment.$pjaxWrapper + }); + + oldView.remove(); + + this.display(newView); + } + + /** + * launch after this.remove() + * @param {js dom element}, + * @return void + */ + + }, { + key: 'display', + value: function display(view) { + this.wrapper.innerHTML = view.outerHTML; + // Fetch any inline script elements. - var scripts = container.querySelectorAll('script.js-inline'); + var scripts = view.querySelectorAll('script.js-inline'); if (scripts instanceof window.NodeList) { var i = 0; @@ -471,43 +708,79 @@ var _class = function () { } } - /** - * Execute any third party features. - */ + _environment.$document.triggerHandler({ + type: _App.EVENT.INIT_SCOPED_MODULES, + isPjax: true + }); - // Google Analytics - if (window.ga && !_environment.isDebug) { - ga('send', 'pageview'); - } - }); + this.transition.displayView(view); + } - Barba.Pjax.Dom.containerClass = 'js-barba-container'; - Barba.Pjax.Dom.wrapperId = 'js-barba-wrapper'; + /** + * Launch when you trigger EVENT.READYTODESTROY in your transition -> displayView(), at the end + * @return void + */ - Barba.Pjax.start(); - } + }, { + key: 'reinit', + value: function reinit() { + this.transition.destroy(); + _environment.$html.attr('data-transition', ''); + this.transition = new transitions['BaseTransition']({ + wrapper: this.wrapper + }); + } - /** - * DOM is loaded - * - * @return {void} - */ + /** + * DOM is loaded + * + * @return {void} + */ - - _class.prototype.load = function load() { - _environment.$html.addClass('dom-is-loaded'); - _environment.$html.removeClass('dom-is-loading'); - setTimeout(function () { - _environment.$html.addClass('dom-is-animated'); - }, 1000); - }; + }, { + key: 'load', + value: function load() { + _environment.$html.addClass('dom-is-loaded'); + _environment.$html.removeClass('dom-is-loading'); + setTimeout(function () { + _environment.$html.addClass('dom-is-animated'); + }, 1000); + } + }]); return _class; }(); exports.default = _class; -},{"../utils/environment":10,"./DefaultTransition":6}],8:[function(require,module,exports){ +},{"../App":1,"../utils/environment":12,"./transitions":9}],9:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _BaseTransition = require('./BaseTransition'); + +Object.defineProperty(exports, 'BaseTransition', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_BaseTransition).default; + } +}); + +var _CustomTransition = require('./CustomTransition'); + +Object.defineProperty(exports, 'CustomTransition', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_CustomTransition).default; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +},{"./BaseTransition":6,"./CustomTransition":7}],10:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -521,6 +794,7 @@ exports.lastItem = lastItem; exports.removeFromArray = removeFromArray; exports.toArray = toArray; exports.findByKeyValue = findByKeyValue; +exports.cloneArray = cloneArray; var _is = require('./is'); @@ -607,7 +881,11 @@ function findByKeyValue(array, key, value) { }); } -},{"./is":12}],9:[function(require,module,exports){ +function cloneArray(array) { + return JSON.parse(JSON.stringify(array)); +} + +},{"./is":14}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -630,7 +908,7 @@ exports.default = function (func, wait, immediate) { }; }; -},{}],10:[function(require,module,exports){ +},{}],12:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -643,7 +921,7 @@ var $document = $(document); var $window = $(window); var $html = $(document.documentElement).removeClass('has-no-js').addClass('has-js'); var $body = $(document.body); -var $barba = $('#js-barba-wrapper'); +var $pjaxWrapper = $('#js-pjax-wrapper'); var isDebug = !!$html.data('debug'); @@ -654,9 +932,9 @@ exports.$window = $window; exports.$html = $html; exports.$body = $body; exports.isDebug = isDebug; -exports.$barba = $barba; +exports.$pjaxWrapper = $pjaxWrapper; -},{}],11:[function(require,module,exports){ +},{}],13:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -757,7 +1035,7 @@ function getData(data) { return data; } -},{}],12:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -810,7 +1088,7 @@ function isFunction(thing) { return thing && getType.toString.call(thing) === '[object Function]'; } -},{}],13:[function(require,module,exports){ +},{}],15:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -883,7 +1161,7 @@ function scrollTo($element, options) { return deferred.promise(); } -},{"./is":12}],14:[function(require,module,exports){ +},{"./is":14}],16:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -1018,5 +1296,5 @@ function visibilityApi(options) { exports.visibilityApi = visibilityApi; -},{"./array":8,"./environment":10,"./is":12}]},{},[1,2,3,4,5,6,7,8,9,10,11,12,13,14]) -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvc2NyaXB0cy9BcHAuanMiLCJhc3NldHMvc2NyaXB0cy9nbG9iYWxzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbW9kdWxlcy5qcyIsImFzc2V0cy9zY3JpcHRzL21vZHVsZXMvQWJzdHJhY3RNb2R1bGUuanMiLCJhc3NldHMvc2NyaXB0cy9tb2R1bGVzL0V4YW1wbGUuanMiLCJhc3NldHMvc2NyaXB0cy90cmFuc2l0aW9ucy9EZWZhdWx0VHJhbnNpdGlvbi5qcyIsImFzc2V0cy9zY3JpcHRzL3RyYW5zaXRpb25zL1RyYW5zaXRpb25NYW5hZ2VyLmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvYXJyYXkuanMiLCJhc3NldHMvc2NyaXB0cy91dGlscy9kZWJvdW5jZS5qcyIsImFzc2V0cy9zY3JpcHRzL3V0aWxzL2Vudmlyb25tZW50LmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvaHRtbC5qcyIsImFzc2V0cy9zY3JpcHRzL3V0aWxzL2lzLmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvc2Nyb2xsVG8uanMiLCJhc3NldHMvc2NyaXB0cy91dGlscy92aXNpYmlsaXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztBQ0NBOztBQUVBOzs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBR0E7O0lBQVksTzs7Ozs7OzBKQVZaOzs7QUFTQTs7O0FBR0EsSUFBTSxjQUFjLEtBQXBCO0FBQ0EsSUFBTSxnREFBaUMsV0FBdkM7O0FBRU8sSUFBTSx3QkFBUTtBQUNqQixtQ0FBNkIsZUFEWjtBQUVqQixnREFBMEMsZUFGekI7QUFHakIsb0RBQThDO0FBSDdCLENBQWQ7O0lBTUQsRztBQUNGLG1CQUFjO0FBQUE7O0FBQUE7O0FBQ1YsYUFBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLGFBQUssY0FBTCxHQUFzQixFQUF0Qjs7QUFFQSwrQkFBVSxFQUFWLENBQWEsTUFBTSxZQUFuQixF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QUFVLEtBQVYsQ0FBcEI7QUFDQSxRQUFJLElBQUksQ0FBUjtBQUNBLFFBQUksTUFBTSxjQUFjLE1BQXhCOztBQUVBLFdBQU8sSUFBSSxHQUFYLEVBQWdCLEdBQWhCLEVBQXFCO0FBQ2pCLHNCQUFjLENBQWQsRUFBaUIsUUFBakI7QUFDSDtBQUNKOztBQUVEOzs7OztBQUtBLFNBQVMsYUFBVCxDQUF3QixPQUF4QixFQUFpQztBQUM3QixRQUFJLFNBQVMsUUFBUSxNQUFSLElBQWtCLEVBQS9CO0FBQ0EsUUFBSSxRQUFRLFFBQVEsS0FBUixJQUFpQixFQUE3QjtBQUNBLFFBQUksWUFBSjs7QUFFQTtBQUNBLFFBQUksQ0FBQywwQkFBYyxPQUFkLEVBQXVCLE1BQXZCLENBQUwsRUFBcUM7QUFDakMsZ0JBQVEsSUFBUixDQUFhLHVCQUFiO0FBQ0EsZUFBTyxLQUFQO0FBQ0g7QUFDRCxRQUFJLENBQUMsMEJBQWMsTUFBZCxFQUFzQixLQUF0QixDQUFMLEVBQW1DO0FBQy9CLGdCQUFRLElBQVIsQ0FBYSxzQkFBYjtBQUNBLGVBQU8sS0FBUDtBQUNIOztBQUVEO0FBQ0EsUUFBSSxXQUFXLGFBQWYsRUFBOEI7QUFDMUIsY0FBTSxZQUFZLEtBQVosRUFBbUIsT0FBbkIsQ0FBTjtBQUNILEtBRkQsTUFFTyxJQUFJLFdBQVcsZ0JBQWYsRUFBaUM7QUFDcEMsY0FBTSxlQUFlLEtBQWYsRUFBc0IsT0FBdEIsQ0FBTjtBQUNIOztBQUVELFdBQU8sR0FBUDtBQUNIOztRQUVRLGEsR0FBQSxhIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCB7IEFQUF9OQU1FLCAkZG9jdW1lbnQsICRiYXJiYSB9IGZyb20gJy4vdXRpbHMvZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQgZ2xvYmFscyBmcm9tICcuL2dsb2JhbHMnO1xuXG5pbXBvcnQgeyBhcnJheUNvbnRhaW5zLCByZW1vdmVGcm9tQXJyYXkgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IGdldE5vZGVEYXRhIH0gZnJvbSAnLi91dGlscy9odG1sJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL3V0aWxzL2lzJztcblxuLy8gQmFzaWMgbW9kdWxlc1xuaW1wb3J0ICogYXMgbW9kdWxlcyBmcm9tICcuL21vZHVsZXMnO1xuXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdBcHAnO1xuY29uc3QgRVZFTlRfTkFNRVNQQUNFID0gYCR7QVBQX05BTUV9LiR7TU9EVUxFX05BTUV9YDtcblxuZXhwb3J0IGNvbnN0IEVWRU5UID0ge1xuICAgIElOSVRfTU9EVUxFUzogYGluaXRNb2R1bGVzLiR7RVZFTlRfTkFNRVNQQUNFfWAsXG4gICAgSU5JVF9TQ09QRURfTU9EVUxFUzogYGluaXRTY29wZWRNb2R1bGVzLiR7RVZFTlRfTkFNRVNQQUNFfWAsXG4gICAgREVMRVRFX1NDT1BFRF9NT0RVTEVTOiBgZGVsZXRlU2NvcGVkTW9kdWxlcy4ke0VWRU5UX05BTUVTUEFDRX1gXG59O1xuXG5jbGFzcyBBcHAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSBtb2R1bGVzO1xuICAgICAgICB0aGlzLmN1cnJlbnRNb2R1bGVzID0gW107XG5cbiAgICAgICAgJGRvY3VtZW50Lm9uKEVWRU5ULklOSVRfTU9EVUxFUywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluaXRHbG9iYWxzKGV2ZW50LmZpcnN0Qmxvb2QpXG4gICAgICAgICAgICAgICAgLmRlbGV0ZU1vZHVsZXMoZXZlbnQpXG4gICAgICAgICAgICAgICAgLmluaXRNb2R1bGVzKGV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJGRvY3VtZW50Lm9uKEVWRU5ULklOSVRfU0NPUEVEX01PRFVMRVMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbml0TW9kdWxlcyhldmVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICRkb2N1bWVudC5vbihFVkVOVC5ERUxFVEVfU0NPUEVEX01PRFVMRVMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVNb2R1bGVzKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBhbGwgZXhpc3RpbmcgbW9kdWxlcyBvciBhIHNwZWNpZmljIHNjb3BlIG9mIG1vZHVsZXNcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGV2ZW50IFRoZSBldmVudCBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSAgICAgICBTZWxmIChhbGxvd3MgY2hhaW5pbmcpXG4gICAgICovXG4gICAgZGVsZXRlTW9kdWxlcyhldmVudCkge1xuICAgICAgICBsZXQgZGVzdHJveUFsbCA9IHRydWU7XG4gICAgICAgIGxldCBtb2R1bGVJZHMgPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBmb3Igc2NvcGUgZmlyc3RcbiAgICAgICAgaWYgKGV2ZW50LiRzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSAmJiBldmVudC4kc2NvcGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gTW9kdWxlcyB3aXRoaW4gc2NvcGVcbiAgICAgICAgICAgIGNvbnN0ICRtb2R1bGVzID0gZXZlbnQuJHNjb3BlLmZpbmQoJ1tkYXRhLW1vZHVsZV0nKTtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZWlyIHVpZHNcbiAgICAgICAgICAgIG1vZHVsZUlkcyA9ICQubWFrZUFycmF5KCRtb2R1bGVzLm1hcChmdW5jdGlvbihpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkbW9kdWxlcy5lcShpbmRleCkuZGF0YSgndWlkJyk7XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIG1vZHVsZXMgYW5kIGRlc3Ryb3lpbmcgYWxsIG9mIHRoZW0sIG9yIHNwZWNpZmljIG9uZXNcbiAgICAgICAgbGV0IGkgPSB0aGlzLmN1cnJlbnRNb2R1bGVzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBpZiAoZGVzdHJveUFsbCB8fCBhcnJheUNvbnRhaW5zKG1vZHVsZUlkcywgdGhpcy5jdXJyZW50TW9kdWxlc1tpXS51aWQpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRnJvbUFycmF5KG1vZHVsZUlkcywgdGhpcy5jdXJyZW50TW9kdWxlc1tpXS51aWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZHVsZXNbaV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZHVsZXMuc3BsaWNlKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBnbG9iYWwgZnVuY3Rpb25zIGFuZCBzZXR0aW5nc1xuICAgICAqIEFsbG93cyB5b3UgdG8gaW5pdGlhbGl6ZSBnbG9iYWwgbW9kdWxlcyBvbmx5IG9uY2UgaWYgeW91IG5lZWRcbiAgICAgKiAoZXguOiB3aGVuIHVzaW5nIEJhcmJhLmpzIG9yIFNtb290aFN0YXRlLmpzKVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gU2VsZiAoYWxsb3dzIGNoYWluaW5nKVxuICAgICAqL1xuICAgIGluaXRHbG9iYWxzKGZpcnN0Qmxvb2QpIHtcbiAgICAgICAgZ2xvYmFscyhmaXJzdEJsb29kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBtb2R1bGVzIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGV2ZW50IFRoZSBldmVudCBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSAgICAgICBTZWxmIChhbGxvd3MgY2hhaW5pbmcpXG4gICAgICovXG4gICAgaW5pdE1vZHVsZXMoZXZlbnQpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgd2l0aCBtb2R1bGVcbiAgICAgICAgbGV0ICRtb2R1bGVFbHMgPSBbXTtcblxuICAgICAgICAvLyBJZiBmaXJzdCBibG9vZCwgbG9hZCBhbGwgbW9kdWxlcyBpbiB0aGUgRE9NXG4gICAgICAgIC8vIElmIHNjb3BlZCwgcmVuZGVyIGVsZW1lbnRzIHdpdGggbW9kdWxlc1xuICAgICAgICAvLyBJZiBCYXJiYSwgbG9hZCBtb2R1bGVzIGNvbnRhaW5lZCBpbiBCYXJiYSBjb250YWluZXJcbiAgICAgICAgaWYgKGV2ZW50LmZpcnN0Qmxvb2QpIHtcbiAgICAgICAgICAgICRtb2R1bGVFbHMgPSAkZG9jdW1lbnQuZmluZCgnW2RhdGEtbW9kdWxlXScpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LiRzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSAmJiBldmVudC4kc2NvcGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgJG1vZHVsZUVscyA9IGV2ZW50LiRzY29wZS5maW5kKCdbZGF0YS1tb2R1bGVdJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuaXNCYXJiYSkge1xuICAgICAgICAgICAgJG1vZHVsZUVscyA9ICRiYXJiYS5maW5kKCdbZGF0YS1tb2R1bGVdJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggZWxlbWVudHNcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBjb25zdCBlbHNMZW4gPSAkbW9kdWxlRWxzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKDsgaSA8IGVsc0xlbjsgaSsrKSB7XG5cbiAgICAgICAgICAgIC8vIEN1cnJlbnQgZWxlbWVudFxuICAgICAgICAgICAgbGV0IGVsID0gJG1vZHVsZUVsc1tpXTtcblxuICAgICAgICAgICAgLy8gQWxsIGRhdGEtIGF0dHJpYnV0ZXMgY29uc2lkZXJlZCBhcyBvcHRpb25zXG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IGdldE5vZGVEYXRhKGVsKTtcblxuICAgICAgICAgICAgLy8gQWRkIGN1cnJlbnQgRE9NIGVsZW1lbnQgYW5kIGpRdWVyeSBlbGVtZW50XG4gICAgICAgICAgICBvcHRpb25zLmVsID0gZWw7XG4gICAgICAgICAgICBvcHRpb25zLiRlbCA9ICRtb2R1bGVFbHMuZXEoaSk7XG5cbiAgICAgICAgICAgIC8vIE1vZHVsZSBkb2VzIGV4aXN0IGF0IHRoaXMgcG9pbnRcbiAgICAgICAgICAgIGxldCBhdHRyID0gb3B0aW9ucy5tb2R1bGU7XG5cbiAgICAgICAgICAgIC8vIFNwbGl0dGluZyBtb2R1bGVzIGZvdW5kIGluIHRoZSBkYXRhLWF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IG1vZHVsZUlkZW50cyA9IGF0dHIuc3BsaXQoL1ssXFxzXSsvZyk7XG5cbiAgICAgICAgICAgIC8vIExvb3AgbW9kdWxlc1xuICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgbGV0IG1vZHVsZXNMZW4gPSBtb2R1bGVJZGVudHMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKDsgaiA8IG1vZHVsZXNMZW47IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBtb2R1bGVBdHRyID0gbW9kdWxlSWRlbnRzW2pdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1vZHVsZXNbbW9kdWxlQXR0cl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZHVsZSA9IG5ldyB0aGlzLm1vZHVsZXNbbW9kdWxlQXR0cl0ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuaW5pdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuLy8gSUlGRSBmb3IgbG9hZGluZyB0aGUgYXBwbGljYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gICAgbmV3IEFwcCgpO1xuICAgICRkb2N1bWVudC50cmlnZ2VySGFuZGxlcih7XG4gICAgICAgIHR5cGU6IEVWRU5ULklOSVRfTU9EVUxFUyxcbiAgICAgICAgZmlyc3RCbG9vZDogdHJ1ZVxuICAgIH0pO1xufSkoKTtcbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCBUcmFuc2l0aW9uTWFuYWdlciBmcm9tICcuL3RyYW5zaXRpb25zL1RyYW5zaXRpb25NYW5hZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZmlyc3RCbG9vZCkge1xuICAgIHN2ZzRldmVyeWJvZHkoKTtcblxuICAgIGlmIChmaXJzdEJsb29kKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb25NYW5hZ2VyID0gbmV3IFRyYW5zaXRpb25NYW5hZ2VyKCk7XG4gICAgfVxufVxuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuZXhwb3J0IHtkZWZhdWx0IGFzIEV4YW1wbGV9IGZyb20gJy4vbW9kdWxlcy9FeGFtcGxlJztcbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmxldCB1aWQgPSAwO1xuXG4vKipcbiAqIEFic3RyYWN0IE1vZHVsZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLiRlbCA9IG9wdGlvbnMuJGVsIHx8IG51bGw7XG4gICAgICAgIHRoaXMuZWwgID0gb3B0aW9ucy5lbCAgfHwgbnVsbDtcblxuICAgICAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBtb2R1bGUgaWRlbnRpZmllclxuICAgICAgICB0aGlzLnVpZCA9ICdtLScgKyB1aWQrKztcbiAgICAgICAgLy8gVXNlIGpRdWVyeSdzIGRhdGEgQVBJIHRvIFwic3RvcmUgaXQgaW4gdGhlIERPTVwiXG4gICAgICAgIHRoaXMuJGVsLmRhdGEoJ3VpZCcsIHRoaXMudWlkKTtcbiAgICB9XG5cbiAgICBpbml0KCkge31cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLiRlbCkge1xuICAgICAgICAgICAgdGhpcy4kZWwucmVtb3ZlRGF0YSgndWlkJylcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCB7IEFQUF9OQU1FIH0gZnJvbSAnLi4vdXRpbHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IEFic3RyYWN0TW9kdWxlIGZyb20gJy4vQWJzdHJhY3RNb2R1bGUnO1xuXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdFeGFtcGxlJztcbmNvbnN0IEVWRU5UX05BTUVTUEFDRSA9IGAke0FQUF9OQU1FfS4ke01PRFVMRV9OQU1FfWA7XG5cbmNvbnN0IEVWRU5UID0ge1xuICAgIENMSUNLOiBgY2xpY2suJHtFVkVOVF9OQU1FU1BBQ0V9YFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcblxuICAgICAgICAvLyBEZWNsYXJhdGlvbiBvZiBwcm9wZXJ0aWVzXG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgLy8gU2V0IGV2ZW50cyBhbmQgc3VjaFxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKGAuJHtFVkVOVF9OQU1FU1BBQ0V9YCk7XG4gICAgfVxufVxuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuaW1wb3J0IHsgQVBQX05BTUUsICRkb2N1bWVudCwgJGh0bWwsICRiYXJiYSB9IGZyb20gJy4uL3V0aWxzL2Vudmlyb25tZW50JztcbmltcG9ydCB7IEVWRU5UIGFzIEFQUF9FVkVOVCB9IGZyb20gJy4uL0FwcCc7XG5cbmZ1bmN0aW9uIERlZmF1bHRUcmFuc2l0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzdGFydENhbGxiYWNrID0gKHR5cGVvZiBvcHRpb25zLnN0YXJ0Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpID8gb3B0aW9ucy5zdGFydENhbGxiYWNrIDogZnVuY3Rpb24oKXt9O1xuICAgIGNvbnN0IG92ZXJyaWRlQ2xhc3MgPSAodHlwZW9mIG9wdGlvbnMub3ZlcnJpZGVDbGFzcyA9PT0gJ3N0cmluZycpID8gb3B0aW9ucy5vdmVycmlkZUNsYXNzIDogJyc7XG5cbiAgICByZXR1cm4gQmFyYmEuQmFzZVRyYW5zaXRpb24uZXh0ZW5kKHtcbiAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJGh0bWxcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2RvbS1pcy1sb2FkZWQgZG9tLWlzLWFuaW1hdGVkJylcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoYGRvbS1pcy1sb2FkaW5nICR7b3ZlcnJpZGVDbGFzc31gKTtcblxuICAgICAgICAgICAgc3RhcnRDYWxsYmFjaygpO1xuXG4gICAgICAgICAgICAvKiBDbG9zZSBhbnkgb3ZlcmxheXMgKi9cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgLmFsbChbdGhpcy5uZXdDb250YWluZXJMb2FkaW5nXSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKHRoaXMuZmluaXNoLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkZG9jdW1lbnQudHJpZ2dlckhhbmRsZXIoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICAgQVBQX0VWRU5ULkRFTEVURV9TQ09QRURfTU9EVUxFUyxcbiAgICAgICAgICAgICAgICAkc2NvcGU6ICRiYXJiYVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZG9uZSgpO1xuXG4gICAgICAgICAgICBjb25zdCAkZWwgPSAkKHRoaXMubmV3Q29udGFpbmVyKTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSB0ZW1wbGF0ZSBuYW1lIG9mIHRoZSBuZXcgY29udGFpbmVyIGFuZCBzZXQgaXQgdG8gdGhlIERPTVxuICAgICAgICAgICAgJGh0bWwuYXR0cignZGF0YS10ZW1wbGF0ZScsICRlbC5kYXRhKCd0ZW1wbGF0ZScpKTtcblxuICAgICAgICAgICAgJGRvY3VtZW50LnRyaWdnZXJIYW5kbGVyKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBUFBfRVZFTlQuSU5JVF9TQ09QRURfTU9EVUxFUyxcbiAgICAgICAgICAgICAgICBpc0JhcmJhOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJGh0bWxcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2RvbS1pcy1sb2FkZWQnKVxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnZG9tLWlzLWxvYWRpbmcnKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgJGh0bWxcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKG92ZXJyaWRlQ2xhc3MpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZG9tLWlzLWFuaW1hdGVkJyk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0VHJhbnNpdGlvbjtcbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCB7IEFQUF9OQU1FLCAkZG9jdW1lbnQsICRodG1sLCBpc0RlYnVnIH0gZnJvbSAnLi4vdXRpbHMvZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQgRGVmYXVsdFRyYW5zaXRpb24gZnJvbSAnLi9EZWZhdWx0VHJhbnNpdGlvbic7XG5cbmNvbnN0IE1PRFVMRV9OQU1FID0gJ1RyYW5zaXRpb25NYW5hZ2VyJztcbmNvbnN0IEVWRU5UX05BTUVTUEFDRSA9IGAke0FQUF9OQU1FfS4ke01PRFVMRV9OQU1FfWA7XG5cbmNvbnN0IEVWRU5UID0ge1xuICAgIEdPVE86IGBnb3RvLiR7RVZFTlRfTkFNRVNQQUNFfWBcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbGV0IGNsaWNrZWRMaW5rID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgdHJhbnNpdGlvbiA9ICcnO1xuXG4gICAgICAgIC8vIGpRdWVyeSBvbmRvbXJlYWR5XG4gICAgICAgICQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJGRvY3VtZW50Lm9uKEVWRU5ULkdPVE8sIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBldmVudC5vcHRpb25zLmxvY2F0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gZXZlbnQub3B0aW9ucy50cmFuc2l0aW9uO1xuICAgICAgICAgICAgICAgIEJhcmJhLlBqYXguZ29UbyhldmVudC5vcHRpb25zLmxvY2F0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVmaW5lIGRpZmZlcmVudCBwYWdlIHRyYW5zaXRpb25zXG4gICAgICAgIEJhcmJhLlBqYXguZ2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdHJhbnNpdGlvbiA9IChjbGlja2VkTGluayBpbnN0YW5jZW9mIE5vZGUpID8gY2xpY2tlZExpbmsuZ2V0QXR0cmlidXRlKCdkYXRhLXRyYW5zaXRpb24nKSA6ICh0eXBlb2YgdHJhbnNpdGlvbiA9PT0gJ3N0cmluZycgPyB0cmFuc2l0aW9uIDogJycpO1xuXG4gICAgICAgICAgICBsZXQgVHJhbnNpdGlvbk9iamVjdDtcblxuICAgICAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbk9iamVjdCA9IERlZmF1bHRUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsaWNrZWRMaW5rID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdHJhbnNpdGlvbiA9ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gVHJhbnNpdGlvbk9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIEJhcmJhLkRpc3BhdGNoZXIub24oJ2xpbmtDbGlja2VkJywgKEhUTUxFbGVtZW50LCBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjbGlja2VkTGluayA9IEhUTUxFbGVtZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBCYXJiYS5EaXNwYXRjaGVyLm9uKCduZXdQYWdlUmVhZHknLCAoY3VycmVudFN0YXR1cywgcHJldlN0YXR1cywgY29udGFpbmVyLCBjdXJyZW50SFRNTCkgPT4ge1xuICAgICAgICAgICAgLy8gRmV0Y2ggYW55IGlubGluZSBzY3JpcHQgZWxlbWVudHMuXG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdC5qcy1pbmxpbmUnKTtcblxuICAgICAgICAgICAgaWYgKHNjcmlwdHMgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZUxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IHNjcmlwdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZXZhbChzY3JpcHRzW2ldLmlubmVySFRNTCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEV4ZWN1dGUgYW55IHRoaXJkIHBhcnR5IGZlYXR1cmVzLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIEdvb2dsZSBBbmFseXRpY3NcbiAgICAgICAgICAgIGlmICh3aW5kb3cuZ2EgJiYgIWlzRGVidWcpIHtcbiAgICAgICAgICAgICAgICBnYSgnc2VuZCcsICdwYWdldmlldycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBCYXJiYS5QamF4LkRvbS5jb250YWluZXJDbGFzcyA9ICdqcy1iYXJiYS1jb250YWluZXInO1xuICAgICAgICBCYXJiYS5QamF4LkRvbS53cmFwcGVySWQgPSAnanMtYmFyYmEtd3JhcHBlcic7XG5cbiAgICAgICAgQmFyYmEuUGpheC5zdGFydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERPTSBpcyBsb2FkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgbG9hZCgpIHtcbiAgICAgICAgJGh0bWwuYWRkQ2xhc3MoJ2RvbS1pcy1sb2FkZWQnKTtcbiAgICAgICAgJGh0bWwucmVtb3ZlQ2xhc3MoJ2RvbS1pcy1sb2FkaW5nJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgJGh0bWwuYWRkQ2xhc3MoJ2RvbS1pcy1hbmltYXRlZCcpO1xuICAgICAgICB9LCAxMDAwKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuL2lzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvQXJyYXkgKCBhcnJheSwgdmFsdWUgKSB7XG4gICAgY29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKCB2YWx1ZSApO1xuXG4gICAgaWYgKCBpbmRleCA9PT0gLTEgKSB7XG4gICAgICAgIGFycmF5LnB1c2goIHZhbHVlICk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlDb250YWlucyAoIGFycmF5LCB2YWx1ZSApIHtcbiAgICBmb3IgKCBsZXQgaSA9IDAsIGMgPSBhcnJheS5sZW5ndGg7IGkgPCBjOyBpKysgKSB7XG4gICAgICAgIGlmICggYXJyYXlbaV0gPT0gdmFsdWUgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5Q29udGVudHNNYXRjaCAoIGEsIGIgKSB7XG4gICAgbGV0IGk7XG5cbiAgICBpZiAoICFpc0FycmF5KCBhICkgfHwgIWlzQXJyYXkoIGIgKSApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICggYS5sZW5ndGggIT09IGIubGVuZ3RoICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaSA9IGEubGVuZ3RoO1xuICAgIHdoaWxlICggaS0tICkge1xuICAgICAgICBpZiAoIGFbaV0gIT09IGJbaV0gKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFycmF5ICggeCApIHtcbiAgICBpZiAoIHR5cGVvZiB4ID09PSAnc3RyaW5nJyApIHtcbiAgICAgICAgcmV0dXJuIFsgeCBdO1xuICAgIH1cblxuICAgIGlmICggeCA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXN0SXRlbSAoIGFycmF5ICkge1xuICAgIHJldHVybiBhcnJheVsgYXJyYXkubGVuZ3RoIC0gMSBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5ICggYXJyYXksIG1lbWJlciApIHtcbiAgICBpZiAoICFhcnJheSApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gYXJyYXkuaW5kZXhPZiggbWVtYmVyICk7XG5cbiAgICBpZiAoIGluZGV4ICE9PSAtMSApIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXkgKCBhcnJheUxpa2UgKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBsZXQgaSA9IGFycmF5TGlrZS5sZW5ndGg7XG4gICAgd2hpbGUgKCBpLS0gKSB7XG4gICAgICAgIGFycmF5W2ldID0gYXJyYXlMaWtlW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRCeUtleVZhbHVlKCBhcnJheSwga2V5LCB2YWx1ZSApIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uKCBvYmogKSB7XG4gICAgICAgIHJldHVybiBvYmpba2V5XSA9PT0gdmFsdWU7XG4gICAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIWltbWVkaWF0ZSkgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG59XG4iLCJjb25zdCBBUFBfTkFNRSAgICAgPSAnQm9pbGVycGxhdGUnO1xuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSc7XG5cbmNvbnN0ICRkb2N1bWVudCAgICA9ICQoZG9jdW1lbnQpO1xuY29uc3QgJHdpbmRvdyAgICAgID0gJCh3aW5kb3cpO1xuY29uc3QgJGh0bWwgICAgICAgID0gJChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLnJlbW92ZUNsYXNzKCdoYXMtbm8tanMnKS5hZGRDbGFzcygnaGFzLWpzJyk7XG5jb25zdCAkYm9keSAgICAgICAgPSAkKGRvY3VtZW50LmJvZHkpO1xuY29uc3QgJGJhcmJhICAgICAgID0gJCgnI2pzLWJhcmJhLXdyYXBwZXInKTtcblxuY29uc3QgaXNEZWJ1ZyAgICAgID0gISEkaHRtbC5kYXRhKCdkZWJ1ZycpO1xuXG5leHBvcnQgeyBBUFBfTkFNRSwgREFUQV9BUElfS0VZLCAkZG9jdW1lbnQsICR3aW5kb3csICRodG1sLCAkYm9keSwgaXNEZWJ1ZywgJGJhcmJhIH07XG4iLCIvKipcbiAqIEBzZWUgIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWN0aXZlanMvcmFjdGl2ZS9ibG9iL2Rldi9zcmMvdXRpbHMvaHRtbC5qc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbChzdHIpIHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbn1cblxuLyoqXG4gKiBQcmVwYXJlIEhUTUwgY29udGVudCB0aGF0IGNvbnRhaW5zIG11c3RhY2hlIGNoYXJhY3RlcnMgZm9yIHVzZSB3aXRoIFJhY3RpdmVcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZUh0bWwoc3RyKSB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvJmx0Oy9nLCAnPCcpXG4gICAgICAgIC5yZXBsYWNlKC8mZ3Q7L2csICc+JylcbiAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7XG59XG5cbi8qKlxuICogR2V0IGVsZW1lbnQgZGF0YSBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0gICB7RE9NRWxlbWVudH0gIG5vZGVcbiAqIEByZXR1cm4gIHtBcnJheX0gICAgICAgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZURhdGEobm9kZSkge1xuICAgIC8vIEFsbCBhdHRyaWJ1dGVzXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcztcblxuICAgIC8vIFJlZ2V4IFBhdHRlcm5cbiAgICBjb25zdCBwYXR0ZXJuID0gL15kYXRhXFwtKC4rKSQvO1xuXG4gICAgLy8gT3V0cHV0XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICghYXR0cmlidXRlc1tpXSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRyaWJ1dGVzIG5hbWUgKGV4OiBkYXRhLW1vZHVsZSlcbiAgICAgICAgbGV0IG5hbWUgPSBhdHRyaWJ1dGVzW2ldLm5hbWU7XG5cbiAgICAgICAgLy8gVGhpcyBoYXBwZW5zLlxuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIHRocm93cyBhbiBlcnJvciwgeW91IGhhdmUgc29tZVxuICAgICAgICAvLyBzZXJpb3VzIHByb2JsZW1zIGluIHlvdXIgSFRNTC5cbiAgICAgICAgZGF0YVttYXRjaFsxXV0gPSBnZXREYXRhKG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbn1cblxuY29uc3QgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvO1xuXG4vKipcbiAqIFBhcnNlIHZhbHVlIHRvIGRhdGEgdHlwZS5cbiAqXG4gKiBAbGluayAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2Jsb2IvMy4xLjEvc3JjL2RhdGEuanNcbiAqIEBwYXJhbSAge3N0cmluZ30gZGF0YSAtIEEgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm4ge21peGVkfSAgUmV0dXJucyB0aGUgdmFsdWUgaW4gaXRzIG5hdHVyYWwgZGF0YSB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YShkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPT09ICdudWxsJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuICAgIGlmIChkYXRhID09PSArZGF0YSsnJykge1xuICAgICAgICByZXR1cm4gK2RhdGE7XG4gICAgfVxuXG4gICAgaWYgKHJicmFjZS50ZXN0KCBkYXRhICkpIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsImNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmNvbnN0IGFycmF5TGlrZVBhdHRlcm4gPSAvXlxcW29iamVjdCAoPzpBcnJheXxGaWxlTGlzdClcXF0kLztcblxuLy8gdGhhbmtzLCBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS9pbnN0YW5jZW9mLWNvbnNpZGVyZWQtaGFybWZ1bC1vci1ob3ctdG8td3JpdGUtYS1yb2J1c3QtaXNhcnJheS9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5ICggdGhpbmcgKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoIHRoaW5nICkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5TGlrZSAoIG9iaiApIHtcbiAgICByZXR1cm4gYXJyYXlMaWtlUGF0dGVybi50ZXN0KCB0b1N0cmluZy5jYWxsKCBvYmogKSApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcXVhbCAoIGEsIGIgKSB7XG4gICAgaWYgKCBhID09PSBudWxsICYmIGIgPT09IG51bGwgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICggdHlwZW9mIGEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBiID09PSAnb2JqZWN0JyApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhID09PSBiO1xufVxuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MDgyL3ZhbGlkYXRlLW51bWJlcnMtaW4tamF2YXNjcmlwdC1pc251bWVyaWNcbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWMgKCB0aGluZyApIHtcbiAgICByZXR1cm4gIWlzTmFOKCBwYXJzZUZsb2F0KCB0aGluZyApICkgJiYgaXNGaW5pdGUoIHRoaW5nICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCAoIHRoaW5nICkge1xuICAgIHJldHVybiAoIHRoaW5nICYmIHRvU3RyaW5nLmNhbGwoIHRoaW5nICkgPT09ICdbb2JqZWN0IE9iamVjdF0nICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKCB0aGluZyApIHtcbiAgICBjb25zdCBnZXRUeXBlID0ge307XG4gICAgcmV0dXJuIHRoaW5nICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5pbXBvcnQgeyBpc051bWVyaWMgfSBmcm9tICcuL2lzJ1xuXG5sZXQgaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgZWFzaW5nOiAnc3dpbmcnLFxuICAgIGhlYWRlck9mZnNldDogNjAsXG4gICAgc3BlZWQ6IDMwMFxufTtcblxuLyoqXG4gKiBzY3JvbGxUbyBpcyBhIGZ1bmN0aW9uIHRoYXQgc2Nyb2xscyBhIGNvbnRhaW5lciB0byBhbiBlbGVtZW50J3MgcG9zaXRpb24gd2l0aGluIHRoYXQgY29udHJvbGxlclxuICogVXNlcyBqUXVlcnkncyAkLkRlZmVycmVkIHRvIGFsbG93IHVzaW5nIGEgY2FsbGJhY2sgb24gYW5pbWF0aW9uIGNvbXBsZXRpb25cbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAkZWxlbWVudCAgQSBqUXVlcnkgbm9kZVxuICogQHBhcmFtICAge29iamVjdH0gIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvKCRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAvLyBEcm9wIGV2ZXJ5dGhpbmcgaWYgdGhpcyBhaW4ndCBhIGpRdWVyeSBvYmplY3RcbiAgICBpZiAoJGVsZW1lbnQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgJGVsZW1lbnQubGVuZ3RoID4gMCkge1xuXG4gICAgICAgIC8vIE1lcmdpbmcgb3B0aW9uc1xuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCAodHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucyA6IHt9KSk7XG5cbiAgICAgICAgLy8gUHJldmVudHMgYWNjdW11bGF0aW9uIG9mIGFuaW1hdGlvbnNcbiAgICAgICAgaWYgKGlzQW5pbWF0aW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaXNBbmltYXRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBEZWZhdWx0IGNvbnRhaW5lciB0aGF0IHdlJ2xsIGJlIHNjcm9sbGluZ1xuICAgICAgICAgICAgbGV0ICRjb250YWluZXIgPSAkKCdodG1sLCBib2R5Jyk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudE9mZnNldCA9IDA7XG5cbiAgICAgICAgICAgIC8vIFRlc3RpbmcgY29udGFpbmVyIGluIG9wdGlvbnMgZm9yIGpRdWVyeS1uZXNzXG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgdXNpbmcgYSBjdXN0b20gY29udGFpbmVyLCB3ZSB0YWtlIHRoZSB0b3AgZG9jdW1lbnQgb2Zmc2V0XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUsIHdlIHVzZSB0aGUgZWxlbWVudHMgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLiRjb250YWluZXIgIT09ICd1bmRlZmluZWQnICYmIG9wdGlvbnMuJGNvbnRhaW5lciBpbnN0YW5jZW9mIGpRdWVyeSAmJiBvcHRpb25zLiRjb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2Nyb2xsVG9wICE9PSAndW5kZWZpbmVkJyAmJiBpc051bWVyaWMob3B0aW9ucy5zY3JvbGxUb3ApICYmIG9wdGlvbnMuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcCA9IG9wdGlvbnMuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZcKge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSAkZWxlbWVudC5wb3NpdGlvbigpLnRvcCAtIG9wdGlvbnMuaGVhZGVyT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNjcm9sbFRvcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOdW1lcmljKG9wdGlvbnMuc2Nyb2xsVG9wKSAmJiBvcHRpb25zLnNjcm9sbFRvcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSBvcHRpb25zLnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9IGVsc2XCoHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wID0gJGVsZW1lbnQub2Zmc2V0KCkudG9wIC0gb3B0aW9ucy5oZWFkZXJPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkY29udGFpbmVyLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wXG4gICAgICAgICAgICB9LCBvcHRpb25zLnNwZWVkLCBvcHRpb25zLmVhc2luZywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaXNBbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG59XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBhcnJheUNvbnRhaW5zLCBmaW5kQnlLZXlWYWx1ZSwgcmVtb3ZlRnJvbUFycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyAkZG9jdW1lbnQsICR3aW5kb3csICRodG1sLCAkYm9keSB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuXG5jb25zdCBDQUxMQkFDS1MgPSB7XG4gICAgaGlkZGVuOiBbXSxcbiAgICB2aXNpYmxlOiBbXVxufTtcblxuY29uc3QgQUNUSU9OUyA9IFtcbiAgICAnYWRkQ2FsbGJhY2snLFxuICAgICdyZW1vdmVDYWxsYmFjaydcbl07XG5cbmNvbnN0IFNUQVRFUyA9IFtcbiAgICAndmlzaWJsZScsXG4gICAgJ2hpZGRlbidcbl07XG5cbmNvbnN0IFBSRUZJWCA9ICd2LSc7XG5cbmxldCBVVUlEID0gMDtcblxuLy8gTWFpbiBldmVudFxuJGRvY3VtZW50Lm9uKCd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XG4gICAgICAgIG9uRG9jdW1lbnRDaGFuZ2UoJ2hpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9uRG9jdW1lbnRDaGFuZ2UoJ3Zpc2libGUnKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBBZGQgYSBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9ICAgc3RhdGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICBpZGVudFxuICovXG5mdW5jdGlvbiBhZGRDYWxsYmFjayAoc3RhdGUsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8ICcnO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgaWRlbnQgPSBQUkVGSVggKyBVVUlEKys7XG5cbiAgICBDQUxMQkFDS1Nbc3RhdGVdLnB1c2goe1xuICAgICAgICBpZGVudDogaWRlbnQsXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlkZW50O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGNhbGxiYWNrXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgc3RhdGUgIFZpc2libGUgb3IgaGlkZGVuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgaWRlbnQgIFVuaXF1ZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgIElmIG9wZXJhdGlvbiB3YXMgYSBzdWNjZXNzXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUNhbGxiYWNrIChzdGF0ZSwgb3B0aW9ucykge1xuICAgIGxldCBpZGVudCA9IG9wdGlvbnMuaWRlbnQgfHwgJyc7XG5cbiAgICBpZiAodHlwZW9mKGlkZW50KSA9PT0gJ3VuZGVmaW5lZCcgfHwgaWRlbnQgPT09ICcnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTmVlZCBpZGVudCB0byByZW1vdmUgY2FsbGJhY2snKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpbmRleCA9IGZpbmRCeUtleVZhbHVlKENBTExCQUNLU1tzdGF0ZV0sICdpZGVudCcsIGlkZW50KVswXTtcblxuICAgIC8vIGNvbnNvbGUubG9nKGlkZW50KVxuICAgIC8vIGNvbnNvbGUubG9nKENBTExCQUNLU1tzdGF0ZV0pXG5cbiAgICBpZiAodHlwZW9mKGluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUFycmF5KENBTExCQUNLU1tzdGF0ZV0sIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDYWxsYmFjayBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBXaGVuIGRvY3VtZW50IHN0YXRlIGNoYW5nZXMsIHRyaWdnZXIgY2FsbGJhY2tzXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBzdGF0ZSAgVmlzaWJsZSBvciBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gb25Eb2N1bWVudENoYW5nZSAoc3RhdGUpIHtcbiAgICBsZXQgY2FsbGJhY2tBcnJheSA9IENBTExCQUNLU1tzdGF0ZV07XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW4gPSBjYWxsYmFja0FycmF5Lmxlbmd0aDtcblxuICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tBcnJheVtpXS5jYWxsYmFjaygpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQdWJsaWMgZmFjaW5nIEFQSSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBjYWxsYmFja3NcbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAgICAgICAgICBvcHRpb25zICBPcHRpb25zXG4gKiBAcmV0dXJuICB7Ym9vbGVhbnxpbnRlZ2VyfSAgICAgICAgICAgVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYWxsYmFjayBvciBib29sZWFuIGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gKi9cbmZ1bmN0aW9uIHZpc2liaWxpdHlBcGkgKG9wdGlvbnMpIHtcbiAgICBsZXQgYWN0aW9uID0gb3B0aW9ucy5hY3Rpb24gfHwgJyc7XG4gICAgbGV0IHN0YXRlID0gb3B0aW9ucy5zdGF0ZSB8fCAnJztcbiAgICBsZXQgcmV0O1xuXG4gICAgLy8gVHlwZSBhbmQgdmFsdWUgY2hlY2tpbmdcbiAgICBpZiAoIWFycmF5Q29udGFpbnMoQUNUSU9OUywgYWN0aW9uKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0FjdGlvbiBkb2VzIG5vdCBleGlzdCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXJyYXlDb250YWlucyhTVEFURVMsIHN0YXRlKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1N0YXRlIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBAdG9kbyBNYWdpYyBjYWxsIGZ1bmN0aW9uIHBsc1xuICAgIGlmIChhY3Rpb24gPT09ICdhZGRDYWxsYmFjaycpIHtcbiAgICAgICAgcmV0ID0gYWRkQ2FsbGJhY2soc3RhdGUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncmVtb3ZlQ2FsbGJhY2snKSB7XG4gICAgICAgIHJldCA9IHJlbW92ZUNhbGxiYWNrKHN0YXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgeyB2aXNpYmlsaXR5QXBpIH07XG4iXX0= +},{"./array":10,"./environment":12,"./is":14}]},{},[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvc2NyaXB0cy9BcHAuanMiLCJhc3NldHMvc2NyaXB0cy9nbG9iYWxzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbW9kdWxlcy5qcyIsImFzc2V0cy9zY3JpcHRzL21vZHVsZXMvQWJzdHJhY3RNb2R1bGUuanMiLCJhc3NldHMvc2NyaXB0cy9tb2R1bGVzL0V4YW1wbGUuanMiLCJhc3NldHMvc2NyaXB0cy90cmFuc2l0aW9ucy9CYXNlVHJhbnNpdGlvbi5qcyIsImFzc2V0cy9zY3JpcHRzL3RyYW5zaXRpb25zL0N1c3RvbVRyYW5zaXRpb24uanMiLCJhc3NldHMvc2NyaXB0cy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uTWFuYWdlci5qcyIsImFzc2V0cy9zY3JpcHRzL3RyYW5zaXRpb25zL3RyYW5zaXRpb25zLmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvYXJyYXkuanMiLCJhc3NldHMvc2NyaXB0cy91dGlscy9kZWJvdW5jZS5qcyIsImFzc2V0cy9zY3JpcHRzL3V0aWxzL2Vudmlyb25tZW50LmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvaHRtbC5qcyIsImFzc2V0cy9zY3JpcHRzL3V0aWxzL2lzLmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvc2Nyb2xsVG8uanMiLCJhc3NldHMvc2NyaXB0cy91dGlscy92aXNpYmlsaXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztxakJDQUE7OztBQVNBOzs7QUFSQTs7QUFFQTs7OztBQUVBOztBQUNBOztBQUNBOztBQUdBOztJQUFZLE87Ozs7Ozs7O0FBRVosSUFBTSxjQUFjLEtBQXBCO0FBQ0EsSUFBTSxnREFBaUMsV0FBdkM7O0FBRU8sSUFBTSx3QkFBUTtBQUNqQixtQ0FBNkIsZUFEWjtBQUVqQixnREFBMEMsZUFGekI7QUFHakIsb0RBQThDO0FBSDdCLENBQWQ7O0lBTUQsRztBQUNGLG1CQUFjO0FBQUE7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QUFjLENBQWQsRUFBaUIsUUFBakI7QUFDSDtBQUNKOztBQUVEOzs7OztBQUtBLFNBQVMsYUFBVCxDQUF3QixPQUF4QixFQUFpQztBQUM3QixRQUFJLFNBQVMsUUFBUSxNQUFSLElBQWtCLEVBQS9CO0FBQ0EsUUFBSSxRQUFRLFFBQVEsS0FBUixJQUFpQixFQUE3QjtBQUNBLFFBQUksWUFBSjs7QUFFQTtBQUNBLFFBQUksQ0FBQywwQkFBYyxPQUFkLEVBQXVCLE1BQXZCLENBQUwsRUFBcUM7QUFDakMsZ0JBQVEsSUFBUixDQUFhLHVCQUFiO0FBQ0EsZUFBTyxLQUFQO0FBQ0g7QUFDRCxRQUFJLENBQUMsMEJBQWMsTUFBZCxFQUFzQixLQUF0QixDQUFMLEVBQW1DO0FBQy9CLGdCQUFRLElBQVIsQ0FBYSxzQkFBYjtBQUNBLGVBQU8sS0FBUDtBQUNIOztBQUVEO0FBQ0EsUUFBSSxXQUFXLGFBQWYsRUFBOEI7QUFDMUIsY0FBTSxZQUFZLEtBQVosRUFBbUIsT0FBbkIsQ0FBTjtBQUNILEtBRkQsTUFFTyxJQUFJLFdBQVcsZ0JBQWYsRUFBaUM7QUFDcEMsY0FBTSxlQUFlLEtBQWYsRUFBc0IsT0FBdEIsQ0FBTjtBQUNIOztBQUVELFdBQU8sR0FBUDtBQUNIOztRQUVRLGEsR0FBQSxhIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCB7IEFQUF9OQU1FLCAkZG9jdW1lbnQsICRwamF4V3JhcHBlciB9IGZyb20gJy4vdXRpbHMvZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQgZ2xvYmFscyBmcm9tICcuL2dsb2JhbHMnO1xuXG5pbXBvcnQgeyBhcnJheUNvbnRhaW5zLCByZW1vdmVGcm9tQXJyYXkgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IGdldE5vZGVEYXRhIH0gZnJvbSAnLi91dGlscy9odG1sJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL3V0aWxzL2lzJztcblxuLy8gQmFzaWMgbW9kdWxlc1xuaW1wb3J0ICogYXMgbW9kdWxlcyBmcm9tICcuL21vZHVsZXMnO1xuXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdBcHAnO1xuY29uc3QgRVZFTlRfTkFNRVNQQUNFID0gYCR7QVBQX05BTUV9LiR7TU9EVUxFX05BTUV9YDtcblxuZXhwb3J0IGNvbnN0IEVWRU5UID0ge1xuICAgIElOSVRfTU9EVUxFUzogYGluaXRNb2R1bGVzLiR7RVZFTlRfTkFNRVNQQUNFfWAsXG4gICAgSU5JVF9TQ09QRURfTU9EVUxFUzogYGluaXRTY29wZWRNb2R1bGVzLiR7RVZFTlRfTkFNRVNQQUNFfWAsXG4gICAgREVMRVRFX1NDT1BFRF9NT0RVTEVTOiBgZGVsZXRlU2NvcGVkTW9kdWxlcy4ke0VWRU5UX05BTUVTUEFDRX1gXG59O1xuXG5jbGFzcyBBcHAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSBtb2R1bGVzO1xuICAgICAgICB0aGlzLmN1cnJlbnRNb2R1bGVzID0gW107XG5cbiAgICAgICAgJGRvY3VtZW50Lm9uKEVWRU5ULklOSVRfTU9EVUxFUywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluaXRHbG9iYWxzKGV2ZW50LmZpcnN0Qmxvb2QpXG4gICAgICAgICAgICAgICAgLmRlbGV0ZU1vZHVsZXMoZXZlbnQpXG4gICAgICAgICAgICAgICAgLmluaXRNb2R1bGVzKGV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJGRvY3VtZW50Lm9uKEVWRU5ULklOSVRfU0NPUEVEX01PRFVMRVMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbml0TW9kdWxlcyhldmVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICRkb2N1bWVudC5vbihFVkVOVC5ERUxFVEVfU0NPUEVEX01PRFVMRVMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVNb2R1bGVzKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBhbGwgZXhpc3RpbmcgbW9kdWxlcyBvciBhIHNwZWNpZmljIHNjb3BlIG9mIG1vZHVsZXNcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGV2ZW50IFRoZSBldmVudCBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSAgICAgICBTZWxmIChhbGxvd3MgY2hhaW5pbmcpXG4gICAgICovXG4gICAgZGVsZXRlTW9kdWxlcyhldmVudCkge1xuICAgICAgICBsZXQgZGVzdHJveUFsbCA9IHRydWU7XG4gICAgICAgIGxldCBtb2R1bGVJZHMgPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBmb3Igc2NvcGUgZmlyc3RcbiAgICAgICAgaWYgKGV2ZW50LiRzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSAmJiBldmVudC4kc2NvcGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gTW9kdWxlcyB3aXRoaW4gc2NvcGVcbiAgICAgICAgICAgIGNvbnN0ICRtb2R1bGVzID0gZXZlbnQuJHNjb3BlLmZpbmQoJ1tkYXRhLW1vZHVsZV0nKTtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZWlyIHVpZHNcbiAgICAgICAgICAgIG1vZHVsZUlkcyA9ICQubWFrZUFycmF5KCRtb2R1bGVzLm1hcChmdW5jdGlvbihpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkbW9kdWxlcy5lcShpbmRleCkuZGF0YSgndWlkJyk7XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIG1vZHVsZXMgYW5kIGRlc3Ryb3lpbmcgYWxsIG9mIHRoZW0sIG9yIHNwZWNpZmljIG9uZXNcbiAgICAgICAgbGV0IGkgPSB0aGlzLmN1cnJlbnRNb2R1bGVzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBpZiAoZGVzdHJveUFsbCB8fCBhcnJheUNvbnRhaW5zKG1vZHVsZUlkcywgdGhpcy5jdXJyZW50TW9kdWxlc1tpXS51aWQpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRnJvbUFycmF5KG1vZHVsZUlkcywgdGhpcy5jdXJyZW50TW9kdWxlc1tpXS51aWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZHVsZXNbaV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZHVsZXMuc3BsaWNlKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBnbG9iYWwgZnVuY3Rpb25zIGFuZCBzZXR0aW5nc1xuICAgICAqIEFsbG93cyB5b3UgdG8gaW5pdGlhbGl6ZSBnbG9iYWwgbW9kdWxlcyBvbmx5IG9uY2UgaWYgeW91IG5lZWRcbiAgICAgKiAoZXguOiB3aGVuIHVzaW5nIEJhcmJhLmpzIG9yIFNtb290aFN0YXRlLmpzKVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gU2VsZiAoYWxsb3dzIGNoYWluaW5nKVxuICAgICAqL1xuICAgIGluaXRHbG9iYWxzKGZpcnN0Qmxvb2QpIHtcbiAgICAgICAgZ2xvYmFscyhmaXJzdEJsb29kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBtb2R1bGVzIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGV2ZW50IFRoZSBldmVudCBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSAgICAgICBTZWxmIChhbGxvd3MgY2hhaW5pbmcpXG4gICAgICovXG4gICAgaW5pdE1vZHVsZXMoZXZlbnQpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgd2l0aCBtb2R1bGVcbiAgICAgICAgbGV0ICRtb2R1bGVFbHMgPSBbXTtcblxuICAgICAgICAvLyBJZiBmaXJzdCBibG9vZCwgbG9hZCBhbGwgbW9kdWxlcyBpbiB0aGUgRE9NXG4gICAgICAgIC8vIElmIHNjb3BlZCwgcmVuZGVyIGVsZW1lbnRzIHdpdGggbW9kdWxlc1xuICAgICAgICAvLyBJZiBCYXJiYSwgbG9hZCBtb2R1bGVzIGNvbnRhaW5lZCBpbiBCYXJiYSBjb250YWluZXJcbiAgICAgICAgaWYgKGV2ZW50LmZpcnN0Qmxvb2QpIHtcbiAgICAgICAgICAgICRtb2R1bGVFbHMgPSAkZG9jdW1lbnQuZmluZCgnW2RhdGEtbW9kdWxlXScpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LiRzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSAmJiBldmVudC4kc2NvcGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgJG1vZHVsZUVscyA9IGV2ZW50LiRzY29wZS5maW5kKCdbZGF0YS1tb2R1bGVdJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuaXNQamF4KSB7XG4gICAgICAgICAgICAkbW9kdWxlRWxzID0gJHBqYXhXcmFwcGVyLmZpbmQoJ1tkYXRhLW1vZHVsZV0nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBlbGVtZW50c1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGNvbnN0IGVsc0xlbiA9ICRtb2R1bGVFbHMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAoOyBpIDwgZWxzTGVuOyBpKyspIHtcblxuICAgICAgICAgICAgLy8gQ3VycmVudCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgZWwgPSAkbW9kdWxlRWxzW2ldO1xuXG4gICAgICAgICAgICAvLyBBbGwgZGF0YS0gYXR0cmlidXRlcyBjb25zaWRlcmVkIGFzIG9wdGlvbnNcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gZ2V0Tm9kZURhdGEoZWwpO1xuXG4gICAgICAgICAgICAvLyBBZGQgY3VycmVudCBET00gZWxlbWVudCBhbmQgalF1ZXJ5IGVsZW1lbnRcbiAgICAgICAgICAgIG9wdGlvbnMuZWwgPSBlbDtcbiAgICAgICAgICAgIG9wdGlvbnMuJGVsID0gJG1vZHVsZUVscy5lcShpKTtcblxuICAgICAgICAgICAgLy8gTW9kdWxlIGRvZXMgZXhpc3QgYXQgdGhpcyBwb2ludFxuICAgICAgICAgICAgbGV0IGF0dHIgPSBvcHRpb25zLm1vZHVsZTtcblxuICAgICAgICAgICAgLy8gU3BsaXR0aW5nIG1vZHVsZXMgZm91bmQgaW4gdGhlIGRhdGEtYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgbW9kdWxlSWRlbnRzID0gYXR0ci5zcGxpdCgvWyxcXHNdKy9nKTtcblxuICAgICAgICAgICAgLy8gTG9vcCBtb2R1bGVzXG4gICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICBsZXQgbW9kdWxlc0xlbiA9IG1vZHVsZUlkZW50cy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoOyBqIDwgbW9kdWxlc0xlbjsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vZHVsZUF0dHIgPSBtb2R1bGVJZGVudHNbal07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMubW9kdWxlc1ttb2R1bGVBdHRyXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW9kdWxlID0gbmV3IHRoaXMubW9kdWxlc1ttb2R1bGVBdHRyXShvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9kdWxlcy5wdXNoKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5pbml0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG4vLyBJSUZFIGZvciBsb2FkaW5nIHRoZSBhcHBsaWNhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgICBuZXcgQXBwKCk7XG4gICAgJGRvY3VtZW50LnRyaWdnZXJIYW5kbGVyKHtcbiAgICAgICAgdHlwZTogRVZFTlQuSU5JVF9NT0RVTEVTLFxuICAgICAgICBmaXJzdEJsb29kOiB0cnVlXG4gICAgfSk7XG59KSgpO1xuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuaW1wb3J0IFRyYW5zaXRpb25NYW5hZ2VyIGZyb20gJy4vdHJhbnNpdGlvbnMvVHJhbnNpdGlvbk1hbmFnZXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihmaXJzdEJsb29kKSB7XG4gICAgc3ZnNGV2ZXJ5Ym9keSgpO1xuXG4gICAgaWYgKGZpcnN0Qmxvb2QpIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbk1hbmFnZXIgPSBuZXcgVHJhbnNpdGlvbk1hbmFnZXIoKTtcbiAgICB9XG59XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5leHBvcnQge2RlZmF1bHQgYXMgRXhhbXBsZX0gZnJvbSAnLi9tb2R1bGVzL0V4YW1wbGUnO1xuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xubGV0IHVpZCA9IDA7XG5cbi8qKlxuICogQWJzdHJhY3QgTW9kdWxlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuJGVsID0gb3B0aW9ucy4kZWwgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5lbCAgPSBvcHRpb25zLmVsICB8fCBudWxsO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIG1vZHVsZSBpZGVudGlmaWVyXG4gICAgICAgIHRoaXMudWlkID0gJ20tJyArIHVpZCsrO1xuICAgICAgICAvLyBVc2UgalF1ZXJ5J3MgZGF0YSBBUEkgdG8gXCJzdG9yZSBpdCBpbiB0aGUgRE9NXCJcbiAgICAgICAgdGhpcy4kZWwuZGF0YSgndWlkJywgdGhpcy51aWQpO1xuICAgIH1cblxuICAgIGluaXQoKSB7fVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuJGVsKSB7XG4gICAgICAgICAgICB0aGlzLiRlbC5yZW1vdmVEYXRhKCd1aWQnKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuaW1wb3J0IHsgQVBQX05BTUUgfSBmcm9tICcuLi91dGlscy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgQWJzdHJhY3RNb2R1bGUgZnJvbSAnLi9BYnN0cmFjdE1vZHVsZSc7XG5cbmNvbnN0IE1PRFVMRV9OQU1FID0gJ0V4YW1wbGUnO1xuY29uc3QgRVZFTlRfTkFNRVNQQUNFID0gYCR7QVBQX05BTUV9LiR7TU9EVUxFX05BTUV9YDtcblxuY29uc3QgRVZFTlQgPSB7XG4gICAgQ0xJQ0s6IGBjbGljay4ke0VWRU5UX05BTUVTUEFDRX1gXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIERlY2xhcmF0aW9uIG9mIHByb3BlcnRpZXNcbiAgICAgICAgY29uc29sZS5sb2coJ/CflKggW21vZHVsZV06Y29uc3RydWN0b3IgLSBFeGFtcGxlJyk7XG5cbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBTZXQgZXZlbnRzIGFuZCBzdWNoXG5cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjb25zb2xlLmxvZygn4p2MIFttb2R1bGVdOmRlc3Ryb3kgLSBFeGFtcGxlJyk7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKGAuJHtFVkVOVF9OQU1FU1BBQ0V9YCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQVBQX05BTUUsICRkb2N1bWVudCwgJGh0bWwsICRib2R5LCAgaXNEZWJ1ZywgJHBqYXhXcmFwcGVyIH0gZnJvbSAnLi4vdXRpbHMvZW52aXJvbm1lbnQnO1xuXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdUcmFuc2l0aW9uJztcbmNvbnN0IEVWRU5UX05BTUVTUEFDRSA9IGAke0FQUF9OQU1FfS4ke01PRFVMRV9OQU1FfWA7XG5cbmNvbnN0IEVWRU5UID0ge1xuICAgIENMSUNLOiBgY2xpY2suJHtFVkVOVF9OQU1FU1BBQ0V9YCxcbiAgICBSRUFEWVRPUkVNT1ZFOiBgcmVhZHlUb1JlbW92ZS4ke0VWRU5UX05BTUVTUEFDRX1gLFxuICAgIFJFQURZVE9ERVNUUk9ZOiBgcmVhZHlUb0Rlc3Ryb3kuJHtFVkVOVF9OQU1FU1BBQ0V9YFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLndyYXBwZXIgPSBvcHRpb25zLndyYXBwZXI7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVDbGFzcyA9IG9wdGlvbnMub3ZlcnJpZGVDbGFzcyA/IG9wdGlvbnMub3ZlcnJpZGVDbGFzcyA6ICcnO1xuICAgICAgICB0aGlzLmNsaWNrZWRMaW5rID0gb3B0aW9ucy5jbGlja2VkTGluaztcblxuICAgIH1cblxuICAgIGxhdW5jaCgpIHtcbiAgICAgICAgaWYoaXNEZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCItLS0tIExhdW5jaCB0cmFuc2l0aW9uIPCfkYogLS0tLS1cIik7XG4gICAgICAgIH1cblxuICAgICAgICAkaHRtbFxuICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdkb20taXMtbG9hZGVkIGRvbS1pcy1hbmltYXRlZCAnKVxuICAgICAgICAgICAgLmFkZENsYXNzKGBkb20taXMtbG9hZGluZyAke3RoaXMub3ZlcnJpZGVDbGFzc31gKTtcblxuICAgIH1cblxuICAgIGhpZGVWaWV3KG9sZFZpZXcsIG5ld1ZpZXcpIHtcbiAgICAgICAgaWYoaXNEZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tIOKdjCBbVklFV106aGlkZSAtICcsIG9sZFZpZXcuZ2V0QXR0cmlidXRlKCdkYXRhLXRlbXBsYXRlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGF1bmNoIGl0IGF0IHRoZSBlbmQgKGFuaW1hdGlvbnMuLi4pXG4gICAgICAgICRkb2N1bWVudC50cmlnZ2VySGFuZGxlcih7XG4gICAgICAgICAgICB0eXBlOkVWRU5ULlJFQURZVE9SRU1PVkUsXG4gICAgICAgICAgICBvbGRWaWV3OiBvbGRWaWV3LFxuICAgICAgICAgICAgbmV3VmlldzogbmV3Vmlld1xuICAgICAgICB9KTtcblxuICAgIH1cblxuXG4gICAgZGlzcGxheVZpZXcodmlldykge1xuXG4gICAgICAgIGlmKGlzRGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLSDinIUgW1ZJRVddOmRpc3BsYXkgOicsIHZpZXcuZ2V0QXR0cmlidXRlKCdkYXRhLXRlbXBsYXRlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgJGh0bWwuYXR0cignZGF0YS10ZW1wbGF0ZScsIHZpZXcuZ2V0QXR0cmlidXRlKCdkYXRhLXRlbXBsYXRlJykpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgJGh0bWxcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2RvbS1pcy1sb2FkZWQnKVxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnZG9tLWlzLWxvYWRpbmcnKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgJGh0bWxcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHRoaXMub3ZlcnJpZGVDbGFzcylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdkb20taXMtYW5pbWF0ZWQnKTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuXG4gICAgICAgICAgICAvLyBsYXVuY2ggaXQgYXQgdGhlIGVuZCAoYW5pbWF0aW9ucy4uLilcbiAgICAgICAgICAgICRkb2N1bWVudC50cmlnZ2VySGFuZGxlcih7XG4gICAgICAgICAgICAgICAgdHlwZTpFVkVOVC5SRUFEWVRPREVTVFJPWVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSwxMDAwKTtcbiAgICB9XG5cbiAgICBcbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZihpc0RlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0g4p2MIFt0cmFuc2l0aW9uXTpkZXN0cm95IC0tLS0tXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQVBQX05BTUUsICRkb2N1bWVudCwgJGh0bWwsIGlzRGVidWcsICRwamF4V3JhcHBlciB9IGZyb20gJy4uL3V0aWxzL2Vudmlyb25tZW50JztcbmltcG9ydCBCYXNlVHJhbnNpdGlvbiBmcm9tICcuL0Jhc2VUcmFuc2l0aW9uJztcblxuY29uc3QgTU9EVUxFX05BTUUgPSAnVHJhbnNpdGlvbic7XG5jb25zdCBFVkVOVF9OQU1FU1BBQ0UgPSBgJHtBUFBfTkFNRX0uJHtNT0RVTEVfTkFNRX1gO1xuXG5jb25zdCBFVkVOVCA9IHtcbiAgICBDTElDSzogYGNsaWNrLiR7RVZFTlRfTkFNRVNQQUNFfWAsXG4gICAgUkVBRFlUT1JFTU9WRTogYHJlYWR5VG9SZW1vdmUuJHtFVkVOVF9OQU1FU1BBQ0V9YCxcbiAgICBSRUFEWVRPRElTUExBWTogYHJlYWR5VG9EaXNwbGF5LiR7RVZFTlRfTkFNRVNQQUNFfWAsXG4gICAgUkVBRFlUT0RFU1RST1k6IGByZWFkeVRvRGVzdHJveS4ke0VWRU5UX05BTUVTUEFDRX1gXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQmFzZVRyYW5zaXRpb257XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcblxuICAgICAgICB0aGlzLm92ZXJyaWRlQ2xhc3MgPSAnLWN1c3RvbS10cmFuc2l0aW9uJztcbiAgICB9XG5cbn1cbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCB7IEFQUF9OQU1FLCAkZG9jdW1lbnQsICRodG1sLCBpc0RlYnVnLCAkcGpheFdyYXBwZXIgfSBmcm9tICcuLi91dGlscy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBFVkVOVCBhcyBBUFBfRVZFTlQgfSBmcm9tICcuLi9BcHAnO1xuXG4vL0xpc3QgaGVyZSBhbGwgb2YgeW91ciB0cmFuc2l0aW9uc1xuaW1wb3J0ICogYXMgdHJhbnNpdGlvbnMgZnJvbSAnLi90cmFuc2l0aW9ucyc7XG5cbmNvbnN0IE1PRFVMRV9OQU1FID0gJ1RyYW5zaXRpb24nO1xuY29uc3QgRVZFTlRfTkFNRVNQQUNFID0gYCR7QVBQX05BTUV9LiR7TU9EVUxFX05BTUV9YDtcblxuY29uc3QgRVZFTlQgPSB7XG4gICAgQ0xJQ0s6IGBjbGljay4ke0VWRU5UX05BTUVTUEFDRX1gLFxuICAgIFJFQURZVE9SRU1PVkU6IGByZWFkeVRvUmVtb3ZlLiR7RVZFTlRfTkFNRVNQQUNFfWAsXG4gICAgUkVBRFlUT0RFU1RST1k6IGByZWFkeVRvRGVzdHJveS4ke0VWRU5UX05BTUVTUEFDRX1gXG59O1xuXG4vKlxuXG5AdG9kbyA6IFxuXG4tIOKchSBnZXQgZGF0YS10cmFuc2l0aW9uIG9uIGNsaWNrZWQgbGluayAtPiBsYXVuY2goKSBhbmQgYWRkIHN3aXRjaCgpe31cbi0g4p2MIGFkZCBnb3RvIGxpc3RlbmVyXG4tIOKdjCBhZGQgbmV3UGFnZVJlYWR5IGZ1bmN0b24gd2l0aCBnb29nbGUgYW5hbHl0aWNzIHNlbmQgKG1heWJlIHBqYXggZG8gdGhhdD8pXG4tIOKchSBhZGQgb3ZlcnJpZGVDbGFzcyBzeXN0ZW0gZm9yIGFsbCB0cmFuc2l0aW9uc1xuLSDinIUgYWRkIGJhc2UgY2xhc3MgbWFuYWdlciBsaWtlIG9sZCBEZWZhdWx0VHJhbnNpdGlvbiAoZG9tLWlzLWxvYWRlZCwgZG9tLWlzLWxvYWRpbmcgZXRjLi4pXG5cblxuXG49PT09PT09IFNDSEVNQSA9PT09PT09XG5cbltdIDogbGlzdGVuZXJcbiogOiB0cmlnZ2VyIGV2ZW50XG5cbltwamF4OnNlbmRdIC0+ICh0cmFuc2l0aW9uKSBsYXVuY2goKVxuXG5bcGpheDpzd2l0Y2hdICg9IG5ldyB2aWV3IGlzIGxvYWRlZCkgLT4gKHRyYW5zaXRpb24pIGhpZGVWaWV3KCktPiBoaWRlIGFuaW1hdGlvbnMgJiAqcmVhZHlUb1JlbW92ZVxuXG5bcmVhZHlUb1JlbW92ZV0gLT4gcmVtb3ZlKCkgLT4gZGVsZXRlIG1vZHVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiByZW1vdmUgb2xkVmlldyBmcm9tIHRoZSBET00sIGFuZCBpbm5lckhUTWwgbmV3Vmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IGRpc3BsYXkoKVxuXG5kaXNwbGF5KCkgLT4gKHRyYW5zaXRpb24pIGRpc3BsYXlWaWV3KCkgLT4gZGlzcGxheSBhbmltYXRpb25zICYgKnJlYWR5VG9SZW1vdmVcbiAgICAgICAgICAtPiBpbml0IG5ldyBtb2R1bGVzXG5cbltyZWFkeVRvUmVtb3ZlXSAtPiByZWluaXQoKVxuXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIFxuXG4gICAgICAgIC8vIGpRdWVyeSBvbmRvbXJlYWR5XG4gICAgICAgICQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IG5ldyB0cmFuc2l0aW9uc1snQmFzZVRyYW5zaXRpb24nXSh7XG4gICAgICAgICAgICB3cmFwcGVyOiB0aGlzLndyYXBwZXJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgPT09PT0gUEpBWCBDT05GSUdVUkFUSU9OID09PT09XG4gICAgICAgICovXG5cbiAgICAgICAgdGhpcy5jb250YWluZXJDbGFzcyA9ICcuanMtcGpheC1jb250YWluZXInO1xuICAgICAgICB0aGlzLndyYXBwZXJJZCA9ICdqcy1wamF4LXdyYXBwZXInO1xuICAgICAgICB0aGlzLm5vUGpheFJlcXVlc3RDbGFzcyA9ICduby10cmFuc2l0aW9uJztcbiAgICAgICAgdGhpcy53cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy53cmFwcGVySWQpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgICAgIGNhY2hlQnVzdDogZmFsc2UsXG4gICAgICAgICAgICBlbGVtZW50czogW2BhOm5vdCguJHt0aGlzLm5vUGpheFJlcXVlc3RDbGFzc30pYCwnZm9ybVthY3Rpb25dJ10sXG4gICAgICAgICAgICBzZWxlY3RvcnM6IFsndGl0bGUnLGAke3RoaXMuY29udGFpbmVyQ2xhc3N9YF0sXG4gICAgICAgICAgICBzd2l0Y2hlczoge31cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnN3aXRjaGVzW3RoaXMuY29udGFpbmVyQ2xhc3NdID0gKG9sZEVsLCBuZXdFbCwgb3B0aW9ucykgPT4gdGhpcy5zd2l0Y2gob2xkRWwsIG5ld0VsLCBvcHRpb25zKVxuICAgICAgICB0aGlzLnBqYXggPSBuZXcgUGpheCh0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgIC8qXG4gICAgICAgID09PT09IExJU1RFTkVSUyA9PT09PVxuICAgICAgICAqL1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BqYXg6c2VuZCcsKGUpID0+IHRoaXMuc2VuZChlKSk7XG5cblxuICAgICAgICAkZG9jdW1lbnQub24oRVZFTlQuUkVBRFlUT1JFTU9WRSwoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKGV2ZW50Lm9sZFZpZXcsIGV2ZW50Lm5ld1ZpZXcpO1xuICAgICAgICB9KTtcbiAgICAgICAgJGRvY3VtZW50Lm9uKEVWRU5ULlJFQURZVE9ERVNUUk9ZLChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWluaXQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiAoUEpBWCkgTGF1bmNoIHdoZW4gcGpheCByZWNlaXZlIGEgcmVxdWVzdFxuICAgICAqIGdldCAmIG1hbmFnZSBkYXRhLXRyYW5zaXRpb24saW5pdCBhbmQgbGF1bmNoIGl0XG4gICAgICogQHBhcmFtICB7ZXZlbnR9XG4gICAgICogQHJldHVybiB2b2lkXG4gICAgICovXG4gICAgc2VuZChlKSB7XG4gICAgICAgIGlmKGlzRGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLSBMYXVuY2ggcmVxdWVzdCDwn5mMIC0tLS0tXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsID0gZS50cmlnZ2VyRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCB0cmFuc2l0aW9uID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRyYW5zaXRpb24nKSA/IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS10cmFuc2l0aW9uJykgOiAnQmFzZVRyYW5zaXRpb24nO1xuICAgICAgICAkaHRtbC5hdHRyKCdkYXRhLXRyYW5zaXRpb24nLHRyYW5zaXRpb24pO1xuXG4gICAgICAgIC8vIG9wdGlvbnMgYXZhaWxhYmxlIDogd3JhcHBlciwgb3ZlcnJpZGVDbGFzc1xuICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBuZXcgdHJhbnNpdGlvbnNbdHJhbnNpdGlvbl0oe1xuICAgICAgICAgICAgd3JhcHBlcjogdGhpcy53cmFwcGVyLFxuICAgICAgICAgICAgY2xpY2tlZExpbms6IGVsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudHJhbnNpdGlvbi5sYXVuY2goKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIChQSkFYKSBMYXVuY2ggd2hlbiBuZXcgcGFnZSBpcyBsb2FkZWRcbiAgICAgKiBAcGFyYW0gIHtqcyBkb20gZWxlbWVudH0sIFxuICAgICAqIEBwYXJhbSAge2pzIGRvbSBlbGVtZW50fVxuICAgICAqIEBwYXJhbSAge29wdGlvbnMgOiBwamF4IG9wdGlvbnN9XG4gICAgICogQHJldHVybiB2b2lkXG4gICAgICovXG4gICAgc3dpdGNoKG9sZFZpZXcsIG5ld1ZpZXcsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYoaXNEZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0gTmV4dCB2aWV3IGxvYWRlZCDwn5GMIC0tLS0tJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uLmhpZGVWaWV3KG9sZFZpZXcsIG5ld1ZpZXcpO1xuXG4gICAgICAgIHRoaXMucGpheC5vblN3aXRjaCgpO1xuICAgICAgICBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMYXVuY2ggd2hlbiB5b3UgdHJpZ2dlciBFVkVOVC5SRUFEWVRPUkVNT1ZFIGluIHlvdXIgdHJhbnNpdGlvbiAtPiBoaWRlVmlldygpLCBhdCB0aGUgZW5kXG4gICAgICogYWZ0ZXIgb2xkVmlldyBoaWRkZW4sIGRlbGV0ZSBtb2R1bGVzIGFuZCBsYXVuY2ggdGhpcy5kaXNwbGF5KClcbiAgICAgKiBAcGFyYW0gIHtqcyBkb20gZWxlbWVudH0sIFxuICAgICAqIEBwYXJhbSAge2pzIGRvbSBlbGVtZW50fVxuICAgICAqIEByZXR1cm4gdm9pZFxuICAgICAqL1xuICAgIHJlbW92ZShvbGRWaWV3LCBuZXdWaWV3KSB7XG5cbiAgICAgICAgJGRvY3VtZW50LnRyaWdnZXJIYW5kbGVyKHtcbiAgICAgICAgICAgIHR5cGU6IEFQUF9FVkVOVC5ERUxFVEVfU0NPUEVEX01PRFVMRVMsXG4gICAgICAgICAgICAkc2NvcGU6ICRwamF4V3JhcHBlclxuICAgICAgICB9KTtcblxuICAgICAgICBvbGRWaWV3LnJlbW92ZSgpO1xuXG4gICAgICAgIHRoaXMuZGlzcGxheShuZXdWaWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBsYXVuY2ggYWZ0ZXIgdGhpcy5yZW1vdmUoKVxuICAgICAqIEBwYXJhbSAge2pzIGRvbSBlbGVtZW50fSwgXG4gICAgICogQHJldHVybiB2b2lkXG4gICAgICovXG4gICAgZGlzcGxheSh2aWV3KSB7XG4gICAgICAgIHRoaXMud3JhcHBlci5pbm5lckhUTUwgPSB2aWV3Lm91dGVySFRNTDtcblxuICAgICAgICAvLyBGZXRjaCBhbnkgaW5saW5lIHNjcmlwdCBlbGVtZW50cy5cbiAgICAgICAgY29uc3Qgc2NyaXB0cyA9IHZpZXcucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0LmpzLWlubGluZScpO1xuXG4gICAgICAgIGlmIChzY3JpcHRzIGluc3RhbmNlb2Ygd2luZG93Lk5vZGVMaXN0KSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gc2NyaXB0cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXZhbChzY3JpcHRzW2ldLmlubmVySFRNTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAkZG9jdW1lbnQudHJpZ2dlckhhbmRsZXIoe1xuICAgICAgICAgICAgdHlwZTogQVBQX0VWRU5ULklOSVRfU0NPUEVEX01PRFVMRVMsXG4gICAgICAgICAgICBpc1BqYXg6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uLmRpc3BsYXlWaWV3KHZpZXcpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGF1bmNoIHdoZW4geW91IHRyaWdnZXIgRVZFTlQuUkVBRFlUT0RFU1RST1kgaW4geW91ciB0cmFuc2l0aW9uIC0+IGRpc3BsYXlWaWV3KCksIGF0IHRoZSBlbmRcbiAgICAgKiBAcmV0dXJuIHZvaWRcbiAgICAgKi9cbiAgICByZWluaXQoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICRodG1sLmF0dHIoJ2RhdGEtdHJhbnNpdGlvbicsJycpO1xuICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBuZXcgdHJhbnNpdGlvbnNbJ0Jhc2VUcmFuc2l0aW9uJ10oe1xuICAgICAgICAgICAgd3JhcHBlcjogdGhpcy53cmFwcGVyXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERPTSBpcyBsb2FkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgbG9hZCgpIHtcbiAgICAgICAgJGh0bWwuYWRkQ2xhc3MoJ2RvbS1pcy1sb2FkZWQnKTtcbiAgICAgICAgJGh0bWwucmVtb3ZlQ2xhc3MoJ2RvbS1pcy1sb2FkaW5nJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgJGh0bWwuYWRkQ2xhc3MoJ2RvbS1pcy1hbmltYXRlZCcpO1xuICAgICAgICB9LCAxMDAwKVxuICAgIH1cbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBCYXNlVHJhbnNpdGlvbn0gZnJvbSAnLi9CYXNlVHJhbnNpdGlvbic7XG5leHBvcnQge2RlZmF1bHQgYXMgQ3VzdG9tVHJhbnNpdGlvbn0gZnJvbSAnLi9DdXN0b21UcmFuc2l0aW9uJztcbiIsImltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuL2lzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvQXJyYXkgKCBhcnJheSwgdmFsdWUgKSB7XG4gICAgY29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKCB2YWx1ZSApO1xuXG4gICAgaWYgKCBpbmRleCA9PT0gLTEgKSB7XG4gICAgICAgIGFycmF5LnB1c2goIHZhbHVlICk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlDb250YWlucyAoIGFycmF5LCB2YWx1ZSApIHtcbiAgICBmb3IgKCBsZXQgaSA9IDAsIGMgPSBhcnJheS5sZW5ndGg7IGkgPCBjOyBpKysgKSB7XG4gICAgICAgIGlmICggYXJyYXlbaV0gPT0gdmFsdWUgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5Q29udGVudHNNYXRjaCAoIGEsIGIgKSB7XG4gICAgbGV0IGk7XG5cbiAgICBpZiAoICFpc0FycmF5KCBhICkgfHwgIWlzQXJyYXkoIGIgKSApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICggYS5sZW5ndGggIT09IGIubGVuZ3RoICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaSA9IGEubGVuZ3RoO1xuICAgIHdoaWxlICggaS0tICkge1xuICAgICAgICBpZiAoIGFbaV0gIT09IGJbaV0gKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFycmF5ICggeCApIHtcbiAgICBpZiAoIHR5cGVvZiB4ID09PSAnc3RyaW5nJyApIHtcbiAgICAgICAgcmV0dXJuIFsgeCBdO1xuICAgIH1cblxuICAgIGlmICggeCA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXN0SXRlbSAoIGFycmF5ICkge1xuICAgIHJldHVybiBhcnJheVsgYXJyYXkubGVuZ3RoIC0gMSBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5ICggYXJyYXksIG1lbWJlciApIHtcbiAgICBpZiAoICFhcnJheSApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gYXJyYXkuaW5kZXhPZiggbWVtYmVyICk7XG5cbiAgICBpZiAoIGluZGV4ICE9PSAtMSApIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXkgKCBhcnJheUxpa2UgKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBsZXQgaSA9IGFycmF5TGlrZS5sZW5ndGg7XG4gICAgd2hpbGUgKCBpLS0gKSB7XG4gICAgICAgIGFycmF5W2ldID0gYXJyYXlMaWtlW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRCeUtleVZhbHVlKCBhcnJheSwga2V5LCB2YWx1ZSApIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uKCBvYmogKSB7XG4gICAgICAgIHJldHVybiBvYmpba2V5XSA9PT0gdmFsdWU7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUFycmF5KCBhcnJheSApIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcnJheSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgY29uc3QgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdykgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9O1xufVxuIiwiY29uc3QgQVBQX05BTUUgICAgID0gJ0JvaWxlcnBsYXRlJztcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuXG5jb25zdCAkZG9jdW1lbnQgICAgPSAkKGRvY3VtZW50KTtcbmNvbnN0ICR3aW5kb3cgICAgICA9ICQod2luZG93KTtcbmNvbnN0ICRodG1sICAgICAgICA9ICQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5yZW1vdmVDbGFzcygnaGFzLW5vLWpzJykuYWRkQ2xhc3MoJ2hhcy1qcycpO1xuY29uc3QgJGJvZHkgICAgICAgID0gJChkb2N1bWVudC5ib2R5KTtcbmNvbnN0ICRwamF4V3JhcHBlciA9ICQoJyNqcy1wamF4LXdyYXBwZXInKTtcblxuY29uc3QgaXNEZWJ1ZyAgICAgID0gISEkaHRtbC5kYXRhKCdkZWJ1ZycpO1xuXG5leHBvcnQgeyBBUFBfTkFNRSwgREFUQV9BUElfS0VZLCAkZG9jdW1lbnQsICR3aW5kb3csICRodG1sLCAkYm9keSwgaXNEZWJ1ZywgJHBqYXhXcmFwcGVyIH07XG4iLCIvKipcbiAqIEBzZWUgIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWN0aXZlanMvcmFjdGl2ZS9ibG9iL2Rldi9zcmMvdXRpbHMvaHRtbC5qc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbChzdHIpIHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbn1cblxuLyoqXG4gKiBQcmVwYXJlIEhUTUwgY29udGVudCB0aGF0IGNvbnRhaW5zIG11c3RhY2hlIGNoYXJhY3RlcnMgZm9yIHVzZSB3aXRoIFJhY3RpdmVcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZUh0bWwoc3RyKSB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvJmx0Oy9nLCAnPCcpXG4gICAgICAgIC5yZXBsYWNlKC8mZ3Q7L2csICc+JylcbiAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7XG59XG5cbi8qKlxuICogR2V0IGVsZW1lbnQgZGF0YSBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0gICB7RE9NRWxlbWVudH0gIG5vZGVcbiAqIEByZXR1cm4gIHtBcnJheX0gICAgICAgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZURhdGEobm9kZSkge1xuICAgIC8vIEFsbCBhdHRyaWJ1dGVzXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcztcblxuICAgIC8vIFJlZ2V4IFBhdHRlcm5cbiAgICBjb25zdCBwYXR0ZXJuID0gL15kYXRhXFwtKC4rKSQvO1xuXG4gICAgLy8gT3V0cHV0XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICghYXR0cmlidXRlc1tpXSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRyaWJ1dGVzIG5hbWUgKGV4OiBkYXRhLW1vZHVsZSlcbiAgICAgICAgbGV0IG5hbWUgPSBhdHRyaWJ1dGVzW2ldLm5hbWU7XG5cbiAgICAgICAgLy8gVGhpcyBoYXBwZW5zLlxuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIHRocm93cyBhbiBlcnJvciwgeW91IGhhdmUgc29tZVxuICAgICAgICAvLyBzZXJpb3VzIHByb2JsZW1zIGluIHlvdXIgSFRNTC5cbiAgICAgICAgZGF0YVttYXRjaFsxXV0gPSBnZXREYXRhKG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbn1cblxuY29uc3QgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvO1xuXG4vKipcbiAqIFBhcnNlIHZhbHVlIHRvIGRhdGEgdHlwZS5cbiAqXG4gKiBAbGluayAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2Jsb2IvMy4xLjEvc3JjL2RhdGEuanNcbiAqIEBwYXJhbSAge3N0cmluZ30gZGF0YSAtIEEgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm4ge21peGVkfSAgUmV0dXJucyB0aGUgdmFsdWUgaW4gaXRzIG5hdHVyYWwgZGF0YSB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YShkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPT09ICdudWxsJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuICAgIGlmIChkYXRhID09PSArZGF0YSsnJykge1xuICAgICAgICByZXR1cm4gK2RhdGE7XG4gICAgfVxuXG4gICAgaWYgKHJicmFjZS50ZXN0KCBkYXRhICkpIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsImNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmNvbnN0IGFycmF5TGlrZVBhdHRlcm4gPSAvXlxcW29iamVjdCAoPzpBcnJheXxGaWxlTGlzdClcXF0kLztcblxuLy8gdGhhbmtzLCBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS9pbnN0YW5jZW9mLWNvbnNpZGVyZWQtaGFybWZ1bC1vci1ob3ctdG8td3JpdGUtYS1yb2J1c3QtaXNhcnJheS9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5ICggdGhpbmcgKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoIHRoaW5nICkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5TGlrZSAoIG9iaiApIHtcbiAgICByZXR1cm4gYXJyYXlMaWtlUGF0dGVybi50ZXN0KCB0b1N0cmluZy5jYWxsKCBvYmogKSApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcXVhbCAoIGEsIGIgKSB7XG4gICAgaWYgKCBhID09PSBudWxsICYmIGIgPT09IG51bGwgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICggdHlwZW9mIGEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBiID09PSAnb2JqZWN0JyApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhID09PSBiO1xufVxuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MDgyL3ZhbGlkYXRlLW51bWJlcnMtaW4tamF2YXNjcmlwdC1pc251bWVyaWNcbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWMgKCB0aGluZyApIHtcbiAgICByZXR1cm4gIWlzTmFOKCBwYXJzZUZsb2F0KCB0aGluZyApICkgJiYgaXNGaW5pdGUoIHRoaW5nICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCAoIHRoaW5nICkge1xuICAgIHJldHVybiAoIHRoaW5nICYmIHRvU3RyaW5nLmNhbGwoIHRoaW5nICkgPT09ICdbb2JqZWN0IE9iamVjdF0nICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKCB0aGluZyApIHtcbiAgICBjb25zdCBnZXRUeXBlID0ge307XG4gICAgcmV0dXJuIHRoaW5nICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5pbXBvcnQgeyBpc051bWVyaWMgfSBmcm9tICcuL2lzJ1xuXG5sZXQgaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgZWFzaW5nOiAnc3dpbmcnLFxuICAgIGhlYWRlck9mZnNldDogNjAsXG4gICAgc3BlZWQ6IDMwMFxufTtcblxuLyoqXG4gKiBzY3JvbGxUbyBpcyBhIGZ1bmN0aW9uIHRoYXQgc2Nyb2xscyBhIGNvbnRhaW5lciB0byBhbiBlbGVtZW50J3MgcG9zaXRpb24gd2l0aGluIHRoYXQgY29udHJvbGxlclxuICogVXNlcyBqUXVlcnkncyAkLkRlZmVycmVkIHRvIGFsbG93IHVzaW5nIGEgY2FsbGJhY2sgb24gYW5pbWF0aW9uIGNvbXBsZXRpb25cbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAkZWxlbWVudCAgQSBqUXVlcnkgbm9kZVxuICogQHBhcmFtICAge29iamVjdH0gIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvKCRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAvLyBEcm9wIGV2ZXJ5dGhpbmcgaWYgdGhpcyBhaW4ndCBhIGpRdWVyeSBvYmplY3RcbiAgICBpZiAoJGVsZW1lbnQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgJGVsZW1lbnQubGVuZ3RoID4gMCkge1xuXG4gICAgICAgIC8vIE1lcmdpbmcgb3B0aW9uc1xuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCAodHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucyA6IHt9KSk7XG5cbiAgICAgICAgLy8gUHJldmVudHMgYWNjdW11bGF0aW9uIG9mIGFuaW1hdGlvbnNcbiAgICAgICAgaWYgKGlzQW5pbWF0aW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaXNBbmltYXRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBEZWZhdWx0IGNvbnRhaW5lciB0aGF0IHdlJ2xsIGJlIHNjcm9sbGluZ1xuICAgICAgICAgICAgbGV0ICRjb250YWluZXIgPSAkKCdodG1sLCBib2R5Jyk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudE9mZnNldCA9IDA7XG5cbiAgICAgICAgICAgIC8vIFRlc3RpbmcgY29udGFpbmVyIGluIG9wdGlvbnMgZm9yIGpRdWVyeS1uZXNzXG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgdXNpbmcgYSBjdXN0b20gY29udGFpbmVyLCB3ZSB0YWtlIHRoZSB0b3AgZG9jdW1lbnQgb2Zmc2V0XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUsIHdlIHVzZSB0aGUgZWxlbWVudHMgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLiRjb250YWluZXIgIT09ICd1bmRlZmluZWQnICYmIG9wdGlvbnMuJGNvbnRhaW5lciBpbnN0YW5jZW9mIGpRdWVyeSAmJiBvcHRpb25zLiRjb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2Nyb2xsVG9wICE9PSAndW5kZWZpbmVkJyAmJiBpc051bWVyaWMob3B0aW9ucy5zY3JvbGxUb3ApICYmIG9wdGlvbnMuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcCA9IG9wdGlvbnMuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZcKge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSAkZWxlbWVudC5wb3NpdGlvbigpLnRvcCAtIG9wdGlvbnMuaGVhZGVyT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNjcm9sbFRvcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOdW1lcmljKG9wdGlvbnMuc2Nyb2xsVG9wKSAmJiBvcHRpb25zLnNjcm9sbFRvcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSBvcHRpb25zLnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9IGVsc2XCoHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wID0gJGVsZW1lbnQub2Zmc2V0KCkudG9wIC0gb3B0aW9ucy5oZWFkZXJPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkY29udGFpbmVyLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wXG4gICAgICAgICAgICB9LCBvcHRpb25zLnNwZWVkLCBvcHRpb25zLmVhc2luZywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaXNBbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG59XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBhcnJheUNvbnRhaW5zLCBmaW5kQnlLZXlWYWx1ZSwgcmVtb3ZlRnJvbUFycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyAkZG9jdW1lbnQsICR3aW5kb3csICRodG1sLCAkYm9keSB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuXG5jb25zdCBDQUxMQkFDS1MgPSB7XG4gICAgaGlkZGVuOiBbXSxcbiAgICB2aXNpYmxlOiBbXVxufTtcblxuY29uc3QgQUNUSU9OUyA9IFtcbiAgICAnYWRkQ2FsbGJhY2snLFxuICAgICdyZW1vdmVDYWxsYmFjaydcbl07XG5cbmNvbnN0IFNUQVRFUyA9IFtcbiAgICAndmlzaWJsZScsXG4gICAgJ2hpZGRlbidcbl07XG5cbmNvbnN0IFBSRUZJWCA9ICd2LSc7XG5cbmxldCBVVUlEID0gMDtcblxuLy8gTWFpbiBldmVudFxuJGRvY3VtZW50Lm9uKCd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XG4gICAgICAgIG9uRG9jdW1lbnRDaGFuZ2UoJ2hpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9uRG9jdW1lbnRDaGFuZ2UoJ3Zpc2libGUnKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBBZGQgYSBjYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9ICAgc3RhdGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICBpZGVudFxuICovXG5mdW5jdGlvbiBhZGRDYWxsYmFjayAoc3RhdGUsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8ICcnO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgaWRlbnQgPSBQUkVGSVggKyBVVUlEKys7XG5cbiAgICBDQUxMQkFDS1Nbc3RhdGVdLnB1c2goe1xuICAgICAgICBpZGVudDogaWRlbnQsXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlkZW50O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGNhbGxiYWNrXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgc3RhdGUgIFZpc2libGUgb3IgaGlkZGVuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgaWRlbnQgIFVuaXF1ZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgIElmIG9wZXJhdGlvbiB3YXMgYSBzdWNjZXNzXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUNhbGxiYWNrIChzdGF0ZSwgb3B0aW9ucykge1xuICAgIGxldCBpZGVudCA9IG9wdGlvbnMuaWRlbnQgfHwgJyc7XG5cbiAgICBpZiAodHlwZW9mKGlkZW50KSA9PT0gJ3VuZGVmaW5lZCcgfHwgaWRlbnQgPT09ICcnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTmVlZCBpZGVudCB0byByZW1vdmUgY2FsbGJhY2snKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpbmRleCA9IGZpbmRCeUtleVZhbHVlKENBTExCQUNLU1tzdGF0ZV0sICdpZGVudCcsIGlkZW50KVswXTtcblxuICAgIC8vIGNvbnNvbGUubG9nKGlkZW50KVxuICAgIC8vIGNvbnNvbGUubG9nKENBTExCQUNLU1tzdGF0ZV0pXG5cbiAgICBpZiAodHlwZW9mKGluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUFycmF5KENBTExCQUNLU1tzdGF0ZV0sIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDYWxsYmFjayBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBXaGVuIGRvY3VtZW50IHN0YXRlIGNoYW5nZXMsIHRyaWdnZXIgY2FsbGJhY2tzXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBzdGF0ZSAgVmlzaWJsZSBvciBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gb25Eb2N1bWVudENoYW5nZSAoc3RhdGUpIHtcbiAgICBsZXQgY2FsbGJhY2tBcnJheSA9IENBTExCQUNLU1tzdGF0ZV07XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW4gPSBjYWxsYmFja0FycmF5Lmxlbmd0aDtcblxuICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tBcnJheVtpXS5jYWxsYmFjaygpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQdWJsaWMgZmFjaW5nIEFQSSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBjYWxsYmFja3NcbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAgICAgICAgICBvcHRpb25zICBPcHRpb25zXG4gKiBAcmV0dXJuICB7Ym9vbGVhbnxpbnRlZ2VyfSAgICAgICAgICAgVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYWxsYmFjayBvciBib29sZWFuIGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gKi9cbmZ1bmN0aW9uIHZpc2liaWxpdHlBcGkgKG9wdGlvbnMpIHtcbiAgICBsZXQgYWN0aW9uID0gb3B0aW9ucy5hY3Rpb24gfHwgJyc7XG4gICAgbGV0IHN0YXRlID0gb3B0aW9ucy5zdGF0ZSB8fCAnJztcbiAgICBsZXQgcmV0O1xuXG4gICAgLy8gVHlwZSBhbmQgdmFsdWUgY2hlY2tpbmdcbiAgICBpZiAoIWFycmF5Q29udGFpbnMoQUNUSU9OUywgYWN0aW9uKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0FjdGlvbiBkb2VzIG5vdCBleGlzdCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXJyYXlDb250YWlucyhTVEFURVMsIHN0YXRlKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1N0YXRlIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBAdG9kbyBNYWdpYyBjYWxsIGZ1bmN0aW9uIHBsc1xuICAgIGlmIChhY3Rpb24gPT09ICdhZGRDYWxsYmFjaycpIHtcbiAgICAgICAgcmV0ID0gYWRkQ2FsbGJhY2soc3RhdGUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncmVtb3ZlQ2FsbGJhY2snKSB7XG4gICAgICAgIHJldCA9IHJlbW92ZUNhbGxiYWNrKHN0YXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgeyB2aXNpYmlsaXR5QXBpIH07XG4iXX0= diff --git a/www/assets/scripts/vendors.js b/www/assets/scripts/vendors.js index c4f6e48..01450cd 100644 --- a/www/assets/scripts/vendors.js +++ b/www/assets/scripts/vendors.js @@ -1,1714 +1,788 @@ -/*! Dependencies for Locomotive Boilerplate - 2017-03-02 */ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define("Barba", [], factory); - else if(typeof exports === 'object') - exports["Barba"] = factory(); - else - root["Barba"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "http://localhost:8080/dist"; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { +/*! Dependencies for Locomotive Boilerplate - 2018-02-01 */ +!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Pjax=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0) { - item._idleTimeoutId = setTimeout(function onTimeout() { - if (item._onTimeout) - item._onTimeout(); - }, msecs); - } - }; - - // That's not how node.js implements it but the exposed api is the same. - exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { - var id = nextImmediateId++; - var args = arguments.length < 2 ? false : slice.call(arguments, 1); - - immediateIds[id] = true; - - nextTick(function onNextTick() { - if (immediateIds[id]) { - // fn.call() is faster so we optimize for the common use-case - // @see http://jsperf.com/call-apply-segu - if (args) { - fn.apply(null, args); - } else { - fn.call(null); - } - // Prevent ids from leaking - exports.clearImmediate(id); - } - }); - - return id; - }; - - exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { - delete immediateIds[id]; - }; - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).setImmediate, __webpack_require__(2).clearImmediate)) + this.parseDOM(document) -/***/ }, -/* 3 */ -/***/ function(module, exports) { + on(window, "popstate", function(st) { + if (st.state) { + var opt = clone(this.options) + opt.url = st.state.url + opt.title = st.state.title + opt.history = false - // shim for using process in browser - - var process = module.exports = {}; - - // cached from whatever global is present so that test runners that stub it - // don't break things. But we need to wrap it in a try catch in case it is - // wrapped in strict mode code which doesn't define any globals. It's inside a - // function because try/catches deoptimize in certain engines. - - var cachedSetTimeout; - var cachedClearTimeout; - - (function () { - try { - cachedSetTimeout = setTimeout; - } catch (e) { - cachedSetTimeout = function () { - throw new Error('setTimeout is not defined'); - } - } - try { - cachedClearTimeout = clearTimeout; - } catch (e) { - cachedClearTimeout = function () { - throw new Error('clearTimeout is not defined'); - } - } - } ()) - var queue = []; - var draining = false; - var currentQueue; - var queueIndex = -1; - - function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } - } - - function drainQueue() { - if (draining) { - return; - } - var timeout = cachedSetTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - cachedClearTimeout(timeout); - } - - process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - cachedSetTimeout(drainQueue, 0); - } - }; - - // v8 likes predictible objects - function Item(fun, array) { - this.fun = fun; - this.array = array; - } - Item.prototype.run = function () { - this.fun.apply(null, this.array); - }; - process.title = 'browser'; - process.browser = true; - process.env = {}; - process.argv = []; - process.version = ''; // empty string to avoid regexp issues - process.versions = {}; - - function noop() {} - - process.on = noop; - process.addListener = noop; - process.once = noop; - process.off = noop; - process.removeListener = noop; - process.removeAllListeners = noop; - process.emit = noop; - - process.binding = function (name) { - throw new Error('process.binding is not supported'); - }; - - process.cwd = function () { return '/' }; - process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); - }; - process.umask = function() { return 0; }; + if (st.state.uid < this.lastUid) { + opt.backward = true + } + else { + opt.forward = true + } + this.lastUid = st.state.uid + + // @todo implement history cache here, based on uid + this.loadUrl(st.state.url, opt) + } + }.bind(this)) + } + +Pjax.prototype = { + log: _dereq_("./lib/proto/log.js"), + + getElements: _dereq_("./lib/proto/get-elements.js"), + + parseDOM: _dereq_("./lib/proto/parse-dom.js"), + + refresh: _dereq_("./lib/proto/refresh.js"), + + reload: _dereq_("./lib/reload.js"), + + attachLink: _dereq_("./lib/proto/attach-link.js"), + + forEachSelectors: function(cb, context, DOMcontext) { + return _dereq_("./lib/foreach-selectors.js").bind(this)(this.options.selectors, cb, context, DOMcontext) + }, + + switchSelectors: function(selectors, fromEl, toEl, options) { + return _dereq_("./lib/switches-selectors.js").bind(this)(this.options.switches, this.options.switchesOptions, selectors, fromEl, toEl, options) + }, + + // too much problem with the code below + // + it’s too dangerous +// switchFallback: function(fromEl, toEl) { +// this.switchSelectors(["head", "body"], fromEl, toEl) +// // execute script when DOM is like it should be +// Pjax.executeScripts(document.querySelector("head")) +// Pjax.executeScripts(document.querySelector("body")) +// } + + latestChance: function(href) { + window.location = href + }, + + onSwitch: function() { + trigger(window, "resize scroll") + }, + + loadContent: function(html, options) { + var tmpEl = document.implementation.createHTMLDocument() + + // parse HTML attributes to copy them + // since we are forced to use documentElement.innerHTML (outerHTML can't be used for ) + var htmlRegex = /]+>/gi + var htmlAttribsRegex = /\s?[a-z:]+(?:\=(?:\'|\")[^\'\">]+(?:\'|\"))*/gi + var matches = html.match(htmlRegex) + if (matches && matches.length) { + matches = matches[0].match(htmlAttribsRegex) + if (matches.length) { + matches.shift() + matches.forEach(function(htmlAttrib) { + var attr = htmlAttrib.trim().split("=") + if (attr.length === 1) { + tmpEl.documentElement.setAttribute(attr[0], true) + } + else { + tmpEl.documentElement.setAttribute(attr[0], attr[1].slice(1, -1)) + } + }) + } + } + + tmpEl.documentElement.innerHTML = html + this.log("load content", tmpEl.documentElement.attributes, tmpEl.documentElement.innerHTML.length) + + // Clear out any focused controls before inserting new page contents. + // we clear focus on non form elements + if (document.activeElement && !document.activeElement.value) { + try { + document.activeElement.blur() + } catch (e) { } + } + + // try { + this.switchSelectors(this.options.selectors, tmpEl, document, options) + + // FF bug: Won’t autofocus fields that are inserted via JS. + // This behavior is incorrect. So if theres no current focus, autofocus + // the last field. + // + // http://www.w3.org/html/wg/drafts/html/master/forms.html + var autofocusEl = Array.prototype.slice.call(document.querySelectorAll("[autofocus]")).pop() + if (autofocusEl && document.activeElement !== autofocusEl) { + autofocusEl.focus(); + } + + // execute scripts when DOM have been completely updated + this.options.selectors.forEach(function(selector) { + forEachEls(document.querySelectorAll(selector), function(el) { + executeScripts(el) + }) + }) + // } + // catch(e) { + // if (this.options.debug) { + // this.log("Pjax switch fail: ", e) + // } + // this.switchFallback(tmpEl, document) + // } + }, + + doRequest: _dereq_("./lib/request.js"), + + loadUrl: function(href, options) { + this.log("load href", href, options) + + trigger(document, "pjax:send", options); + + // Do the request + this.doRequest(href, function(html) { + // Fail if unable to load HTML via AJAX + if (html === false) { + trigger(document,"pjax:complete pjax:error", options) + + return + } + + // Clear out any focused controls before inserting new page contents. + document.activeElement.blur() + + try { + this.loadContent(html, options) + } + catch (e) { + if (!this.options.debug) { + if (console && console.error) { + console.error("Pjax switch fail: ", e) + } + this.latestChance(href) + return + } + else { + throw e + } + } + + if (options.history) { + if (this.firstrun) { + this.lastUid = this.maxUid = newUid() + this.firstrun = false + window.history.replaceState({ + url: window.location.href, + title: document.title, + uid: this.maxUid + }, + document.title) + } + + // Update browser history + this.lastUid = this.maxUid = newUid() + window.history.pushState({ + url: href, + title: options.title, + uid: this.maxUid + }, + options.title, + href) + } + + this.forEachSelectors(function(el) { + this.parseDOM(el) + }, this) + + // Fire Events + trigger(document,"pjax:complete pjax:success", options) + + options.analytics() + + // Scroll page to top on new page load + if (options.scrollTo !== false) { + if (options.scrollTo.length > 1) { + window.scrollTo(options.scrollTo[0], options.scrollTo[1]) + } + else { + window.scrollTo(0, options.scrollTo) + } + } + }.bind(this)) + } +} + +Pjax.isSupported = _dereq_("./lib/is-supported.js"); + +//arguably could do `if( require("./lib/is-supported.js")()) {` but that might be a little to simple +if (Pjax.isSupported()) { + module.exports = Pjax +} +// if there isn’t required browser functions, returning stupid api +else { + var stupidPjax = function() {} + for (var key in Pjax.prototype) { + if (Pjax.prototype.hasOwnProperty(key) && typeof Pjax.prototype[key] === "function") { + stupidPjax[key] = stupidPjax + } + } + + module.exports = stupidPjax +} + +},{"./lib/clone.js":2,"./lib/events/on.js":4,"./lib/events/trigger.js":5,"./lib/execute-scripts.js":6,"./lib/foreach-els.js":7,"./lib/foreach-selectors.js":8,"./lib/is-supported.js":9,"./lib/proto/attach-link.js":11,"./lib/proto/get-elements.js":12,"./lib/proto/log.js":13,"./lib/proto/parse-dom.js":14,"./lib/proto/parse-options.js":16,"./lib/proto/refresh.js":17,"./lib/reload.js":18,"./lib/request.js":19,"./lib/switches-selectors.js":20,"./lib/uniqueid.js":22}],2:[function(_dereq_,module,exports){ +module.exports = function(obj) { + if (null === obj || "object" != typeof obj) { + return obj + } + var copy = obj.constructor() + for (var attr in obj) { + if (obj.hasOwnProperty(attr)) { + copy[attr] = obj[attr] + } + } + return copy +} + +},{}],3:[function(_dereq_,module,exports){ +module.exports = function(el) { + // console.log("going to execute script", el) + + var code = (el.text || el.textContent || el.innerHTML || "") + var head = document.querySelector("head") || document.documentElement + var script = document.createElement("script") + + if (code.match("document.write")) { + if (console && console.log) { + console.log("Script contains document.write. Can’t be executed correctly. Code skipped ", el) + } + return false + } + + script.type = "text/javascript" + try { + script.appendChild(document.createTextNode(code)) + } + catch (e) { + // old IEs have funky script nodes + script.text = code + } + + // execute + head.insertBefore(script, head.firstChild) + head.removeChild(script) // avoid pollution + + return true +} + +},{}],4:[function(_dereq_,module,exports){ +var forEachEls = _dereq_("../foreach-els") + +module.exports = function(els, events, listener, useCapture) { + events = (typeof events === "string" ? events.split(" ") : events) + + events.forEach(function(e) { + forEachEls(els, function(el) { + el.addEventListener(e, listener, useCapture) + }) + }) +} + +},{"../foreach-els":7}],5:[function(_dereq_,module,exports){ +var forEachEls = _dereq_("../foreach-els") + +module.exports = function(els, events, opts) { + events = (typeof events === "string" ? events.split(" ") : events) + + events.forEach(function(e) { + var event // = new CustomEvent(e) // doesn't everywhere yet + event = document.createEvent("HTMLEvents") + event.initEvent(e, true, true) + event.eventName = e + if (opts) { + Object.keys(opts).forEach(function(key) { + event[key] = opts[key] + }) + } + + forEachEls(els, function(el) { + var domFix = false + if (!el.parentNode && el !== document && el !== window) { + // THANKS YOU IE (9/10//11 concerned) + // dispatchEvent doesn't work if element is not in the dom + domFix = true + document.body.appendChild(el) + } + el.dispatchEvent(event) + if (domFix) { + el.parentNode.removeChild(el) + } + }) + }) +} + +},{"../foreach-els":7}],6:[function(_dereq_,module,exports){ +var forEachEls = _dereq_("./foreach-els") +var evalScript = _dereq_("./eval-script") +// Finds and executes scripts (used for newly added elements) +// Needed since innerHTML does not run scripts +module.exports = function(el) { + // console.log("going to execute scripts for ", el) + forEachEls(el.querySelectorAll("script"), function(script) { + if (!script.type || script.type.toLowerCase() === "text/javascript") { + if (script.parentNode) { + script.parentNode.removeChild(script) + } + evalScript(script) + } + }) +} + +},{"./eval-script":3,"./foreach-els":7}],7:[function(_dereq_,module,exports){ +/* global HTMLCollection: true */ + +module.exports = function(els, fn, context) { + if (els instanceof HTMLCollection || els instanceof NodeList || els instanceof Array) { + return Array.prototype.forEach.call(els, fn, context) + } + // assume simple dom element + return fn.call(context, els) +} + +},{}],8:[function(_dereq_,module,exports){ +var forEachEls = _dereq_("./foreach-els") + +module.exports = function(selectors, cb, context, DOMcontext) { + DOMcontext = DOMcontext || document + selectors.forEach(function(selector) { + forEachEls(DOMcontext.querySelectorAll(selector), cb, context) + }) +} + +},{"./foreach-els":7}],9:[function(_dereq_,module,exports){ +module.exports = function() { + // Borrowed wholesale from https://github.com/defunkt/jquery-pjax + return window.history && + window.history.pushState && + window.history.replaceState && + // pushState isn’t reliable on iOS until 5. + !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/) +} + +},{}],10:[function(_dereq_,module,exports){ +if (!Function.prototype.bind) { + Function.prototype.bind = function(oThis) { + if (typeof this !== "function") { + // closest thing possible to the ECMAScript 5 internal IsCallable function + throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable") + } + + var aArgs = Array.prototype.slice.call(arguments, 1) + var that = this + var Fnoop = function() {} + var fBound = function() { + return that.apply(this instanceof Fnoop && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))) + } + + Fnoop.prototype = this.prototype + fBound.prototype = new Fnoop() + + return fBound + } +} + +},{}],11:[function(_dereq_,module,exports){ +_dereq_("../polyfills/Function.prototype.bind") + +var on = _dereq_("../events/on") +var clone = _dereq_("../clone") + +var attrClick = "data-pjax-click-state" +var attrKey = "data-pjax-keyup-state" + +var linkAction = function(el, event) { + // Don’t break browser special behavior on links (like page in new window) + if (event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) { + el.setAttribute(attrClick, "modifier") + return + } + + // we do test on href now to prevent unexpected behavior if for some reason + // user have href that can be dynamically updated + + // Ignore external links. + if (el.protocol !== window.location.protocol || el.host !== window.location.host) { + el.setAttribute(attrClick, "external") + return + } + + // Ignore click if we are on an anchor on the same page + if (el.pathname === window.location.pathname && el.hash.length > 0) { + el.setAttribute(attrClick, "anchor-present") + return + } + + // Ignore anchors on the same page (keep native behavior) + if (el.hash && el.href.replace(el.hash, "") === window.location.href.replace(location.hash, "")) { + el.setAttribute(attrClick, "anchor") + return + } + + // Ignore empty anchor "foo.html#" + if (el.href === window.location.href.split("#")[0] + "#") { + el.setAttribute(attrClick, "anchor-empty") + return + } + + event.preventDefault() + + // don’t do "nothing" if user try to reload the page by clicking the same link twice + if ( + this.options.currentUrlFullReload && + el.href === window.location.href.split("#")[0] + ) { + el.setAttribute(attrClick, "reload") + this.reload() + return + } + + el.setAttribute(attrClick, "load") + this.loadUrl(el.href, clone(this.options)) +} + +var isDefaultPrevented = function(event) { + return event.defaultPrevented || event.returnValue === false; +} + +module.exports = function(el) { + var that = this + + on(el, "click", function(event) { + if (isDefaultPrevented(event)) { + return + } + + linkAction.call(that, el, event) + }) + + on(el, "keyup", function(event) { + if (isDefaultPrevented(event)) { + return + } + + // Don’t break browser special behavior on links (like page in new window) + if (event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) { + el.setAttribute(attrKey, "modifier") + return + } + + if (event.keyCode == 13) { + linkAction.call(that, el, event) + } + }.bind(this)) +} + +},{"../clone":2,"../events/on":4,"../polyfills/Function.prototype.bind":10}],12:[function(_dereq_,module,exports){ +module.exports = function(el) { + return el.querySelectorAll(this.options.elements) +} + +},{}],13:[function(_dereq_,module,exports){ +module.exports = function() { + if (this.options.debug && console) { + if (typeof console.log === "function") { + console.log.apply(console, arguments); + } + // ie is weird + else if (console.log) { + console.log(arguments); + } + } +} + +},{}],14:[function(_dereq_,module,exports){ +var forEachEls = _dereq_("../foreach-els") + +var parseElement = _dereq_("./parse-element") + +module.exports = function(el) { + forEachEls(this.getElements(el), parseElement, this) +} + +},{"../foreach-els":7,"./parse-element":15}],15:[function(_dereq_,module,exports){ +module.exports = function(el) { + switch (el.tagName.toLowerCase()) { + case "a": + // only attach link if el does not already have link attached + if (!el.hasAttribute('data-pjax-click-state')) { + this.attachLink(el) + } + break + + case "form": + throw "Pjax doesnt support
yet." + break + + default: + throw "Pjax can only be applied on or submit" + } +} + +},{}],16:[function(_dereq_,module,exports){ +/* global _gaq: true, ga: true */ + +module.exports = function(options){ + this.options = options + this.options.elements = this.options.elements || "a[href], form[action]" + this.options.selectors = this.options.selectors || ["title", ".js-Pjax"] + this.options.switches = this.options.switches || {} + this.options.switchesOptions = this.options.switchesOptions || {} + this.options.history = this.options.history || true + this.options.analytics = this.options.analytics || function() { + // options.backward or options.foward can be true or undefined + // by default, we do track back/foward hit + // https://productforums.google.com/forum/#!topic/analytics/WVwMDjLhXYk + if (window._gaq) { + _gaq.push(["_trackPageview"]) + } + if (window.ga) { + ga("send", "pageview", {page: location.pathname, title: document.title}) + } + } + this.options.scrollTo = (typeof this.options.scrollTo === 'undefined') ? 0 : this.options.scrollTo; + this.options.cacheBust = (typeof this.options.cacheBust === 'undefined') ? true : this.options.cacheBust + this.options.debug = this.options.debug || false + + // we can’t replace body.outerHTML or head.outerHTML + // it create a bug where new body or new head are created in the dom + // if you set head.outerHTML, a new body tag is appended, so the dom get 2 body + // & it break the switchFallback which replace head & body + if (!this.options.switches.head) { + this.options.switches.head = this.switchElementsAlt + } + if (!this.options.switches.body) { + this.options.switches.body = this.switchElementsAlt + } + if (typeof options.analytics !== "function") { + options.analytics = function() {} + } +} +},{}],17:[function(_dereq_,module,exports){ +module.exports = function(el) { + this.parseDOM(el || document) +} + +},{}],18:[function(_dereq_,module,exports){ +module.exports = function() { + window.location.reload() +} + +},{}],19:[function(_dereq_,module,exports){ +module.exports = function(location, callback) { + var request = new XMLHttpRequest() + + request.onreadystatechange = function() { + if (request.readyState === 4) { + if (request.status === 200) { + callback(request.responseText, request) + } + else { + callback(null, request) + } + } + } + + // Add a timestamp as part of the query string if cache busting is enabled + if (this.options.cacheBust) { + location += (!/[?&]/.test(location) ? "?" : "&") + new Date().getTime() + } + + request.open("GET", location, true) + request.setRequestHeader("X-Requested-With", "XMLHttpRequest") + request.send(null) + return request +} + +},{}],20:[function(_dereq_,module,exports){ +var forEachEls = _dereq_("./foreach-els") + +var defaultSwitches = _dereq_("./switches") + +module.exports = function(switches, switchesOptions, selectors, fromEl, toEl, options) { + selectors.forEach(function(selector) { + var newEls = fromEl.querySelectorAll(selector) + var oldEls = toEl.querySelectorAll(selector) + if (this.log) { + this.log("Pjax switch", selector, newEls, oldEls) + } + if (newEls.length !== oldEls.length) { + // forEachEls(newEls, function(el) { + // this.log("newEl", el, el.outerHTML) + // }, this) + // forEachEls(oldEls, function(el) { + // this.log("oldEl", el, el.outerHTML) + // }, this) + throw "DOM doesn’t look the same on new loaded page: ’" + selector + "’ - new " + newEls.length + ", old " + oldEls.length + } + + forEachEls(newEls, function(newEl, i) { + var oldEl = oldEls[i] + if (this.log) { + this.log("newEl", newEl, "oldEl", oldEl) + } + if (switches[selector]) { + switches[selector].bind(this)(oldEl, newEl, options, switchesOptions[selector]) + } + else { + defaultSwitches.outerHTML.bind(this)(oldEl, newEl, options) + } + }, this) + }, this) +} + +},{"./foreach-els":7,"./switches":21}],21:[function(_dereq_,module,exports){ +var on = _dereq_("./events/on.js") +// var off = require("./lib/events/on.js") +// var trigger = require("./lib/events/trigger.js") -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { +module.exports = { + outerHTML: function(oldEl, newEl) { + oldEl.outerHTML = newEl.outerHTML + this.onSwitch() + }, - var Utils = __webpack_require__(5); - - /** - * BaseTransition to extend - * - * @namespace Barba.BaseTransition - * @type {Object} - */ - var BaseTransition = { - /** - * @memberOf Barba.BaseTransition - * @type {HTMLElement} - */ - oldContainer: undefined, - - /** - * @memberOf Barba.BaseTransition - * @type {HTMLElement} - */ - newContainer: undefined, - - /** - * @memberOf Barba.BaseTransition - * @type {Promise} - */ - newContainerLoading: undefined, - - /** - * Helper to extend the object - * - * @memberOf Barba.BaseTransition - * @param {Object} newObject - * @return {Object} newInheritObject - */ - extend: function(obj){ - return Utils.extend(this, obj); - }, - - /** - * This function is called from Pjax module to initialize - * the transition. - * - * @memberOf Barba.BaseTransition - * @private - * @param {HTMLElement} oldContainer - * @param {Promise} newContainer - * @return {Promise} - */ - init: function(oldContainer, newContainer) { - var _this = this; - - this.oldContainer = oldContainer; - this._newContainerPromise = newContainer; - - this.deferred = Utils.deferred(); - this.newContainerReady = Utils.deferred(); - this.newContainerLoading = this.newContainerReady.promise; - - this.start(); - - this._newContainerPromise.then(function(newContainer) { - _this.newContainer = newContainer; - _this.newContainerReady.resolve(); - }); - - return this.deferred.promise; - }, - - /** - * This function needs to be called as soon the Transition is finished - * - * @memberOf Barba.BaseTransition - */ - done: function() { - this.oldContainer.parentNode.removeChild(this.oldContainer); - this.newContainer.style.visibility = 'visible'; - this.deferred.resolve(); - }, - - /** - * Constructor for your Transition - * - * @memberOf Barba.BaseTransition - * @abstract - */ - start: function() {}, - }; - - module.exports = BaseTransition; + innerHTML: function(oldEl, newEl) { + oldEl.innerHTML = newEl.innerHTML + oldEl.className = newEl.className + this.onSwitch() + }, + sideBySide: function(oldEl, newEl, options, switchOptions) { + var forEach = Array.prototype.forEach + var elsToRemove = [] + var elsToAdd = [] + var fragToAppend = document.createDocumentFragment() + // height transition are shitty on safari + // so commented for now (until I found something ?) + // var relevantHeight = 0 + var animationEventNames = "animationend webkitAnimationEnd MSAnimationEnd oanimationend" + var animatedElsNumber = 0 + var sexyAnimationEnd = function(e) { + if (e.target != e.currentTarget) { + // end triggered by an animation on a child + return + } -/***/ }, -/* 5 */ -/***/ function(module, exports) { + animatedElsNumber-- + if (animatedElsNumber <= 0 && elsToRemove) { + elsToRemove.forEach(function(el) { + // browsing quickly can make the el + // already removed by last page update ? + if (el.parentNode) { + el.parentNode.removeChild(el) + } + }) - /** - * Just an object with some helpful functions - * - * @type {Object} - * @namespace Barba.Utils - */ - var Utils = { - /** - * Return the current url - * - * @memberOf Barba.Utils - * @return {String} currentUrl - */ - getCurrentUrl: function() { - return window.location.protocol + '//' + - window.location.host + - window.location.pathname + - window.location.search; - }, - - /** - * Given an url, return it without the hash - * - * @memberOf Barba.Utils - * @private - * @param {String} url - * @return {String} newCleanUrl - */ - cleanLink: function(url) { - return url.replace(/#.*/, ''); - }, - - /** - * Time in millisecond after the xhr request goes in timeout - * - * @memberOf Barba.Utils - * @type {Number} - * @default - */ - xhrTimeout: 5000, - - /** - * Start an XMLHttpRequest() and return a Promise - * - * @memberOf Barba.Utils - * @param {String} url - * @return {Promise} - */ - xhr: function(url) { - var deferred = this.deferred(); - var req = new XMLHttpRequest(); - - req.onreadystatechange = function() { - if (req.readyState === 4) { - if (req.status === 200) { - return deferred.resolve(req.responseText); - } else { - return deferred.reject(new Error('xhr: HTTP code is not 200')); - } - } - }; - - req.ontimeout = function() { - return deferred.reject(new Error('xhr: Timeout exceeded')); - }; - - req.open('GET', url); - req.timeout = this.xhrTimeout; - req.setRequestHeader('x-barba', 'yes'); - req.send(); - - return deferred.promise; - }, - - /** - * Get obj and props and return a new object with the property merged - * - * @memberOf Barba.Utils - * @param {object} obj - * @param {object} props - * @return {object} - */ - extend: function(obj, props) { - var newObj = Object.create(obj); - - for(var prop in props) { - if(props.hasOwnProperty(prop)) { - newObj[prop] = props[prop]; - } - } - - return newObj; - }, - - /** - * Return a new "Deferred" object - * https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred - * - * @memberOf Barba.Utils - * @return {Deferred} - */ - deferred: function() { - return new function() { - this.resolve = null; - this.reject = null; - - this.promise = new Promise(function(resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }.bind(this)); - }; - }, - - /** - * Return the port number normalized, eventually you can pass a string to be normalized. - * - * @memberOf Barba.Utils - * @private - * @param {String} p - * @return {Int} port - */ - getPort: function(p) { - var port = typeof p !== 'undefined' ? p : window.location.port; - var protocol = window.location.protocol; - - if (port != '') - return parseInt(port); - - if (protocol === 'http:') - return 80; - - if (protocol === 'https:') - return 443; - } - }; - - module.exports = Utils; + elsToAdd.forEach(function(el) { + el.className = el.className.replace(el.getAttribute("data-pjax-classes"), "") + el.removeAttribute("data-pjax-classes") + // Pjax.off(el, animationEventNames, sexyAnimationEnd, true) + }) + elsToAdd = null // free memory + elsToRemove = null // free memory -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { + // assume the height is now useless (avoid bug since there is overflow hidden on the parent) + // oldEl.style.height = "auto" - var Dispatcher = __webpack_require__(7); - var Utils = __webpack_require__(5); - - /** - * BaseView to be extended - * - * @namespace Barba.BaseView - * @type {Object} - */ - var BaseView = { - /** - * Namespace of the view. - * (need to be associated with the data-namespace of the container) - * - * @memberOf Barba.BaseView - * @type {String} - */ - namespace: null, - - /** - * Helper to extend the object - * - * @memberOf Barba.BaseView - * @param {Object} newObject - * @return {Object} newInheritObject - */ - extend: function(obj){ - return Utils.extend(this, obj); - }, - - /** - * Init the view. - * P.S. Is suggested to init the view before starting Barba.Pjax.start(), - * in this way .onEnter() and .onEnterCompleted() will be fired for the current - * container when the page is loaded. - * - * @memberOf Barba.BaseView - */ - init: function() { - var _this = this; - - Dispatcher.on('initStateChange', - function(newStatus, oldStatus) { - if (oldStatus && oldStatus.namespace === _this.namespace) - _this.onLeave(); - } - ); - - Dispatcher.on('newPageReady', - function(newStatus, oldStatus, container) { - _this.container = container; - - if (newStatus.namespace === _this.namespace) - _this.onEnter(); - } - ); - - Dispatcher.on('transitionCompleted', - function(newStatus, oldStatus) { - if (newStatus.namespace === _this.namespace) - _this.onEnterCompleted(); - - if (oldStatus && oldStatus.namespace === _this.namespace) - _this.onLeaveCompleted(); - } - ); - }, - - /** - * This function will be fired when the container - * is ready and attached to the DOM. - * - * @memberOf Barba.BaseView - * @abstract - */ - onEnter: function() {}, - - /** - * This function will be fired when the transition - * to this container has just finished. - * - * @memberOf Barba.BaseView - * @abstract - */ - onEnterCompleted: function() {}, - - /** - * This function will be fired when the transition - * to a new container has just started. - * - * @memberOf Barba.BaseView - * @abstract - */ - onLeave: function() {}, - - /** - * This function will be fired when the container - * has just been removed from the DOM. - * - * @memberOf Barba.BaseView - * @abstract - */ - onLeaveCompleted: function() {} - } - - module.exports = BaseView; + // this is to trigger some repaint (example: picturefill) + this.onSwitch() + // Pjax.trigger(window, "scroll") + } + }.bind(this) + // Force height to be able to trigger css animation + // here we get the relevant height + // oldEl.parentNode.appendChild(newEl) + // relevantHeight = newEl.getBoundingClientRect().height + // oldEl.parentNode.removeChild(newEl) + // oldEl.style.height = oldEl.getBoundingClientRect().height + "px" -/***/ }, -/* 7 */ -/***/ function(module, exports) { + switchOptions = switchOptions || {} - /** - * Little Dispatcher inspired by MicroEvent.js - * - * @namespace Barba.Dispatcher - * @type {Object} - */ - var Dispatcher = { - /** - * Object that keeps all the events - * - * @memberOf Barba.Dispatcher - * @readOnly - * @type {Object} - */ - events: {}, - - /** - * Bind a callback to an event - * - * @memberOf Barba.Dispatcher - * @param {String} eventName - * @param {Function} function - */ - on: function(e, f) { - this.events[e] = this.events[e] || []; - this.events[e].push(f); - }, - - /** - * Unbind event - * - * @memberOf Barba.Dispatcher - * @param {String} eventName - * @param {Function} function - */ - off: function(e, f) { - if(e in this.events === false) - return; - - this.events[e].splice(this.events[e].indexOf(f), 1); - }, - - /** - * Fire the event running all the event associated to it - * - * @memberOf Barba.Dispatcher - * @param {String} eventName - * @param {...*} args - */ - trigger: function(e) {//e, ...args - if (e in this.events === false) - return; - - for(var i = 0; i < this.events[e].length; i++){ - this.events[e][i].apply(this, Array.prototype.slice.call(arguments, 1)); - } - } - }; - - module.exports = Dispatcher; + forEach.call(oldEl.childNodes, function(el) { + elsToRemove.push(el) + if (el.classList && !el.classList.contains("js-Pjax-remove")) { + // for fast switch, clean element that just have been added, & not cleaned yet. + if (el.hasAttribute("data-pjax-classes")) { + el.className = el.className.replace(el.getAttribute("data-pjax-classes"), "") + el.removeAttribute("data-pjax-classes") + } + el.classList.add("js-Pjax-remove") + if (switchOptions.callbacks && switchOptions.callbacks.removeElement) { + switchOptions.callbacks.removeElement(el) + } + if (switchOptions.classNames) { + el.className += " " + switchOptions.classNames.remove + " " + (options.backward ? switchOptions.classNames.backward : switchOptions.classNames.forward) + } + animatedElsNumber++ + on(el, animationEventNames, sexyAnimationEnd, true) + } + }) + forEach.call(newEl.childNodes, function(el) { + if (el.classList) { + var addClasses = "" + if (switchOptions.classNames) { + addClasses = " js-Pjax-add " + switchOptions.classNames.add + " " + (options.backward ? switchOptions.classNames.forward : switchOptions.classNames.backward) + } + if (switchOptions.callbacks && switchOptions.callbacks.addElement) { + switchOptions.callbacks.addElement(el) + } + el.className += addClasses + el.setAttribute("data-pjax-classes", addClasses) + elsToAdd.push(el) + fragToAppend.appendChild(el) + animatedElsNumber++ + on(el, animationEventNames, sexyAnimationEnd, true) + } + }) -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { + // pass all className of the parent + oldEl.className = newEl.className + oldEl.appendChild(fragToAppend) - var Utils = __webpack_require__(5); - - /** - * BaseCache it's a simple static cache - * - * @namespace Barba.BaseCache - * @type {Object} - */ - var BaseCache = { - /** - * The Object that keeps all the key value information - * - * @memberOf Barba.BaseCache - * @type {Object} - */ - data: {}, - - /** - * Helper to extend this object - * - * @memberOf Barba.BaseCache - * @private - * @param {Object} newObject - * @return {Object} newInheritObject - */ - extend: function(obj) { - return Utils.extend(this, obj); - }, - - /** - * Set a key and value data, mainly Barba is going to save promises - * - * @memberOf Barba.BaseCache - * @param {String} key - * @param {*} value - */ - set: function(key, val) { - this.data[key] = val; - }, - - /** - * Retrieve the data using the key - * - * @memberOf Barba.BaseCache - * @param {String} key - * @return {*} - */ - get: function(key) { - return this.data[key]; - }, - - /** - * Flush the cache - * - * @memberOf Barba.BaseCache - */ - reset: function() { - this.data = {}; - } - }; - - module.exports = BaseCache; + // oldEl.style.height = relevantHeight + "px" + } +} +},{"./events/on.js":4}],22:[function(_dereq_,module,exports){ +module.exports = (function() { + var counter = 0 + return function() { + var id = ("pjax" + (new Date().getTime())) + "_" + counter + counter++ + return id + } +})() -/***/ }, -/* 9 */ -/***/ function(module, exports) { - - /** - * HistoryManager helps to keep track of the navigation - * - * @namespace Barba.HistoryManager - * @type {Object} - */ - var HistoryManager = { - /** - * Keep track of the status in historic order - * - * @memberOf Barba.HistoryManager - * @readOnly - * @type {Array} - */ - history: [], - - /** - * Add a new set of url and namespace - * - * @memberOf Barba.HistoryManager - * @param {String} url - * @param {String} namespace - * @private - */ - add: function(url, namespace) { - if (!namespace) - namespace = undefined; - - this.history.push({ - url: url, - namespace: namespace - }); - }, - - /** - * Return information about the current status - * - * @memberOf Barba.HistoryManager - * @return {Object} - */ - currentStatus: function() { - return this.history[this.history.length - 1]; - }, - - /** - * Return information about the previous status - * - * @memberOf Barba.HistoryManager - * @return {Object} - */ - prevStatus: function() { - var history = this.history; - - if (history.length < 2) - return null; - - return history[history.length - 2]; - } - }; - - module.exports = HistoryManager; - - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - var Utils = __webpack_require__(5); - var Dispatcher = __webpack_require__(7); - var HideShowTransition = __webpack_require__(11); - var BaseCache = __webpack_require__(8); - - var HistoryManager = __webpack_require__(9); - var Dom = __webpack_require__(12); - - /** - * Pjax is a static object with main function - * - * @namespace Barba.Pjax - * @borrows Dom as Dom - * @type {Object} - */ - var Pjax = { - Dom: Dom, - History: HistoryManager, - Cache: BaseCache, - - /** - * Indicate wether or not use the cache - * - * @memberOf Barba.Pjax - * @type {Boolean} - * @default - */ - cacheEnabled: true, - - /** - * Indicate if there is an animation in progress - * - * @memberOf Barba.Pjax - * @readOnly - * @type {Boolean} - */ - transitionProgress: false, - - /** - * Class name used to ignore links - * - * @memberOf Barba.Pjax - * @type {String} - * @default - */ - ignoreClassLink: 'no-barba', - - /** - * Function to be called to start Pjax - * - * @memberOf Barba.Pjax - */ - start: function() { - this.init(); - }, - - /** - * Init the events - * - * @memberOf Barba.Pjax - * @private - */ - init: function() { - var container = this.Dom.getContainer(); - var wrapper = this.Dom.getWrapper(); - - wrapper.setAttribute('aria-live', 'polite'); - - this.History.add( - this.getCurrentUrl(), - this.Dom.getNamespace(container) - ); - - //Fire for the current view. - Dispatcher.trigger('initStateChange', this.History.currentStatus()); - Dispatcher.trigger('newPageReady', - this.History.currentStatus(), - {}, - container, - this.Dom.currentHTML - ); - Dispatcher.trigger('transitionCompleted', this.History.currentStatus()); - - this.bindEvents(); - }, - - /** - * Attach the eventlisteners - * - * @memberOf Barba.Pjax - * @private - */ - bindEvents: function() { - document.addEventListener('click', - this.onLinkClick.bind(this) - ); - - window.addEventListener('popstate', - this.onStateChange.bind(this) - ); - }, - - /** - * Return the currentURL cleaned - * - * @memberOf Barba.Pjax - * @return {String} currentUrl - */ - getCurrentUrl: function() { - return Utils.cleanLink( - Utils.getCurrentUrl() - ); - }, - - /** - * Change the URL with pushstate and trigger the state change - * - * @memberOf Barba.Pjax - * @param {String} newUrl - */ - goTo: function(url) { - window.history.pushState(null, null, url); - this.onStateChange(); - }, - - /** - * Force the browser to go to a certain url - * - * @memberOf Barba.Pjax - * @param {String} url - * @private - */ - forceGoTo: function(url) { - window.location = url; - }, - - /** - * Load an url, will start an xhr request or load from the cache - * - * @memberOf Barba.Pjax - * @private - * @param {String} url - * @return {Promise} - */ - load: function(url) { - var deferred = Utils.deferred(); - var _this = this; - var xhr; - - xhr = this.Cache.get(url); - - if (!xhr) { - xhr = Utils.xhr(url); - this.Cache.set(url, xhr); - } - - xhr.then( - function(data) { - var container = _this.Dom.parseResponse(data); - - _this.Dom.putContainer(container); - - if (!_this.cacheEnabled) - _this.Cache.reset(); - - deferred.resolve(container); - }, - function() { - //Something went wrong (timeout, 404, 505...) - _this.forceGoTo(url); - - deferred.reject(); - } - ); - - return deferred.promise; - }, - - /** - * Get the .href parameter out of an element - * and handle special cases (like xlink:href) - * - * @private - * @memberOf Barba.Pjax - * @param {HTMLElement} el - * @return {String} href - */ - getHref: function(el) { - if (!el) { - return undefined; - } - - if (el.getAttribute && typeof el.getAttribute('xlink:href') === 'string') { - return el.getAttribute('xlink:href'); - } - - if (typeof el.href === 'string') { - return el.href; - } - - return undefined; - }, - - /** - * Callback called from click event - * - * @memberOf Barba.Pjax - * @private - * @param {MouseEvent} evt - */ - onLinkClick: function(evt) { - var el = evt.target; - - //Go up in the nodelist until we - //find something with an href - while (el && !this.getHref(el)) { - el = el.parentNode; - } - - if (this.preventCheck(evt, el)) { - evt.stopPropagation(); - evt.preventDefault(); - - Dispatcher.trigger('linkClicked', el, evt); - - var href = this.getHref(el); - this.goTo(href); - } - }, - - /** - * Determine if the link should be followed - * - * @memberOf Barba.Pjax - * @param {MouseEvent} evt - * @param {HTMLElement} element - * @return {Boolean} - */ - preventCheck: function(evt, element) { - if (!window.history.pushState) - return false; - - var href = this.getHref(element); - - //User - if (!element || !href) - return false; - - //Middle click, cmd click, and ctrl click - if (evt.which > 1 || evt.metaKey || evt.ctrlKey || evt.shiftKey || evt.altKey) - return false; - - //Ignore target with _blank target - if (element.target && element.target === '_blank') - return false; - - //Check if it's the same domain - if (window.location.protocol !== element.protocol || window.location.hostname !== element.hostname) - return false; - - //Check if the port is the same - if (Utils.getPort() !== Utils.getPort(element.port)) - return false; - - //Ignore case when a hash is being tacked on the current URL - if (href.indexOf('#') > -1) - return false; - - //Ignore case where there is download attribute - if (element.getAttribute && typeof element.getAttribute('download') === 'string') - return false; - - //In case you're trying to load the same page - if (Utils.cleanLink(href) == Utils.cleanLink(location.href)) - return false; - - if (element.classList.contains(this.ignoreClassLink)) - return false; - - return true; - }, - - /** - * Return a transition object - * - * @memberOf Barba.Pjax - * @return {Barba.Transition} Transition object - */ - getTransition: function() { - //User customizable - return HideShowTransition; - }, - - /** - * Method called after a 'popstate' or from .goTo() - * - * @memberOf Barba.Pjax - * @private - */ - onStateChange: function() { - var newUrl = this.getCurrentUrl(); - - if (this.transitionProgress) - this.forceGoTo(newUrl); - - if (this.History.currentStatus().url === newUrl) - return false; - - this.History.add(newUrl); - - var newContainer = this.load(newUrl); - var transition = Object.create(this.getTransition()); - - this.transitionProgress = true; - - Dispatcher.trigger('initStateChange', - this.History.currentStatus(), - this.History.prevStatus() - ); - - var transitionInstance = transition.init( - this.Dom.getContainer(), - newContainer - ); - - newContainer.then( - this.onNewContainerLoaded.bind(this) - ); - - transitionInstance.then( - this.onTransitionEnd.bind(this) - ); - }, - - /** - * Function called as soon the new container is ready - * - * @memberOf Barba.Pjax - * @private - * @param {HTMLElement} container - */ - onNewContainerLoaded: function(container) { - var currentStatus = this.History.currentStatus(); - currentStatus.namespace = this.Dom.getNamespace(container); - - Dispatcher.trigger('newPageReady', - this.History.currentStatus(), - this.History.prevStatus(), - container, - this.Dom.currentHTML - ); - }, - - /** - * Function called as soon the transition is finished - * - * @memberOf Barba.Pjax - * @private - */ - onTransitionEnd: function() { - this.transitionProgress = false; - - Dispatcher.trigger('transitionCompleted', - this.History.currentStatus(), - this.History.prevStatus() - ); - } - }; - - module.exports = Pjax; - - -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { - - var BaseTransition = __webpack_require__(4); - - /** - * Basic Transition object, wait for the new Container to be ready, - * scroll top, and finish the transition (removing the old container and displaying the new one) - * - * @private - * @namespace Barba.HideShowTransition - * @augments Barba.BaseTransition - */ - var HideShowTransition = BaseTransition.extend({ - start: function() { - this.newContainerLoading.then(this.finish.bind(this)); - }, - - finish: function() { - document.body.scrollTop = 0; - this.done(); - } - }); - - module.exports = HideShowTransition; - - -/***/ }, -/* 12 */ -/***/ function(module, exports) { - - /** - * Object that is going to deal with DOM parsing/manipulation - * - * @namespace Barba.Pjax.Dom - * @type {Object} - */ - var Dom = { - /** - * The name of the data attribute on the container - * - * @memberOf Barba.Pjax.Dom - * @type {String} - * @default - */ - dataNamespace: 'namespace', - - /** - * Id of the main wrapper - * - * @memberOf Barba.Pjax.Dom - * @type {String} - * @default - */ - wrapperId: 'barba-wrapper', - - /** - * Class name used to identify the containers - * - * @memberOf Barba.Pjax.Dom - * @type {String} - * @default - */ - containerClass: 'barba-container', - - /** - * Full HTML String of the current page. - * By default is the innerHTML of the initial loaded page. - * - * Each time a new page is loaded, the value is the response of the xhr call. - * - * @memberOf Barba.Pjax.Dom - * @type {String} - */ - currentHTML: document.documentElement.innerHTML, - - /** - * Parse the responseText obtained from the xhr call - * - * @memberOf Barba.Pjax.Dom - * @private - * @param {String} responseText - * @return {HTMLElement} - */ - parseResponse: function(responseText) { - this.currentHTML = responseText; - - var wrapper = document.createElement('div'); - wrapper.innerHTML = responseText; - - var titleEl = wrapper.querySelector('title'); - - if (titleEl) - document.title = titleEl.textContent; - - return this.getContainer(wrapper); - }, - - /** - * Get the main barba wrapper by the ID `wrapperId` - * - * @memberOf Barba.Pjax.Dom - * @return {HTMLElement} element - */ - getWrapper: function() { - var wrapper = document.getElementById(this.wrapperId); - - if (!wrapper) - throw new Error('Barba.js: wrapper not found!'); - - return wrapper; - }, - - /** - * Get the container on the current DOM, - * or from an HTMLElement passed via argument - * - * @memberOf Barba.Pjax.Dom - * @private - * @param {HTMLElement} element - * @return {HTMLElement} - */ - getContainer: function(element) { - if (!element) - element = document.body; - - if (!element) - throw new Error('Barba.js: DOM not ready!'); - - var container = this.parseContainer(element); - - if (container && container.jquery) - container = container[0]; - - if (!container) - throw new Error('Barba.js: no container found'); - - return container; - }, - - /** - * Get the namespace of the container - * - * @memberOf Barba.Pjax.Dom - * @private - * @param {HTMLElement} element - * @return {String} - */ - getNamespace: function(element) { - if (element && element.dataset) { - return element.dataset[this.dataNamespace]; - } else if (element) { - return element.getAttribute('data-' + this.dataNamespace); - } - - return null; - }, - - /** - * Put the container on the page - * - * @memberOf Barba.Pjax.Dom - * @private - * @param {HTMLElement} element - */ - putContainer: function(element) { - element.style.visibility = 'hidden'; - - var wrapper = this.getWrapper(); - wrapper.appendChild(element); - }, - - /** - * Get container selector - * - * @memberOf Barba.Pjax.Dom - * @private - * @param {HTMLElement} element - * @return {HTMLElement} element - */ - parseContainer: function(element) { - return element.querySelector('.' + this.containerClass); - } - }; - - module.exports = Dom; - - -/***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { - - var Utils = __webpack_require__(5); - var Pjax = __webpack_require__(10); - - /** - * Prefetch - * - * @namespace Barba.Prefetch - * @type {Object} - */ - var Prefetch = { - /** - * Class name used to ignore prefetch on links - * - * @memberOf Barba.Prefetch - * @type {String} - * @default - */ - ignoreClassLink: 'no-barba-prefetch', - - /** - * Init the event listener on mouseover and touchstart - * for the prefetch - * - * @memberOf Barba.Prefetch - */ - init: function() { - if (!window.history.pushState) { - return false; - } - - document.body.addEventListener('mouseover', this.onLinkEnter.bind(this)); - document.body.addEventListener('touchstart', this.onLinkEnter.bind(this)); - }, - - /** - * Callback for the mousehover/touchstart - * - * @memberOf Barba.Prefetch - * @private - * @param {Object} evt - */ - onLinkEnter: function(evt) { - var el = evt.target; - - while (el && !Pjax.getHref(el)) { - el = el.parentNode; - } - - if (!el || el.classList.contains(this.ignoreClassLink)) { - return; - } - - var url = Pjax.getHref(el); - - //Check if the link is elegible for Pjax - if (Pjax.preventCheck(evt, el) && !Pjax.Cache.get(url)) { - var xhr = Utils.xhr(url); - Pjax.Cache.set(url, xhr); - } - } - }; - - module.exports = Prefetch; - - -/***/ } -/******/ ]) +},{}]},{},[1]) +(1) }); -; -//# sourceMappingURL=barba.js.map !function(root, factory) { "function" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set define([], function() { @@ -1718,7 +792,7 @@ return /******/ (function(modules) { // webpackBootstrap // like Node. module.exports = factory() : root.svg4everybody = factory(); }(this, function() { - /*! svg4everybody v2.1.6 | github.com/jonathantneal/svg4everybody */ + /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */ function embed(parent, svg, target) { // if the target exists if (target) { @@ -1763,9 +837,9 @@ return /******/ (function(modules) { // webpackBootstrap for (// get the cached index var index = 0; index < uses.length; ) { // get the current - var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent); - if (svg) { - var src = use.getAttribute("xlink:href") || use.getAttribute("href"); + var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute("xlink:href") || use.getAttribute("href"); + if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), + svg && src) { if (polyfill) { if (!opts.validate || opts.validate(src, svg, use)) { // remove the element @@ -1787,7 +861,7 @@ return /******/ (function(modules) { // webpackBootstrap loadreadystatechange(xhr); } else { // embed the local id into the svg - embed(parent, document.getElementById(id)); + embed(parent, svg, document.getElementById(id)); } } else { // increase the index when the previous value was not "valid" diff --git a/www/assets/styles/main.css b/www/assets/styles/main.css index 5b9e60d..1629300 100644 --- a/www/assets/styles/main.css +++ b/www/assets/styles/main.css @@ -1,884 +1 @@ -/* - * ! Locomotive Boilerplate - 2017-12-07 - */ -/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ -/** - * 1. Change the default font family in all browsers (opinionated). - * 2. Correct the line height in all browsers. - * 3. Prevent adjustments of font size after orientation changes in - * IE on Windows Phone and in iOS. - */ -/* Document - ========================================================================== */ -html { - font-family: sans-serif; - /* 1 */ - line-height: 1.15; - /* 2 */ - -ms-text-size-adjust: 100%; - /* 3 */ - -webkit-text-size-adjust: 100%; - /* 3 */ -} - -/* Sections - ========================================================================== */ -/** - * Remove the margin in all browsers (opinionated). - */ -body { - margin: 0; -} - -/** - * Add the correct display in IE 9-. - */ -article, -aside, -footer, -header, -nav, -section { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ -h1 { - margin: 0.67em 0; - font-size: 2em; -} - -/* Grouping content - ========================================================================== */ -/** - * Add the correct display in IE 9-. - * 1. Add the correct display in IE. - */ -figcaption, -figure, -main { - /* 1 */ - display: block; -} - -/** - * Add the correct margin in IE 8. - */ -figure { - margin: 1em 40px; -} - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ -hr { - overflow: visible; - /* 2 */ - box-sizing: content-box; - /* 1 */ - height: 0; - /* 1 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -pre { - font-size: 1em; - /* 2 */ - font-family: monospace, monospace; - /* 1 */ -} - -/* Text-level semantics - ========================================================================== */ -/** - * 1. Remove the gray background on active links in IE 10. - * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. - */ -a { - background-color: transparent; - /* 1 */ - -webkit-text-decoration-skip: objects; - /* 2 */ -} - -/** - * Remove the outline on focused links when they are also active or hovered - * in all browsers (opinionated). - */ -a:active, -a:hover { - outline-width: 0; -} - -/** - * 1. Remove the bottom border in Firefox 39-. - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ -abbr[title] { - border-bottom: none; - /* 1 */ - text-decoration: underline; - /* 2 */ - text-decoration: underline dotted; - /* 2 */ -} - -/** - * Prevent the duplicate application of `bolder` by the next rule in Safari 6. - */ -b, -strong { - font-weight: inherit; -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -code, -kbd, -samp { - font-size: 1em; - /* 2 */ - font-family: monospace, monospace; - /* 1 */ -} - -/** - * Add the correct font style in Android 4.3-. - */ -dfn { - font-style: italic; -} - -/** - * Add the correct background and color in IE 9-. - */ -mark { - background-color: #FFFF00; - color: #000000; -} - -/** - * Add the correct font size in all browsers. - */ -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ -sub, -sup { - position: relative; - vertical-align: baseline; - font-size: 75%; - line-height: 0; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ -/** - * Add the correct display in IE 9-. - */ -audio, -video { - display: inline-block; -} - -/** - * Add the correct display in iOS 4-7. - */ -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Remove the border on images inside links in IE 10-. - */ -img { - border-style: none; -} - -/** - * Hide the overflow in IE. - */ -svg:not(:root) { - overflow: hidden; -} - -/* Forms - ========================================================================== */ -/** - * 1. Change the font styles in all browsers (opinionated). - * 2. Remove the margin in Firefox and Safari. - */ -button, -input, -optgroup, -select, -textarea { - margin: 0; - /* 2 */ - font-size: 100%; - /* 1 */ - font-family: sans-serif; - /* 1 */ - line-height: 1.15; - /* 1 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ -button, -input { - /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ -button, -select { - /* 1 */ - text-transform: none; -} - -/** - * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` - * controls in Android 4. - * 2. Correct the inability to style clickable types in iOS and Safari. - * 3. Remove the border-radius in Chrome 62+ on macOS. - */ -button, -html [type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; - /* 2 */ - border-radius: 0; - /* 3 */ -} - -/** - * Remove the inner border and padding in Firefox. - */ -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -/** - * Restore the focus styles unset by the previous rule. - */ -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Change the border, margin, and padding in all browsers (opinionated). - */ -fieldset { - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; - border: 1px solid #C0C0C0; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ -legend { - display: table; - /* 1 */ - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 3 */ - max-width: 100%; - /* 1 */ - color: inherit; - /* 2 */ - white-space: normal; - /* 1 */ -} - -/** - * 1. Add the correct display in IE 9-. - * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ -progress { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ -} - -/** - * Remove the default vertical scrollbar in IE. - */ -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10-. - * 2. Remove the padding in IE 10-. - */ -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ -[type="search"] { - outline-offset: -2px; - /* 2 */ - -webkit-appearance: textfield; - /* 1 */ -} - -/** - * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. - */ -[type="search"]::-webkit-search-cancel-button, -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ -::-webkit-file-upload-button { - font: inherit; - /* 2 */ - -webkit-appearance: button; - /* 1 */ -} - -/* Interactive - ========================================================================== */ -/* - * Add the correct display in IE 9-. - * 1. Add the correct display in Edge, IE, and Firefox. - */ -details, -menu { - display: block; -} - -/* - * Add the correct display in all browsers. - */ -summary { - display: list-item; -} - -/* Scripting - ========================================================================== */ -/** - * Add the correct display in IE 9-. - */ -canvas { - display: inline-block; -} - -/** - * Add the correct display in IE. - */ -template { - display: none; -} - -/* Hidden - ========================================================================== */ -/** - * Add the correct display in IE 10-. - */ -[hidden] { - display: none; -} - -html { - box-sizing: border-box; -} - -template, -[hidden] { - display: none; -} - -*, -:before, -:after { - box-sizing: inherit; -} - -address { - font-style: inherit; -} - -dfn, -cite, -em, -i { - font-style: italic; -} - -b, -strong { - font-weight: 700; -} - -a { - text-decoration: none; -} - -a svg { - pointer-events: none; -} - -/** - * 1. Single taps should be dispatched immediately on clickable elements - */ -a, area, button, input, label, select, textarea, [tabindex] { - -ms-touch-action: manipulation; - /* [1] */ - touch-action: manipulation; -} - -[hreflang] > abbr[title] { - text-decoration: none; -} - -table { - border-spacing: 0; - border-collapse: collapse; -} - -hr { - display: block; - margin: 1em 0; - padding: 0; - height: 1px; - border: 0; - border-top: 1px solid #CCCCCC; -} - -audio, -canvas, -iframe, -img, -svg, -video { - vertical-align: middle; - /* [1] */ -} - -audio:not([controls]) { - display: none; - height: 0; -} - -img, -svg { - max-width: 100%; - /* [2] */ - height: auto; -} - -img[width], img[height], -svg[width], -svg[height] { - /* [4] */ - max-width: none; -} - -img { - font-style: italic; - /* [4] */ -} - -svg { - fill: currentColor; - /* [5] */ -} - -input, -select, -textarea { - display: block; - margin: 0; - padding: 0; - width: 100%; - outline: 0; - border: 0; - border-radius: 0; - background: none transparent; - color: inherit; - font: inherit; - line-height: normal; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -select { - text-transform: none; -} - -select::-ms-expand { - display: none; -} - -select::-ms-value { - background: none; - color: inherit; -} - -textarea { - overflow: auto; - resize: vertical; -} - -button, -.o-button { - display: inline-block; - /* [1] */ - overflow: visible; - /* [2] */ - margin: 0; - /* [3] */ - padding: 0; - outline: 0; - border: 0; - background: none transparent; - color: inherit; - vertical-align: middle; - /* [4] */ - text-align: center; - /* [3] */ - text-decoration: none; - text-transform: none; - font: inherit; - /* [5] */ - line-height: normal; - cursor: pointer; - /* [6] */ - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -button:focus, button:hover, -.o-button:focus, -.o-button:hover { - text-decoration: none; -} - -html { - overflow-y: scroll; - /* [2] */ - min-height: 100%; - /* [3] */ - color: #222222; - font-size: 1em; - /* [1] */ - font-family: sans-serif; - line-height: 1.5; - /* [1] */ -} - -::-moz-selection { - background-color: #FFFFFF; - color: #3297FD; - text-shadow: none; -} - -::selection { - background-color: #FFFFFF; - color: #3297FD; - text-shadow: none; -} - -a { - color: #1A0DAB; -} - -a:focus, a:hover { - color: #13097c; -} - -.o-h, h1, .o-h1, h2, .o-h2, h3, .o-h3, h4, .o-h4, h5, .o-h5, h6, .o-h6 { - margin-top: 0; - line-height: 1.5; -} - -h1, .o-h1 { - font-size: 2.25rem; -} - -h2, .o-h2 { - font-size: 1.75rem; -} - -h3, .o-h3 { - font-size: 1.5rem; -} - -h4, .o-h4 { - font-size: 1.25rem; -} - -h5, .o-h5 { - font-size: 1.125rem; -} - -h6, .o-h6 { - font-size: 1rem; -} - -/* stylelint-disable */ -/* stylelint-enable */ -.o-container { - margin-right: auto; - margin-left: auto; - padding-right: 60px; - padding-left: 60px; - max-width: 2000px; -} - -.o-layout { - margin: 0; - padding: 0; - list-style: none; - font-size: 0; - margin-left: 0; -} - -.o-layout.-gutter { - margin-left: -3.75rem; -} - -.o-layout.-gutter-small { - margin-left: -1.875rem; -} - -.o-layout.-center { - text-align: center; -} - -.o-layout.-right { - text-align: right; -} - -.o-layout.-reverse { - direction: rtl; -} - -.o-layout_item { - display: inline-block; - width: 100%; - vertical-align: top; - font-size: 1rem; - padding-left: 0; -} - -.o-layout.-gutter > .o-layout_item { - padding-left: 3.75rem; -} - -.o-layout.-gutter-small > .o-layout_item { - padding-left: 1.875rem; -} - -.o-layout.-middle > .o-layout_item { - vertical-align: middle; -} - -.o-layout.-bottom > .o-layout_item { - vertical-align: bottom; -} - -.o-layout.-center > .o-layout_item, -.o-layout.-right > .o-layout_item, -.o-layout.-reverse > .o-layout_item { - text-align: left; -} - -.o-layout.-reverse > .o-layout_item { - direction: ltr; -} - -.o-label, .o-checkbox-label, .o-radio-label { - display: block; - margin-bottom: 0.9375rem; -} - -.o-input, .o-checkbox-label::before, .o-radio-label::before, .o-checkbox-label::after, .o-radio-label::after, .o-select, .o-textarea { - padding: 0.625rem; - border-width: 1px; - border-style: solid; - border-color: lightgray; - background-color: white; -} - -.o-input:focus, .o-checkbox-label:focus::before, .o-radio-label:focus::before, .o-checkbox-label:focus::after, .o-radio-label:focus::after, .o-select:focus, .o-textarea:focus { - border-color: gray; -} - -.o-input::-webkit-input-placeholder, .o-select::-webkit-input-placeholder, .o-textarea::-webkit-input-placeholder { - color: gray; -} - -.o-input:-ms-input-placeholder, .o-select:-ms-input-placeholder, .o-textarea:-ms-input-placeholder { - color: gray; -} - -.o-input::placeholder, .o-select::placeholder, .o-textarea::placeholder { - color: gray; -} - -.o-checkbox, .o-radio { - position: absolute; - width: 0; - opacity: 0; -} - -.o-checkbox:focus + .o-checkbox-label::before, .o-radio:focus + .o-checkbox-label::before, .o-checkbox:focus + .o-radio-label::before, .o-radio:focus + .o-radio-label::before { - border-color: gray; -} - -.o-checkbox:checked + .o-checkbox-label::after, .o-radio:checked + .o-checkbox-label::after, .o-checkbox:checked + .o-radio-label::after, .o-radio:checked + .o-radio-label::after { - opacity: 1; -} - -.o-checkbox-label, .o-radio-label { - position: relative; - display: inline-block; - margin-right: 0.5em; - padding-left: 1.75rem; -} - -.o-checkbox-label::before, .o-radio-label::before, .o-checkbox-label::after, .o-radio-label::after { - position: absolute; - top: 50%; - left: 0; - display: inline-block; - margin-top: -0.5625rem; - padding: 0; - width: 1.125rem; - height: 1.125rem; - content: ""; -} - -.o-checkbox-label::after, .o-radio-label::after { - border-color: transparent; - background-color: transparent; - background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2213%22%20height%3D%2210.5%22%20viewBox%3D%220%200%2013%2010.5%22%20enable-background%3D%22new%200%200%2013%2010.5%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23424242%22%20d%3D%22M4.8%205.8L2.4%203.3%200%205.7l4.8%204.8L13%202.4c0%200-2.4-2.4-2.4-2.4L4.8%205.8z%22%2F%3E%3C%2Fsvg%3E"); - background-position: center; - background-size: 0.8125rem; - background-repeat: no-repeat; - opacity: 0; -} - -.o-radio-label::before, .o-radio-label::after { - border-radius: 50%; -} - -.o-radio-label::after { - background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20enable-background%3D%22new%200%200%2013%2013%22%20xml%3Aspace%3D%22preserve%22%3E%3Ccircle%20fill%3D%22%23424242%22%20cx%3D%226.5%22%20cy%3D%226.5%22%20r%3D%226.5%22%2F%3E%3C%2Fsvg%3E"); - background-size: 0.5rem; -} - -.o-select { - position: relative; - z-index: 1; - padding-right: 2.5rem; -} - -.o-select-wrap { - position: relative; -} - -.o-select-wrap::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 2; - width: 2.5rem; - background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2213%22%20height%3D%2211.3%22%20viewBox%3D%220%200%2013%2011.3%22%20enable-background%3D%22new%200%200%2013%2011.3%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23424242%22%20points%3D%226.5%2011.3%203.3%205.6%200%200%206.5%200%2013%200%209.8%205.6%20%22%2F%3E%3C%2Fsvg%3E"); - background-position: center; - background-size: 0.625rem; - background-repeat: no-repeat; - content: ""; - pointer-events: none; -} - -.o-textarea { - min-height: 6.25rem; -} - -.o-button { - padding: 0.625rem; - background-color: lightgray; -} - -.o-button:focus, .o-button:hover { - background-color: gray; -} +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{margin:.67em 0;font-size:2em}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{overflow:visible;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{font-size:1em;font-family:monospace,monospace}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-size:1em;font-family:monospace,monospace}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{margin:0;font-size:100%;font-family:sans-serif;line-height:1.15}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button;border-radius:0}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}legend{display:table;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0;max-width:100%;color:inherit;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}[hidden],template{display:none}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}address{font-style:inherit}cite,dfn,em,i{font-style:italic}b,strong{font-weight:700}a{text-decoration:none}a svg{pointer-events:none}[tabindex],a,area,button,input,label,select,textarea{-ms-touch-action:manipulation;touch-action:manipulation}[hreflang]>abbr[title]{text-decoration:none}table{border-spacing:0;border-collapse:collapse}hr{display:block;margin:1em 0;padding:0;height:1px;border:0;border-top:1px solid #ccc}audio,canvas,iframe,img,svg,video{vertical-align:middle}audio:not([controls]){display:none;height:0}img,svg{max-width:100%;height:auto}img[height],img[width],svg[height],svg[width]{max-width:none}img{font-style:italic}svg{fill:currentColor}input,select,textarea{display:block;margin:0;padding:0;width:100%;outline:0;border:0;border-radius:0;background:none transparent;color:inherit;font:inherit;line-height:normal;-webkit-appearance:none;-moz-appearance:none;appearance:none}select{text-transform:none}select::-ms-expand{display:none}select::-ms-value{background:0 0;color:inherit}textarea{overflow:auto;resize:vertical}.o-button,button{display:inline-block;overflow:visible;margin:0;padding:0;outline:0;border:0;background:none transparent;color:inherit;vertical-align:middle;text-align:center;text-decoration:none;text-transform:none;font:inherit;line-height:normal;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.o-button:focus,.o-button:hover,button:focus,button:hover{text-decoration:none}html{overflow-y:scroll;min-height:100%;color:#222;font-size:1em;font-family:sans-serif;line-height:1.5}::-moz-selection{background-color:#fff;color:#3297fd;text-shadow:none}::selection{background-color:#fff;color:#3297fd;text-shadow:none}a{color:#1a0dab}a:focus,a:hover{color:#13097c}.o-h,.o-h1,.o-h2,.o-h3,.o-h4,.o-h5,.o-h6,h1,h2,h3,h4,h5,h6{margin-top:0;line-height:1.5}.o-h1,h1{font-size:2.25rem}.o-h2,h2{font-size:1.75rem}.o-h3,h3{font-size:1.5rem}.o-h4,h4{font-size:1.25rem}.o-h5,h5{font-size:1.125rem}.o-h6,h6{font-size:1rem}.o-container{margin-right:auto;margin-left:auto;padding-right:60px;padding-left:60px;max-width:2000px}.o-layout{margin:0;padding:0;list-style:none;font-size:0;margin-left:0}.o-layout.-gutter{margin-left:-3.75rem}.o-layout.-gutter-small{margin-left:-1.875rem}.o-layout.-center{text-align:center}.o-layout.-right{text-align:right}.o-layout.-reverse{direction:rtl}.o-layout_item{display:inline-block;width:100%;vertical-align:top;font-size:1rem;padding-left:0}.o-layout.-gutter>.o-layout_item{padding-left:3.75rem}.o-layout.-gutter-small>.o-layout_item{padding-left:1.875rem}.o-layout.-middle>.o-layout_item{vertical-align:middle}.o-layout.-bottom>.o-layout_item{vertical-align:bottom}.o-layout.-center>.o-layout_item,.o-layout.-reverse>.o-layout_item,.o-layout.-right>.o-layout_item{text-align:left}.o-layout.-reverse>.o-layout_item{direction:ltr}.o-checkbox-label,.o-label,.o-radio-label{display:block;margin-bottom:.9375rem}.o-checkbox-label::after,.o-checkbox-label::before,.o-input,.o-radio-label::after,.o-radio-label::before,.o-select,.o-textarea{padding:.625rem;border-width:1px;border-style:solid;border-color:#d3d3d3;background-color:#fff}.o-checkbox-label:focus::after,.o-checkbox-label:focus::before,.o-input:focus,.o-radio-label:focus::after,.o-radio-label:focus::before,.o-select:focus,.o-textarea:focus{border-color:gray}.o-input::-webkit-input-placeholder,.o-select::-webkit-input-placeholder,.o-textarea::-webkit-input-placeholder{color:gray}.o-input:-ms-input-placeholder,.o-select:-ms-input-placeholder,.o-textarea:-ms-input-placeholder{color:gray}.o-input::-ms-input-placeholder,.o-select::-ms-input-placeholder,.o-textarea::-ms-input-placeholder{color:gray}.o-input::placeholder,.o-select::placeholder,.o-textarea::placeholder{color:gray}.o-checkbox,.o-radio{position:absolute;width:0;opacity:0}.o-checkbox:focus+.o-checkbox-label::before,.o-checkbox:focus+.o-radio-label::before,.o-radio:focus+.o-checkbox-label::before,.o-radio:focus+.o-radio-label::before{border-color:gray}.o-checkbox:checked+.o-checkbox-label::after,.o-checkbox:checked+.o-radio-label::after,.o-radio:checked+.o-checkbox-label::after,.o-radio:checked+.o-radio-label::after{opacity:1}.o-checkbox-label,.o-radio-label{position:relative;display:inline-block;margin-right:.5em;padding-left:1.75rem}.o-checkbox-label::after,.o-checkbox-label::before,.o-radio-label::after,.o-radio-label::before{position:absolute;top:50%;left:0;display:inline-block;margin-top:-.5625rem;padding:0;width:1.125rem;height:1.125rem;content:""}.o-checkbox-label::after,.o-radio-label::after{border-color:transparent;background-color:transparent;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2213%22%20height%3D%2210.5%22%20viewBox%3D%220%200%2013%2010.5%22%20enable-background%3D%22new%200%200%2013%2010.5%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23424242%22%20d%3D%22M4.8%205.8L2.4%203.3%200%205.7l4.8%204.8L13%202.4c0%200-2.4-2.4-2.4-2.4L4.8%205.8z%22%2F%3E%3C%2Fsvg%3E);background-position:center;background-size:.8125rem;background-repeat:no-repeat;opacity:0}.o-radio-label::after,.o-radio-label::before{border-radius:50%}.o-radio-label::after{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20enable-background%3D%22new%200%200%2013%2013%22%20xml%3Aspace%3D%22preserve%22%3E%3Ccircle%20fill%3D%22%23424242%22%20cx%3D%226.5%22%20cy%3D%226.5%22%20r%3D%226.5%22%2F%3E%3C%2Fsvg%3E);background-size:.5rem}.o-select{position:relative;z-index:1;padding-right:2.5rem}.o-select-wrap{position:relative}.o-select-wrap::after{position:absolute;top:0;right:0;bottom:0;z-index:2;width:2.5rem;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2213%22%20height%3D%2211.3%22%20viewBox%3D%220%200%2013%2011.3%22%20enable-background%3D%22new%200%200%2013%2011.3%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23424242%22%20points%3D%226.5%2011.3%203.3%205.6%200%200%206.5%200%2013%200%209.8%205.6%20%22%2F%3E%3C%2Fsvg%3E);background-position:center;background-size:.625rem;background-repeat:no-repeat;content:"";pointer-events:none}.o-textarea{min-height:6.25rem}.o-button{padding:.625rem;background-color:#d3d3d3}.o-button:focus,.o-button:hover{background-color:gray} \ No newline at end of file diff --git a/www/index.html b/www/index.html index bedf3f3..41c49d6 100644 --- a/www/index.html +++ b/www/index.html @@ -1,13 +1,13 @@ - + - Boilerplate + Home | Boilerplate @@ -15,9 +15,24 @@ -
-
-
+ +
+ +
+ +
+
+
Home page with Example module
diff --git a/www/page.html b/www/page.html new file mode 100644 index 0000000..26a0795 --- /dev/null +++ b/www/page.html @@ -0,0 +1,45 @@ + + + + + + + + + + Page | Boilerplate + + + + + + + + +
+ +
+ +
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus tempore officia temporibus error rem id, vel perspiciatis eveniet placeat, ducimus fugit vitae sequi, quas deserunt ab eius expedita quia nulla. + +
+
+ + + + + + +